More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,111 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20120817 | 40 days ago | IN | 0 ETH | 0.00172158 | ||||
Deposit | 19794941 | 85 days ago | IN | 0 ETH | 0.00163388 | ||||
Deposit | 19072518 | 186 days ago | IN | 0 ETH | 0.00317013 | ||||
Withdraw | 18007984 | 336 days ago | IN | 0 ETH | 0.00373521 | ||||
Deposit | 18007971 | 336 days ago | IN | 0 ETH | 0.00357857 | ||||
Deposit | 17843634 | 359 days ago | IN | 0 ETH | 0.00487969 | ||||
Deposit | 17399426 | 421 days ago | IN | 0 ETH | 0.00854384 | ||||
Deposit | 17399416 | 421 days ago | IN | 0 ETH | 0.00802725 | ||||
Deposit | 16361074 | 567 days ago | IN | 0 ETH | 0.00361075 | ||||
Emergency Withdr... | 16226203 | 586 days ago | IN | 0 ETH | 0.00077387 | ||||
Emergency Withdr... | 16226200 | 586 days ago | IN | 0 ETH | 0.00084824 | ||||
Deposit | 16226189 | 586 days ago | IN | 0 ETH | 0.00274761 | ||||
Deposit | 16226185 | 586 days ago | IN | 0 ETH | 0.00320423 | ||||
Deposit For | 16078482 | 606 days ago | IN | 0 ETH | 0.00113584 | ||||
Withdraw From | 16078477 | 606 days ago | IN | 0 ETH | 0.00132811 | ||||
Deposit | 16078459 | 606 days ago | IN | 0 ETH | 0.00263058 | ||||
Deposit | 16035086 | 613 days ago | IN | 0 ETH | 0.00372259 | ||||
Deposit | 15901399 | 631 days ago | IN | 0 ETH | 0.00432482 | ||||
Deposit | 15829769 | 641 days ago | IN | 0 ETH | 0.00261196 | ||||
Deposit | 15729494 | 655 days ago | IN | 0 ETH | 0.00444457 | ||||
Deposit | 15729484 | 655 days ago | IN | 0 ETH | 0.00573142 | ||||
Deposit | 15528054 | 684 days ago | IN | 0 ETH | 0.0047717 | ||||
Deposit | 15520729 | 685 days ago | IN | 0 ETH | 0.00854698 | ||||
Deposit | 15515227 | 686 days ago | IN | 0 ETH | 0.00291881 | ||||
Withdraw | 15515213 | 686 days ago | IN | 0 ETH | 0.00310851 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StacyVault
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-31 */ pragma solidity 0.6.12; // /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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); } } } } // /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // import "./INBUNIERC20.sol"; // import "@nomiclabs/buidler/console.sol"; interface IMigratorToChadSwap { // Perform LP token migration from legacy UniswapV2 to ChadSwap. // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. // Return the new LP token address. // // XXX Migrator must have allowance access to UniswapV2 LP tokens. // ChadSwap must mint EXACTLY the same amount of ChadSwap LP tokens or // else something bad will happen. Traditional UniswapV2 does not // do that so be careful! function migrate(IERC20 token) external returns (IERC20); } interface IStacyVaultRewardsLock { function lock(address _holder, uint256 _amount) external; function lockToBlock() external returns (uint256); } // Only true Chads can enter Stacy's vault. contract StacyVault is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 lastDepositBlock; // // We do some fancy math here. Basically, any point in time, the amount of STACYs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accStacyPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws tokens to a pool. Here's what happens: // 1. The pool's `accStacyPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 token; // Address of token contract. uint256 allocPoint; // How many allocation points assigned to this pool. STACYs to distribute per block. uint256 accStacyPerShare; // Accumulated STACYs per share, times 1e12. See below. bool withdrawable; // Is this pool withdrawable? mapping(address => mapping(address => uint256)) allowance; } IERC20 public stacy; // Dev address. address public devaddr; IStacyVaultRewardsLock public rewardsLock; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; //// pending rewards awaiting anyone to massUpdate uint256 public pendingRewards; uint256 public contractStartBlock; uint256 public epochCalculationStartBlock; uint256 public cumulativeRewardsSinceStart; uint256 public rewardsInThisEpoch; uint public epoch; uint256 public constant PERCENT_LOCK_BONUS_REWARD = 75; // lock 75% of bonus reward // Returns fees generated since start of this contract function averageFeesPerBlockSinceStart() external view returns (uint averagePerBlock) { averagePerBlock = cumulativeRewardsSinceStart.add(rewardsInThisEpoch).div(block.number.sub(contractStartBlock)); } // Returns averge fees in this epoch function averageFeesPerBlockEpoch() external view returns (uint256 averagePerBlock) { averagePerBlock = rewardsInThisEpoch.div(block.number.sub(epochCalculationStartBlock)); } // For easy graphing historical epoch rewards mapping(uint => uint256) public epochRewards; //Starts a new calculation epoch // Because averge since start will not be accurate function startNewEpoch() public { require(epochCalculationStartBlock + 50000 < block.number, "New epoch not ready yet"); // About a week epochRewards[epoch] = rewardsInThisEpoch; cumulativeRewardsSinceStart = cumulativeRewardsSinceStart.add(rewardsInThisEpoch); rewardsInThisEpoch = 0; epochCalculationStartBlock = block.number; ++epoch; } event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event Approval(address indexed owner, address indexed spender, uint256 _pid, uint256 value); constructor( IERC20 _stacy, IStacyVaultRewardsLock _rewardsLock, address _devaddr, address superAdmin ) public Ownable() { DEV_FEE = 500; // 5% (of the burn %) stacy = _stacy; rewardsLock = _rewardsLock; devaddr = _devaddr; contractStartBlock = block.number; _superAdmin = superAdmin; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new token pool. Can only be called by the owner. function add( uint256 _allocPoint, IERC20 _token, bool _withUpdate, bool _withdrawable ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { require(poolInfo[pid].token != _token,"Error pool already added"); } totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ token: _token, allocPoint: _allocPoint, accStacyPerShare: 0, withdrawable : _withdrawable }) ); } // Update the given pool's STACYs allocation point. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Update the given pool's ability to withdraw tokens function setPoolWithdrawable( uint256 _pid, bool _withdrawable ) public onlyOwner { poolInfo[_pid].withdrawable = _withdrawable; } function setRewardsLock(IStacyVaultRewardsLock _rewardsLock) public onlyOwner { rewardsLock = _rewardsLock; } // Sets the dev fee for this contract // defaults at 5.00% uint16 DEV_FEE; function setDevFee(uint16 _DEV_FEE) public onlyOwner { require(_DEV_FEE <= 1000, 'Dev fee clamped at 10%'); DEV_FEE = _DEV_FEE; } uint256 pending_DEV_rewards; // View function to see pending STACYs on frontend. function pendingStacy(uint256 _pid, address _user) public view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accStacyPerShare = pool.accStacyPerShare; return user.amount.mul(accStacyPerShare).div(1e12).sub(user.rewardDebt); } // Update reward vairables for all pools. Be careful of gas spending! function massUpdatePools() public { // console.log("Mass Updating Pools"); uint256 length = poolInfo.length; uint allRewards; for (uint256 pid = 0; pid < length; ++pid) { allRewards = allRewards.add(updatePool(pid)); } pendingRewards = pendingRewards.sub(allRewards); } // ---- // Function that adds pending rewards, called by the STACY token. // ---- uint256 private stacyBalance; function addPendingRewards(uint256 _) public { uint256 newRewards = stacy.balanceOf(address(this)).sub(stacyBalance); if (newRewards > 0) { stacyBalance = stacy.balanceOf(address(this)); // If there is no change the balance didn't change pendingRewards = pendingRewards.add(newRewards); rewardsInThisEpoch = rewardsInThisEpoch.add(newRewards); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal returns (uint256 stacyRewardWhole) { PoolInfo storage pool = poolInfo[_pid]; uint256 tokenSupply = pool.token.balanceOf(address(this)); if (tokenSupply == 0) { // avoids division by 0 errors return 0; } stacyRewardWhole = pendingRewards // Multiplies pending rewards by allocation point of this pool and then total allocation .mul(pool.allocPoint) // getting the percent of total pending rewards this pool should get .div(totalAllocPoint); // we can do this because pools are only mass updated uint256 stacyRewardFee = stacyRewardWhole.mul(DEV_FEE).div(10000); uint256 stacyRewardToDistribute = stacyRewardWhole.sub(stacyRewardFee); pending_DEV_rewards = pending_DEV_rewards.add(stacyRewardFee); pool.accStacyPerShare = pool.accStacyPerShare.add( stacyRewardToDistribute.mul(1e12).div(tokenSupply) ); } function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, msg.sender); // Transfer in the amounts from user // save gas if (_amount > 0) { pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); } user.rewardDebt = user.amount.mul(pool.accStacyPerShare).div(1e12); user.lastDepositBlock = block.number; emit Deposit(msg.sender, _pid, _amount); } // Test coverage // [x] Does user get the deposited amounts? // [x] Does user that its deposited for update correcty? // [x] Does the depositor get their tokens decreased function depositFor(address depositForAddress, uint256 _pid, uint256 _amount) public { // requires no allowances PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][depositForAddress]; massUpdatePools(); // Transfer pending tokens // to user updateAndPayOutPending(_pid, depositForAddress); // Update the balances of person that amount is being deposited for if(_amount > 0) { pool.token.safeTransferFrom(address(msg.sender), address(this), _amount); user.amount = user.amount.add(_amount); // This is depositedFor address } user.rewardDebt = user.amount.mul(pool.accStacyPerShare).div(1e12); /// This is deposited for address emit Deposit(depositForAddress, _pid, _amount); } // Test coverage // [x] Does allowance update correctly? function setAllowanceForPoolToken(address spender, uint256 _pid, uint256 value) public { PoolInfo storage pool = poolInfo[_pid]; pool.allowance[msg.sender][spender] = value; emit Approval(msg.sender, spender, _pid, value); } // Test coverage // [x] Does allowance decrease? // [x] Do oyu need allowance // [x] Withdraws to correct address function withdrawFrom(address owner, uint256 _pid, uint256 _amount) public{ PoolInfo storage pool = poolInfo[_pid]; require(pool.allowance[owner][msg.sender] >= _amount, "withdraw: insufficient allowance"); pool.allowance[owner][msg.sender] = pool.allowance[owner][msg.sender].sub(_amount); _withdraw(_pid, _amount, owner, msg.sender); } function withdraw(uint256 _pid, uint256 _amount) public { _withdraw(_pid, _amount, msg.sender, msg.sender); } // Low level withdraw function function _withdraw(uint256 _pid, uint256 _amount, address from, address to) internal { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][from]; require(user.amount >= _amount, "withdraw: not good"); require(block.number > user.lastDepositBlock, "withdraw: same block as deposit"); massUpdatePools(); updateAndPayOutPending(_pid, from); // Update balances of from this is not withdrawal but claiming STACY farmed if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.token.safeTransfer(address(to), _amount); } user.rewardDebt = user.amount.mul(pool.accStacyPerShare).div(1e12); emit Withdraw(to, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. // !Caution this will remove all your pending rewards! function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; require(pool.withdrawable, "Withdrawing from this pool is disabled"); UserInfo storage user = userInfo[_pid][msg.sender]; pool.token.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; // No mass update dont update pending rewards } function updateAndPayOutPending(uint256 _pid, address _addr) internal { uint256 pending = pendingStacy(_pid, _addr); if (pending > 0) { uint256 stacyBal = stacy.balanceOf(address(this)); uint256 availableAmountToTransfer = pending > stacyBal ? stacyBal : pending; // if (block.number < rewardsLock.lockToBlock()) {} uint256 lockAmount = availableAmountToTransfer.mul(PERCENT_LOCK_BONUS_REWARD).div(100); // Transfer 25% immediately stacy.transfer(_addr, availableAmountToTransfer.sub(lockAmount)); // Lock the remaining 75% in the vault rewards lock contract stacy.safeApprove(address(rewardsLock), lockAmount); // console.log("lockAmount", lockAmount, "amountTransferred", availableAmountToTransfer); rewardsLock.lock(_addr, lockAmount); stacy.safeApprove(address(rewardsLock), 0); // Book keeping stacyBalance = stacy.balanceOf(address(this)); transferDevFee(); } } // function that lets owner/governance contract // approve allowance for any token inside this contract // This means all future UNI like airdrops are covered // And at the same time allows us to give allowance to strategy contracts. // Upcoming cYFI etc vaults strategy contracts will se this function to manage and farm yield on value locked function setStrategyContractOrDistributionContractAllowance(address tokenAddress, uint256 _amount, address contractAddress) public onlySuperAdmin { require(isContract(contractAddress), "Recipent is not a smart contract, BAD"); require(block.number > contractStartBlock.add(95_000), "Governance setup grace period not over"); // about 2weeks IERC20(tokenAddress).approve(contractAddress, _amount); } function isContract(address addr) public returns (bool) { uint size; assembly { size := extcodesize(addr) } return size > 0; } // Safe stacy transfer function, just in case if rounding error causes pool to not have enough STACYs. function safeStacyTransfer(address _to, uint256 _amount) internal returns (uint256 amountToTransfer) { uint256 stacyBal = stacy.balanceOf(address(this)); amountToTransfer = _amount > stacyBal ? stacyBal : _amount; stacy.transfer(_to, amountToTransfer); stacyBalance = stacy.balanceOf(address(this)); transferDevFee(); return amountToTransfer; } function transferDevFee() public { if (pending_DEV_rewards == 0) { return; } uint256 stacyBal = stacy.balanceOf(address(this)); if (pending_DEV_rewards > stacyBal) { stacy.transfer(devaddr, stacyBal); stacyBalance = stacy.balanceOf(address(this)); } else { stacy.transfer(devaddr, pending_DEV_rewards); stacyBalance = stacy.balanceOf(address(this)); } pending_DEV_rewards = 0; } // Update dev address by the previous dev. // Note onlyOwner functions are meant for the governance contract function setDevFeeReciever(address _devaddr) public onlyOwner { devaddr = _devaddr; } address private _superAdmin; event SuperAdminTransfered(address indexed previousOwner, address indexed newOwner); /** * @dev Returns the address of the current super admin */ function superAdmin() public view returns (address) { return _superAdmin; } /** * @dev Throws if called by any account other than the superAdmin */ modifier onlySuperAdmin() { require(_superAdmin == _msgSender(), "Super admin : caller is not super admin."); _; } // Assisns super admint to address 0, making it unreachable forever function burnSuperAdmin() public virtual onlySuperAdmin { emit SuperAdminTransfered(_superAdmin, address(0)); _superAdmin = address(0); } // Super admin can transfer its powers to another address function newSuperAdmin(address newOwner) public virtual onlySuperAdmin { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit SuperAdminTransfered(_superAdmin, newOwner); _superAdmin = newOwner; } // ChadSwap hooks IMigratorToChadSwap public migrator; function setMigrator(IMigratorToChadSwap _migrator) public onlyOwner { migrator = _migrator; } function migrate(uint256 _pid) public { require(address(migrator) != address(0), "migrate: no migrator"); PoolInfo storage pool = poolInfo[_pid]; IERC20 lpToken = pool.token; uint256 bal = lpToken.balanceOf(address(this)); lpToken.safeApprove(address(migrator), bal); IERC20 newLpToken = migrator.migrate(lpToken); require(bal == newLpToken.balanceOf(address(this)), "migrate: bad"); pool.token = newLpToken; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_stacy","type":"address"},{"internalType":"contract IStacyVaultRewardsLock","name":"_rewardsLock","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"address","name":"superAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"SuperAdminTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PERCENT_LOCK_BONUS_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_","type":"uint256"}],"name":"addPendingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"averageFeesPerBlockEpoch","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"averageFeesPerBlockSinceStart","outputs":[{"internalType":"uint256","name":"averagePerBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cumulativeRewardsSinceStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositForAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochCalculationStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigratorToChadSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"newSuperAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingStacy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"accStacyPerShare","type":"uint256"},{"internalType":"bool","name":"withdrawable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsInThisEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsLock","outputs":[{"internalType":"contract IStacyVaultRewardsLock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setAllowanceForPoolToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_DEV_FEE","type":"uint16"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"setDevFeeReciever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMigratorToChadSwap","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_withdrawable","type":"bool"}],"name":"setPoolWithdrawable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStacyVaultRewardsLock","name":"_rewardsLock","type":"address"}],"name":"setRewardsLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setStrategyContractOrDistributionContractAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stacy","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startNewEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"lastDepositBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004c8638038062004c86833981810160405260808110156200003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050506000620000786200024a60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506101f4600e60006101000a81548161ffff021916908361ffff16021790555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504360088190555080601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000252565b600033905090565b614a2480620002626000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c8063608c8d3a1161015c57806395fdf258116100ce578063d49e77cd11610087578063d49e77cd14610a97578063dbe0901f14610acb578063e18cb4fe14610b23578063e2bbb15814610b55578063eded3fda14610b8d578063f2fde38b14610bab5761027f565b806395fdf258146109255780639dbc2d9014610943578063a676860a14610961578063c4014588146109a5578063c507aeaa14610a13578063c8ffb87314610a795761027f565b80637cd07e47116101205780637cd07e47146107e157806384fbe8b9146108155780638da5cb5b14610859578063900cf0cf1461088d578063934eaa50146108ab57806393f1a40b146108b55761027f565b8063608c8d3a1461073757806361c7a1cc14610755578063630b5ba11461078957806364482f7914610793578063715018a6146107d75761027f565b80633b67f03a116101f557806349c5468d116101b957806349c5468d146105f95780634cf5fbf5146106175780634dc47d341461066f5780635207cc0d146106b15780635312ea8e146106eb5780635d577c18146107195761027f565b80633b67f03a14610527578063423d6fa01461055b578063434339f314610589578063441a3e7014610593578063454b0608146105cb5761027f565b80631d14841d116102475780631d14841d146103a757806323cf31181461040957806329575f6a1461044d5780632d6754e5146104815780633a0967cd146104c55780633aab0a621461051d5761027f565b806303dec00914610284578063081e3eda146102a25780631526fe27146102c0578063162790551461032f57806317caf6f114610389575b600080fd5b61028c610bef565b6040518082815260200191505060405180910390f35b6102aa610c1f565b6040518082815260200191505060405180910390f35b6102ec600480360360208110156102d657600080fd5b8101908080359060200190929190505050610c2c565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b6103716004803603602081101561034557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c96565b60405180821515815260200191505060405180910390f35b610391610ca9565b6040518082815260200191505060405180910390f35b6103f3600480360360408110156103bd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610caf565b6040518082815260200191505060405180910390f35b61044b6004803603602081101561041f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d7b565b005b610455610e87565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104c36004803603602081101561049757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610eb1565b005b61051b600480360360608110156104db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610fbd565b005b6105256111f5565b005b61052f6112ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105876004803603602081101561057157600080fd5b81019080803590602001909291905050506112f0565b005b6105916114da565b005b6105c9600480360360408110156105a957600080fd5b810190808035906020019092919080359060200190929190505050611946565b005b6105f7600480360360208110156105e157600080fd5b8101908080359060200190929190505050611956565b005b610601611d80565b6040518082815260200191505060405180910390f35b61066d6004803603606081101561062d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611d86565b005b61069b6004803603602081101561068557600080fd5b8101908080359060200190929190505050611f15565b6040518082815260200191505060405180910390f35b6106e9600480360360408110156106c757600080fd5b8101908080359060200190929190803515159060200190929190505050611f2d565b005b6107176004803603602081101561070157600080fd5b810190808035906020019092919050505061202f565b005b6107216121c8565b6040518082815260200191505060405180910390f35b61073f6121ce565b6040518082815260200191505060405180910390f35b61075d6121d4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107916121fa565b005b6107d5600480360360608110156107a957600080fd5b81019080803590602001909291908035906020019092919080351515906020019092919050505061225c565b005b6107df6123a6565b005b6107e961252c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108576004803603602081101561082b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612552565b005b61086161265e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610895612687565b6040518082815260200191505060405180910390f35b6108b361268d565b005b610901600480360360408110156108cb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127fb565b60405180848152602001838152602001828152602001935050505060405180910390f35b61092d612832565b6040518082815260200191505060405180910390f35b61094b612837565b6040518082815260200191505060405180910390f35b6109a36004803603602081101561097757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061287b565b005b610a11600480360360608110156109bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a6e565b005b610a7760048036036080811015610a2957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050612c9a565b005b610a81612f76565b6040518082815260200191505060405180910390f35b610a9f612f7c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b2160048036036060811015610ae157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612fa2565b005b610b5360048036036020811015610b3957600080fd5b81019080803561ffff1690602001909291905050506130b7565b005b610b8b60048036036040811015610b6b57600080fd5b81019080803590602001909291908035906020019092919050505061321b565b005b610b956133b2565b6040518082815260200191505060405180910390f35b610bed60048036036020811015610bc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133b8565b005b6000610c1a610c09600954436135c390919063ffffffff16565b600b5461360d90919063ffffffff16565b905090565b6000600480549050905090565b60048181548110610c3957fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b600080823b905060008111915050919050565b60065481565b60008060048481548110610cbf57fe5b9060005260206000209060050201905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600201549050610d708260010154610d6264e8d4a51000610d5485876000015461365790919063ffffffff16565b61360d90919063ffffffff16565b6135c390919063ffffffff16565b935050505092915050565b610d836136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e43576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eb96136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060048381548110610fcc57fe5b90600052602060002090600502019050818160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f77697468647261773a20696e73756666696369656e7420616c6c6f77616e636581525060200191505060405180910390fd5b611161828260040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135c390919063ffffffff16565b8160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111ef838386336136e5565b50505050565b4361c3506009540110611270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772065706f6368206e6f742072656164792079657400000000000000000081525060200191505060405180910390fd5b600b54600d6000600c548152602001908152602001600020819055506112a3600b54600a546139cd90919063ffffffff16565b600a819055506000600b8190555043600981905550600c6000815460010191905081905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113ca601054600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561138157600080fd5b505afa158015611395573d6000803e3d6000fd5b505050506040513d60208110156113ab57600080fd5b81019080805190602001909291905050506135c390919063ffffffff16565b905060008111156114d657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d602081101561148857600080fd5b81019080805190602001909291905050506010819055506114b4816007546139cd90919063ffffffff16565b6007819055506114cf81600b546139cd90919063ffffffff16565b600b819055505b5050565b6000600f5414156114ea57611944565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561157557600080fd5b505afa158015611589573d6000803e3d6000fd5b505050506040513d602081101561159f57600080fd5b8101908080519060200190929190505050905080600f54111561177c57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b505050506040513d602081101561169b57600080fd5b810190808051906020019092919050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561173657600080fd5b505afa15801561174a573d6000803e3d6000fd5b505050506040513d602081101561176057600080fd5b810190808051906020019092919050505060108190555061193a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561183357600080fd5b505af1158015611847573d6000803e3d6000fd5b505050506040513d602081101561185d57600080fd5b810190808051906020019092919050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118f857600080fd5b505afa15801561190c573d6000803e3d6000fd5b505050506040513d602081101561192257600080fd5b81019080805190602001909291905050506010819055505b6000600f81905550505b565b611952828233336136e5565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b600060048281548110611a2a57fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611acc57600080fd5b505afa158015611ae0573d6000803e3d6000fd5b505050506040513d6020811015611af657600080fd5b81019080805190602001909291905050509050611b56601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613a559092919063ffffffff16565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015611be357600080fd5b505af1158015611bf7573d6000803e3d6000fd5b505050506040513d6020811015611c0d57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c8757600080fd5b505afa158015611c9b573d6000803e3d6000fd5b505050506040513d6020811015611cb157600080fd5b81019080805190602001909291905050508214611d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60085481565b600060048381548110611d9557fe5b9060005260206000209060050201905060006005600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611e016121fa565b611e0b8486613c1a565b6000831115611e8557611e653330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661407d909392919063ffffffff16565b611e7c8382600001546139cd90919063ffffffff16565b81600001819055505b611eb764e8d4a51000611ea98460020154846000015461365790919063ffffffff16565b61360d90919063ffffffff16565b8160010181905550838573ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a35050505050565b600d6020528060005260406000206000915090505481565b611f356136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806004838154811061200357fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055505050565b60006004828154811061203e57fe5b906000526020600020906005020190508060030160009054906101000a900460ff166120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149436026913960400191505060405180910390fd5b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061215c3382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661413e9092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b60095481565b600b5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006004805490509050600080600090505b8281101561223c5761222f612220826141e0565b836139cd90919063ffffffff16565b915080600101905061220c565b50612252816007546135c390919063ffffffff16565b6007819055505050565b6122646136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015612333576123326121fa565b5b6123788261236a6004868154811061234757fe5b9060005260206000209060050201600101546006546135c390919063ffffffff16565b6139cd90919063ffffffff16565b600681905550816004848154811061238c57fe5b906000526020600020906005020160010181905550505050565b6123ae6136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461246e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61255a6136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461261a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b6126956136dd565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461273a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148fa6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a36000601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b604b81565b6000612876612851600854436135c390919063ffffffff16565b612868600b54600a546139cd90919063ffffffff16565b61360d90919063ffffffff16565b905090565b6128836136dd565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612928576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148fa6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148af6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a380601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612a766136dd565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148fa6028913960400191505060405180910390fd5b612b2481610c96565b612b79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148d56025913960400191505060405180910390fd5b612b91620173186008546139cd90919063ffffffff16565b4311612be8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149696026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612c5957600080fd5b505af1158015612c6d573d6000803e3d6000fd5b505050506040513d6020811015612c8357600080fd5b810190808051906020019092919050505050505050565b612ca26136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8115612d7157612d706121fa565b5b6000600480549050905060005b81811015612e71578473ffffffffffffffffffffffffffffffffffffffff1660048281548110612daa57fe5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4572726f7220706f6f6c20616c7265616479206164646564000000000000000081525060200191505060405180910390fd5b806001019050612d7e565b50612e87856006546139cd90919063ffffffff16565b600681905550600460405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200160008152602001841515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505050505050565b600a5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060048381548110612fb157fe5b90600052602060002090600502019050818160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a78585604051808381526020018281526020019250505060405180910390a350505050565b6130bf6136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461317f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e88161ffff1611156131fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4465762066656520636c616d706564206174203130250000000000000000000081525060200191505060405180910390fd5b80600e60006101000a81548161ffff021916908361ffff16021790555050565b60006004838154811061322a57fe5b9060005260206000209060050201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506132966121fa565b6132a08433613c1a565b600083111561331a576132fa3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661407d909392919063ffffffff16565b6133118382600001546139cd90919063ffffffff16565b81600001819055505b61334c64e8d4a5100061333e8460020154846000015461365790919063ffffffff16565b61360d90919063ffffffff16565b8160010181905550438160020181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b60075481565b6133c06136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148af6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061360583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506143d0565b905092915050565b600061364f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614490565b905092915050565b60008083141561366a57600090506136d7565b600082840290508284828161367b57fe5b04146136d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149226021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b6000600485815481106136f457fe5b906000526020600020906005020190508060030160009054906101000a900460ff1661376b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149436026913960400191505060405180910390fd5b60006005600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508481600001541015613839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b806002015443116138b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f77697468647261773a2073616d6520626c6f636b206173206465706f7369740081525060200191505060405180910390fd5b6138ba6121fa565b6138c48685613c1a565b600085111561393c576138e48582600001546135c390919063ffffffff16565b816000018190555061393b83868460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661413e9092919063ffffffff16565b5b61396e64e8d4a510006139608460020154846000015461365790919063ffffffff16565b61360d90919063ffffffff16565b8160010181905550858373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568876040518082815260200191505060405180910390a3505050505050565b600080828401905083811015613a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000811480613b23575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015613ae657600080fd5b505afa158015613afa573d6000803e3d6000fd5b505050506040513d6020811015613b1057600080fd5b8101908080519060200190929190505050145b613b78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806149b96036913960400191505060405180910390fd5b613c158363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614556565b505050565b6000613c268383610caf565b90506000811115614078576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613cbc57600080fd5b505afa158015613cd0573d6000803e3d6000fd5b505050506040513d6020811015613ce657600080fd5b810190808051906020019092919050505090506000818311613d085782613d0a565b815b90506000613d356064613d27604b8561365790919063ffffffff16565b61360d90919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86613d8984866135c390919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613ddc57600080fd5b505af1158015613df0573d6000803e3d6000fd5b505050506040513d6020811015613e0657600080fd5b810190808051906020019092919050505050613e87600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a559092919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663282d3fdf86836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613f1a57600080fd5b505af1158015613f2e573d6000803e3d6000fd5b50505050613fa2600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a559092919063ffffffff16565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402b57600080fd5b505afa15801561403f573d6000803e3d6000fd5b505050506040513d602081101561405557600080fd5b81019080805190602001909291905050506010819055506140746114da565b5050505b505050565b614138846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614556565b50505050565b6141db8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614556565b505050565b600080600483815481106141f057fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561428d57600080fd5b505afa1580156142a1573d6000803e3d6000fd5b505050506040513d60208110156142b757600080fd5b8101908080519060200190929190505050905060008114156142de576000925050506143cb565b61430b6006546142fd846001015460075461365790919063ffffffff16565b61360d90919063ffffffff16565b9250600061434a61271061433c600e60009054906101000a900461ffff1661ffff168761365790919063ffffffff16565b61360d90919063ffffffff16565b9050600061436182866135c390919063ffffffff16565b905061437882600f546139cd90919063ffffffff16565b600f819055506143be6143ab8461439d64e8d4a510008561365790919063ffffffff16565b61360d90919063ffffffff16565b85600201546139cd90919063ffffffff16565b8460020181905550505050505b919050565b600083831115829061447d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614442578082015181840152602081019050614427565b50505050905090810190601f16801561446f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808311829061453c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145015780820151818401526020810190506144e6565b50505050905090810190601f16801561452e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161454857fe5b049050809150509392505050565b60606145b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146459092919063ffffffff16565b9050600081511115614640578080602001905160208110156145d957600080fd5b810190808051906020019092919050505061463f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061498f602a913960400191505060405180910390fd5b5b505050565b6060614654848460008561465d565b90509392505050565b606061466885614863565b6146da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061472a5780518252602082019150602081019050602083039250614707565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461478c576040519150601f19603f3d011682016040523d82523d6000602084013e614791565b606091505b509150915081156147a657809250505061485b565b6000815111156147b95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614820578082015181840152602081019050614805565b50505050905090810190601f16801561484d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156148a557506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c2042414453757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122095db9f7d47e3b3f71e156f532c2e509ac0ce84e245063a8a2df39415781fd98164736f6c634300060c0033000000000000000000000000f12ec0d3dab64ddefbdc96474bde25af3fe1b327000000000000000000000000222207e931d7bf38466c395da30e632872a98ae60000000000000000000000008aef57fe9d16be8f24df37ab56da6ec18f7e9a080000000000000000000000008aef57fe9d16be8f24df37ab56da6ec18f7e9a08
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c8063608c8d3a1161015c57806395fdf258116100ce578063d49e77cd11610087578063d49e77cd14610a97578063dbe0901f14610acb578063e18cb4fe14610b23578063e2bbb15814610b55578063eded3fda14610b8d578063f2fde38b14610bab5761027f565b806395fdf258146109255780639dbc2d9014610943578063a676860a14610961578063c4014588146109a5578063c507aeaa14610a13578063c8ffb87314610a795761027f565b80637cd07e47116101205780637cd07e47146107e157806384fbe8b9146108155780638da5cb5b14610859578063900cf0cf1461088d578063934eaa50146108ab57806393f1a40b146108b55761027f565b8063608c8d3a1461073757806361c7a1cc14610755578063630b5ba11461078957806364482f7914610793578063715018a6146107d75761027f565b80633b67f03a116101f557806349c5468d116101b957806349c5468d146105f95780634cf5fbf5146106175780634dc47d341461066f5780635207cc0d146106b15780635312ea8e146106eb5780635d577c18146107195761027f565b80633b67f03a14610527578063423d6fa01461055b578063434339f314610589578063441a3e7014610593578063454b0608146105cb5761027f565b80631d14841d116102475780631d14841d146103a757806323cf31181461040957806329575f6a1461044d5780632d6754e5146104815780633a0967cd146104c55780633aab0a621461051d5761027f565b806303dec00914610284578063081e3eda146102a25780631526fe27146102c0578063162790551461032f57806317caf6f114610389575b600080fd5b61028c610bef565b6040518082815260200191505060405180910390f35b6102aa610c1f565b6040518082815260200191505060405180910390f35b6102ec600480360360208110156102d657600080fd5b8101908080359060200190929190505050610c2c565b604051808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001838152602001821515815260200194505050505060405180910390f35b6103716004803603602081101561034557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c96565b60405180821515815260200191505060405180910390f35b610391610ca9565b6040518082815260200191505060405180910390f35b6103f3600480360360408110156103bd57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610caf565b6040518082815260200191505060405180910390f35b61044b6004803603602081101561041f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d7b565b005b610455610e87565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104c36004803603602081101561049757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610eb1565b005b61051b600480360360608110156104db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610fbd565b005b6105256111f5565b005b61052f6112ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105876004803603602081101561057157600080fd5b81019080803590602001909291905050506112f0565b005b6105916114da565b005b6105c9600480360360408110156105a957600080fd5b810190808035906020019092919080359060200190929190505050611946565b005b6105f7600480360360208110156105e157600080fd5b8101908080359060200190929190505050611956565b005b610601611d80565b6040518082815260200191505060405180910390f35b61066d6004803603606081101561062d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611d86565b005b61069b6004803603602081101561068557600080fd5b8101908080359060200190929190505050611f15565b6040518082815260200191505060405180910390f35b6106e9600480360360408110156106c757600080fd5b8101908080359060200190929190803515159060200190929190505050611f2d565b005b6107176004803603602081101561070157600080fd5b810190808035906020019092919050505061202f565b005b6107216121c8565b6040518082815260200191505060405180910390f35b61073f6121ce565b6040518082815260200191505060405180910390f35b61075d6121d4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107916121fa565b005b6107d5600480360360608110156107a957600080fd5b81019080803590602001909291908035906020019092919080351515906020019092919050505061225c565b005b6107df6123a6565b005b6107e961252c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108576004803603602081101561082b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612552565b005b61086161265e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610895612687565b6040518082815260200191505060405180910390f35b6108b361268d565b005b610901600480360360408110156108cb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506127fb565b60405180848152602001838152602001828152602001935050505060405180910390f35b61092d612832565b6040518082815260200191505060405180910390f35b61094b612837565b6040518082815260200191505060405180910390f35b6109a36004803603602081101561097757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061287b565b005b610a11600480360360608110156109bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a6e565b005b610a7760048036036080811015610a2957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050612c9a565b005b610a81612f76565b6040518082815260200191505060405180910390f35b610a9f612f7c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b2160048036036060811015610ae157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612fa2565b005b610b5360048036036020811015610b3957600080fd5b81019080803561ffff1690602001909291905050506130b7565b005b610b8b60048036036040811015610b6b57600080fd5b81019080803590602001909291908035906020019092919050505061321b565b005b610b956133b2565b6040518082815260200191505060405180910390f35b610bed60048036036020811015610bc157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506133b8565b005b6000610c1a610c09600954436135c390919063ffffffff16565b600b5461360d90919063ffffffff16565b905090565b6000600480549050905090565b60048181548110610c3957fe5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030160009054906101000a900460ff16905084565b600080823b905060008111915050919050565b60065481565b60008060048481548110610cbf57fe5b9060005260206000209060050201905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600082600201549050610d708260010154610d6264e8d4a51000610d5485876000015461365790919063ffffffff16565b61360d90919063ffffffff16565b6135c390919063ffffffff16565b935050505092915050565b610d836136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e43576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eb96136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060048381548110610fcc57fe5b90600052602060002090600502019050818160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f77697468647261773a20696e73756666696369656e7420616c6c6f77616e636581525060200191505060405180910390fd5b611161828260040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135c390919063ffffffff16565b8160040160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506111ef838386336136e5565b50505050565b4361c3506009540110611270576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e65772065706f6368206e6f742072656164792079657400000000000000000081525060200191505060405180910390fd5b600b54600d6000600c548152602001908152602001600020819055506112a3600b54600a546139cd90919063ffffffff16565b600a819055506000600b8190555043600981905550600c6000815460010191905081905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006113ca601054600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561138157600080fd5b505afa158015611395573d6000803e3d6000fd5b505050506040513d60208110156113ab57600080fd5b81019080805190602001909291905050506135c390919063ffffffff16565b905060008111156114d657600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d602081101561148857600080fd5b81019080805190602001909291905050506010819055506114b4816007546139cd90919063ffffffff16565b6007819055506114cf81600b546139cd90919063ffffffff16565b600b819055505b5050565b6000600f5414156114ea57611944565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561157557600080fd5b505afa158015611589573d6000803e3d6000fd5b505050506040513d602081101561159f57600080fd5b8101908080519060200190929190505050905080600f54111561177c57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b505050506040513d602081101561169b57600080fd5b810190808051906020019092919050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561173657600080fd5b505afa15801561174a573d6000803e3d6000fd5b505050506040513d602081101561176057600080fd5b810190808051906020019092919050505060108190555061193a565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561183357600080fd5b505af1158015611847573d6000803e3d6000fd5b505050506040513d602081101561185d57600080fd5b810190808051906020019092919050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118f857600080fd5b505afa15801561190c573d6000803e3d6000fd5b505050506040513d602081101561192257600080fd5b81019080805190602001909291905050506010819055505b6000600f81905550505b565b611952828233336136e5565b5050565b600073ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6d6967726174653a206e6f206d69677261746f7200000000000000000000000081525060200191505060405180910390fd5b600060048281548110611a2a57fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611acc57600080fd5b505afa158015611ae0573d6000803e3d6000fd5b505050506040513d6020811015611af657600080fd5b81019080805190602001909291905050509050611b56601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828473ffffffffffffffffffffffffffffffffffffffff16613a559092919063ffffffff16565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ce5494bb846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015611be357600080fd5b505af1158015611bf7573d6000803e3d6000fd5b505050506040513d6020811015611c0d57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c8757600080fd5b505afa158015611c9b573d6000803e3d6000fd5b505050506040513d6020811015611cb157600080fd5b81019080805190602001909291905050508214611d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6d6967726174653a20626164000000000000000000000000000000000000000081525060200191505060405180910390fd5b808460000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60085481565b600060048381548110611d9557fe5b9060005260206000209060050201905060006005600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611e016121fa565b611e0b8486613c1a565b6000831115611e8557611e653330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661407d909392919063ffffffff16565b611e7c8382600001546139cd90919063ffffffff16565b81600001819055505b611eb764e8d4a51000611ea98460020154846000015461365790919063ffffffff16565b61360d90919063ffffffff16565b8160010181905550838573ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a35050505050565b600d6020528060005260406000206000915090505481565b611f356136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b806004838154811061200357fe5b906000526020600020906005020160030160006101000a81548160ff0219169083151502179055505050565b60006004828154811061203e57fe5b906000526020600020906005020190508060030160009054906101000a900460ff166120b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149436026913960400191505060405180910390fd5b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061215c3382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661413e9092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040518082815260200191505060405180910390a36000816000018190555060008160010181905550505050565b60095481565b600b5481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006004805490509050600080600090505b8281101561223c5761222f612220826141e0565b836139cd90919063ffffffff16565b915080600101905061220c565b50612252816007546135c390919063ffffffff16565b6007819055505050565b6122646136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8015612333576123326121fa565b5b6123788261236a6004868154811061234757fe5b9060005260206000209060050201600101546006546135c390919063ffffffff16565b6139cd90919063ffffffff16565b600681905550816004848154811061238c57fe5b906000526020600020906005020160010181905550505050565b6123ae6136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461246e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61255a6136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461261a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c5481565b6126956136dd565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461273a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148fa6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a36000601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b604b81565b6000612876612851600854436135c390919063ffffffff16565b612868600b54600a546139cd90919063ffffffff16565b61360d90919063ffffffff16565b905090565b6128836136dd565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612928576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148fa6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156129ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148af6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff564c40f4f45e62a2c1e6c22e8bfb46501f0f71fa1c72e5358903fa1115a4b6460405160405180910390a380601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612a766136dd565b73ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b1b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148fa6028913960400191505060405180910390fd5b612b2481610c96565b612b79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806148d56025913960400191505060405180910390fd5b612b91620173186008546139cd90919063ffffffff16565b4311612be8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149696026913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612c5957600080fd5b505af1158015612c6d573d6000803e3d6000fd5b505050506040513d6020811015612c8357600080fd5b810190808051906020019092919050505050505050565b612ca26136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8115612d7157612d706121fa565b5b6000600480549050905060005b81811015612e71578473ffffffffffffffffffffffffffffffffffffffff1660048281548110612daa57fe5b906000526020600020906005020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e66576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4572726f7220706f6f6c20616c7265616479206164646564000000000000000081525060200191505060405180910390fd5b806001019050612d7e565b50612e87856006546139cd90919063ffffffff16565b600681905550600460405180608001604052808673ffffffffffffffffffffffffffffffffffffffff16815260200187815260200160008152602001841515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002015560608201518160030160006101000a81548160ff02191690831515021790555050505050505050565b600a5481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060048381548110612fb157fe5b90600052602060002090600502019050818160040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb3fd5071835887567a0671151121894ddccc2842f1d10bedad13e0d17cace9a78585604051808381526020018281526020019250505060405180910390a350505050565b6130bf6136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461317f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6103e88161ffff1611156131fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4465762066656520636c616d706564206174203130250000000000000000000081525060200191505060405180910390fd5b80600e60006101000a81548161ffff021916908361ffff16021790555050565b60006004838154811061322a57fe5b9060005260206000209060050201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506132966121fa565b6132a08433613c1a565b600083111561331a576132fa3330858560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661407d909392919063ffffffff16565b6133118382600001546139cd90919063ffffffff16565b81600001819055505b61334c64e8d4a5100061333e8460020154846000015461365790919063ffffffff16565b61360d90919063ffffffff16565b8160010181905550438160020181905550833373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15856040518082815260200191505060405180910390a350505050565b60075481565b6133c06136dd565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613480576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806148af6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061360583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506143d0565b905092915050565b600061364f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614490565b905092915050565b60008083141561366a57600090506136d7565b600082840290508284828161367b57fe5b04146136d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149226021913960400191505060405180910390fd5b809150505b92915050565b600033905090565b6000600485815481106136f457fe5b906000526020600020906005020190508060030160009054906101000a900460ff1661376b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149436026913960400191505060405180910390fd5b60006005600087815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508481600001541015613839576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f77697468647261773a206e6f7420676f6f64000000000000000000000000000081525060200191505060405180910390fd5b806002015443116138b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f77697468647261773a2073616d6520626c6f636b206173206465706f7369740081525060200191505060405180910390fd5b6138ba6121fa565b6138c48685613c1a565b600085111561393c576138e48582600001546135c390919063ffffffff16565b816000018190555061393b83868460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661413e9092919063ffffffff16565b5b61396e64e8d4a510006139608460020154846000015461365790919063ffffffff16565b61360d90919063ffffffff16565b8160010181905550858373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568876040518082815260200191505060405180910390a3505050505050565b600080828401905083811015613a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000811480613b23575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015613ae657600080fd5b505afa158015613afa573d6000803e3d6000fd5b505050506040513d6020811015613b1057600080fd5b8101908080519060200190929190505050145b613b78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806149b96036913960400191505060405180910390fd5b613c158363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614556565b505050565b6000613c268383610caf565b90506000811115614078576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613cbc57600080fd5b505afa158015613cd0573d6000803e3d6000fd5b505050506040513d6020811015613ce657600080fd5b810190808051906020019092919050505090506000818311613d085782613d0a565b815b90506000613d356064613d27604b8561365790919063ffffffff16565b61360d90919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86613d8984866135c390919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613ddc57600080fd5b505af1158015613df0573d6000803e3d6000fd5b505050506040513d6020811015613e0657600080fd5b810190808051906020019092919050505050613e87600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a559092919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663282d3fdf86836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613f1a57600080fd5b505af1158015613f2e573d6000803e3d6000fd5b50505050613fa2600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613a559092919063ffffffff16565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402b57600080fd5b505afa15801561403f573d6000803e3d6000fd5b505050506040513d602081101561405557600080fd5b81019080805190602001909291905050506010819055506140746114da565b5050505b505050565b614138846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614556565b50505050565b6141db8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614556565b505050565b600080600483815481106141f057fe5b9060005260206000209060050201905060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561428d57600080fd5b505afa1580156142a1573d6000803e3d6000fd5b505050506040513d60208110156142b757600080fd5b8101908080519060200190929190505050905060008114156142de576000925050506143cb565b61430b6006546142fd846001015460075461365790919063ffffffff16565b61360d90919063ffffffff16565b9250600061434a61271061433c600e60009054906101000a900461ffff1661ffff168761365790919063ffffffff16565b61360d90919063ffffffff16565b9050600061436182866135c390919063ffffffff16565b905061437882600f546139cd90919063ffffffff16565b600f819055506143be6143ab8461439d64e8d4a510008561365790919063ffffffff16565b61360d90919063ffffffff16565b85600201546139cd90919063ffffffff16565b8460020181905550505050505b919050565b600083831115829061447d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614442578082015181840152602081019050614427565b50505050905090810190601f16801561446f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808311829061453c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145015780820151818401526020810190506144e6565b50505050905090810190601f16801561452e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161454857fe5b049050809150509392505050565b60606145b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166146459092919063ffffffff16565b9050600081511115614640578080602001905160208110156145d957600080fd5b810190808051906020019092919050505061463f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061498f602a913960400191505060405180910390fd5b5b505050565b6060614654848460008561465d565b90509392505050565b606061466885614863565b6146da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061472a5780518252602082019150602081019050602083039250614707565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461478c576040519150601f19603f3d011682016040523d82523d6000602084013e614791565b606091505b509150915081156147a657809250505061485b565b6000815111156147b95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614820578082015181840152602081019050614805565b50505050905090810190601f16801561484d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156148a557506000801b8214155b9250505091905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265636970656e74206973206e6f74206120736d61727420636f6e74726163742c2042414453757065722061646d696e203a2063616c6c6572206973206e6f742073757065722061646d696e2e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775769746864726177696e672066726f6d207468697320706f6f6c2069732064697361626c6564476f7665726e616e636520736574757020677261636520706572696f64206e6f74206f7665725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a264697066735822122095db9f7d47e3b3f71e156f532c2e509ac0ce84e245063a8a2df39415781fd98164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f12ec0d3dab64ddefbdc96474bde25af3fe1b327000000000000000000000000222207e931d7bf38466c395da30e632872a98ae60000000000000000000000008aef57fe9d16be8f24df37ab56da6ec18f7e9a080000000000000000000000008aef57fe9d16be8f24df37ab56da6ec18f7e9a08
-----Decoded View---------------
Arg [0] : _stacy (address): 0xf12EC0D3Dab64DdEfBdC96474bDe25af3FE1B327
Arg [1] : _rewardsLock (address): 0x222207E931D7Bf38466C395DA30E632872a98aE6
Arg [2] : _devaddr (address): 0x8aEf57fe9d16BE8F24df37ab56da6eC18f7e9a08
Arg [3] : superAdmin (address): 0x8aEf57fe9d16BE8F24df37ab56da6eC18f7e9a08
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f12ec0d3dab64ddefbdc96474bde25af3fe1b327
Arg [1] : 000000000000000000000000222207e931d7bf38466c395da30e632872a98ae6
Arg [2] : 0000000000000000000000008aef57fe9d16be8f24df37ab56da6ec18f7e9a08
Arg [3] : 0000000000000000000000008aef57fe9d16be8f24df37ab56da6ec18f7e9a08
Deployed Bytecode Sourcemap
21863:18128:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24428:189;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26022:95;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23428:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36772:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23667:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28090:369;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39385:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38418:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38105:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32819:378;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24823:398;;;:::i;:::-;;23351:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29025:428;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37463:515;;;:::i;:::-;;33205:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39501:487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23800:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31495:851;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24676:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27441:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34361:488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23840:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23937:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23273:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28542:343;;;:::i;:::-;;27002:372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20410:148;;;:::i;:::-;;39341:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27616:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19768:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23977:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38822:160;;;:::i;:::-;;23508:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24003:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24154:216;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39053:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36334:430;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26189:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23888:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23320:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32421:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27837:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30548:748;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23762:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20713:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24428:189;24487:23;24541:68;24564:44;24581:26;;24564:12;:16;;:44;;;;:::i;:::-;24541:18;;:22;;:68;;;;:::i;:::-;24523:86;;24428:189;:::o;26022:95::-;26067:7;26094:8;:15;;;;26087:22;;26022:95;:::o;23428:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36772:158::-;36822:4;36839:9;36890:4;36878:17;36870:25;;36921:1;36914:4;:8;36907:15;;;36772:158;;;:::o;23667:30::-;;;;:::o;28090:369::-;28189:7;28214:21;28238:8;28247:4;28238:14;;;;;;;;;;;;;;;;;;28214:38;;28263:21;28287:8;:14;28296:4;28287:14;;;;;;;;;;;:21;28302:5;28287:21;;;;;;;;;;;;;;;28263:45;;28319:24;28346:4;:21;;;28319:48;;28387:64;28435:4;:15;;;28387:43;28425:4;28387:33;28403:16;28387:4;:11;;;:15;;:33;;;;:::i;:::-;:37;;:43;;;;:::i;:::-;:47;;:64;;;;:::i;:::-;28380:71;;;;;28090:369;;;;:::o;39385:108::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39476:9:::1;39465:8;;:20;;;;;;;;;;;;;;;;;;39385:108:::0;:::o;38418:89::-;38461:7;38488:11;;;;;;;;;;;38481:18;;38418:89;:::o;38105:99::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38188:8:::1;38178:7;;:18;;;;;;;;;;;;;;;;;;38105:99:::0;:::o;32819:378::-;32904:21;32928:8;32937:4;32928:14;;;;;;;;;;;;;;;;;;32904:38;;32998:7;32961:4;:14;;:21;32976:5;32961:21;;;;;;;;;;;;;;;:33;32983:10;32961:33;;;;;;;;;;;;;;;;:44;;32953:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33089:46;33127:7;33089:4;:14;;:21;33104:5;33089:21;;;;;;;;;;;;;;;:33;33111:10;33089:33;;;;;;;;;;;;;;;;:37;;:46;;;;:::i;:::-;33053:4;:14;;:21;33068:5;33053:21;;;;;;;;;;;;;;;:33;33075:10;33053:33;;;;;;;;;;;;;;;:82;;;;33146:43;33156:4;33162:7;33171:5;33178:10;33146:9;:43::i;:::-;32819:378;;;;:::o;24823:398::-;24911:12;24903:5;24874:26;;:34;:49;24866:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25000:18;;24978:12;:19;24991:5;;24978:19;;;;;;;;;;;:40;;;;25059:51;25091:18;;25059:27;;:31;;:51;;;;:::i;:::-;25029:27;:81;;;;25142:1;25121:18;:22;;;;25183:12;25154:26;:41;;;;25208:5;;25206:7;;;;;;;;;;;24823:398::o;23351:41::-;;;;;;;;;;;;;:::o;29025:428::-;29081:18;29102:48;29137:12;;29102:5;;;;;;;;;;;:15;;;29126:4;29102:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:34;;:48;;;;:::i;:::-;29081:69;;29188:1;29175:10;:14;29171:275;;;29221:5;;;;;;;;;;;:15;;;29245:4;29221:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29206:12;:45;;;;29334:30;29353:10;29334:14;;:18;;:30;;;;:::i;:::-;29317:14;:47;;;;29400:34;29423:10;29400:18;;:22;;:34;;;;:::i;:::-;29379:18;:55;;;;29171:275;29025:428;;:::o;37463:515::-;37534:1;37511:19;;:24;37507:63;;;37552:7;;37507:63;37582:16;37601:5;;;;;;;;;;;:15;;;37625:4;37601:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37582:49;;37668:8;37646:19;;:30;37642:293;;;37693:5;;;;;;;;;;;:14;;;37708:7;;;;;;;;;;;37717:8;37693:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37756:5;;;;;;;;;;;:15;;;37780:4;37756:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37741:12;:45;;;;37642:293;;;37819:5;;;;;;;;;;;:14;;;37834:7;;;;;;;;;;;37843:19;;37819:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37893:5;;;;;;;;;;;:15;;;37917:4;37893:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37878:12;:45;;;;37642:293;37969:1;37947:19;:23;;;;37463:515;;:::o;33205:123::-;33272:48;33282:4;33288:7;33297:10;33309;33272:9;:48::i;:::-;33205:123;;:::o;39501:487::-;39587:1;39558:31;;39566:8;;;;;;;;;;;39558:31;;;;39550:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39625:21;39649:8;39658:4;39649:14;;;;;;;;;;;;;;;;;;39625:38;;39674:14;39691:4;:10;;;;;;;;;;;;39674:27;;39712:11;39726:7;:17;;;39752:4;39726:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39712:46;;39769:43;39797:8;;;;;;;;;;;39808:3;39769:7;:19;;;;:43;;;;;:::i;:::-;39823:17;39843:8;;;;;;;;;;;:16;;;39860:7;39843:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39823:45;;39894:10;:20;;;39923:4;39894:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39887:3;:42;39879:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39970:10;39957:4;:10;;;:23;;;;;;;;;;;;;;;;;;39501:487;;;;;:::o;23800:33::-;;;;:::o;31495:851::-;31626:21;31650:8;31659:4;31650:14;;;;;;;;;;;;;;;;;;31626:38;;31675:21;31699:8;:14;31708:4;31699:14;;;;;;;;;;;:33;31714:17;31699:33;;;;;;;;;;;;;;;31675:57;;31745:17;:15;:17::i;:::-;31839:47;31862:4;31868:17;31839:22;:47::i;:::-;31980:1;31970:7;:11;31967:200;;;31998:72;32034:10;32055:4;32062:7;31998:4;:10;;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;32099:24;32115:7;32099:4;:11;;;:15;;:24;;;;:::i;:::-;32085:4;:11;;:38;;;;31967:200;32197:48;32240:4;32197:38;32213:4;:21;;;32197:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;32179:4;:15;;:66;;;;32322:4;32303:17;32295:41;;;32328:7;32295:41;;;;;;;;;;;;;;;;;;31495:851;;;;;:::o;24676:44::-;;;;;;;;;;;;;;;;;:::o;27441:167::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27587:13:::1;27557:8;27566:4;27557:14;;;;;;;;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;27441:167:::0;;:::o;34361:488::-;34420:21;34444:8;34453:4;34444:14;;;;;;;;;;;;;;;;;;34420:38;;34477:4;:17;;;;;;;;;;;;34469:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34548:21;34572:8;:14;34581:4;34572:14;;;;;;;;;;;:26;34587:10;34572:26;;;;;;;;;;;;;;;34548:50;;34609:57;34641:10;34654:4;:11;;;34609:4;:10;;;;;;;;;;;;:23;;;;:57;;;;;:::i;:::-;34712:4;34700:10;34682:48;;;34718:4;:11;;;34682:48;;;;;;;;;;;;;;;;;;34755:1;34741:4;:11;;:15;;;;34785:1;34767:4;:15;;:19;;;;34361:488;;;:::o;23840:41::-;;;;:::o;23937:33::-;;;;:::o;23273:19::-;;;;;;;;;;;;;:::o;28542:343::-;28635:14;28652:8;:15;;;;28635:32;;28678:15;28709:11;28723:1;28709:15;;28704:114;28732:6;28726:3;:12;28704:114;;;28775:31;28790:15;28801:3;28790:10;:15::i;:::-;28775:10;:14;;:31;;;;:::i;:::-;28762:44;;28740:5;;;;;28704:114;;;;28847:30;28866:10;28847:14;;:18;;:30;;;;:::i;:::-;28830:14;:47;;;;28542:343;;:::o;27002:372::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27134:11:::1;27130:61;;;27162:17;:15;:17::i;:::-;27130:61;27229:87;27294:11;27229:46;27249:8;27258:4;27249:14;;;;;;;;;;;;;;;;;;:25;;;27229:15;;:19;;:46;;;;:::i;:::-;:50;;:87;;;;:::i;:::-;27211:15;:105;;;;27355:11;27327:8;27336:4;27327:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;27002:372:::0;;;:::o;20410:148::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20517:1:::1;20480:40;;20501:6;::::0;::::1;;;;;;;;20480:40;;;;;;;;;;;;20548:1;20531:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;20410:148::o:0;39341:35::-;;;;;;;;;;;;;:::o;27616:123::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27719:12:::1;27705:11;;:26;;;;;;;;;;;;;;;;;;27616:123:::0;:::o;19768:79::-;19806:7;19833:6;;;;;;;;;;;19826:13;;19768:79;:::o;23977:17::-;;;;:::o;38822:160::-;38664:12;:10;:12::i;:::-;38649:27;;:11;;;;;;;;;;;:27;;;38641:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38936:1:::1;38894:45;;38915:11;;;;;;;;;;;38894:45;;;;;;;;;;;;38972:1;38950:11;;:24;;;;;;;;;;;;;;;;;;38822:160::o:0;23508:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24003:54::-;24055:2;24003:54;:::o;24154:216::-;24218:20;24269:93;24325:36;24342:18;;24325:12;:16;;:36;;;;:::i;:::-;24269:51;24301:18;;24269:27;;:31;;:51;;;;:::i;:::-;:55;;:93;;;;:::i;:::-;24251:111;;24154:216;:::o;39053:255::-;38664:12;:10;:12::i;:::-;38649:27;;:11;;;;;;;;;;;:27;;;38641:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39163:1:::1;39143:22;;:8;:22;;;;39135:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39258:8;39224:43;;39245:11;;;;;;;;;;;39224:43;;;;;;;;;;;;39292:8;39278:11;;:22;;;;;;;;;;;;;;;;;;39053:255:::0;:::o;36334:430::-;38664:12;:10;:12::i;:::-;38649:27;;:11;;;;;;;;;;;:27;;;38641:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36499:27:::1;36510:15;36499:10;:27::i;:::-;36491:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36602:30;36625:6;36602:18;;:22;;:30;;;;:::i;:::-;36587:12;:45;36579:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36709:12;36702:28;;;36731:15;36748:7;36702:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;36334:430:::0;;;:::o;26189:715::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26351:11:::1;26347:61;;;26379:17;:15;:17::i;:::-;26347:61;26420:14;26437:8;:15;;;;26420:32;;26468:11;26463:135;26491:6;26485:3;:12;26463:135;;;26552:6;26529:29;;:8;26538:3;26529:13;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;:29;;;;26521:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26499:5;;;;;26463:135;;;;26628:32;26648:11;26628:15;;:19;;:32;;;;:::i;:::-;26610:15;:50;;;;26673:8;26701:184;;;;;;;;26736:6;26701:184;;;;;;26773:11;26701:184;;;;26821:1;26701:184;;;;26856:13;26701:184;;;;::::0;26673:223:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20050:1;26189:715:::0;;;;:::o;23888:42::-;;;;:::o;23320:22::-;;;;;;;;;;;;;:::o;32421:256::-;32519:21;32543:8;32552:4;32543:14;;;;;;;;;;;;;;;;;;32519:38;;32606:5;32568:4;:14;;:26;32583:10;32568:26;;;;;;;;;;;;;;;:35;32595:7;32568:35;;;;;;;;;;;;;;;:43;;;;32648:7;32627:42;;32636:10;32627:42;;;32657:4;32663:5;32627:42;;;;;;;;;;;;;;;;;;;;;;;;32421:256;;;;:::o;27837:152::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27921:4:::1;27909:8;:16;;;;27901:51;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27973:8;27963:7;;:18;;;;;;;;;;;;;;;;;;27837:152:::0;:::o;30548:748::-;30616:21;30640:8;30649:4;30640:14;;;;;;;;;;;;;;;;;;30616:38;;30665:21;30689:8;:14;30698:4;30689:14;;;;;;;;;;;:26;30704:10;30689:26;;;;;;;;;;;;;;;30665:50;;30728:17;:15;:17::i;:::-;30822:40;30845:4;30851:10;30822:22;:40::i;:::-;30956:1;30946:7;:11;30942:169;;;30974:72;31010:10;31031:4;31038:7;30974:4;:10;;;;;;;;;;;;:27;;;;:72;;;;;;:::i;:::-;31075:24;31091:7;31075:4;:11;;;:15;;:24;;;;:::i;:::-;31061:4;:11;;:38;;;;30942:169;31143:48;31186:4;31143:38;31159:4;:21;;;31143:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;31125:4;:15;;:66;;;;31226:12;31202:4;:21;;:36;;;;31274:4;31262:10;31254:34;;;31280:7;31254:34;;;;;;;;;;;;;;;;;;30548:748;;;;:::o;23762:29::-;;;;:::o;20713:244::-;19990:12;:10;:12::i;:::-;19980:22;;:6;;;;;;;;;;:22;;;19972:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20822:1:::1;20802:22;;:8;:22;;;;20794:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20912:8;20883:38;;20904:6;::::0;::::1;;;;;;;;20883:38;;;;;;;;;;;;20941:8;20932:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;20713:244:::0;:::o;4056:136::-;4114:7;4141:43;4145:1;4148;4141:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4134:50;;4056:136;;;;:::o;5893:132::-;5951:7;5978:39;5982:1;5985;5978:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5971:46;;5893:132;;;;:::o;4946:471::-;5004:7;5254:1;5249;:6;5245:47;;;5279:1;5272:8;;;;5245:47;5304:9;5320:1;5316;:5;5304:17;;5349:1;5344;5340;:5;;;;;;:10;5332:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5408:1;5401:8;;;4946:471;;;;;:::o;18401:106::-;18454:15;18489:10;18482:17;;18401:106;:::o;33372:858::-;33468:21;33492:8;33501:4;33492:14;;;;;;;;;;;;;;;;;;33468:38;;33525:4;:17;;;;;;;;;;;;33517:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33596:21;33620:8;:14;33629:4;33620:14;;;;;;;;;;;:20;33635:4;33620:20;;;;;;;;;;;;;;;33596:44;;33674:7;33659:4;:11;;;:22;;33651:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33738:4;:21;;;33723:12;:36;33715:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33808:17;:15;:17::i;:::-;33836:34;33859:4;33865;33836:22;:34::i;:::-;33973:1;33963:7;:11;33959:142;;;34005:24;34021:7;34005:4;:11;;;:15;;:24;;;;:::i;:::-;33991:4;:11;;:38;;;;34044:45;34076:2;34081:7;34044:4;:10;;;;;;;;;;;;:23;;;;:45;;;;;:::i;:::-;33959:142;34129:48;34172:4;34129:38;34145:4;:21;;;34129:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48;;;;:::i;:::-;34111:4;:15;;:66;;;;34208:4;34204:2;34195:27;;;34214:7;34195:27;;;;;;;;;;;;;;;;;;33372:858;;;;;;:::o;3592:181::-;3650:7;3670:9;3686:1;3682;:5;3670:17;;3711:1;3706;:6;;3698:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3764:1;3757:8;;;3592:181;;;;:::o;15439:622::-;15818:1;15809:5;:10;15808:62;;;;15868:1;15825:5;:15;;;15849:4;15856:7;15825:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;15808:62;15800:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15963:90;15983:5;16013:22;;;16037:7;16046:5;15990:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15963:19;:90::i;:::-;15439:622;;;:::o;34861:1095::-;34942:15;34960:25;34973:4;34979:5;34960:12;:25::i;:::-;34942:43;;35012:1;35002:7;:11;34998:951;;;35030:16;35049:5;;;;;;;;;;;:15;;;35073:4;35049:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35030:49;;35094:33;35140:8;35130:7;:18;:39;;35162:7;35130:39;;;35151:8;35130:39;35094:75;;35253:18;35274:65;35335:3;35274:56;24055:2;35274:25;:29;;:56;;;;:::i;:::-;:60;;:65;;;;:::i;:::-;35253:86;;35397:5;;;;;;;;;;;:14;;;35412:5;35419:41;35449:10;35419:25;:29;;:41;;;;:::i;:::-;35397:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35552:51;35578:11;;;;;;;;;;;35592:10;35552:5;;;;;;;;;;;:17;;;;:51;;;;;:::i;:::-;35721:11;;;;;;;;;;;:16;;;35738:5;35745:10;35721:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35771:42;35797:11;;;;;;;;;;;35811:1;35771:5;;;;;;;;;;;:17;;;;:42;;;;;:::i;:::-;35874:5;;;;;;;;;;;:15;;;35898:4;35874:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35859:12;:45;;;;35921:16;:14;:16::i;:::-;34998:951;;;;34861:1095;;;:::o;14965:205::-;15066:96;15086:5;15116:27;;;15145:4;15151:2;15155:5;15093:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15066:19;:96::i;:::-;14965:205;;;;:::o;14780:177::-;14863:86;14883:5;14913:23;;;14938:2;14942:5;14890:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14863:19;:86::i;:::-;14780:177;;;:::o;29529:1011::-;29581:24;29618:21;29642:8;29651:4;29642:14;;;;;;;;;;;;;;;;;;29618:38;;29669:19;29691:4;:10;;;;;;;;;;;;:20;;;29720:4;29691:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29669:57;;29756:1;29741:11;:16;29737:88;;;29812:1;29805:8;;;;;;29737:88;29854:249;30087:15;;29854:138;29976:4;:15;;;29854:14;;:121;;:138;;;;:::i;:::-;:232;;:249;;;;:::i;:::-;29835:268;;30174:22;30199:40;30233:5;30199:29;30220:7;;;;;;;;;;;30199:29;;:16;:20;;:29;;;;:::i;:::-;:33;;:40;;;;:::i;:::-;30174:65;;30250:31;30284:36;30305:14;30284:16;:20;;:36;;;;:::i;:::-;30250:70;;30355:39;30379:14;30355:19;;:23;;:39;;;;:::i;:::-;30333:19;:61;;;;30431:101;30471:50;30509:11;30471:33;30499:4;30471:23;:27;;:33;;;;:::i;:::-;:37;;:50;;;;:::i;:::-;30431:4;:21;;;:25;;:101;;;;:::i;:::-;30407:4;:21;;:125;;;;29529:1011;;;;;;;;:::o;4495:192::-;4581:7;4614:1;4609;:6;;4617:12;4601:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4641:9;4657:1;4653;:5;4641:17;;4678:1;4671:8;;;4495:192;;;;;:::o;6521:278::-;6607:7;6639:1;6635;:5;6642:12;6627:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6666:9;6682:1;6678;:5;;;;;;6666:17;;6790:1;6783:8;;;6521:278;;;;;:::o;17085:761::-;17509:23;17535:69;17563:4;17535:69;;;;;;;;;;;;;;;;;17543:5;17535:27;;;;:69;;;;;:::i;:::-;17509:95;;17639:1;17619:10;:17;:21;17615:224;;;17761:10;17750:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17742:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17615:224;17085:761;;;:::o;11853:196::-;11956:12;11988:53;12011:6;12019:4;12025:1;12028:12;11988:22;:53::i;:::-;11981:60;;11853:196;;;;;:::o;13230:979::-;13360:12;13393:18;13404:6;13393:10;:18::i;:::-;13385:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13519:12;13533:23;13560:6;:11;;13580:8;13591:4;13560:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13518:78;;;;13611:7;13607:595;;;13642:10;13635:17;;;;;;13607:595;13776:1;13756:10;:17;:21;13752:439;;;14019:10;14013:17;14080:15;14067:10;14063:2;14059:19;14052:44;13967:148;14162:12;14155:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13230:979;;;;;;;:::o;8738:619::-;8798:4;9060:16;9087:19;9109:66;9087:88;;;;9278:7;9266:20;9254:32;;9318:11;9306:8;:23;;:42;;;;;9345:3;9333:15;;:8;:15;;9306:42;9298:51;;;;8738:619;;;:::o
Swarm Source
ipfs://95db9f7d47e3b3f71e156f532c2e509ac0ce84e245063a8a2df39415781fd981
Loading...
Loading
Loading...
Loading
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.