Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 258 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Repay | 14751724 | 983 days ago | IN | 0 ETH | 0.03836662 | ||||
Harvest | 14751693 | 983 days ago | IN | 0 ETH | 0.04437759 | ||||
Deposit | 14743818 | 984 days ago | IN | 0 ETH | 0.12089284 | ||||
Deposit | 14741788 | 984 days ago | IN | 0 ETH | 0.02982089 | ||||
Deposit | 14733010 | 986 days ago | IN | 0 ETH | 0.02291487 | ||||
Harvest | 14732968 | 986 days ago | IN | 0 ETH | 0.02307224 | ||||
Harvest | 14714088 | 989 days ago | IN | 0 ETH | 0.05566481 | ||||
Deposit | 14710273 | 989 days ago | IN | 0 ETH | 0.04472323 | ||||
Deposit | 14704001 | 990 days ago | IN | 0 ETH | 0.05428602 | ||||
Repay | 14695201 | 992 days ago | IN | 0 ETH | 0.04117657 | ||||
Harvest | 14695155 | 992 days ago | IN | 0 ETH | 0.06711022 | ||||
Deposit | 14678932 | 994 days ago | IN | 0 ETH | 0.02856685 | ||||
Harvest | 14678833 | 994 days ago | IN | 0 ETH | 0.04048719 | ||||
Harvest | 14676079 | 995 days ago | IN | 0 ETH | 0.05022125 | ||||
Deposit | 14657135 | 998 days ago | IN | 0 ETH | 0.0461726 | ||||
Report | 14657011 | 998 days ago | IN | 0 ETH | 0.0076288 | ||||
Claim Rewards | 14656995 | 998 days ago | IN | 0 ETH | 0.01810356 | ||||
Deposit | 14646871 | 999 days ago | IN | 0 ETH | 0.01959104 | ||||
Repay | 14637937 | 1001 days ago | IN | 0 ETH | 0.02749838 | ||||
Harvest | 14637896 | 1001 days ago | IN | 0 ETH | 0.04578202 | ||||
Deposit | 14625588 | 1003 days ago | IN | 0 ETH | 0.05219892 | ||||
Harvest | 14618781 | 1004 days ago | IN | 0 ETH | 0.04935844 | ||||
Deposit | 14617202 | 1004 days ago | IN | 0 ETH | 0.04712934 | ||||
Deposit | 14608606 | 1005 days ago | IN | 0 ETH | 0.02636762 | ||||
Deposit | 14606402 | 1006 days ago | IN | 0 ETH | 0.02222989 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StrategyConvexAlUsdUsdc
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-11 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.6; library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint 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, uint 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, uint value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface BaseRewardPool { function balanceOf(address _account) external view returns (uint); function getReward(address _account, bool _claimExtras) external returns (bool); function withdrawAndUnwrap(uint amount, bool claim) external returns (bool); } interface Booster { function poolInfo(uint _pid) external view returns ( address lptoken, address token, address gauge, address crvRewards, address stash, bool shutdown ); function deposit( uint _pid, uint _amount, bool _stake ) external returns (bool); function withdraw(uint _pid, uint _amount) external returns (bool); } interface DepositZapAlUsd3Crv { // Curve.fi Factory USD Metapool v2 function add_liquidity( address _pool, uint[4] calldata _amounts, uint _min_mint_amount ) external returns (uint); function remove_liquidity_one_coin( address _pool, uint _burn_amount, int128 _i, uint _min_amount ) external returns (uint); function calc_withdraw_one_coin( address _pool, uint _amount, int128 _i ) external view returns (uint); } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint); /** * @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, uint 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 (uint); /** * @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, uint 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, uint 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, uint 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, uint value); } interface IFundManager { function token() external view returns (address); function borrow(uint amount) external returns (uint); function repay(uint amount) external returns (uint); function report(uint gain, uint loss) external; function getDebt(address strategy) external view returns (uint); } library SafeERC20 { using SafeMath for uint; using Address for address; function safeTransfer( IERC20 token, address to, uint value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint 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, uint 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, uint value ) internal { uint newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint value ) internal { uint 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" ); } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint a, uint b) internal pure returns (bool, uint) { uint c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint a, uint b) internal pure returns (bool, uint) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint a, uint b) internal pure returns (bool, uint) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint a, uint b) internal pure returns (bool, uint) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint a, uint b) internal pure returns (bool, uint) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint a, uint b) internal pure returns (uint) { uint 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(uint a, uint b) internal pure returns (uint) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint a, uint b) internal pure returns (uint) { if (a == 0) return 0; uint c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. 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(uint a, uint b) internal pure returns (uint) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint a, uint b) internal pure returns (uint) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint a, uint b, string memory errorMessage ) internal pure returns (uint) { require(b > 0, errorMessage); return a % b; } } interface StableSwapAlUsd3Crv { function coins(uint _i) external view returns (address); function get_virtual_price() external view returns (uint); } abstract contract Strategy { using SafeERC20 for IERC20; using SafeMath for uint; event SetNextTimeLock(address nextTimeLock); event AcceptTimeLock(address timeLock); event SetAdmin(address admin); event Authorize(address addr, bool authorized); event SetTreasury(address treasury); event SetFundManager(address fundManager); event Deposit(uint amount, uint borrowed); event Repay(uint amount, uint repaid); event Withdraw(uint amount, uint withdrawn, uint loss); event ClaimRewards(uint profit); event Skim(uint total, uint debt, uint profit); event Report(uint gain, uint loss, uint free, uint total, uint debt); // Privilege - time lock >= admin >= authorized addresses address public timeLock; address public nextTimeLock; address public admin; address public treasury; // Profit is sent to this address // authorization other than time lock and admin mapping(address => bool) public authorized; IERC20 public immutable token; IFundManager public fundManager; // Performance fee sent to treasury uint public perfFee = 1000; uint private constant PERF_FEE_CAP = 2000; // Upper limit to performance fee uint internal constant PERF_FEE_MAX = 10000; bool public claimRewardsOnMigrate = true; constructor( address _token, address _fundManager, address _treasury ) { // Don't allow accidentally sending perf fee to 0 address require(_treasury != address(0), "treasury = 0 address"); timeLock = msg.sender; admin = msg.sender; treasury = _treasury; require( IFundManager(_fundManager).token() == _token, "fund manager token != token" ); fundManager = IFundManager(_fundManager); token = IERC20(_token); IERC20(_token).safeApprove(_fundManager, type(uint).max); } modifier onlyTimeLock() { require(msg.sender == timeLock, "!time lock"); _; } modifier onlyTimeLockOrAdmin() { require(msg.sender == timeLock || msg.sender == admin, "!auth"); _; } modifier onlyAuthorized() { require( msg.sender == timeLock || msg.sender == admin || authorized[msg.sender], "!auth" ); _; } modifier onlyFundManager() { require(msg.sender == address(fundManager), "!fund manager"); _; } /* @notice Set next time lock @param _nextTimeLock Address of next time lock @dev nextTimeLock can become timeLock by calling acceptTimeLock() */ function setNextTimeLock(address _nextTimeLock) external onlyTimeLock { // Allow next time lock to be zero address (cancel next time lock) nextTimeLock = _nextTimeLock; emit SetNextTimeLock(_nextTimeLock); } /* @notice Set timeLock to msg.sender @dev msg.sender must be nextTimeLock */ function acceptTimeLock() external { require(msg.sender == nextTimeLock, "!next time lock"); timeLock = msg.sender; nextTimeLock = address(0); emit AcceptTimeLock(msg.sender); } /* @notice Set admin @param _admin Address of admin */ function setAdmin(address _admin) external onlyTimeLockOrAdmin { require(_admin != address(0), "admin = 0 address"); admin = _admin; emit SetAdmin(_admin); } /* @notice Set authorization @param _addr Address to authorize @param _authorized Boolean */ function authorize(address _addr, bool _authorized) external onlyTimeLockOrAdmin { require(_addr != address(0), "addr = 0 address"); authorized[_addr] = _authorized; emit Authorize(_addr, _authorized); } /* @notice Set treasury @param _treasury Address of treasury */ function setTreasury(address _treasury) external onlyTimeLockOrAdmin { // Don't allow accidentally sending perf fee to 0 address require(_treasury != address(0), "treasury = 0 address"); treasury = _treasury; emit SetTreasury(_treasury); } /* @notice Set performance fee @param _fee Performance fee */ function setPerfFee(uint _fee) external onlyTimeLockOrAdmin { require(_fee <= PERF_FEE_CAP, "fee > cap"); perfFee = _fee; } function setFundManager(address _fundManager) external onlyTimeLock { if (address(fundManager) != address(0)) { token.safeApprove(address(fundManager), 0); } require( IFundManager(_fundManager).token() == address(token), "new fund manager token != token" ); fundManager = IFundManager(_fundManager); token.safeApprove(_fundManager, type(uint).max); emit SetFundManager(_fundManager); } /* @notice Set `claimRewardsOnMigrate`. If `false` skip call to `claimRewards` when `migrate` is called. @param _claimRewards Boolean to call or skip call to `claimRewards` */ function setClaimRewardsOnMigrate(bool _claimRewards) external onlyTimeLockOrAdmin { claimRewardsOnMigrate = _claimRewards; } /* @notice Transfer funds from `_from` address. Used for migration. @param _from Address to transfer token from @param _amount Amount of token to transfer */ function transferTokenFrom(address _from, uint _amount) external onlyAuthorized { token.safeTransferFrom(_from, address(this), _amount); } /* @notice Returns approximate amount of token locked in this contract @dev Output may vary depending on price pulled from external DeFi contracts */ function totalAssets() external view virtual returns (uint); /* @notice Deposit into strategy @param _amount Amount of token to deposit from fund manager @param _min Minimum amount borrowed */ function deposit(uint _amount, uint _min) external virtual; /* @notice Withdraw token from this contract @dev Only callable by fund manager @dev Returns current loss = debt to fund manager - total assets */ function withdraw(uint _amount) external virtual returns (uint); /* @notice Repay fund manager @param _amount Amount of token to repay to fund manager @param _min Minimum amount repaid @dev Call report after this to report any loss */ function repay(uint _amount, uint _min) external virtual; /* @notice Claim any reward tokens, sell for token @param _minProfit Minumum amount of token to gain from selling rewards */ function claimRewards(uint _minProfit) external virtual; /* @notice Free up any profit over debt */ function skim() external virtual; /* @notice Report gain or loss back to fund manager @param _minTotal Minimum value of total assets. Used to protect against price manipulation. @param _maxTotal Maximum value of total assets Used Used to protect against price manipulation. */ function report(uint _minTotal, uint _maxTotal) external virtual; /* @notice Claim rewards, skim and report @param _minProfit Minumum amount of token to gain from selling rewards @param _minTotal Minimum value of total assets. Used to protect against price manipulation. @param _maxTotal Maximum value of total assets Used Used to protect against price manipulation. */ function harvest( uint _minProfit, uint _minTotal, uint _maxTotal ) external virtual; /* @notice Migrate to new version of this strategy @param _strategy Address of new strategy @dev Only callable by fund manager */ function migrate(address _strategy) external virtual; /* @notice Transfer token accidentally sent here back to admin @param _token Address of token to transfer */ function sweep(address _token) external virtual; } contract StrategyConvexAlUsd is Strategy { using SafeERC20 for IERC20; using SafeMath for uint; // Uniswap and Sushiswap // // UNISWAP = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // SUSHISWAP = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; uint private constant NUM_REWARDS = 3; // address of DEX (uniswap or sushiswap) to use for selling reward tokens // CRV, CVX, ALCX address[NUM_REWARDS] public dex; address private constant CRV = 0xD533a949740bb3306d119CC777fa900bA034cd52; address private constant CVX = 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B; address private constant ALCX = 0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF; // Solc 0.7 cannot create constant arrays address[NUM_REWARDS] private REWARDS = [CRV, CVX, ALCX]; // Convex // Booster private constant BOOSTER = Booster(0xF403C135812408BFbE8713b5A23a04b3D48AAE31); // pool id uint private constant PID = 36; BaseRewardPool private constant REWARD = BaseRewardPool(0x02E2151D4F351881017ABdF2DD2b51150841d5B3); bool public shouldClaimExtras = true; // Curve // // DepositZap alUSD + 3CRV DepositZapAlUsd3Crv private constant ZAP = DepositZapAlUsd3Crv(0xA79828DF1850E8a3A3064576f380D90aECDD3359); // StableSwap alUSD + 3CRV (meta pool) StableSwapAlUsd3Crv private constant CURVE_POOL = StableSwapAlUsd3Crv(0x43b4FdFD4Ff969587185cDB6f0BD875c5Fc83f8c); // LP token for curve pool (same contract as CURVE_POOL) IERC20 private constant CURVE_LP = IERC20(0x43b4FdFD4Ff969587185cDB6f0BD875c5Fc83f8c); // prevent slippage from deposit / withdraw uint public slip = 100; uint private constant SLIP_MAX = 10000; /* 0 - alUSD 1 - DAI 2 - USDC 3 - USDT */ // multipliers to normalize token decimals to 10 ** 18 uint[4] private MULS = [1, 1, 1e12, 1e12]; uint private immutable MUL; // multiplier of token uint private immutable INDEX; // index of token // DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F // USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 // USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7 constructor( address _token, address _fundManager, address _treasury, uint _index ) Strategy(_token, _fundManager, _treasury) { // disable alUSD require(_index > 0, "index = 0"); INDEX = _index; MUL = MULS[_index]; (address lptoken, , , address crvRewards, , ) = BOOSTER.poolInfo(PID); require(address(CURVE_LP) == lptoken, "curve pool lp != pool info lp"); require(address(REWARD) == crvRewards, "reward != pool info reward"); IERC20(_token).safeApprove(address(ZAP), type(uint).max); // deposit into BOOSTER CURVE_LP.safeApprove(address(BOOSTER), type(uint).max); // withdraw from ZAP CURVE_LP.safeApprove(address(ZAP), type(uint).max); _setDex(0, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CRV - sushiswap _setDex(1, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // CVX - sushiswap _setDex(2, 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); // ALCX - sushiswap } function _setDex(uint _i, address _dex) private { IERC20 reward = IERC20(REWARDS[_i]); // disallow previous dex if (dex[_i] != address(0)) { reward.safeApprove(dex[_i], 0); } dex[_i] = _dex; // approve new dex reward.safeApprove(_dex, type(uint).max); } function setDex(uint _i, address _dex) external onlyTimeLock { require(_dex != address(0), "dex = 0 address"); _setDex(_i, _dex); } /* @notice Set max slippage for deposit and withdraw from Curve pool @param _slip Max amount of slippage allowed */ function setSlip(uint _slip) external onlyAuthorized { require(_slip <= SLIP_MAX, "slip > max"); slip = _slip; } // @dev Claim extra rewards (ALCX) from Convex function setShouldClaimExtras(bool _shouldClaimExtras) external onlyAuthorized { shouldClaimExtras = _shouldClaimExtras; } function _totalAssets() private view returns (uint total) { /* s0 = shares in meta pool p0 = price per share of meta pool s1 = shares in base pool p1 = price per share of base pool a = amount of tokens (DAI, USDC, USDT) s1 = s0 * p0 a = s1 * p1 a = s0 * p0 * p1 */ // amount of Curve LP tokens in Convex uint lpBal = REWARD.balanceOf(address(this)); // amount of alUSD or DAI, USDC, USDT converted from Curve LP // BASE_POOL.get_virtual_price is included in CURVE_POOL.get_virtual_price // so CURVE_POOL.get_virtual_price = p0 * p1 total = lpBal.mul(CURVE_POOL.get_virtual_price()) / (MUL * 1e18); total = total.add(token.balanceOf(address(this))); } function totalAssets() external view override returns (uint) { return _totalAssets(); } function _deposit() private { uint bal = token.balanceOf(address(this)); if (bal > 0) { uint[4] memory amounts; amounts[INDEX] = bal; /* shares = token amount * multiplier * 1e18 / price per share */ uint pricePerShare = CURVE_POOL.get_virtual_price(); uint shares = bal.mul(MUL).mul(1e18).div(pricePerShare); uint min = shares.mul(SLIP_MAX - slip) / SLIP_MAX; ZAP.add_liquidity(address(CURVE_POOL), amounts, min); } uint lpBal = CURVE_LP.balanceOf(address(this)); if (lpBal > 0) { require(BOOSTER.deposit(PID, lpBal, true), "deposit failed"); } } function deposit(uint _amount, uint _min) external override onlyAuthorized { require(_amount > 0, "deposit = 0"); uint borrowed = fundManager.borrow(_amount); require(borrowed >= _min, "borrowed < min"); _deposit(); emit Deposit(_amount, borrowed); } function _calcSharesToWithdraw( uint _amount, uint _total, uint _totalShares ) private pure returns (uint) { /* calculate shares to withdraw a = amount of token to withdraw T = total amount of token locked in external liquidity pool s = shares to withdraw P = total shares deposited into external liquidity pool a / T = s / P s = a / T * P */ if (_total > 0) { // avoid rounding errors and cap shares to be <= total shares if (_amount >= _total) { return _totalShares; } return _amount.mul(_totalShares) / _total; } return 0; } function _withdraw(uint _amount) private returns (uint) { uint bal = token.balanceOf(address(this)); if (_amount <= bal) { return _amount; } uint total = _totalAssets(); if (_amount >= total) { _amount = total; } uint need = _amount - bal; uint totalShares = REWARD.balanceOf(address(this)); // total assets is always >= bal uint shares = _calcSharesToWithdraw(need, total - bal, totalShares); // withdraw from Convex if (shares > 0) { // true = claim CRV and ALCX require(REWARD.withdrawAndUnwrap(shares, false), "reward withdraw failed"); } // withdraw from Curve uint lpBal = CURVE_LP.balanceOf(address(this)); if (shares > lpBal) { shares = lpBal; } if (shares > 0) { uint min = need.mul(SLIP_MAX - slip) / SLIP_MAX; ZAP.remove_liquidity_one_coin( address(CURVE_POOL), shares, int128(INDEX), min ); } uint balAfter = token.balanceOf(address(this)); if (balAfter < _amount) { return balAfter; } // balAfter >= _amount >= total // requested to withdraw all so return balAfter if (_amount >= total) { return balAfter; } // requested withdraw < all return _amount; } function withdraw(uint _amount) external override onlyFundManager returns (uint loss) { require(_amount > 0, "withdraw = 0"); // availabe <= _amount uint available = _withdraw(_amount); uint debt = fundManager.getDebt(address(this)); uint total = _totalAssets(); if (debt > total) { loss = debt - total; } if (available > 0) { token.safeTransfer(msg.sender, available); } emit Withdraw(_amount, available, loss); } function repay(uint _amount, uint _min) external override onlyAuthorized { require(_amount > 0, "repay = 0"); // availabe <= _amount uint available = _withdraw(_amount); uint repaid = fundManager.repay(available); require(repaid >= _min, "repaid < min"); emit Repay(_amount, repaid); } /* @dev Uniswap fails with zero address so no check is necessary here */ function _swap( address _dex, address _tokenIn, address _tokenOut, uint _amount ) private { // create dynamic array with 3 elements address[] memory path = new address[](3); path[0] = _tokenIn; path[1] = WETH; path[2] = _tokenOut; UniswapV2Router(_dex).swapExactTokensForTokens( _amount, 1, path, address(this), block.timestamp ); } function _claimRewards(uint _minProfit) private { // calculate profit = balance of token after - balance of token before uint diff = token.balanceOf(address(this)); require( REWARD.getReward(address(this), shouldClaimExtras), "get reward failed" ); for (uint i = 0; i < NUM_REWARDS; i++) { uint rewardBal = IERC20(REWARDS[i]).balanceOf(address(this)); if (rewardBal > 0) { _swap(dex[i], REWARDS[i], address(token), rewardBal); } } diff = token.balanceOf(address(this)) - diff; require(diff >= _minProfit, "profit < min"); // transfer performance fee to treasury if (diff > 0) { uint fee = diff.mul(perfFee) / PERF_FEE_MAX; if (fee > 0) { token.safeTransfer(treasury, fee); diff = diff.sub(fee); } } emit ClaimRewards(diff); } function claimRewards(uint _minProfit) external override onlyAuthorized { _claimRewards(_minProfit); } function _skim() private { uint total = _totalAssets(); uint debt = fundManager.getDebt(address(this)); require(total > debt, "total <= debt"); uint profit = total - debt; // reassign to actual amount withdrawn profit = _withdraw(profit); emit Skim(total, debt, profit); } function skim() external override onlyAuthorized { _skim(); } function _report(uint _minTotal, uint _maxTotal) private { uint total = _totalAssets(); require(total >= _minTotal, "total < min"); require(total <= _maxTotal, "total > max"); uint gain = 0; uint loss = 0; uint free = 0; // balance of token uint debt = fundManager.getDebt(address(this)); if (total > debt) { gain = total - debt; free = token.balanceOf(address(this)); if (gain > free) { gain = free; } } else { loss = debt - total; } if (gain > 0 || loss > 0) { fundManager.report(gain, loss); } emit Report(gain, loss, free, total, debt); } function report(uint _minTotal, uint _maxTotal) external override onlyAuthorized { _report(_minTotal, _maxTotal); } function harvest( uint _minProfit, uint _minTotal, uint _maxTotal ) external override onlyAuthorized { _claimRewards(_minProfit); _skim(); _report(_minTotal, _maxTotal); } function migrate(address _strategy) external override onlyFundManager { Strategy strat = Strategy(_strategy); require(address(strat.token()) == address(token), "strategy token != token"); require( address(strat.fundManager()) == address(fundManager), "strategy fund manager != fund manager" ); if (claimRewardsOnMigrate) { _claimRewards(1); } uint bal = _withdraw(type(uint).max); token.safeApprove(_strategy, bal); strat.transferTokenFrom(address(this), bal); } /* @notice Transfer token accidentally sent here to admin @param _token Address of token to transfer */ function sweep(address _token) external override onlyAuthorized { require(_token != address(token), "protected token"); for (uint i = 0; i < NUM_REWARDS; i++) { require(_token != REWARDS[i], "protected token"); } IERC20(_token).safeTransfer(admin, IERC20(_token).balanceOf(address(this))); } } interface UniswapV2Router { function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); } contract StrategyConvexAlUsdUsdc is StrategyConvexAlUsd { constructor(address _fundManager, address _treasury) StrategyConvexAlUsd( 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, _fundManager, _treasury, 2 ) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"timeLock","type":"address"}],"name":"AcceptTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"authorized","type":"bool"}],"name":"Authorize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"borrowed","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repaid","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gain","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"free","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"}],"name":"Report","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fundManager","type":"address"}],"name":"SetFundManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nextTimeLock","type":"address"}],"name":"SetNextTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"Skim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"acceptTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_authorized","type":"bool"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsOnMigrate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundManager","outputs":[{"internalType":"contract IFundManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"},{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextTimeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"perfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTotal","type":"uint256"},{"internalType":"uint256","name":"_maxTotal","type":"uint256"}],"name":"report","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_claimRewards","type":"bool"}],"name":"setClaimRewardsOnMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_i","type":"uint256"},{"internalType":"address","name":"_dex","type":"address"}],"name":"setDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundManager","type":"address"}],"name":"setFundManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nextTimeLock","type":"address"}],"name":"setNextTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setPerfFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimExtras","type":"bool"}],"name":"setShouldClaimExtras","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slip","type":"uint256"}],"name":"setSlip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldClaimExtras","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferTokenFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6103e86006556007805460ff1916600117905561014060405273d533a949740bb3306d119cc777fa900ba034cd5260e0908152734e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6101005273dbdb4d16eda451d0503b854cf79d55697f90c8df610120526200007490600b90600362000a95565b50600e805460ff191660019081179091556064600f5560408051608081018252828152602081019290925264e8d4a510009082018190526060820152620000c090601090600462000af2565b50348015620000ce57600080fd5b50604051620045773803806200457783398181016040526040811015620000f457600080fd5b50805160209091015173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48828260028383836001600160a01b03811662000175576040805162461bcd60e51b815260206004820152601460248201527f7472656173757279203d20302061646472657373000000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b031990811633908117909255600280548216909217909155600380546001600160a01b038481169190931617905560408051637e062a3560e11b815290518583169285169163fc0c546a916004808301926020929190829003018186803b158015620001eb57600080fd5b505afa15801562000200573d6000803e3d6000fd5b505050506040513d60208110156200021757600080fd5b50516001600160a01b03161462000275576040805162461bcd60e51b815260206004820152601b60248201527f66756e64206d616e6167657220746f6b656e20213d20746f6b656e0000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155606084901b6001600160601b031916608052620002c490841683600019620005c9602090811b62001c9617901c565b5050506000811162000309576040805162461bcd60e51b81526020600482015260096024820152680696e646578203d20360bc1b604482015290519081900360640190fd5b60c0819052601081600481106200031c57fe5b015460a05260408051631526fe2760e01b81526024600482018190529151600092839273f403c135812408bfbe8713b5a23a04b3d48aae3192631526fe27928281019260c0929190829003018186803b1580156200037957600080fd5b505afa1580156200038e573d6000803e3d6000fd5b505050506040513d60c0811015620003a557600080fd5b50805160609091015190925090507343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6001600160a01b0383161462000425576040805162461bcd60e51b815260206004820152601d60248201527f637572766520706f6f6c206c7020213d20706f6f6c20696e666f206c70000000604482015290519081900360640190fd5b7302e2151d4f351881017abdf2dd2b51150841d5b36001600160a01b0382161462000497576040805162461bcd60e51b815260206004820152601a60248201527f72657761726420213d20706f6f6c20696e666f20726577617264000000000000604482015290519081900360640190fd5b620004d273a79828df1850e8a3a3064576f380d90aecdd3359600019886001600160a01b0316620005c960201b62001c96179092919060201c565b620005157343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c73f403c135812408bfbe8713b5a23a04b3d48aae31600019620005c9602090811b62001c9617901c565b620005587343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c73a79828df1850e8a3a3064576f380d90aecdd3359600019620005c9602090811b62001c9617901c565b62000579600073d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006ed565b6200059a600173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006ed565b620005bb600273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f620006ed565b505050505050505062000b43565b80158062000653575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156200062357600080fd5b505afa15801562000638573d6000803e3d6000fd5b505050506040513d60208110156200064f57600080fd5b5051155b620006905760405162461bcd60e51b8152600401808060200182810382526036815260200180620045416036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620006e8918591620007a716565b505050565b6000600b8360038110620006fd57fe5b01546001600160a01b031690506000600884600381106200071a57fe5b01546001600160a01b031614620007605762000760600884600381106200073d57fe5b01546001600160a01b0383811691166000620005c9602090811b62001c9617901c565b81600884600381106200076f57fe5b0180546001600160a01b0319166001600160a01b03928316179055620006e890821683600019620005c9602090811b62001c9617901c565b600062000803826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200086360201b62001da9179092919060201c565b805190915015620006e8578080602001905160208110156200082457600080fd5b5051620006e85760405162461bcd60e51b815260040180806020018281038252602a81526020018062004517602a913960400191505060405180910390fd5b60606200087484846000856200087e565b90505b9392505050565b606082471015620008c15760405162461bcd60e51b8152600401808060200182810382526026815260200180620044f16026913960400191505060405180910390fd5b620008cc85620009e5565b6200091e576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106200095e5780518252601f1990920191602091820191016200093d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620009c2576040519150601f19603f3d011682016040523d82523d6000602084013e620009c7565b606091505b509092509050620009da828286620009eb565b979650505050505050565b3b151590565b60608315620009fc57508162000877565b82511562000a0d5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101562000a5957818101518382015260200162000a3f565b50505050905090810190601f16801562000a875780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b826003810192821562000ae0579160200282015b8281111562000ae057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000aa9565b5062000aee92915062000b2c565b5090565b826004810192821562000ae0579160200282015b8281111562000ae0578251829064ffffffffff1690559160200191906001019062000b06565b5b8082111562000aee576000815560010162000b2d565b60805160601c60a05160c05161391f62000bd260003980612b455280612e07525080611eb45280612ece52508061062052806108b15280610b355280610b615280610c6f5280610fe8528061156552806117365280611c745280611f575280611fff528061223a528061226c528061238b52806126ba52806128225280612beb5280612d5c525061391f6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b6107a0565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b50356107af565b6102316004803603604081101561028057600080fd5b506001600160a01b03813516906020013561082e565b610231600480360360208110156102ac57600080fd5b50356108dd565b61023161099c565b610231610a1c565b61023b610ac1565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610ac7565b61030e6004803603602081101561030757600080fd5b5035610cd7565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610cf7565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d8d565b61023b6004803603602081101561039757600080fd5b5035610e9b565b610231600480360360208110156103b457600080fd5b50351515611057565b610231600480360360208110156103d357600080fd5b503515156110c6565b61023b61114f565b6103ec611155565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b031661115e565b61030e6111fe565b61030e61120d565b6102316004803603602081101561044c57600080fd5b50356001600160a01b031661121c565b6102316004803603602081101561047257600080fd5b503561131b565b6102316004803603604081101561048f57600080fd5b50803590602001356113bf565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b031661143f565b61030e6114e2565b6103ec6114f1565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b03166114fa565b6102316004803603602081101561051457600080fd5b50356001600160a01b031661150f565b61030e6117c8565b6102316004803603604081101561054257600080fd5b50803590602001356117d7565b6102316004803603604081101561056557600080fd5b508035906020013561199f565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611b61565b61030e611c63565b61030e611c72565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415610697576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60005b600381101561070c57600b81600381106106b057fe5b01546001600160a01b0383811691161415610704576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60010161069a565b50600254604080516370a0823160e01b8152306004820152905161079d926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561076057600080fd5b505afa158015610774573d6000803e3d6000fd5b505050506040513d602081101561078a57600080fd5b50516001600160a01b0384169190611dc2565b50565b60006107aa611e14565b905090565b6000546001600160a01b03163314806107d257506002546001600160a01b031633145b806107ec57503360009081526004602052604090205460ff165b610825576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61079d81611ffb565b6000546001600160a01b031633148061085157506002546001600160a01b031633145b8061086b57503360009081526004602052604090205460ff165b6108a4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168330846123fa565b5050565b6000546001600160a01b031633148061090057506002546001600160a01b031633145b8061091a57503360009081526004602052604090205460ff165b610953576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b612710811115610997576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600f55565b6000546001600160a01b03163314806109bf57506002546001600160a01b031633145b806109d957503360009081526004602052604090205460ff165b610a12576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a1a61245a565b565b6001546001600160a01b03163314610a6d576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610b13576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610b5f57600554610b5f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691166000611c96565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc257600080fd5b505afa158015610bd6573d6000803e3d6000fd5b505050506040513d6020811015610bec57600080fd5b50516001600160a01b031614610c49576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c98907f00000000000000000000000000000000000000000000000000000000000000001682600019611c96565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160038110610ce757600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610d1a57506002546001600160a01b031633145b80610d3457503360009081526004602052604090205460ff165b610d6d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610d7683611ffb565b610d7e61245a565b610d88828261257c565b505050565b6000546001600160a01b0316331480610db057506002546001600160a01b031633145b610de9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610e37576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610eed576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610f31576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610f3c8361281d565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d6020811015610fb757600080fd5b505190506000610fc5611e14565b905080821115610fd55780820393505b821561100f5761100f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385611dc2565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061107a57506002546001600160a01b031633145b6110b3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b03163314806110e957506002546001600160a01b031633145b8061110357503360009081526004602052604090205460ff165b61113c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff1916911515919091179055565b600f5481565b60075460ff1681565b6000546001600160a01b031633146111aa576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b031633148061123f57506002546001600160a01b031633145b611278576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166112c7576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b031633148061133e57506002546001600160a01b031633145b611377576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d08111156113ba576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b03163314806113e257506002546001600160a01b031633145b806113fc57503360009081526004602052604090205460ff165b611435576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d9828261257c565b6000546001600160a01b0316331461148b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166114d8576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108d98282612cbf565b6001546001600160a01b031681565b600e5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b0316331461155e576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b50516001600160a01b03161461164d576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561169457600080fd5b505afa1580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b50516001600160a01b0316146117055760405162461bcd60e51b81526004018080602001828103825260258152602001806138446025913960400191505060405180910390fd5b60075460ff161561171a5761171a6001611ffb565b600061172760001961281d565b905061175d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611c96565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b03163314806117fa57506002546001600160a01b031633145b8061181457503360009081526004602052604090205460ff165b61184d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000821161188e576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b60006118998361281d565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b505190508281101561195e576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b03163314806119c257506002546001600160a01b031633145b806119dc57503360009081526004602052604090205460ff165b611a15576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611a58576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611aa557600080fd5b505af1158015611ab9573d6000803e3d6000fd5b505050506040513d6020811015611acf57600080fd5b5051905081811015611b19576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611b21612d58565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b8457506002546001600160a01b031633145b611bbd576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611c0f576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580611d1c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6020811015611d1857600080fd5b5051155b611d575760405162461bcd60e51b81526004018080602001828103825260368152602001806138b46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d8890849061314f565b6060611db88484600085613200565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d8890849061314f565b604080516370a0823160e01b8152306004820152905160009182917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b158015611e6a57600080fd5b505afa158015611e7e573d6000803e3d6000fd5b505050506040513d6020811015611e9457600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000000291611f48917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c9163bb7b8b8091600480820192602092909190829003018186803b158015611f1557600080fd5b505afa158015611f29573d6000803e3d6000fd5b505050506040513d6020811015611f3f57600080fd5b5051839061335b565b81611f4f57fe5b049150611ff57f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b505183906133bd565b91505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b5051600e5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507302e2151d4f351881017abdf2dd2b51150841d5b391637050ccd9916044808201926020929091908290030181600087803b1580156120fb57600080fd5b505af115801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b505161216c576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b6003811015612268576000600b826003811061218757fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156121d157600080fd5b505afa1580156121e5573d6000803e3d6000fd5b505050506040513d60208110156121fb57600080fd5b50519050801561225f5761225f6008836003811061221557fe5b01546001600160a01b0316600b846003811061222d57fe5b01546001600160a01b03167f000000000000000000000000000000000000000000000000000000000000000084613417565b5060010161216f565b50807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d602081101561230157600080fd5b50510390508181101561234a576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b80156123c357600061271061236a6006548461335b90919063ffffffff16565b8161237157fe5b04905080156123c1576003546123b4906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611dc2565b6123be8282613657565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261245490859061314f565b50505050565b6000612464611e14565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b1580156124b557600080fd5b505afa1580156124c9573d6000803e3d6000fd5b505050506040513d60208110156124df57600080fd5b50519050808211612527576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036125338161281d565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612586611e14565b9050828110156125cb576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b8181111561260e576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d602081101561268957600080fd5b505190508085111561273f57604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561270057600080fd5b505afa158015612714573d6000803e3d6000fd5b505050506040513d602081101561272a57600080fd5b505191508184111561273a578193505b612745565b84810392505b60008411806127545750600083115b156127c6576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b505190508083116128cb5782915050612cba565b60006128d5611e14565b90508084106128e2578093505b604080516370a0823160e01b81523060048201529051838603916000917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b50519050600061297783868603846136b4565b90508015612a5a577302e2151d4f351881017abdf2dd2b51150841d5b36001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b1580156129e457600080fd5b505af11580156129f8573d6000803e3d6000fd5b505050506040513d6020811015612a0e57600080fd5b5051612a5a576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b5051905080821115612ae9578091505b8115612be7576000612710612b0d600f54612710038761335b90919063ffffffff16565b81612b1457fe5b604080516314f6943160e11b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820152602481018790527f0000000000000000000000000000000000000000000000000000000000000000600f0b60448201529290910460648301819052905190925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848083019260209291908290030181600087803b158015612bb957600080fd5b505af1158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5050505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c5657600080fd5b505afa158015612c6a573d6000803e3d6000fd5b505050506040513d6020811015612c8057600080fd5b5051905088811015612c9a579650612cba95505050505050565b858910612caf579650612cba95505050505050565b889750505050505050505b919050565b6000600b8360038110612cce57fe5b01546001600160a01b03169050600060088460038110612cea57fe5b01546001600160a01b031614612d2057612d2060088460038110612d0a57fe5b01546001600160a01b0383811691166000611c96565b8160088460038110612d2e57fe5b0180546001600160a01b0319166001600160a01b03928316179055610d8890821683600019611c96565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612dc757600080fd5b505afa158015612ddb573d6000803e3d6000fd5b505050506040513d6020811015612df157600080fd5b505190508015612ff657612e036137ff565b81817f000000000000000000000000000000000000000000000000000000000000000060048110612e3057fe5b60200201818152505060007343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b505190506000612efe82612ef8670de0b6b3a7640000612ef2887f000000000000000000000000000000000000000000000000000000000000000061335b565b9061335b565b906136ee565b90506000612710612f1e600f54612710038461335b90919063ffffffff16565b81612f2557fe5b60405163384e03db60e01b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820181815293909204935073a79828df1850e8a3a3064576f380d90aecdd33599263384e03db92918891869160240183608080838360005b83811015612f99578181015183820152602001612f81565b505050509050018281526020019350505050602060405180830381600087803b158015612fc557600080fd5b505af1158015612fd9573d6000803e3d6000fd5b505050506040513d6020811015612fef57600080fd5b5050505050505b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b15801561304b57600080fd5b505afa15801561305f573d6000803e3d6000fd5b505050506040513d602081101561307557600080fd5b5051905080156108d957604080516321d0683360e11b8152602460048201819052810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b1580156130e157600080fd5b505af11580156130f5573d6000803e3d6000fd5b505050506040513d602081101561310b57600080fd5b50516108d9576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006131a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611da99092919063ffffffff16565b805190915015610d88578080602001905160208110156131c357600080fd5b5051610d885760405162461bcd60e51b815260040180806020018281038252602a81526020018061388a602a913960400191505060405180910390fd5b6060824710156132415760405162461bcd60e51b815260040180806020018281038252602681526020018061381e6026913960400191505060405180910390fd5b61324a85613755565b61329b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106132d95780518252601f1990920191602091820191016132ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461333b576040519150601f19603f3d011682016040523d82523d6000602084013e613340565b606091505b509150915061335082828661375b565b979650505050505050565b60008261336a575060006133b7565b8282028284828161337757fe5b04146133b45760405162461bcd60e51b81526004018080602001828103825260218152602001806138696021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156133b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061344857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061348a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816002815181106134b857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561355d578181015183820152602001613545565b505050509050019650505050505050600060405180830381600087803b15801561358657600080fd5b505af115801561359a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135c357600080fd5b81019080805160405193929190846401000000008211156135e357600080fd5b9083019060208201858111156135f857600080fd5b825186602082028301116401000000008211171561361557600080fd5b82525081516020918201928201910280838360005b8381101561364257818101518382015260200161362a565b50505050905001604052505050505050505050565b6000828211156136ae576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136e4578284106136ca575080611dbb565b826136d5858461335b565b816136dc57fe5b049050611dbb565b5060009392505050565b6000808211613744576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161374d57fe5b049392505050565b3b151590565b6060831561376a575081611dbb565b82511561377a5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137c45781810151838201526020016137ac565b50505050905090810190601f1680156137f15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220a817c9a146324a76c26ec3c679a0a6465ff7a804d1890a1a2059e9292586839964736f6c63430007060033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000000000b00aa15f78a278be2fcb2aa7de899f3f863780f800000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c806347a02a441161011a578063b157eacf116100ad578063d8aed1451161007c578063d8aed1451461052c578063e2bbb1581461054f578063f0f4426014610572578063f851a44014610598578063fc0c546a146105a057610206565b8063b157eacf146104d0578063b9181611146104d8578063ce5494bb146104fe578063d085835a1461052457610206565b80637372bb41116100e95780637372bb411461045c578063753c0985146104795780638a36bef71461049c578063b127df87146104c857610206565b806347a02a441461040057806361d027b3146104265780636209ec2d1461042e578063704b6c021461043657610206565b8063232a30601161019d5780632e1a7d4d1161016c5780632e1a7d4d146103815780633739795c1461039e57806338c2eae5146103bd578063392c731f146103dc57806342d14c83146103e457610206565b8063232a3060146102cb57806324d16c1a146102f1578063284fa3441461032a5780632d1fb3891461035357610206565b806313b857b4116101d957806313b857b4146102965780631dd19cb4146102b35780631e39831e146102bb57806322b2ba73146102c357610206565b806301681a621461020b57806301e1d114146102335780630962ef791461024d5780630acf84811461026a575b600080fd5b6102316004803603602081101561022157600080fd5b50356001600160a01b03166105a8565b005b61023b6107a0565b60408051918252519081900360200190f35b6102316004803603602081101561026357600080fd5b50356107af565b6102316004803603604081101561028057600080fd5b506001600160a01b03813516906020013561082e565b610231600480360360208110156102ac57600080fd5b50356108dd565b61023161099c565b610231610a1c565b61023b610ac1565b610231600480360360208110156102e157600080fd5b50356001600160a01b0316610ac7565b61030e6004803603602081101561030757600080fd5b5035610cd7565b604080516001600160a01b039092168252519081900360200190f35b6102316004803603606081101561034057600080fd5b5080359060208101359060400135610cf7565b6102316004803603604081101561036957600080fd5b506001600160a01b0381351690602001351515610d8d565b61023b6004803603602081101561039757600080fd5b5035610e9b565b610231600480360360208110156103b457600080fd5b50351515611057565b610231600480360360208110156103d357600080fd5b503515156110c6565b61023b61114f565b6103ec611155565b604080519115158252519081900360200190f35b6102316004803603602081101561041657600080fd5b50356001600160a01b031661115e565b61030e6111fe565b61030e61120d565b6102316004803603602081101561044c57600080fd5b50356001600160a01b031661121c565b6102316004803603602081101561047257600080fd5b503561131b565b6102316004803603604081101561048f57600080fd5b50803590602001356113bf565b610231600480360360408110156104b257600080fd5b50803590602001356001600160a01b031661143f565b61030e6114e2565b6103ec6114f1565b6103ec600480360360208110156104ee57600080fd5b50356001600160a01b03166114fa565b6102316004803603602081101561051457600080fd5b50356001600160a01b031661150f565b61030e6117c8565b6102316004803603604081101561054257600080fd5b50803590602001356117d7565b6102316004803603604081101561056557600080fd5b508035906020013561199f565b6102316004803603602081101561058857600080fd5b50356001600160a01b0316611b61565b61030e611c63565b61030e611c72565b6000546001600160a01b03163314806105cb57506002546001600160a01b031633145b806105e557503360009081526004602052604090205460ff165b61061e576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316816001600160a01b03161415610697576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60005b600381101561070c57600b81600381106106b057fe5b01546001600160a01b0383811691161415610704576040805162461bcd60e51b815260206004820152600f60248201526e383937ba32b1ba32b2103a37b5b2b760891b604482015290519081900360640190fd5b60010161069a565b50600254604080516370a0823160e01b8152306004820152905161079d926001600160a01b0390811692908516916370a0823191602480820192602092909190829003018186803b15801561076057600080fd5b505afa158015610774573d6000803e3d6000fd5b505050506040513d602081101561078a57600080fd5b50516001600160a01b0384169190611dc2565b50565b60006107aa611e14565b905090565b6000546001600160a01b03163314806107d257506002546001600160a01b031633145b806107ec57503360009081526004602052604090205460ff165b610825576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b61079d81611ffb565b6000546001600160a01b031633148061085157506002546001600160a01b031633145b8061086b57503360009081526004602052604090205460ff165b6108a4576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d96001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48168330846123fa565b5050565b6000546001600160a01b031633148061090057506002546001600160a01b031633145b8061091a57503360009081526004602052604090205460ff165b610953576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b612710811115610997576040805162461bcd60e51b815260206004820152600a6024820152690e6d8d2e0407c40dac2f60b31b604482015290519081900360640190fd5b600f55565b6000546001600160a01b03163314806109bf57506002546001600160a01b031633145b806109d957503360009081526004602052604090205460ff165b610a12576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610a1a61245a565b565b6001546001600160a01b03163314610a6d576040805162461bcd60e51b815260206004820152600f60248201526e216e6578742074696d65206c6f636b60881b604482015290519081900360640190fd5b600080546001600160a01b03199081163390811790925560018054909116905560408051918252517f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f029181900360200190a1565b60065481565b6000546001600160a01b03163314610b13576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6005546001600160a01b031615610b5f57600554610b5f906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48811691166000611c96565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc257600080fd5b505afa158015610bd6573d6000803e3d6000fd5b505050506040513d6020811015610bec57600080fd5b50516001600160a01b031614610c49576040805162461bcd60e51b815260206004820152601f60248201527f6e65772066756e64206d616e6167657220746f6b656e20213d20746f6b656e00604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383811691909117909155610c98907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481682600019611c96565b604080516001600160a01b038316815290517f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f59181900360200190a150565b60088160038110610ce757600080fd5b01546001600160a01b0316905081565b6000546001600160a01b0316331480610d1a57506002546001600160a01b031633145b80610d3457503360009081526004602052604090205460ff165b610d6d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b610d7683611ffb565b610d7e61245a565b610d88828261257c565b505050565b6000546001600160a01b0316331480610db057506002546001600160a01b031633145b610de9576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038216610e37576040805162461bcd60e51b815260206004820152601060248201526f61646472203d2030206164647265737360801b604482015290519081900360640190fd5b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915582519384529083015280517fcea19d7e74d2901bed6a09d188b76bf13520e4d6361466d6ba67872151fd09ab9281900390910190a15050565b6005546000906001600160a01b03163314610eed576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008211610f31576040805162461bcd60e51b815260206004820152600c60248201526b07769746864726177203d20360a41b604482015290519081900360640190fd5b6000610f3c8361281d565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b158015610f8d57600080fd5b505afa158015610fa1573d6000803e3d6000fd5b505050506040513d6020811015610fb757600080fd5b505190506000610fc5611e14565b905080821115610fd55780820393505b821561100f5761100f6001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48163385611dc2565b604080518681526020810185905280820186905290517fa01a72713bf837059e3a668d28f0de277fb7f24f2a4e95bf926703c95b5f12b29181900360600190a1505050919050565b6000546001600160a01b031633148061107a57506002546001600160a01b031633145b6110b3576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6007805460ff1916911515919091179055565b6000546001600160a01b03163314806110e957506002546001600160a01b031633145b8061110357503360009081526004602052604090205460ff165b61113c576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b600e805460ff1916911515919091179055565b600f5481565b60075460ff1681565b6000546001600160a01b031633146111aa576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c9181900360200190a150565b6003546001600160a01b031681565b6005546001600160a01b031681565b6000546001600160a01b031633148061123f57506002546001600160a01b031633145b611278576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b0381166112c7576040805162461bcd60e51b815260206004820152601160248201527061646d696e203d2030206164647265737360781b604482015290519081900360640190fd5b600280546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a19181900360200190a150565b6000546001600160a01b031633148061133e57506002546001600160a01b031633145b611377576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6107d08111156113ba576040805162461bcd60e51b81526020600482015260096024820152680666565203e206361760bc1b604482015290519081900360640190fd5b600655565b6000546001600160a01b03163314806113e257506002546001600160a01b031633145b806113fc57503360009081526004602052604090205460ff165b611435576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6108d9828261257c565b6000546001600160a01b0316331461148b576040805162461bcd60e51b815260206004820152600a6024820152692174696d65206c6f636b60b01b604482015290519081900360640190fd5b6001600160a01b0381166114d8576040805162461bcd60e51b815260206004820152600f60248201526e646578203d2030206164647265737360881b604482015290519081900360640190fd5b6108d98282612cbf565b6001546001600160a01b031681565b600e5460ff1681565b60046020526000908152604090205460ff1681565b6005546001600160a01b0316331461155e576040805162461bcd60e51b815260206004820152600d60248201526c10b33ab7321036b0b730b3b2b960991b604482015290519081900360640190fd5b60008190507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c657600080fd5b505afa1580156115da573d6000803e3d6000fd5b505050506040513d60208110156115f057600080fd5b50516001600160a01b03161461164d576040805162461bcd60e51b815260206004820152601760248201527f737472617465677920746f6b656e20213d20746f6b656e000000000000000000604482015290519081900360640190fd5b60055460408051636209ec2d60e01b815290516001600160a01b0392831692841691636209ec2d916004808301926020929190829003018186803b15801561169457600080fd5b505afa1580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b50516001600160a01b0316146117055760405162461bcd60e51b81526004018080602001828103825260258152602001806138446025913960400191505060405180910390fd5b60075460ff161561171a5761171a6001611ffb565b600061172760001961281d565b905061175d6001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48168483611c96565b60408051630acf848160e01b81523060048201526024810183905290516001600160a01b03841691630acf848191604480830192600092919082900301818387803b1580156117ab57600080fd5b505af11580156117bf573d6000803e3d6000fd5b50505050505050565b6000546001600160a01b031681565b6000546001600160a01b03163314806117fa57506002546001600160a01b031633145b8061181457503360009081526004602052604090205460ff165b61184d576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6000821161188e576040805162461bcd60e51b815260206004820152600960248201526807265706179203d20360bc1b604482015290519081900360640190fd5b60006118998361281d565b60055460408051631b8fec7360e11b81526004810184905290519293506000926001600160a01b039092169163371fd8e69160248082019260209290919082900301818787803b1580156118ec57600080fd5b505af1158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b505190508281101561195e576040805162461bcd60e51b815260206004820152600c60248201526b3932b830b4b2101e1036b4b760a11b604482015290519081900360640190fd5b604080518581526020810183905281517f552544cb36551120f07c66c5cd4b2987725a0c72198587f2ce796099bb66c58c929181900390910190a150505050565b6000546001600160a01b03163314806119c257506002546001600160a01b031633145b806119dc57503360009081526004602052604090205460ff165b611a15576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b60008211611a58576040805162461bcd60e51b815260206004820152600b60248201526a06465706f736974203d20360ac1b604482015290519081900360640190fd5b6005546040805163317afabb60e21b81526004810185905290516000926001600160a01b03169163c5ebeaec91602480830192602092919082900301818787803b158015611aa557600080fd5b505af1158015611ab9573d6000803e3d6000fd5b505050506040513d6020811015611acf57600080fd5b5051905081811015611b19576040805162461bcd60e51b815260206004820152600e60248201526d3137b93937bbb2b2101e1036b4b760911b604482015290519081900360640190fd5b611b21612d58565b604080518481526020810183905281517fa3af609bf46297028ce551832669030f9effef2b02606d02cbbcc40fe6b47c55929181900390910190a1505050565b6000546001600160a01b0316331480611b8457506002546001600160a01b031633145b611bbd576040805162461bcd60e51b8152602060048201526005602482015264042c2eae8d60db1b604482015290519081900360640190fd5b6001600160a01b038116611c0f576040805162461bcd60e51b81526020600482015260146024820152737472656173757279203d2030206164647265737360601b604482015290519081900360640190fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39181900360200190a150565b6002546001600160a01b031681565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b801580611d1c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611cee57600080fd5b505afa158015611d02573d6000803e3d6000fd5b505050506040513d6020811015611d1857600080fd5b5051155b611d575760405162461bcd60e51b81526004018080602001828103825260368152602001806138b46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d8890849061314f565b6060611db88484600085613200565b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d8890849061314f565b604080516370a0823160e01b8152306004820152905160009182917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b158015611e6a57600080fd5b505afa158015611e7e573d6000803e3d6000fd5b505050506040513d6020811015611e9457600080fd5b505160408051630176f71760e71b81529051919250670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000e8d4a510000291611f48917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c9163bb7b8b8091600480820192602092909190829003018186803b158015611f1557600080fd5b505afa158015611f29573d6000803e3d6000fd5b505050506040513d6020811015611f3f57600080fd5b5051839061335b565b81611f4f57fe5b049150611ff57f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b505183906133bd565b91505090565b60007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561206a57600080fd5b505afa15801561207e573d6000803e3d6000fd5b505050506040513d602081101561209457600080fd5b5051600e5460408051637050ccd960e01b815230600482015260ff90921615156024830152519192507302e2151d4f351881017abdf2dd2b51150841d5b391637050ccd9916044808201926020929091908290030181600087803b1580156120fb57600080fd5b505af115801561210f573d6000803e3d6000fd5b505050506040513d602081101561212557600080fd5b505161216c576040805162461bcd60e51b815260206004820152601160248201527019d95d081c995dd85c990819985a5b1959607a1b604482015290519081900360640190fd5b60005b6003811015612268576000600b826003811061218757fe5b0154604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156121d157600080fd5b505afa1580156121e5573d6000803e3d6000fd5b505050506040513d60208110156121fb57600080fd5b50519050801561225f5761225f6008836003811061221557fe5b01546001600160a01b0316600b846003811061222d57fe5b01546001600160a01b03167f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4884613417565b5060010161216f565b50807f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122d757600080fd5b505afa1580156122eb573d6000803e3d6000fd5b505050506040513d602081101561230157600080fd5b50510390508181101561234a576040805162461bcd60e51b815260206004820152600c60248201526b383937b334ba101e1036b4b760a11b604482015290519081900360640190fd5b80156123c357600061271061236a6006548461335b90919063ffffffff16565b8161237157fe5b04905080156123c1576003546123b4906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488116911683611dc2565b6123be8282613657565b91505b505b6040805182815290517fbacfa9662d479c707dae707c358323f0c7711ef382007957dc9935e629da36b29181900360200190a15050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261245490859061314f565b50505050565b6000612464611e14565b60055460408051634d3c739760e11b815230600482015290519293506000926001600160a01b0390921691639a78e72e91602480820192602092909190829003018186803b1580156124b557600080fd5b505afa1580156124c9573d6000803e3d6000fd5b505050506040513d60208110156124df57600080fd5b50519050808211612527576040805162461bcd60e51b815260206004820152600d60248201526c1d1bdd185b080f0f481919589d609a1b604482015290519081900360640190fd5b8082036125338161281d565b604080518581526020810185905280820183905290519192507fa4e82b218f24092188d168c69d51d358ecc74ea795a76f7254d82e04dacd8a86919081900360600190a1505050565b6000612586611e14565b9050828110156125cb576040805162461bcd60e51b815260206004820152600b60248201526a3a37ba30b6101e1036b4b760a91b604482015290519081900360640190fd5b8181111561260e576040805162461bcd60e51b815260206004820152600b60248201526a0e8dee8c2d8407c40dac2f60ab1b604482015290519081900360640190fd5b60055460408051634d3c739760e11b815230600482015290516000928392839283926001600160a01b031691639a78e72e916024808301926020929190829003018186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d602081101561268957600080fd5b505190508085111561273f57604080516370a0823160e01b8152306004820152905182870395506001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816916370a08231916024808301926020929190829003018186803b15801561270057600080fd5b505afa158015612714573d6000803e3d6000fd5b505050506040513d602081101561272a57600080fd5b505191508184111561273a578193505b612745565b84810392505b60008411806127545750600083115b156127c6576005546040805163753c098560e01b8152600481018790526024810186905290516001600160a01b039092169163753c09859160448082019260009290919082900301818387803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b505050505b6040805185815260208101859052808201849052606081018790526080810183905290517fe177fe4805daa17de988516cc5351c74fad2fef614d4bce6145f624473870c129181900360a00190a150505050505050565b6000807f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b505190508083116128cb5782915050612cba565b60006128d5611e14565b90508084106128e2578093505b604080516370a0823160e01b81523060048201529051838603916000917302e2151d4f351881017abdf2dd2b51150841d5b3916370a08231916024808301926020929190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b50519050600061297783868603846136b4565b90508015612a5a577302e2151d4f351881017abdf2dd2b51150841d5b36001600160a01b031663c32e72028260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050602060405180830381600087803b1580156129e457600080fd5b505af11580156129f8573d6000803e3d6000fd5b505050506040513d6020811015612a0e57600080fd5b5051612a5a576040805162461bcd60e51b81526020600482015260166024820152751c995dd85c99081dda5d1a191c985dc819985a5b195960521b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b158015612aaf57600080fd5b505afa158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b5051905080821115612ae9578091505b8115612be7576000612710612b0d600f54612710038761335b90919063ffffffff16565b81612b1457fe5b604080516314f6943160e11b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820152602481018790527f0000000000000000000000000000000000000000000000000000000000000002600f0b60448201529290910460648301819052905190925073a79828df1850e8a3a3064576f380d90aecdd3359916329ed28629160848083019260209291908290030181600087803b158015612bb957600080fd5b505af1158015612bcd573d6000803e3d6000fd5b505050506040513d6020811015612be357600080fd5b5050505b60007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612c5657600080fd5b505afa158015612c6a573d6000803e3d6000fd5b505050506040513d6020811015612c8057600080fd5b5051905088811015612c9a579650612cba95505050505050565b858910612caf579650612cba95505050505050565b889750505050505050505b919050565b6000600b8360038110612cce57fe5b01546001600160a01b03169050600060088460038110612cea57fe5b01546001600160a01b031614612d2057612d2060088460038110612d0a57fe5b01546001600160a01b0383811691166000611c96565b8160088460038110612d2e57fe5b0180546001600160a01b0319166001600160a01b03928316179055610d8890821683600019611c96565b60007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015612dc757600080fd5b505afa158015612ddb573d6000803e3d6000fd5b505050506040513d6020811015612df157600080fd5b505190508015612ff657612e036137ff565b81817f000000000000000000000000000000000000000000000000000000000000000260048110612e3057fe5b60200201818152505060007343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6001600160a01b031663bb7b8b806040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b505190506000612efe82612ef8670de0b6b3a7640000612ef2887f000000000000000000000000000000000000000000000000000000e8d4a5100061335b565b9061335b565b906136ee565b90506000612710612f1e600f54612710038461335b90919063ffffffff16565b81612f2557fe5b60405163384e03db60e01b81527343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c6004820181815293909204935073a79828df1850e8a3a3064576f380d90aecdd33599263384e03db92918891869160240183608080838360005b83811015612f99578181015183820152602001612f81565b505050509050018281526020019350505050602060405180830381600087803b158015612fc557600080fd5b505af1158015612fd9573d6000803e3d6000fd5b505050506040513d6020811015612fef57600080fd5b5050505050505b604080516370a0823160e01b815230600482015290516000917343b4fdfd4ff969587185cdb6f0bd875c5fc83f8c916370a0823191602480820192602092909190829003018186803b15801561304b57600080fd5b505afa15801561305f573d6000803e3d6000fd5b505050506040513d602081101561307557600080fd5b5051905080156108d957604080516321d0683360e11b8152602460048201819052810183905260016044820152905173f403c135812408bfbe8713b5a23a04b3d48aae31916343a0d0669160648083019260209291908290030181600087803b1580156130e157600080fd5b505af11580156130f5573d6000803e3d6000fd5b505050506040513d602081101561310b57600080fd5b50516108d9576040805162461bcd60e51b815260206004820152600e60248201526d19195c1bdcda5d0819985a5b195960921b604482015290519081900360640190fd5b60006131a4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611da99092919063ffffffff16565b805190915015610d88578080602001905160208110156131c357600080fd5b5051610d885760405162461bcd60e51b815260040180806020018281038252602a81526020018061388a602a913960400191505060405180910390fd5b6060824710156132415760405162461bcd60e51b815260040180806020018281038252602681526020018061381e6026913960400191505060405180910390fd5b61324a85613755565b61329b576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106132d95780518252601f1990920191602091820191016132ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461333b576040519150601f19603f3d011682016040523d82523d6000602084013e613340565b606091505b509150915061335082828661375b565b979650505050505050565b60008261336a575060006133b7565b8282028284828161337757fe5b04146133b45760405162461bcd60e51b81526004018080602001828103825260218152602001806138696021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156133b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805160038082526080820190925260009160208201606080368337019050509050838160008151811061344857fe5b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061348a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505082816002815181106134b857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050846001600160a01b03166338ed17398360018430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561355d578181015183820152602001613545565b505050509050019650505050505050600060405180830381600087803b15801561358657600080fd5b505af115801561359a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156135c357600080fd5b81019080805160405193929190846401000000008211156135e357600080fd5b9083019060208201858111156135f857600080fd5b825186602082028301116401000000008211171561361557600080fd5b82525081516020918201928201910280838360005b8381101561364257818101518382015260200161362a565b50505050905001604052505050505050505050565b6000828211156136ae576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082156136e4578284106136ca575080611dbb565b826136d5858461335b565b816136dc57fe5b049050611dbb565b5060009392505050565b6000808211613744576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161374d57fe5b049392505050565b3b151590565b6060831561376a575081611dbb565b82511561377a5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137c45781810151838201526020016137ac565b50505050905090810190601f1680156137f15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040518060800160405280600490602082028036833750919291505056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c73747261746567792066756e64206d616e6167657220213d2066756e64206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220a817c9a146324a76c26ec3c679a0a6465ff7a804d1890a1a2059e9292586839964736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b00aa15f78a278be2fcb2aa7de899f3f863780f800000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
-----Decoded View---------------
Arg [0] : _fundManager (address): 0xb00AA15F78A278Be2FCb2aa7de899F3F863780f8
Arg [1] : _treasury (address): 0x86d10751B18F3fE331C146546868a07224A8598B
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b00aa15f78a278be2fcb2aa7de899f3f863780f8
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Deployed Bytecode Sourcemap
46115:290:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45292:345;;;;;;;;;;;;;;;;-1:-1:-1;45292:345:0;-1:-1:-1;;;;;45292:345:0;;:::i;:::-;;36829:101;;;:::i;:::-;;;;;;;;;;;;;;;;42855:116;;;;;;;;;;;;;;;;-1:-1:-1;42855:116:0;;:::i;28930:152::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28930:152:0;;;;;;;;:::i;35670:135::-;;;;;;;;;;;;;;;;-1:-1:-1;35670:135:0;;:::i;43331:75::-;;;:::i;26418:218::-;;;:::i;24492:26::-;;;:::i;27885:498::-;;;;;;;;;;;;;;;;-1:-1:-1;27885:498:0;-1:-1:-1;;;;;27885:498:0;;:::i;32136:31::-;;;;;;;;;;;;;;;;-1:-1:-1;32136:31:0;;:::i;:::-;;;;-1:-1:-1;;;;;32136:31:0;;;;;;;;;;;;;;44326:235;;;;;;;;;;;;;;;;-1:-1:-1;44326:235:0;;;;;;;;;;;;:::i;27034:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27034:235:0;;;;;;;;;;:::i;40294:584::-;;;;;;;;;;;;;;;;-1:-1:-1;40294:584:0;;:::i;28600:139::-;;;;;;;;;;;;;;;;-1:-1:-1;28600:139:0;;;;:::i;35865:136::-;;;;;;;;;;;;;;;;-1:-1:-1;35865:136:0;;;;:::i;33421:22::-;;;:::i;24659:40::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;26073:239;;;;;;;;;;;;;;;;-1:-1:-1;26073:239:0;-1:-1:-1;;;;;26073:239:0;;:::i;24205:23::-;;;:::i;24411:31::-;;;:::i;26719:189::-;;;;;;;;;;;;;;;;-1:-1:-1;26719:189:0;-1:-1:-1;;;;;26719:189:0;;:::i;27731:146::-;;;;;;;;;;;;;;;;-1:-1:-1;27731:146:0;;:::i;44189:129::-;;;;;;;;;;;;;;;;-1:-1:-1;44189:129:0;;;;;;;:::i;35372:154::-;;;;;;;;;;;;;;;;-1:-1:-1;35372:154:0;;;;;;-1:-1:-1;;;;;35372:154:0;;:::i;24144:27::-;;;:::i;32818:36::-;;;:::i;24324:42::-;;;;;;;;;;;;;;;;-1:-1:-1;24324:42:0;-1:-1:-1;;;;;24324:42:0;;:::i;44569:591::-;;;;;;;;;;;;;;;;-1:-1:-1;44569:591:0;-1:-1:-1;;;;;44569:591:0;;:::i;24114:23::-;;;:::i;40886:346::-;;;;;;;;;;;;;;;;-1:-1:-1;40886:346:0;;;;;;;:::i;37686:304::-;;;;;;;;;;;;;;;;-1:-1:-1;37686:304:0;;;;;;;:::i;27361:280::-;;;;;;;;;;;;;;;;-1:-1:-1;27361:280:0;-1:-1:-1;;;;;27361:280:0;;:::i;24178:20::-;;;:::i;24375:29::-;;;:::i;45292:345::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;45393:5:::1;-1:-1:-1::0;;;;;45375:24:0::1;:6;-1:-1:-1::0;;;;;45375:24:0::1;;;45367:52;;;::::0;;-1:-1:-1;;;45367:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45367:52:0;;;;;;;;;;;;;::::1;;45435:6;45430:114;32026:1;45447;:15;45430:114;;;45502:7;45510:1;45502:10;;;;;;;;::::0;-1:-1:-1;;;;;45492:20:0;;::::1;45502:10:::0;::::1;45492:20;;45484:48;;;::::0;;-1:-1:-1;;;45484:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45484:48:0;;;;;;;;;;;;;::::1;;45464:3;;45430:114;;;-1:-1:-1::0;45582:5:0::1;::::0;45589:39:::1;::::0;;-1:-1:-1;;;45589:39:0;;45622:4:::1;45589:39;::::0;::::1;::::0;;;45554:75:::1;::::0;-1:-1:-1;;;;;45582:5:0;;::::1;::::0;45589:24;;::::1;::::0;::::1;::::0;:39;;;;;::::1;::::0;;;;;;;;;:24;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45589:39:0;-1:-1:-1;;;;;45554:27:0;::::1;::::0;:75;:27:::1;:75::i;:::-;45292:345:::0;:::o;36829:101::-;36884:4;36908:14;:12;:14::i;:::-;36901:21;;36829:101;:::o;42855:116::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;42938:25:::1;42952:10;42938:13;:25::i;28930:152::-:0;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;29021:53:::1;-1:-1:-1::0;;;;;29021:5:0::1;:22;29044:5:::0;29059:4:::1;29066:7:::0;29021:22:::1;:53::i;:::-;28930:152:::0;;:::o;35670:135::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;33483:5:::1;35742;:17;;35734:40;;;::::0;;-1:-1:-1;;;35734:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35734:40:0;;;;;;;;;;;;;::::1;;35785:4;:12:::0;35670:135::o;43331:75::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;43391:7:::1;:5;:7::i;:::-;43331:75::o:0;26418:218::-;26486:12;;-1:-1:-1;;;;;26486:12:0;26472:10;:26;26464:54;;;;;-1:-1:-1;;;26464:54:0;;;;;;;;;;;;-1:-1:-1;;;26464:54:0;;;;;;;;;;;;;;;26529:8;:21;;-1:-1:-1;;;;;;26529:21:0;;;26540:10;26529:21;;;;;;;26561:25;;;;;;;26602:26;;;;;;;;;;;;;;;;26418:218::o;24492:26::-;;;;:::o;27885:498::-;25401:8;;-1:-1:-1;;;;;25401:8:0;25387:10;:22;25379:45;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;;;;27976:11:::1;::::0;-1:-1:-1;;;;;27976:11:0::1;27968:34:::0;27964:109:::1;;28045:11;::::0;28019:42:::1;::::0;-1:-1:-1;;;;;28019:5:0::1;:17:::0;::::1;::::0;28045:11:::1;;28019:17;:42::i;:::-;28153:5;-1:-1:-1::0;;;;;28107:52:0::1;28120:12;-1:-1:-1::0;;;;;28107:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28107:34:0;-1:-1:-1;;;;;28107:52:0::1;;28085:133;;;::::0;;-1:-1:-1;;;28085:133:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28231:11;:40:::0;;-1:-1:-1;;;;;;28231:40:0::1;-1:-1:-1::0;;;;;28231:40:0;;::::1;::::0;;;::::1;::::0;;;28282:47:::1;::::0;:5:::1;:17;28231:40:::0;-1:-1:-1;;28282:17:0::1;:47::i;:::-;28347:28;::::0;;-1:-1:-1;;;;;28347:28:0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;27885:498:::0;:::o;32136:31::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32136:31:0;;-1:-1:-1;32136:31:0;:::o;44326:235::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;44470:25:::1;44484:10;44470:13;:25::i;:::-;44506:7;:5;:7::i;:::-;44524:29;44532:9;44543;44524:7;:29::i;:::-;44326:235:::0;;;:::o;27034:::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27134:19:0;::::1;27126:48;;;::::0;;-1:-1:-1;;;27126:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27126:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;27185:17:0;::::1;;::::0;;;:10:::1;:17;::::0;;;;;;;;:31;;-1:-1:-1;;27185:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;27232:29;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;27034:235:::0;;:::o;40294:584::-;25844:11;;40405:9;;-1:-1:-1;;;;;25844:11:0;25822:10;:34;25814:60;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;;;;40450:1:::1;40440:7;:11;40432:36;;;::::0;;-1:-1:-1;;;40432:36:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40432:36:0;;;;;;;;;;;;;::::1;;40513:14;40530:18;40540:7;40530:9;:18::i;:::-;40573:11;::::0;:34:::1;::::0;;-1:-1:-1;;;40573:34:0;;40601:4:::1;40573:34;::::0;::::1;::::0;;;40513:35;;-1:-1:-1;40561:9:0::1;::::0;-1:-1:-1;;;;;40573:11:0;;::::1;::::0;:19:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;:11;:34;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;40573:34:0;;-1:-1:-1;40618:10:0::1;40631:14;:12;:14::i;:::-;40618:27;;40667:5;40660:4;:12;40656:64;;;40703:5;40696:4;:12;40689:19;;40656:64;40736:13:::0;;40732:87:::1;;40766:41;-1:-1:-1::0;;;;;40766:5:0::1;:18;40785:10;40797:9:::0;40766:18:::1;:41::i;:::-;40836:34;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;25885:1;;;40294:584:::0;;;:::o;28600:139::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;28694:21:::1;:37:::0;;-1:-1:-1;;28694:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28600:139::o;35865:136::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;35955:17:::1;:38:::0;;-1:-1:-1;;35955:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35865:136::o;33421:22::-;;;;:::o;24659:40::-;;;;;;:::o;26073:239::-;25401:8;;-1:-1:-1;;;;;25401:8:0;25387:10;:22;25379:45;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;;;;26230:12:::1;:28:::0;;-1:-1:-1;;;;;26230:28:0;::::1;-1:-1:-1::0;;;;;;26230:28:0;;::::1;::::0;::::1;::::0;;;26274:30:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26073:239:::0;:::o;24205:23::-;;;-1:-1:-1;;;;;24205:23:0;;:::o;24411:31::-;;;-1:-1:-1;;;;;24411:31:0;;:::o;26719:189::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26801:20:0;::::1;26793:50;;;::::0;;-1:-1:-1;;;26793:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26793:50:0;;;;;;;;;;;;;::::1;;26854:5;:14:::0;;-1:-1:-1;;;;;26854:14:0;::::1;-1:-1:-1::0;;;;;;26854:14:0;;::::1;::::0;::::1;::::0;;;26884:16:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26719:189:::0;:::o;27731:146::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;24562:4:::1;27810;:20;;27802:42;;;::::0;;-1:-1:-1;;;27802:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27802:42:0;;;;;;;;;;;;;::::1;;27855:7;:14:::0;27731:146::o;44189:129::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;44281:29:::1;44289:9;44300;44281:7;:29::i;35372:154::-:0;25401:8;;-1:-1:-1;;;;;25401:8:0;25387:10;:22;25379:45;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;-1:-1:-1;;;25379:45:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35452:18:0;::::1;35444:46;;;::::0;;-1:-1:-1;;;35444:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35444:46:0;;;;;;;;;;;;;::::1;;35501:17;35509:2;35513:4;35501:7;:17::i;24144:27::-:0;;;-1:-1:-1;;;;;24144:27:0;;:::o;32818:36::-;;;;;;:::o;24324:42::-;;;;;;;;;;;;;;;:::o;44569:591::-;25844:11;;-1:-1:-1;;;;;25844:11:0;25822:10;:34;25814:60;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;-1:-1:-1;;;25814:60:0;;;;;;;;;;;;;;;44650:14:::1;44676:9;44650:36;;44739:5;-1:-1:-1::0;;;;;44705:40:0::1;44713:5;-1:-1:-1::0;;;;;44713:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44713:13:0;-1:-1:-1;;;;;44705:40:0::1;;44697:76;;;::::0;;-1:-1:-1;;;44697:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;44846:11;::::0;44814:19:::1;::::0;;-1:-1:-1;;;44814:19:0;;;;-1:-1:-1;;;;;44846:11:0;;::::1;::::0;44814:17;::::1;::::0;::::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:17;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44814:19:0;-1:-1:-1;;;;;44806:52:0::1;;44784:139;;;;-1:-1:-1::0;;;44784:139:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44940:21;::::0;::::1;;44936:70;;;44978:16;44992:1;44978:13;:16::i;:::-;45018:8;45029:25;-1:-1:-1::0;;45029:9:0::1;:25::i;:::-;45018:36:::0;-1:-1:-1;45065:33:0::1;-1:-1:-1::0;;;;;45065:5:0::1;:17;45083:9:::0;45018:36;45065:17:::1;:33::i;:::-;45109:43;::::0;;-1:-1:-1;;;45109:43:0;;45141:4:::1;45109:43;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;45109:23:0;::::1;::::0;::::1;::::0;:43;;;;;-1:-1:-1;;45109:43:0;;;;;;;-1:-1:-1;45109:23:0;:43;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25885:1;;44569:591:::0;:::o;24114:23::-;;;-1:-1:-1;;;;;24114:23:0;;:::o;40886:346::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;40988:1:::1;40978:7;:11;40970:33;;;::::0;;-1:-1:-1;;;40970:33:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40970:33:0;;;;;;;;;;;;;::::1;;41046:14;41063:18;41073:7;41063:9;:18::i;:::-;41106:11;::::0;:28:::1;::::0;;-1:-1:-1;;;41106:28:0;;::::1;::::0;::::1;::::0;;;;;41046:35;;-1:-1:-1;41092:11:0::1;::::0;-1:-1:-1;;;;;41106:11:0;;::::1;::::0;:17:::1;::::0;:28;;;;;::::1;::::0;;;;;;;;;41092:11;41106;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41106:28:0;;-1:-1:-1;41153:14:0;;::::1;;41145:39;;;::::0;;-1:-1:-1;;;41145:39:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41145:39:0;;;;;;;;;;;;;::::1;;41202:22;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25759:1;;40886:346:::0;;:::o;37686:304::-;25658:8;;-1:-1:-1;;;;;25658:8:0;25644:10;:22;;:45;;-1:-1:-1;25684:5:0;;-1:-1:-1;;;;;25684:5:0;25670:10;:19;25644:45;:71;;;-1:-1:-1;25704:10:0;25693:22;;;;:10;:22;;;;;;;;25644:71;25622:126;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;-1:-1:-1;;;25622:126:0;;;;;;;;;;;;;;;37790:1:::1;37780:7;:11;37772:35;;;::::0;;-1:-1:-1;;;37772:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37772:35:0;;;;;;;;;;;;;::::1;;37836:11;::::0;:27:::1;::::0;;-1:-1:-1;;;37836:27:0;;::::1;::::0;::::1;::::0;;;;;37820:13:::1;::::0;-1:-1:-1;;;;;37836:11:0::1;::::0;:18:::1;::::0;:27;;;;;::::1;::::0;;;;;;;;37820:13;37836:11;:27;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37836:27:0;;-1:-1:-1;37882:16:0;;::::1;;37874:43;;;::::0;;-1:-1:-1;;;37874:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37874:43:0;;;;;;;;;;;;;::::1;;37930:10;:8;:10::i;:::-;37956:26;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;25759:1;37686:304:::0;;:::o;27361:280::-;25516:8;;-1:-1:-1;;;;;25516:8:0;25502:10;:22;;:45;;-1:-1:-1;25542:5:0;;-1:-1:-1;;;;;25542:5:0;25528:10;:19;25502:45;25494:63;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;-1:-1:-1;;;25494:63:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27516:23:0;::::1;27508:56;;;::::0;;-1:-1:-1;;;27508:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;27508:56:0;;;;;;;;;;;;;::::1;;27575:8;:20:::0;;-1:-1:-1;;;;;27575:20:0;::::1;-1:-1:-1::0;;;;;;27575:20:0;;::::1;::::0;::::1;::::0;;;27611:22:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;27361:280:::0;:::o;24178:20::-;;;-1:-1:-1;;;;;24178:20:0;;:::o;24375:29::-;;;:::o;13660:704::-;14075:10;;;14074:62;;-1:-1:-1;14091:39:0;;;-1:-1:-1;;;14091:39:0;;14115:4;14091:39;;;;-1:-1:-1;;;;;14091:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14091:39:0;:44;14074:62;14052:166;;;;-1:-1:-1;;;14052:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14283:62;;;-1:-1:-1;;;;;14283:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14283:62:0;-1:-1:-1;;;14283:62:0;;;14229:127;;14263:5;;14229:19;:127::i;3640:229::-;3777:12;3809:52;3831:6;3839:4;3845:1;3848:12;3809:21;:52::i;:::-;3802:59;;3640:229;;;;;;:::o;12856:245::-;13024:58;;;-1:-1:-1;;;;;13024:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13024:58:0;-1:-1:-1;;;13024:58:0;;;12970:123;;13004:5;;12970:19;:123::i;36009:812::-;36438:31;;;-1:-1:-1;;;36438:31:0;;36463:4;36438:31;;;;;;36055:10;;;;32768:42;;36438:16;;:31;;;;;;;;;;;;;;32768:42;36438:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36438:31:0;36707:30;;;-1:-1:-1;;;36707:30:0;;;;36438:31;;-1:-1:-1;36748:4:0;36742:3;:10;;36697:41;;33157:42;;36707:28;;:30;;;;;36438:31;;36707:30;;;;;;;;33157:42;36707:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36707:30:0;36697:5;;:9;:41::i;:::-;:56;;;;;;36689:64;;36772:41;36782:5;-1:-1:-1;;;;;36782:15:0;;36806:4;36782:30;;;;;;;;;;;;;-1:-1:-1;;;;;36782:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36782:30:0;36772:5;;:9;:41::i;:::-;36764:49;;36009:812;;:::o;41844:1003::-;41983:9;41995:5;-1:-1:-1;;;;;41995:15:0;;42019:4;41995:30;;;;;;;;;;;;;-1:-1:-1;;;;;41995:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41995:30:0;42092:17;;42060:50;;;-1:-1:-1;;;42060:50:0;;42085:4;42060:50;;;;42092:17;;;;42060:50;;;;;;;41995:30;;-1:-1:-1;32768:42:0;;42060:16;;:50;;;;;41995:30;;42060:50;;;;;;;;42092:17;32768:42;42060:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42060:50:0;42038:117;;;;;-1:-1:-1;;;42038:117:0;;;;;;;;;;;;-1:-1:-1;;;42038:117:0;;;;;;;;;;;;;;;42173:6;42168:246;32026:1;42185;:15;42168:246;;;42222:14;42246:7;42254:1;42246:10;;;;;;;;;42239:43;;;-1:-1:-1;;;42239:43:0;;42276:4;42239:43;;;;;;-1:-1:-1;;;;;42246:10:0;;;;42239:28;;:43;;;;;;;;;;;;;;;42246:10;42239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42239:43:0;;-1:-1:-1;42301:13:0;;42297:106;;42335:52;42341:3;42345:1;42341:6;;;;;;;;;-1:-1:-1;;;;;42341:6:0;42349:7;42357:1;42349:10;;;;;;;;;-1:-1:-1;;;;;42349:10:0;42369:5;42377:9;42335:5;:52::i;:::-;-1:-1:-1;42202:3:0;;42168:246;;;;42466:4;42433:5;-1:-1:-1;;;;;42433:15:0;;42457:4;42433:30;;;;;;;;;;;;;-1:-1:-1;;;;;42433:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42433:30:0;:37;;-1:-1:-1;42489:18:0;;;;42481:43;;;;;-1:-1:-1;;;42481:43:0;;;;;;;;;;;;-1:-1:-1;;;42481:43:0;;;;;;;;;;;;;;;42590:8;;42586:218;;42615:8;24645:5;42626:17;42635:7;;42626:4;:8;;:17;;;;:::i;:::-;:32;;;;;;;-1:-1:-1;42677:7:0;;42673:120;;42724:8;;42705:33;;-1:-1:-1;;;;;42705:5:0;:18;;;42724:8;42734:3;42705:18;:33::i;:::-;42764:13;:4;42773:3;42764:8;:13::i;:::-;42757:20;;42673:120;42586:218;;42821:18;;;;;;;;;;;;;;;;;41844:1003;;:::o;13109:282::-;13304:68;;;-1:-1:-1;;;;;13304:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13304:68:0;-1:-1:-1;;;13304:68:0;;;13250:133;;13284:5;;13250:19;:133::i;:::-;13109:282;;;;:::o;42979:344::-;43015:10;43028:14;:12;:14::i;:::-;43065:11;;:34;;;-1:-1:-1;;;43065:34:0;;43093:4;43065:34;;;;;;43015:27;;-1:-1:-1;43053:9:0;;-1:-1:-1;;;;;43065:11:0;;;;:19;;:34;;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43065:34:0;;-1:-1:-1;43118:12:0;;;43110:38;;;;;-1:-1:-1;;;43110:38:0;;;;;;;;;;;;-1:-1:-1;;;43110:38:0;;;;;;;;;;;;;;;43175:12;;;43255:17;43175:12;43255:9;:17::i;:::-;43290:25;;;;;;;;;;;;;;;;;;;;43246:26;;-1:-1:-1;43290:25:0;;;;;;;;;;42979:344;;;:::o;43414:767::-;43482:10;43495:14;:12;:14::i;:::-;43482:27;;43537:9;43528:5;:18;;43520:42;;;;;-1:-1:-1;;;43520:42:0;;;;;;;;;;;;-1:-1:-1;;;43520:42:0;;;;;;;;;;;;;;;43590:9;43581:5;:18;;43573:42;;;;;-1:-1:-1;;;43573:42:0;;;;;;;;;;;;-1:-1:-1;;;43573:42:0;;;;;;;;;;;;;;;43732:11;;:34;;;-1:-1:-1;;;43732:34:0;;43760:4;43732:34;;;;;;43628:9;;;;;;;;-1:-1:-1;;;;;43732:11:0;;:19;;:34;;;;;;;;;;;;;;:11;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43732:34:0;;-1:-1:-1;43781:12:0;;;43777:247;;;43853:30;;;-1:-1:-1;;;43853:30:0;;43877:4;43853:30;;;;;;43817:12;;;;-1:-1:-1;;;;;;43853:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43853:30:0;;-1:-1:-1;43902:11:0;;;43898:63;;;43941:4;43934:11;;43898:63;43777:247;;;44007:5;44000:4;:12;43993:19;;43777:247;44047:1;44040:4;:8;:20;;;;44059:1;44052:4;:8;44040:20;44036:83;;;44077:11;;:30;;;-1:-1:-1;;;44077:30:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44077:11:0;;;;:18;;:30;;;;;:11;;:30;;;;;;;;:11;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44036:83;44136:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43414:767;;;;;;;:::o;38751:1535::-;38801:4;38818:8;38829:5;-1:-1:-1;;;;;38829:15:0;;38853:4;38829:30;;;;;;;;;;;;;-1:-1:-1;;;;;38829:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38829:30:0;;-1:-1:-1;38874:14:0;;;38870:61;;38912:7;38905:14;;;;;38870:61;38943:10;38956:14;:12;:14::i;:::-;38943:27;;38998:5;38987:7;:16;38983:64;;39030:5;39020:15;;38983:64;39114:31;;;-1:-1:-1;;;39114:31:0;;39139:4;39114:31;;;;;;39071:13;;;;39059:9;;32768:42;;39114:16;;:31;;;;;;;;;;;;;;32768:42;39114:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39114:31:0;;-1:-1:-1;39198:11:0;39212:53;39234:4;39240:11;;;39114:31;39212:21;:53::i;:::-;39198:67;-1:-1:-1;39315:10:0;;39311:159;;32768:42;-1:-1:-1;;;;;39392:24:0;;39417:6;39425:5;39392:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39392:39:0;39384:74;;;;;-1:-1:-1;;;39384:74:0;;;;;;;;;;;;-1:-1:-1;;;39384:74:0;;;;;;;;;;;;;;;39527:33;;;-1:-1:-1;;;39527:33:0;;39554:4;39527:33;;;;;;39514:10;;33320:42;;39527:18;;:33;;;;;;;;;;;;;;;33320:42;39527:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39527:33:0;;-1:-1:-1;39575:14:0;;;39571:61;;;39615:5;39606:14;;39571:61;39648:10;;39644:266;;39675:8;33483:5;39686:25;39706:4;;33483:5;39695:15;39686:4;:8;;:25;;;;:::i;:::-;:36;;;;;39737:161;;;-1:-1:-1;;;39737:161:0;;33157:42;39737:161;;;;;;;;;;39855:5;39737:161;;;;;;39686:36;;;;39737:161;;;;;;;;39686:36;;-1:-1:-1;32984:42:0;;39737:29;;:161;;;;;;;;;;;;;;-1:-1:-1;32984:42:0;39737:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39644:266:0;39922:13;39938:5;-1:-1:-1;;;;;39938:15:0;;39962:4;39938:30;;;;;;;;;;;;;-1:-1:-1;;;;;39938:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39938:30:0;;-1:-1:-1;39983:18:0;;;39979:66;;;40025:8;-1:-1:-1;40018:15:0;;-1:-1:-1;;;;;;40018:15:0;39979:66;40168:5;40157:7;:16;40153:64;;40197:8;-1:-1:-1;40190:15:0;;-1:-1:-1;;;;;;40190:15:0;40153:64;40271:7;40264:14;;;;;;;;;38751:1535;;;;:::o;35024:340::-;35083:13;35106:7;35114:2;35106:11;;;;;;;;;-1:-1:-1;;;;;35106:11:0;;-1:-1:-1;35106:11:0;35169:3;35173:2;35169:7;;;;;;;;;-1:-1:-1;;;;;35169:7:0;:21;35165:84;;35207:30;35226:3;35230:2;35226:7;;;;;;;;;-1:-1:-1;;;;;35207:18:0;;;;35226:7;;35207:18;:30::i;:::-;35271:4;35261:3;35265:2;35261:7;;;;;;;;:14;;-1:-1:-1;;;;;;35261:14:0;-1:-1:-1;;;;;35261:14:0;;;;;;35316:40;;:18;;35335:4;-1:-1:-1;;35316:18:0;:40::i;36938:740::-;36977:8;36988:5;-1:-1:-1;;;;;36988:15:0;;37012:4;36988:30;;;;;;;;;;;;;-1:-1:-1;;;;;36988:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36988:30:0;;-1:-1:-1;37033:7:0;;37029:471;;37057:22;;:::i;:::-;37111:3;37094:7;37102:5;37094:14;;;;;;;;;;:20;;;;;37234:18;33157:42;-1:-1:-1;;;;;37255:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37255:30:0;;-1:-1:-1;37300:11:0;37314:41;37255:30;37314:22;37331:4;37314:12;:3;37322;37314:7;:12::i;:::-;:16;;:22::i;:::-;:26;;:41::i;:::-;37300:55;;37370:8;33483:5;37381:27;37403:4;;33483:5;37392:15;37381:6;:10;;:27;;;;:::i;:::-;:38;;;;;37436:52;;-1:-1:-1;;;37436:52:0;;33157:42;37436:52;;;;;;37381:38;;;;;-1:-1:-1;32984:42:0;;37436:17;;33157:42;37475:7;;37381:38;;37436:52;;37475:7;37436:52;;;37475:7;-1:-1:-1;37436:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37029:471:0;37525:33;;;-1:-1:-1;;;37525:33:0;;37552:4;37525:33;;;;;;37512:10;;33320:42;;37525:18;;:33;;;;;;;;;;;;;;;33320:42;37525:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37525:33:0;;-1:-1:-1;37573:9:0;;37569:102;;37607:33;;;-1:-1:-1;;;37607:33:0;;32694:2;37607:33;;;;;;;;;;;37635:4;37607:33;;;;;;32600:42;;37607:15;;:33;;;;;;;;;;;;;;-1:-1:-1;32600:42:0;37607:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37607:33:0;37599:60;;;;;-1:-1:-1;;;37599:60:0;;;;;;;;;;;;-1:-1:-1;;;37599:60:0;;;;;;;;;;;;;;15555:860;15979:23;16005:106;16047:4;16005:106;;;;;;;;;;;;;;;;;16013:5;-1:-1:-1;;;;;16005:27:0;;;:106;;;;;:::i;:::-;16126:17;;15979:132;;-1:-1:-1;16126:21:0;16122:286;;16299:10;16288:30;;;;;;;;;;;;;;;-1:-1:-1;16288:30:0;16262:134;;;;-1:-1:-1;;;16262:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4853:605;5020:12;5092:5;5067:21;:30;;5045:118;;;;-1:-1:-1;;;5045:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5182:18;5193:6;5182:10;:18::i;:::-;5174:60;;;;;-1:-1:-1;;;5174:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5308:12;5322:23;5349:6;-1:-1:-1;;;;;5349:11:0;5368:5;5375:4;5349:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5349:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5307:73;;;;5398:52;5416:7;5425:10;5437:12;5398:17;:52::i;:::-;5391:59;4853:605;-1:-1:-1;;;;;;;4853:605:0:o;19356:208::-;19408:4;19429:6;19425:20;;-1:-1:-1;19444:1:0;19437:8;;19425:20;19465:5;;;19469:1;19465;:5;:1;19489:5;;;;;:10;19481:56;;;;-1:-1:-1;;;19481:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19555:1;-1:-1:-1;19356:208:0;;;;;:::o;18498:167::-;18550:4;18576:5;;;18600:6;;;;18592:46;;;;;-1:-1:-1;;;18592:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:508;41543:16;;;41557:1;41543:16;;;;;;;;;41519:21;;41543:16;;;;;;;;;;-1:-1:-1;41543:16:0;41519:40;;41580:8;41570:4;41575:1;41570:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;41570:18:0;;;-1:-1:-1;;;;;41570:18:0;;;;;31941:42;41599:4;41604:1;41599:7;;;;;;;;;;;;;:14;-1:-1:-1;;;;;41599:14:0;;;-1:-1:-1;;;;;41599:14:0;;;;;41634:9;41624:4;41629:1;41624:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;41624:19:0;;;-1:-1:-1;;;;;41624:19:0;;;;;41672:4;-1:-1:-1;;;;;41656:46:0;;41717:7;41739:1;41755:4;41782;41802:15;41656:172;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41656:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41656:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41656:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:508;;;;;:::o;18948:149::-;19000:4;19030:1;19025;:6;;19017:49;;;;;-1:-1:-1;;;19017:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19084:5:0;;;18948:149::o;37998:745::-;38131:4;38471:10;;38467:250;;38588:6;38577:7;:17;38573:77;;-1:-1:-1;38622:12:0;38615:19;;38573:77;38699:6;38671:25;:7;38683:12;38671:11;:25::i;:::-;:34;;;;;;38664:41;;;;38467:250;-1:-1:-1;38734:1:0;37998:745;;;;;:::o;20042:144::-;20094:4;20123:1;20119;:5;20111:44;;;;;-1:-1:-1;;;20111:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20177:1;20173;:5;;;;;;;20042:144;-1:-1:-1;;;20042:144:0:o;683:441::-;1060:20;1108:8;;;683:441::o;7683:777::-;7833:12;7862:7;7858:595;;;-1:-1:-1;7893:10:0;7886:17;;7858:595;8007:17;;:21;8003:439;;8270:10;8264:17;8331:15;8318:10;8314:2;8310:19;8303:44;8218:148;8413:12;8406:20;;-1:-1:-1;;;8406:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://a817c9a146324a76c26ec3c679a0a6465ff7a804d1890a1a2059e92925868399
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.