Contract
0x584f21aee241dbf21e5d3f4428e9cd9bb4890b61
1
Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | ||
---|---|---|---|---|---|---|---|---|
0x5d7e14dfe07f8135c493cf1f9e855dfc1a00e967b6843c8f5114fbd678f647b3 | 0x60806040 | 22670061 | 220 days 19 hrs ago | 0xbd52b44c9dc5fc5c4f1f49fed5cfca10fbd052f1 | IN | Create: Strategy_DAI_FTM | 0 FTM | 1.1513094 |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
Strategy_DAI_FTM
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2021-11-21 */ // SPDX-License-Identifier: MIT pragma solidity =0.8.9; library FullMath { function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, type(uint256).max); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & (~d+1); d /= pow2; l /= pow2; l += h * ((~pow2+1) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; if (h == 0) return l / d; require(h < d, 'FullMath: FULLDIV_OVERFLOW'); return fullDiv(l, h, d); } } library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint256 _x; } uint8 public constant RESOLUTION = 112; uint256 public constant Q112 = 0x10000000000000000000000000000; // 2**112 // decode a UQ144x112 into a uint144 by truncating after the radix point function decode144(uq144x112 memory self) internal pure returns (uint144) { return uint144(self._x >> RESOLUTION); } // multiply a UQ112x112 by a uint, returning a UQ144x112 // reverts on overflow function mul(uq112x112 memory self, uint256 y) internal pure returns (uq144x112 memory) { uint256 z = 0; require(y == 0 || (z = self._x * y) / y == self._x, 'FixedPoint::mul: overflow'); return uq144x112(z); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // can be lossy function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= type(uint144).max) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= type(uint224).max, 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= type(uint224).max, 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface IWETH is IERC20 { function deposit() external payable; function transfer(address dst, uint wad) external returns (bool); function withdraw(uint wad) external; } interface IRouter { function factory() external view returns (address); function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, 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); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IPair { function token0() external view returns (address); function token1() external view returns (address); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function blockTimestampLast() external view returns (uint); function getReserves() external view returns (uint112, uint112, uint32); function totalSupply() external view returns (uint256); function MINIMUM_LIQUIDITY() external view returns (uint256); function mint(address to) external returns (uint256); } // ------------> Important interface for farm. Must be changed for every farm <-------------- interface IFarm{ function boo() external view returns (address); function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); function poolInfo(uint256) external view returns(address lpToken, uint allocPoint, uint lastRewardBlock, uint accSpiritPerShare, uint16 depositFeeBP); } // library with helper methods for oracles that are concerned with computing average prices library UniswapV2OracleLibrary { using FixedPoint for *; // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1] function currentBlockTimestamp() internal view returns (uint32) { return uint32(block.timestamp % 2 ** 32); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices( address pair ) internal view returns (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) { blockTimestamp = currentBlockTimestamp(); price0Cumulative = IPair(pair).price0CumulativeLast(); price1Cumulative = IPair(pair).price1CumulativeLast(); // if time has elapsed since the last update on the pair, mock the accumulated price values (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IPair(pair).getReserves(); if (blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint32 timeElapsed = blockTimestamp - blockTimestampLast; // addition overflow is desired // counterfactual price0Cumulative += uint(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed; // counterfactual price1Cumulative += uint(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed; } } } library Math { function min(uint x, uint y) internal pure returns (uint z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } contract Strategy_DAI_FTM { // This strategy is for FTM network. DAI - FTM pair. RewardToken = "Boo" using SafeERC20 for IERC20; using Address for address; using FixedPoint for *; uint256 public constant withdrawFee = 15; // 15% uint256 public constant toleranceLevelPercent = 1; // 1% uint256 private constant PERIOD = 10 seconds; uint256 private constant percentCheckDifference = 5; uint256 public pendingFee; // in native tokens uint256 public pendingRewardsFee; // in reward tokens from farm address public constant USDT = 0x049d68029688eAbF473097a2fC38ef61633A3C7A; address public constant yelLiquidityRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; address public constant YELtoken = 0xD3b71117E6C1558c1553305b44988cd944e97300; address public constant WETH = 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83; address public token0; // wftm address public token1; // dai address public vault; // ------------> Important constants <-------------- uint256 public constant pid = 3; bool public constant hasPid = true; address public router = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; address public constant lpToken = 0xe120ffBDA0d14f3Bb6d6053E90E63c572A66a428; address public constant farm = 0x2b2929E785374c651a81A63878Ab22742656DcDd; // ------------> END <-------------- mapping(address => uint256) public pendingYel; uint private price0CumulativeLast; uint private price1CumulativeLast; uint32 private blockTimestampLast; uint256 public token1TWAP; uint256 public token0TWAP; uint256 public token1Price; uint256 public token0Price; event AutoCompound(); event Earn(uint256 amount); event YELswapped(uint256 percent); event WithdrawFromStrategy(uint256 amount); event TakeFee(uint256 rewardsFeeInWETH, uint256 amountWETH); modifier onlyVault() { require(msg.sender == vault, "The sender is not vault"); _; } constructor(address _vault) { require(_vault != address(0), "Vault can not be zero address"); vault = _vault; token0 = IPair(lpToken).token0(); token1 = IPair(lpToken).token1(); _approveToken(lpToken, farm); _approveToken(WETH, router); _approveToken(token0, router); _approveToken(token1, router); price0CumulativeLast = IPair(lpToken).price0CumulativeLast(); // fetch the current accumulated price value (0 / 1) price1CumulativeLast = IPair(lpToken).price1CumulativeLast(); // fetch the current accumulated price value (0 / 1) (,,blockTimestampLast) = IPair(lpToken).getReserves(); } receive() external payable onlyVault { deposit(); } // ------------> Important functions for farm <-------------- function getRewardToken() public view returns (address){ return IFarm(farm).boo(); } function _withdrawFromFarm(uint256 _amount) internal { IFarm(farm).withdraw(pid, _amount); } function getAmountLPFromFarm() public view returns (uint256 amount) { (amount,) = IFarm(farm).userInfo(pid, address(this)); } function earn() public returns(uint256 _balance){ _balance = getBalanceOfToken(lpToken); if(_balance > 0) { IFarm(farm).deposit(pid, _balance); emit Earn(getBalanceOfToken(lpToken)); } } // -------------------------> END <--------------------------- // each farm has own autoCompound logic, pay attention // what tokens can be returned from the farm function autoCompound() external { address[] memory path = new address[](2); uint256 amount = getAmountLPFromFarm(); address rewardToken = getRewardToken(); _approveToken(rewardToken, router); _approveToken(WETH, router); _approveToken(USDT, router); if (amount > 0) { // rewards and LP _withdrawFromFarm(amount); uint256 _balance = getBalanceOfToken(rewardToken); if(_balance > 0){ path[0] = rewardToken; path[1] = WETH; // WFTM amount = _getAmountsOut(_balance+pendingRewardsFee, path); if(amount > 100) { _swapExactTokensForTokens(router, _balance+pendingRewardsFee, amount, path); pendingRewardsFee = 0; } else{ pendingRewardsFee += _calculateAmountFee(_balance); } _takeFee(); } _addLiquidityFromAllTokens(); earn(); } emit AutoCompound(); } function claimYel(address _receiver) public onlyVault { uint256 yelAmount = getPendingYel(_receiver); if(yelAmount > 0) { _transfer(YELtoken, _receiver, yelAmount); pendingYel[_receiver] = 0; } } function emergencyWithdraw(address _receiver) public onlyVault { uint256 amount = getAmountLPFromFarm(); address _token = getRewardToken(); _withdrawFromFarm(amount); _transfer(lpToken, _receiver, getBalanceOfToken(lpToken)); _transfer(_token, _receiver, getBalanceOfToken(_token)); _transfer(USDT, _receiver, getBalanceOfToken(USDT)); _transfer(WETH, _receiver, getBalanceOfToken(WETH)); } function requestWithdraw(address _receiver, uint256 _percent) public onlyVault { uint256 _totalLP = getAmountLPFromFarm(); if (_totalLP > 0) { uint256 yelAmount = _swapToYELs(_percent); if(yelAmount > 0) { pendingYel[_receiver] += yelAmount; } emit WithdrawFromStrategy(yelAmount); } } function migrate(uint256 _percent) public onlyVault { _swapLPtoWETH(_percent * 10 ** 12); _transfer(WETH, vault, getBalanceOfToken(WETH)); } function deposit() public payable onlyVault returns (uint256) { _approveToken(token0, router); _approveToken(token1, router); _updateAveragePrices(); // it needs to involve previous leftover funds _addLiquidityETH(address(this).balance); uint256 lpBalance = earn(); return _getSimpleTCI(lpBalance); } function depositAsMigrate() public onlyVault { require(getBalanceOfToken(WETH) > 0, "Not enough WETH to make migration"); _approveToken(token0, router); _approveToken(token1, router); _approveToken(token0, lpToken); _approveToken(token1, lpToken); _approveToken(lpToken, farm); _approveToken(WETH, router); _addLiquidityFromAllTokens(); earn(); } function getTotalCapitalInternal() public view returns (uint256) { return _getSimpleTCI(getAmountLPFromFarm()); } function getTotalCapital() public view returns (uint256) { return _getSimpleTC(); } function getPendingYel(address _receiver) public view returns(uint256) { return pendingYel[_receiver]; } function getBalanceOfToken(address _token) public view returns (uint256) { if(_token == WETH) { return IERC20(_token).balanceOf(address(this)) - pendingFee; } if(_token == getRewardToken()) { return IERC20(_token).balanceOf(address(this)) - pendingRewardsFee; } return IERC20(_token).balanceOf(address(this)); } function _getAmountsOut(uint256 _amount, address[] memory path) internal view returns (uint256){ uint256[] memory amounts = IRouter(router).getAmountsOut(_amount, path); return amounts[1]; } function _getTokenValues( uint256 _amountLP ) internal view returns (uint256 token0Value, uint256 token1Value) { (uint256 _reserve0, uint256 _reserve1,) = IPair(lpToken).getReserves(); uint256 LPRatio = _amountLP * (10**12) / IPair(lpToken).totalSupply(); // Result with LPRatio must be divided by (10**12)! token0Value = LPRatio * _reserve0 / (10**12); token1Value = LPRatio * _reserve1 / (10**12); } function setRouter(address _address) public onlyVault { require(_address != address(0), "The address can not be zero address"); router = _address; _approveToken(WETH, router); _approveToken(token0, router); _approveToken(token1, router); } function withdrawUSDTFee(address _owner) public onlyVault { uint256 _balance = getBalanceOfToken(USDT); if(_balance > 0) { _transfer(USDT, _owner, _balance); } } function _transfer(address _token, address _to, uint256 _amount) internal { IERC20(_token).transfer(_to, _amount); } function _calculateAmountFee(uint256 amount) internal pure returns(uint256) { /* As the contract takes fee percent from the amount, so amount needs to multiple by percent and divide by 100 example: amount = 50 LP, percent = 2% fee calculates: 50 * 2 / 100 fee result: 1 LP */ return (amount * withdrawFee) / 100; } function _approveToken(address _token, address _who) internal { IERC20(_token).safeApprove(_who, 0); IERC20(_token).safeApprove(_who, type(uint256).max); } function _takeFee() internal { address[] memory path = new address[](2); path[0] = WETH; path[1] = USDT; uint256 rewardsFeeInWETH = _calculateAmountFee(getBalanceOfToken(WETH)); if(rewardsFeeInWETH > 0) { uint256 amount = _getAmountsOut(rewardsFeeInWETH + pendingFee, path); if(amount > 100) { _swapExactTokensForTokens(router, rewardsFeeInWETH + pendingFee, amount, path); pendingFee = 0; emit TakeFee(rewardsFeeInWETH, amount); } else { pendingFee += rewardsFeeInWETH; } } } function _getLiquidityAmounts( uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal view returns (uint amountA, uint amountB) { (uint reserveA, uint reserveB,) = IPair(lpToken).getReserves(); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = IRouter(router).quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { if(amountBOptimal >= amountBMin) { (amountA, amountB) = (amountADesired, amountBOptimal); } else { (amountA, amountB) = (0, 0); } } else { uint amountAOptimal = IRouter(router).quote(amountBDesired, reserveB, reserveA); if(amountAOptimal <= amountADesired && amountAOptimal >= amountAMin) { (amountA, amountB) = (amountAOptimal, amountBDesired); } else { (amountA, amountB) = (0, 0); } } } } function _addLiquidity(uint256 _desired0, uint256 _desired1) internal { if(_canAddLiquidity(_desired0, _desired1)) { _transfer(token0, lpToken, _desired0); _transfer(token1, lpToken, _desired1); IPair(lpToken).mint(address(this)); } } function _canAddLiquidity(uint256 amount0, uint256 amount1) internal view returns (bool) { (uint112 _reserve0, uint112 _reserve1,) = IPair(lpToken).getReserves(); // gas savings uint256 _totalSupply = IPair(lpToken).totalSupply(); uint256 liquidity; uint256 minLiquidity = IPair(lpToken).MINIMUM_LIQUIDITY(); if (_totalSupply == 0) { liquidity = Math.sqrt(amount0 * amount1) - minLiquidity; } else { liquidity = Math.min( amount0 * _totalSupply / _reserve0, amount1 * _totalSupply / _reserve1 ); } return liquidity > 0; } function _addLiquidityFromAllTokens() internal { _swapWETHToTokens(); uint256 _balance0 = getBalanceOfToken(token0); uint256 _balance1 = getBalanceOfToken(token1); if(_balance0 > 100 && _balance1 > 100) { (uint256 amount0, uint256 amount1) = _getLiquidityAmounts( _balance0, _balance1, _balance0 - (_balance0*toleranceLevelPercent)/100, _balance1 - (_balance1*toleranceLevelPercent)/100 ); if(amount0 != 0 && amount1 !=0) _addLiquidity(amount0, amount1); } } function _removeLiquidity() internal { _approveToken(lpToken, router); IRouter(router).removeLiquidity( token0, // tokenA token1, // tokenB getBalanceOfToken(lpToken), // liquidity 0, // amountAmin0 0, // amountAmin1 address(this), // to block.timestamp + 1 minutes // deadline ); } function updateTWAP() public onlyVault { _updateTWAP(); } function _updateAveragePrices() internal { _updateTWAP(); _checkPrice(); } function _updateTWAP() internal { (uint price0Cumulative, uint price1Cumulative, uint32 blockTimestamp) = UniswapV2OracleLibrary.currentCumulativePrices(address(lpToken)); uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired token0TWAP = uint256(FixedPoint .uq112x112(uint224((price0Cumulative - price0CumulativeLast) / timeElapsed)) .mul(1e36) .decode144()) / 1e18; token1TWAP = uint256(FixedPoint .uq112x112(uint224((price1Cumulative - price1CumulativeLast) / timeElapsed)) .mul(1e36) .decode144()) / 1e18; price0CumulativeLast = price0Cumulative; price1CumulativeLast = price1Cumulative; blockTimestampLast = blockTimestamp; } function _checkPrice() internal { // check that price difference no more than 5 percent // price per one token token1Price = _getTokenPrice(); string memory msgError = "Prices have more than 5 percent difference for token1"; if(token1TWAP >= token1Price) { require(100 - (token1Price * 100 / token1TWAP) <= percentCheckDifference, msgError); } else { require(100 - (token1TWAP * 100 / token1Price) <= percentCheckDifference, msgError); } token0Price = _getTokenPrice1(); } function _swapExactETHForTokens(address _token, uint256 _amountETH) internal { uint256[] memory amounts; address[] memory path = new address[](2); path[0] = WETH; // swap a half of msg.value to token if(_token != WETH) { path[1] = _token; amounts = IRouter(router).getAmountsOut(_amountETH/2, path); uint256 desiredAmountToken = amounts[1]; if(desiredAmountToken > 100){ IRouter(router).swapExactETHForTokens{value:_amountETH/2}( desiredAmountToken - (desiredAmountToken*toleranceLevelPercent/100), // amountOutMin path, address(this), block.timestamp + 1 minutes // deadline ); } } } function _addLiquidityETH(uint256 _amountETH) internal { _swapExactETHForTokens(token1, _amountETH); __addLiquidityETH(token1, _amountETH / 2); } function __addLiquidityETH(address _token, uint256 desiredAmountETH) internal { uint256 desiredAmountToken = getBalanceOfToken(_token); (uint256 amount0, uint256 amount1) = _getLiquidityAmounts( desiredAmountETH, desiredAmountToken, desiredAmountETH - (desiredAmountETH*toleranceLevelPercent)/100, desiredAmountToken - (desiredAmountToken*toleranceLevelPercent)/100 ); if(amount0 != 0 && amount1 !=0 && _canAddLiquidity(amount0, amount1)) { _transfer(_token, lpToken, amount1); IWETH(WETH).deposit{value: amount0}(); IWETH(WETH).transfer(lpToken, amount0); IPair(lpToken).mint(address(this)); } } function _swapLPtoWETH(uint256 _percent) internal { uint256 _totalLP = getAmountLPFromFarm(); if (_totalLP > 0) { _withdrawFromFarm((_percent * _totalLP) / (100 * 10 ** 12)); address rewardToken = getRewardToken(); _approveToken(rewardToken, router); _approveToken(WETH, router); // swap cakes to WETH _swapTokenToWETH(rewardToken); // swap LPs to token0 and token1 _removeLiquidity(); // swap token1 to WETH _swapTokenToWETH(token1); } } function _swapToYELs(uint256 _percent) internal returns (uint256 newYelBalance){ _swapLPtoWETH(_percent); // swap to YEL uint256 _oldYelBalance = getBalanceOfToken(YELtoken); _approveToken(YELtoken, yelLiquidityRouter); _approveToken(WETH, yelLiquidityRouter); _swapWETHToToken(yelLiquidityRouter, YELtoken); // return an amount of YEL that the user can claim newYelBalance = getBalanceOfToken(YELtoken) - _oldYelBalance; emit YELswapped(newYelBalance); } function _swapTokenToWETH(address _token) internal { address[] memory path = new address[](2); uint256[] memory amounts; // swap _token and token1 to WETH path[1] = WETH; if(_token != WETH) { path[0] = _token; uint256 _balance = getBalanceOfToken(path[0]); if(_balance > 0) { amounts = IRouter(router).getAmountsOut(_balance, path); if(amounts[1] > 100) { _swapExactTokensForTokens(router, _balance, amounts[1], path); } } } } function _swapWETHToToken(address _router, address _token) internal { address[] memory path = new address[](2); path[0] = WETH; path[1] = _token; uint256 _balanceWETH = getBalanceOfToken(WETH); uint256[] memory amounts = IRouter(_router).getAmountsOut(_balanceWETH, path); if(amounts[1] > 100) { _swapExactTokensForTokens(_router, _balanceWETH, amounts[1], path); } } function _swapExactTokensForTokens( address _router, uint256 _amount, uint256 _amount2, address[] memory _path) internal { IRouter(_router).swapExactTokensForTokens( _amount, // desired out rewards _amount2 - (_amount2*toleranceLevelPercent)/100, // min desired WFTM _path, address(this), block.timestamp+1 minutes ); } function _swapWETHToTokens() internal { address[] memory path = new address[](2); path[0] = WETH; uint256 _balance = getBalanceOfToken(WETH) / 2; if (_balance > 0) { path[1] = token1; uint256 amount = _getAmountsOut(_balance, path); if(amount > 100) { _swapExactTokensForTokens(router, _balance, amount, path); } } } function _getTokenPrice() internal view returns (uint256) { address[] memory path = new address[](2); path[0] = token0; path[1] = token1; return 1e36 / (_getAmountsOut(100 * 1e18, path) / 100); } function _getTokenPrice1() internal view returns (uint256) { address[] memory path = new address[](2); path[0] = token1; path[1] = token0; return 1e36 / (_getAmountsOut(100 * 1e18, path) / 100); } function _getSimpleTCI(uint256 _amount) internal view returns (uint256 tCI) { uint256 d = 1e18; if(_amount > 0) { // t0V - token0 value // t1V - token1 value (uint256 t0V, uint256 t1V) = _getTokenValues(_amount); // calculates how many wrapped tokens for token1 tCI = _getTokenPrice() * t1V / d + t0V; } // calculates total Capital from tokens that exist in the contract uint256 _balance = getBalanceOfToken(token1); if (_balance > 0) { tCI += _getTokenPrice() * _balance / d; } // calculates total Capital from Wrapped tokens that exist in the contract tCI += getBalanceOfToken(WETH); } function _getSimpleTC() internal view returns (uint256 TC) { address[] memory path = new address[](2); uint256 _totalLP = getAmountLPFromFarm(); path[1] = WETH; if(_totalLP > 0) { (uint256 t0V, uint256 t1V) = _getTokenValues(_totalLP); // calculates how many nativeToken for tokens if(t1V != 0) { path[0] = token1; TC = _getAmountsOut(t1V, path) + t0V; } } // calculates total Capital from tokens that exist on the contract uint256 _balance = getBalanceOfToken(token1); if (_balance > 0) { path[0] = token1; TC += _getAmountsOut(_balance, path); } // calculates total Capital from WETH tokens that exist on the contract TC += getBalanceOfToken(WETH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AutoCompound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Earn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardsFeeInWETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountWETH","type":"uint256"}],"name":"TakeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFromStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percent","type":"uint256"}],"name":"YELswapped","type":"event"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YELtoken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"claimYel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositAsMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earn","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAmountLPFromFarm","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getBalanceOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"getPendingYel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalCapitalInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingYel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percent","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0TWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1TWAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toleranceLevelPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateTWAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawUSDTFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yelLiquidityRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600580546001600160a01b03191673f491e7b69e4244ad4002bc14e878a34207e38c291790553480156200003757600080fd5b50604051620048b8380380620048b88339810160408190526200005a9162000889565b6001600160a01b038116620000b65760405162461bcd60e51b815260206004820152601d60248201527f5661756c742063616e206e6f74206265207a65726f206164647265737300000060448201526064015b60405180910390fd5b600480546001600160a01b0319166001600160a01b03831617815560408051630dfe168160e01b815290516000805160206200489883398151915292630dfe168192808201926020929091829003018186803b1580156200011657600080fd5b505afa1580156200012b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000151919062000889565b600260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600080516020620048988339815191526001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015620001c057600080fd5b505afa158015620001d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fb919062000889565b600380546001600160a01b0319166001600160a01b03929092169190911790556200024a60008051602062004898833981519152732b2929e785374c651a81a63878ab22742656dcdd6200046f565b60055462000277907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b03166200046f565b60025460055462000295916001600160a01b0390811691166200046f565b600354600554620002b3916001600160a01b0390811691166200046f565b600080516020620048988339815191526001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015620002fc57600080fd5b505afa15801562000311573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003379190620008b4565b600781905550600080516020620048988339815191526001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038657600080fd5b505afa1580156200039b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c19190620008b4565b600881905550600080516020620048988339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156200041057600080fd5b505afa15801562000425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044b9190620008eb565b6009805463ffffffff191663ffffffff9290921691909117905550620009eb915050565b62000495816000846001600160a01b0316620004c060201b62001294179092919060201c565b620004bc81600019846001600160a01b0316620004c060201b62001294179092919060201c565b5050565b8015806200054e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200051157600080fd5b505afa15801562000526573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200054c9190620008b4565b155b620005c25760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401620000ad565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200061a9185916200061f16565b505050565b60006200067b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316620006fd60201b620013da179092919060201c565b8051909150156200061a57808060200190518101906200069c919062000941565b6200061a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620000ad565b60606200070e848460008562000718565b90505b9392505050565b6060824710156200077b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620000ad565b843b620007cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620000ad565b600080866001600160a01b03168587604051620007e9919062000998565b60006040518083038185875af1925050503d806000811462000828576040519150601f19603f3d011682016040523d82523d6000602084013e6200082d565b606091505b509092509050620008408282866200084b565b979650505050505050565b606083156200085c57508162000711565b8251156200086d5782518084602001fd5b8160405162461bcd60e51b8152600401620000ad9190620009b6565b6000602082840312156200089c57600080fd5b81516001600160a01b03811681146200071157600080fd5b600060208284031215620008c757600080fd5b5051919050565b80516001600160701b0381168114620008e657600080fd5b919050565b6000806000606084860312156200090157600080fd5b6200090c84620008ce565b92506200091c60208501620008ce565b9150604084015163ffffffff811681146200093657600080fd5b809150509250925092565b6000602082840312156200095457600080fd5b815180151581146200071157600080fd5b60005b838110156200098257818101518382015260200162000968565b8381111562000992576000848401525b50505050565b60008251620009ac81846020870162000965565b9190910192915050565b6020815260008251806020840152620009d781604085016020870162000965565b601f01601f19169190910160400192915050565b613e9d80620009fb6000396000f3fe6080604052600436106102295760003560e01c8063a644d68511610123578063d2802be5116100ab578063f10684541161006f578063f10684541461065d578063f887ea4014610672578063fbfa77cf14610692578063fc039165146106b2578063fe566b09146106c757600080fd5b8063d2802be5146105e0578063d389800f146105f5578063d79599601461060a578063d920a90114610632578063e941fa781461064857600080fd5b8063b42a8e55116100f2578063b42a8e551461053a578063c0d7865514610570578063c54e44eb14610590578063d0e30db0146105b8578063d21220a7146105c057600080fd5b8063a644d685146104bd578063ad5c4648146104e2578063ae4bbfc914610504578063b06dd06f1461051a57600080fd5b80636d79b7e6116101b157806397091078116101755780639709107814610435578063987b04f01461045d5780639ad160e31461047d5780639b1b4d49146104925780639bea590e146104a857600080fd5b80636d79b7e61461039e5780636ff1c9bc146103b3578063818df50e146103d3578063821c05761461040057806383786f8c1461041557600080fd5b8063397a1b28116101f8578063397a1b281461030f578063454b0608146103315780635fcbd28514610351578063643090bc1461037357806369940d791461038957600080fd5b806302ee8de9146102715780630dfe16811461029957806336e9332d146102d15780633750440d146102f957600080fd5b3661026c576004546001600160a01b031633146102615760405162461bcd60e51b815260040161025890613967565b60405180910390fd5b6102696106dd565b50005b600080fd5b34801561027d57600080fd5b5061028661076f565b6040519081526020015b60405180910390f35b3480156102a557600080fd5b506002546102b9906001600160a01b031681565b6040516001600160a01b039091168152602001610290565b3480156102dd57600080fd5b506102b9732b2929e785374c651a81a63878ab22742656dcdd81565b34801561030557600080fd5b50610286600c5481565b34801561031b57600080fd5b5061032f61032a3660046139b3565b610786565b005b34801561033d57600080fd5b5061032f61034c3660046139df565b61083d565b34801561035d57600080fd5b506102b9600080516020613df383398151915281565b34801561037f57600080fd5b5061028660005481565b34801561039557600080fd5b506102b96108af565b3480156103aa57600080fd5b5061032f610936565b3480156103bf57600080fd5b5061032f6103ce3660046139f8565b610ab1565b3480156103df57600080fd5b506102866103ee3660046139f8565b60066020526000908152604090205481565b34801561040c57600080fd5b5061032f610b94565b34801561042157600080fd5b506102866104303660046139f8565b610d87565b34801561044157600080fd5b506102b973d3b71117e6c1558c1553305b44988cd944e9730081565b34801561046957600080fd5b5061032f6104783660046139f8565b610efa565b34801561048957600080fd5b50610286610f6e565b34801561049e57600080fd5b50610286600d5481565b3480156104b457600080fd5b5061032f610fff565b3480156104c957600080fd5b506104d2600181565b6040519015158152602001610290565b3480156104ee57600080fd5b506102b9600080516020613e4883398151915281565b34801561051057600080fd5b50610286600b5481565b34801561052657600080fd5b5061032f6105353660046139f8565b611033565b34801561054657600080fd5b506102866105553660046139f8565b6001600160a01b031660009081526006602052604090205490565b34801561057c57600080fd5b5061032f61058b3660046139f8565b6110b6565b34801561059c57600080fd5b506102b973049d68029688eabf473097a2fc38ef61633a3c7a81565b6102866106dd565b3480156105cc57600080fd5b506003546102b9906001600160a01b031681565b3480156105ec57600080fd5b50610286600181565b34801561060157600080fd5b506102866111b1565b34801561061657600080fd5b506102b973f491e7b69e4244ad4002bc14e878a34207e38c2981565b34801561063e57600080fd5b50610286600a5481565b34801561065457600080fd5b50610286600f81565b34801561066957600080fd5b50610286600381565b34801561067e57600080fd5b506005546102b9906001600160a01b031681565b34801561069e57600080fd5b506004546102b9906001600160a01b031681565b3480156106be57600080fd5b5061028661128a565b3480156106d357600080fd5b5061028660015481565b6004546000906001600160a01b0316331461070a5760405162461bcd60e51b815260040161025890613967565b600254600554610726916001600160a01b0390811691166113f3565b600354600554610742916001600160a01b0390811691166113f3565b61074a61141e565b6107534761142e565b600061075d6111b1565b905061076881611464565b9150505b90565b600061078161077c610f6e565b611464565b905090565b6004546001600160a01b031633146107b05760405162461bcd60e51b815260040161025890613967565b60006107ba610f6e565b905080156108385760006107cd83611527565b90508015610803576001600160a01b038416600090815260066020526040812080548392906107fd908490613a2b565b90915550505b6040518181527f748ba37f09995b0c469a5bf09f6ea468913b453f110d54f69705396278aa5e999060200160405180910390a1505b505050565b6004546001600160a01b031633146108675760405162461bcd60e51b815260040161025890613967565b61087e6108798264e8d4a51000613a43565b61164c565b6004546108ac90600080516020613e48833981519152906001600160a01b03166108a782610d87565b6116f0565b50565b6000732b2929e785374c651a81a63878ab22742656dcdd6001600160a01b0316634b3df2006040518163ffffffff1660e01b815260040160206040518083038186803b1580156108fe57600080fd5b505afa158015610912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107819190613a62565b6004546001600160a01b031633146109605760405162461bcd60e51b815260040161025890613967565b6000610979600080516020613e48833981519152610d87565b116109d05760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f756768205745544820746f206d616b65206d6967726174696f6044820152603760f91b6064820152608401610258565b6002546005546109ec916001600160a01b0390811691166113f3565b600354600554610a08916001600160a01b0390811691166113f3565b600254610a2c906001600160a01b0316600080516020613df38339815191526113f3565b600354610a50906001600160a01b0316600080516020613df38339815191526113f3565b610a7c600080516020613df3833981519152732b2929e785374c651a81a63878ab22742656dcdd6113f3565b600554610aa190600080516020613e48833981519152906001600160a01b03166113f3565b610aa9611778565b6108ac6111b1565b6004546001600160a01b03163314610adb5760405162461bcd60e51b815260040161025890613967565b6000610ae5610f6e565b90506000610af16108af565b9050610afc8261183c565b610b26600080516020613df3833981519152846108a7600080516020613df3833981519152610d87565b610b3481846108a784610d87565b610b6a73049d68029688eabf473097a2fc38ef61633a3c7a846108a773049d68029688eabf473097a2fc38ef61633a3c7a610d87565b610838600080516020613e48833981519152846108a7600080516020613e48833981519152610d87565b6040805160028082526060820183526000926020830190803683370190505090506000610bbf610f6e565b90506000610bcb6108af565b600554909150610be59082906001600160a01b03166113f3565b600554610c0a90600080516020613e48833981519152906001600160a01b03166113f3565b600554610c359073049d68029688eabf473097a2fc38ef61633a3c7a906001600160a01b03166113f3565b8115610d5957610c448261183c565b6000610c4f82610d87565b90508015610d46578184600081518110610c6b57610c6b613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613e4883398151915284600181518110610cad57610cad613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050610ce460015482610cde9190613a2b565b856118ab565b92506064831115610d1e57600554600154610d14916001600160a01b031690610d0d9084613a2b565b858761195c565b6000600155610d3e565b610d2781611a10565b60016000828254610d389190613a2b565b90915550505b610d46611a29565b610d4e611778565b610d566111b1565b50505b6040517ff9ede3d1cf0bada9c84393b93ca853fddbd2aa2c948305b839424fb4c39419f790600090a1505050565b60006001600160a01b038216600080516020613e488339815191521415610e33576000546040516370a0823160e01b81523060048201526001600160a01b038416906370a08231906024015b60206040518083038186803b158015610deb57600080fd5b505afa158015610dff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e239190613aab565b610e2d9190613ac4565b92915050565b610e3b6108af565b6001600160a01b0316826001600160a01b03161415610e83576001546040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401610dd3565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b158015610ec257600080fd5b505afa158015610ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190613aab565b6004546001600160a01b03163314610f245760405162461bcd60e51b815260040161025890613967565b6000610f4373049d68029688eabf473097a2fc38ef61633a3c7a610d87565b90508015610f6a57610f6a73049d68029688eabf473097a2fc38ef61633a3c7a83836116f0565b5050565b6040516393f1a40b60e01b815260036004820152306024820152600090732b2929e785374c651a81a63878ab22742656dcdd906393f1a40b90604401604080518083038186803b158015610fc157600080fd5b505afa158015610fd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff99190613adb565b50919050565b6004546001600160a01b031633146110295760405162461bcd60e51b815260040161025890613967565b611031611ba3565b565b6004546001600160a01b0316331461105d5760405162461bcd60e51b815260040161025890613967565b6001600160a01b0381166000908152600660205260409020548015610f6a5761109b73d3b71117e6c1558c1553305b44988cd944e9730083836116f0565b506001600160a01b0316600090815260066020526040812055565b6004546001600160a01b031633146110e05760405162461bcd60e51b815260040161025890613967565b6001600160a01b0381166111425760405162461bcd60e51b815260206004820152602360248201527f54686520616464726573732063616e206e6f74206265207a65726f206164647260448201526265737360e81b6064820152608401610258565b600580546001600160a01b0319166001600160a01b03831690811790915561117990600080516020613e48833981519152906113f3565b600254600554611195916001600160a01b0390811691166113f3565b6003546005546108ac916001600160a01b0390811691166113f3565b60006111ca600080516020613df3833981519152610d87565b9050801561076c57604051631c57762b60e31b81526003600482015260248101829052732b2929e785374c651a81a63878ab22742656dcdd9063e2bbb15890604401600060405180830381600087803b15801561122657600080fd5b505af115801561123a573d6000803e3d6000fd5b505050507fe9d573778e0925491fffd3b5b980fb161b898fd42d8e2dcd7c128f9de611c1bc611276600080516020613df3833981519152610d87565b60405190815260200160405180910390a190565b6000610781611cd3565b80158061131d5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190613aab565b155b6113885760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610258565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610838908490611e5b565b60606113e98484600085611f2d565b90505b9392505050565b6114086001600160a01b038316826000611294565b610f6a6001600160a01b03831682600019611294565b611426611ba3565b611031612055565b600354611444906001600160a01b031682612135565b6003546108ac906001600160a01b031661145f600284613b15565b612349565b6000670de0b6b3a764000082156114b35760008061148185612523565b9150915081838261149061269b565b61149a9190613a43565b6114a49190613b15565b6114ae9190613a2b565b935050505b6003546000906114cb906001600160a01b0316610d87565b905080156114fe5781816114dd61269b565b6114e79190613a43565b6114f19190613b15565b6114fb9084613a2b565b92505b611515600080516020613e48833981519152610d87565b61151f9084613a2b565b949350505050565b60006115328261164c565b600061155173d3b71117e6c1558c1553305b44988cd944e97300610d87565b905061158573d3b71117e6c1558c1553305b44988cd944e9730073f491e7b69e4244ad4002bc14e878a34207e38c296113f3565b6115b1600080516020613e4883398151915273f491e7b69e4244ad4002bc14e878a34207e38c296113f3565b6115e373f491e7b69e4244ad4002bc14e878a34207e38c2973d3b71117e6c1558c1553305b44988cd944e97300612769565b8061160173d3b71117e6c1558c1553305b44988cd944e97300610d87565b61160b9190613ac4565b91507f75f2417fcfccb57c521bdf0059341d12df0d56ad818a71946a7c22c0410daccc8260405161163e91815260200190565b60405180910390a150919050565b6000611656610f6e565b90508015610f6a57611681655af3107a40006116728385613a43565b61167c9190613b15565b61183c565b600061168b6108af565b6005549091506116a59082906001600160a01b03166113f3565b6005546116ca90600080516020613e48833981519152906001600160a01b03166113f3565b6116d3816128ea565b6116db612a8f565b600354610838906001600160a01b03166128ea565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190613b29565b50505050565b611780612b9e565b600254600090611798906001600160a01b0316610d87565b6003549091506000906117b3906001600160a01b0316610d87565b90506064821180156117c55750606481115b15610f6a57600080611819848460646117df600184613a43565b6117e99190613b15565b6117f39088613ac4565b6064611800600189613a43565b61180a9190613b15565b6118149088613ac4565b612ca1565b915091508160001415801561182d57508015155b15611772576117728282612ed1565b604051630441a3e760e41b81526003600482015260248101829052732b2929e785374c651a81a63878ab22742656dcdd9063441a3e7090604401600060405180830381600087803b15801561189057600080fd5b505af11580156118a4573d6000803e3d6000fd5b5050505050565b60055460405163d06ca61f60e01b815260009182916001600160a01b039091169063d06ca61f906118e29087908790600401613b8f565b60006040518083038186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119369190810190613ba8565b90508060018151811061194b5761194b613a95565b602002602001015191505092915050565b6001600160a01b0384166338ed1739846064611979600187613a43565b6119839190613b15565b61198d9086613ac4565b843061199a42603c613a2b565b6040518663ffffffff1660e01b81526004016119ba959493929190613c66565b600060405180830381600087803b1580156119d457600080fd5b505af11580156119e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118a49190810190613ba8565b60006064611a1f600f84613a43565b610e2d9190613b15565b604080516002808252606082018352600092602083019080368337019050509050600080516020613e4883398151915281600081518110611a6c57611a6c613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505073049d68029688eabf473097a2fc38ef61633a3c7a81600181518110611ab457611ab4613a95565b60200260200101906001600160a01b031690816001600160a01b0316815250506000611af5611af0600080516020613e48833981519152610d87565b611a10565b90508015610f6a576000611b1660005483611b109190613a2b565b846118ab565b90506064811115611b8857600554600054611b46916001600160a01b031690611b3f9085613a2b565b838661195c565b6000805560408051838152602081018390527fa7c0e55d8b5d8665b86e9000d34040ddf14724d539c7cb9366ccb87e511419fb910160405180910390a1505050565b81600080828254611b999190613a2b565b9091555050505050565b6000806000611bbf600080516020613df3833981519152612fa8565b6009549295509093509150600090611bdd9063ffffffff1683613ca2565b9050670de0b6b3a7640000611c40611c396ec097ce7bc90715b34b9f100000000060405180602001604052808663ffffffff166007548b611c1e9190613ac4565b611c289190613b15565b6001600160e01b03169052906131cc565b5160701c90565b6001600160901b0316611c539190613b15565b600b81905550670de0b6b3a7640000611c98611c396ec097ce7bc90715b34b9f100000000060405180602001604052808663ffffffff166008548a611c1e9190613ac4565b6001600160901b0316611cab9190613b15565b600a55506007929092556008556009805463ffffffff191663ffffffff909216919091179055565b604080516002808252606082018352600092839291906020830190803683370190505090506000611d02610f6e565b9050600080516020613e4883398151915282600181518110611d2657611d26613a95565b6001600160a01b03909216602092830291909101909101528015611db957600080611d5083612523565b9150915080600014611db65760035484516001600160a01b03909116908590600090611d7e57611d7e613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505081611da982866118ab565b611db39190613a2b565b94505b50505b600354600090611dd1906001600160a01b0316610d87565b90508015611e325760035483516001600160a01b03909116908490600090611dfb57611dfb613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050611e2581846118ab565b611e2f9085613a2b565b93505b611e49600080516020613e48833981519152610d87565b611e539085613a2b565b935050505090565b6000611eb0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166113da9092919063ffffffff16565b8051909150156108385780806020019051810190611ece9190613b29565b6108385760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610258565b606082471015611f8e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610258565b843b611fdc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610258565b600080866001600160a01b03168587604051611ff89190613cf3565b60006040518083038185875af1925050503d8060008114612035576040519150601f19603f3d011682016040523d82523d6000602084013e61203a565b606091505b509150915061204a82828661326a565b979650505050505050565b61205d61269b565b600c819055506000604051806060016040528060358152602001613e13603591399050600c54600a54106120db576005600a54600c54606461209f9190613a43565b6120a99190613b15565b6120b4906064613ac4565b111581906120d55760405162461bcd60e51b81526004016102589190613d0f565b50612127565b6005600c54600a5460646120ef9190613a43565b6120f99190613b15565b612104906064613ac4565b111581906121255760405162461bcd60e51b81526004016102589190613d0f565b505b61212f6132a3565b600d5550565b60408051600280825260608083018452926000929190602083019080368337019050509050600080516020613e488339815191528160008151811061217c5761217c613a95565b6001600160a01b0392831660209182029290920101528416600080516020613e48833981519152146117725783816001815181106121bc576121bc613a95565b6001600160a01b0392831660209182029290920101526005541663d06ca61f6121e6600286613b15565b836040518363ffffffff1660e01b8152600401612204929190613b8f565b60006040518083038186803b15801561221c57600080fd5b505afa158015612230573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122589190810190613ba8565b915060008260018151811061226f5761226f613a95565b6020026020010151905060648111156118a4576005546001600160a01b0316637ff36ab561229e600287613b15565b60646122ab600186613a43565b6122b59190613b15565b6122bf9085613ac4565b85306122cc42603c613a2b565b6040518663ffffffff1660e01b81526004016122eb9493929190613d42565b6000604051808303818588803b15801561230457600080fd5b505af1158015612318573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526123419190810190613ba8565b505050505050565b600061235483610d87565b905060008061236b848460646117df600184613a43565b915091508160001415801561237f57508015155b801561239057506123908282613319565b156118a4576123ae85600080516020613df3833981519152836116f0565b600080516020613e488339815191526001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123f757600080fd5b505af115801561240b573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152600080516020613df3833981519152600482015260248101869052600080516020613e48833981519152935063a9059cbb92506044019050602060405180830381600087803b15801561246c57600080fd5b505af1158015612480573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a49190613b29565b506040516335313c2160e11b8152306004820152600080516020613df383398151915290636a62784290602401602060405180830381600087803b1580156124eb57600080fd5b505af11580156124ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123419190613aab565b600080600080600080516020613df38339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561257057600080fd5b505afa158015612584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a89190613d8e565b506001600160701b031691506001600160701b031691506000600080516020613df38339815191526001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561260857600080fd5b505afa15801561261c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126409190613aab565b61264f8764e8d4a51000613a43565b6126599190613b15565b905064e8d4a5100061266b8483613a43565b6126759190613b15565b945064e8d4a510006126878383613a43565b6126919190613b15565b9350505050915091565b60408051600280825260608201835260009283929190602083019080368337505060025482519293506001600160a01b0316918391506000906126e0576126e0613a95565b6001600160a01b03928316602091820292909201015260035482519116908290600190811061271157612711613a95565b60200260200101906001600160a01b031690816001600160a01b031681525050606461274668056bc75e2d63100000836118ab565b6127509190613b15565b610768906ec097ce7bc90715b34b9f1000000000613b15565b604080516002808252606082018352600092602083019080368337019050509050600080516020613e48833981519152816000815181106127ac576127ac613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106127e0576127e0613a95565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612819600080516020613e48833981519152610d87565b90506000846001600160a01b031663d06ca61f83856040518363ffffffff1660e01b815260040161284b929190613b8f565b60006040518083038186803b15801561286357600080fd5b505afa158015612877573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261289f9190810190613ba8565b90506064816001815181106128b6576128b6613a95565b602002602001015111156118a4576118a48583836001815181106128dc576128dc613a95565b60200260200101518661195c565b6040805160028082526060820183526000926020830190803683370190505090506060600080516020613e488339815191528260018151811061292f5761292f613a95565b6001600160a01b0392831660209182029290920101528316600080516020613e488339815191521461083857828260008151811061296f5761296f613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505060006129b4836000815181106129a7576129a7613a95565b6020026020010151610d87565b905080156117725760055460405163d06ca61f60e01b81526001600160a01b039091169063d06ca61f906129ee9084908790600401613b8f565b60006040518083038186803b158015612a0657600080fd5b505afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ba8565b9150606482600181518110612a5957612a59613a95565b60200260200101511115611772576005548251611772916001600160a01b0316908390859060019081106128dc576128dc613a95565b600554612ab490600080516020613df3833981519152906001600160a01b03166113f3565b6005546002546003546001600160a01b039283169263baa2abde9281169116612aea600080516020613df3833981519152610d87565b60008030612af942603c613a2b565b60405160e089901b6001600160e01b03191681526001600160a01b039788166004820152958716602487015260448601949094526064850192909252608484015290921660a482015260c481019190915260e4016040805180830381600087803b158015612b6657600080fd5b505af1158015612b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613adb565b604080516002808252606082018352600092602083019080368337019050509050600080516020613e4883398151915281600081518110612be157612be1613a95565b60200260200101906001600160a01b031690816001600160a01b03168152505060006002612c1c600080516020613e48833981519152610d87565b612c269190613b15565b90508015610f6a5760035482516001600160a01b039091169083906001908110612c5257612c52613a95565b60200260200101906001600160a01b031690816001600160a01b0316815250506000612c7e82846118ab565b9050606481111561083857600554610838906001600160a01b031683838661195c565b600080600080600080516020613df38339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612cee57600080fd5b505afa158015612d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d269190613d8e565b506001600160701b031691506001600160701b03169150816000148015612d4b575080155b15612d5b57879350869250612ec6565b600554604051632b58577b60e21b8152600481018a905260248101849052604481018390526000916001600160a01b03169063ad615dec9060640160206040518083038186803b158015612dae57600080fd5b505afa158015612dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de69190613aab565b9050878111612e0d57858110612e0157889450925082612ec4565b60009450849350612ec4565b600554604051632b58577b60e21b8152600481018a905260248101849052604481018590526000916001600160a01b03169063ad615dec9060640160206040518083038186803b158015612e6057600080fd5b505afa158015612e74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e989190613aab565b9050898111158015612eaa5750878110155b15612eba57945087935084612ec2565b600095508594505b505b505b505094509492505050565b612edb8282613319565b15610f6a57600254612f05906001600160a01b0316600080516020613df3833981519152846116f0565b600354612f2a906001600160a01b0316600080516020613df3833981519152836116f0565b6040516335313c2160e11b8152306004820152600080516020613df383398151915290636a62784290602401602060405180830381600087803b158015612f7057600080fd5b505af1158015612f84573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190613aab565b6000806000612fb5613526565b9050836001600160a01b0316635909c0d56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ff057600080fd5b505afa158015613004573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130289190613aab565b9250836001600160a01b0316635a3d54936040518163ffffffff1660e01b815260040160206040518083038186803b15801561306357600080fd5b505afa158015613077573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061309b9190613aab565b91506000806000866001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156130db57600080fd5b505afa1580156130ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131139190613d8e565b9250925092508363ffffffff168163ffffffff16146131c25760006131388286613ca2565b90508063ffffffff1661315d846001600160701b0316866001600160701b0316613537565b5161317191906001600160e01b0316613a43565b61317b9088613a2b565b96508063ffffffff166131a0856001600160701b0316856001600160701b0316613537565b516131b491906001600160e01b0316613a43565b6131be9087613a2b565b9550505b5050509193909250565b6040805160208101909152600081526000821580613209575083516001600160e01b0316836131fb8183613a43565b92506132079083613b15565b145b6132555760405162461bcd60e51b815260206004820152601960248201527f4669786564506f696e743a3a6d756c3a206f766572666c6f77000000000000006044820152606401610258565b60408051602081019091529081529392505050565b606083156132795750816113ec565b8251156132895782518084602001fd5b8160405162461bcd60e51b81526004016102589190613d0f565b60408051600280825260608201835260009283929190602083019080368337505060035482519293506001600160a01b0316918391506000906132e8576132e8613a95565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061271157612711613a95565b6000806000600080516020613df38339815191526001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561336557600080fd5b505afa158015613379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339d9190613d8e565b50915091506000600080516020613df38339815191526001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133eb57600080fd5b505afa1580156133ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134239190613aab565b9050600080600080516020613df38339815191526001600160a01b031663ba9a7a566040518163ffffffff1660e01b815260040160206040518083038186803b15801561346f57600080fd5b505afa158015613483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a79190613aab565b9050826134d257806134c16134bc898b613a43565b613667565b6134cb9190613ac4565b9150613519565b6135166001600160701b0386166134e9858b613a43565b6134f39190613b15565b6001600160701b038616613507868b613a43565b6135119190613b15565b6136d1565b91505b5015159695505050505050565b600061078164010000000042613dde565b604080516020810190915260008152600082116135a55760405162461bcd60e51b815260206004820152602660248201527f4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206260448201526579207a65726f60d01b6064820152608401610258565b826135bf5750604080516020810190915260008152610e2d565b6001600160901b0383116136565760006135dd83607086901b613b15565b90506001600160e01b038111156136365760405162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f7700006044820152606401610258565b6040518060200160405280826001600160e01b0316815250915050610e2d565b60006135dd84600160701b856136e7565b600060038211156136c25750806000613681600283613b15565b61368c906001613a2b565b90505b81811015610ff9579050806002816136a78186613b15565b6136b19190613a2b565b6136bb9190613b15565b905061368f565b81156136cc575060015b919050565b60008183106136e057816113ec565b5090919050565b60008060006136f686866137a4565b915091506000848061370a5761370a613aff565b86880990508281111561372557613722600183613ac4565b91505b61372f8184613ac4565b92508161374a576137408584613b15565b93505050506113ec565b8482106137995760405162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f570000000000006044820152606401610258565b61204a8383876137e6565b6000808060001984860990506137ba8486613a43565b92506137c68382613ac4565b9150828110156137de576137db600183613ac4565b91505b509250929050565b6000806137f583196001613a2b565b831690506138038184613b15565b925061380f8186613b15565b94508061381e81196001613a2b565b6138289190613b15565b613833906001613a2b565b61383d9085613a43565b6138479086613a2b565b945060016138558185613a43565b613860906002613ac4565b61386a9082613a43565b90506138768185613a43565b613881906002613ac4565b61388b9082613a43565b90506138978185613a43565b6138a2906002613ac4565b6138ac9082613a43565b90506138b88185613a43565b6138c3906002613ac4565b6138cd9082613a43565b90506138d98185613a43565b6138e4906002613ac4565b6138ee9082613a43565b90506138fa8185613a43565b613905906002613ac4565b61390f9082613a43565b905061391b8185613a43565b613926906002613ac4565b6139309082613a43565b905061393c8185613a43565b613947906002613ac4565b6139519082613a43565b905061395d8187613a43565b9695505050505050565b60208082526017908201527f5468652073656e646572206973206e6f74207661756c74000000000000000000604082015260600190565b6001600160a01b03811681146108ac57600080fd5b600080604083850312156139c657600080fd5b82356139d18161399e565b946020939093013593505050565b6000602082840312156139f157600080fd5b5035919050565b600060208284031215613a0a57600080fd5b81356113ec8161399e565b634e487b7160e01b600052601160045260246000fd5b60008219821115613a3e57613a3e613a15565b500190565b6000816000190483118215151615613a5d57613a5d613a15565b500290565b600060208284031215613a7457600080fd5b81516113ec8161399e565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215613abd57600080fd5b5051919050565b600082821015613ad657613ad6613a15565b500390565b60008060408385031215613aee57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601260045260246000fd5b600082613b2457613b24613aff565b500490565b600060208284031215613b3b57600080fd5b815180151581146113ec57600080fd5b600081518084526020808501945080840160005b83811015613b845781516001600160a01b031687529582019590820190600101613b5f565b509495945050505050565b8281526040602082015260006113e96040830184613b4b565b60006020808385031215613bbb57600080fd5b825167ffffffffffffffff80821115613bd357600080fd5b818501915085601f830112613be757600080fd5b815181811115613bf957613bf9613a7f565b8060051b604051601f19603f83011681018181108582111715613c1e57613c1e613a7f565b604052918252848201925083810185019188831115613c3c57600080fd5b938501935b82851015613c5a57845184529385019392850192613c41565b98975050505050505050565b85815284602082015260a060408201526000613c8560a0830186613b4b565b6001600160a01b0394909416606083015250608001529392505050565b600063ffffffff83811690831681811015613cbf57613cbf613a15565b039392505050565b60005b83811015613ce2578181015183820152602001613cca565b838111156117725750506000910152565b60008251613d05818460208701613cc7565b9190910192915050565b6020815260008251806020840152613d2e816040850160208701613cc7565b601f01601f19169190910160400192915050565b848152608060208201526000613d5b6080830186613b4b565b6001600160a01b03949094166040830152506060015292915050565b80516001600160701b03811681146136cc57600080fd5b600080600060608486031215613da357600080fd5b613dac84613d77565b9250613dba60208501613d77565b9150604084015163ffffffff81168114613dd357600080fd5b809150509250925092565b600082613ded57613ded613aff565b50069056fe000000000000000000000000e120ffbda0d14f3bb6d6053e90e63c572a66a4285072696365732068617665206d6f7265207468616e20352070657263656e7420646966666572656e636520666f7220746f6b656e3100000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83a2646970667358221220feab8d392617cce40194904d439604d51569d81869a195422e24067e813c7cee64736f6c63430008090033000000000000000000000000e120ffbda0d14f3bb6d6053e90e63c572a66a428000000000000000000000000a5ade4eac20a1f1f90a51e5eaa2852d8ea098c89
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5ade4eac20a1f1f90a51e5eaa2852d8ea098c89
-----Decoded View---------------
Arg [0] : _vault (address): 0xa5ade4eac20a1f1f90a51e5eaa2852d8ea098c89
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5ade4eac20a1f1f90a51e5eaa2852d8ea098c89
Deployed ByteCode Sourcemap
24606:22213:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;;;;;;;;;27419:9:::1;:7;:9::i;:::-;;24606:22213:::0;;;;;31551:127;;;;;;;;;;;;;:::i;:::-;;;512:25:1;;;500:2;485:18;31551:127:0;;;;;;;;25501:21;;;;;;;;;;-1:-1:-1;25501:21:0;;;;-1:-1:-1;;;;;25501:21:0;;;;;;-1:-1:-1;;;;;712:32:1;;;694:51;;682:2;667:18;25501:21:0;548:203:1;25894:73:0;;;;;;;;;;;;25925:42;25894:73;;26270:26;;;;;;;;;;;;;;;;30169:387;;;;;;;;;;-1:-1:-1;30169:387:0;;;;;:::i;:::-;;:::i;:::-;;30564:163;;;;;;;;;;-1:-1:-1;30564:163:0;;;;;:::i;:::-;;:::i;25811:76::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25811:76:0;;25040:25;;;;;;;;;;;;;;;;27511:98;;;;;;;;;;;;;:::i;31111:432::-;;;;;;;;;;;;;:::i;29703:458::-;;;;;;;;;;-1:-1:-1;29703:458:0;;;;;:::i;:::-;;:::i;26034:45::-;;;;;;;;;;-1:-1:-1;26034:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;28314:1114;;;;;;;;;;;;;:::i;31917:387::-;;;;;;;;;;-1:-1:-1;31917:387:0;;;;;:::i;:::-;;:::i;25335:77::-;;;;;;;;;;;;25370:42;25335:77;;33306:206;;;;;;;;;;-1:-1:-1;33306:206:0;;;;;:::i;:::-;;:::i;27731:139::-;;;;;;;;;;;;;:::i;26303:26::-;;;;;;;;;;;;;;;;38172:71;;;;;;;;;;;;;:::i;25697:34::-;;;;;;;;;;;;25727:4;25697:34;;;;;1814:14:1;;1807:22;1789:41;;1777:2;1762:18;25697:34:0;1649:187:1;25419:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25419:73:0;;26238:25;;;;;;;;;;;;;;;;29442:253;;;;;;;;;;-1:-1:-1;29442:253:0;;;;;:::i;:::-;;:::i;31791:118::-;;;;;;;;;;-1:-1:-1;31791:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;31880:21:0;31853:7;31880:21;;;:10;:21;;;;;;;31791:118;33006:292;;;;;;;;;;-1:-1:-1;33006:292:0;;;;;:::i;:::-;;:::i;25161:73::-;;;;;;;;;;;;25192:42;25161:73;;30735:368;;;:::i;25537:21::-;;;;;;;;;;-1:-1:-1;25537:21:0;;;;-1:-1:-1;;;;;25537:21:0;;;24867:49;;;;;;;;;;;;24915:1;24867:49;;27882:244;;;;;;;;;;;;;:::i;25241:87::-;;;;;;;;;;;;25286:42;25241:87;;26206:25;;;;;;;;;;;;;;;;24813:40;;;;;;;;;;;;24851:2;24813:40;;25659:31;;;;;;;;;;;;25689:1;25659:31;;25738:66;;;;;;;;;;-1:-1:-1;25738:66:0;;;;-1:-1:-1;;;;;25738:66:0;;;25572:20;;;;;;;;;;-1:-1:-1;25572:20:0;;;;-1:-1:-1;;;;;25572:20:0;;;31686:97;;;;;;;;;;;;;:::i;25092:32::-;;;;;;;;;;;;;;;;30735:368;26609:5;;30788:7;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;30822:6:::1;::::0;30830::::1;::::0;30808:29:::1;::::0;-1:-1:-1;;;;;30822:6:0;;::::1;::::0;30830::::1;30808:13;:29::i;:::-;30862:6;::::0;30870::::1;::::0;30848:29:::1;::::0;-1:-1:-1;;;;;30862:6:0;;::::1;::::0;30870::::1;30848:13;:29::i;:::-;30888:22;:20;:22::i;:::-;30977:39;30994:21;30977:16;:39::i;:::-;31027:17;31047:6;:4;:6::i;:::-;31027:26;;31071:24;31085:9;31071:13;:24::i;:::-;31064:31;;;26653:1;30735:368:::0;:::o;31551:127::-;31607:7;31634:36;31648:21;:19;:21::i;:::-;31634:13;:36::i;:::-;31627:43;;31551:127;:::o;30169:387::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;30259:16:::1;30278:21;:19;:21::i;:::-;30259:40:::0;-1:-1:-1;30314:12:0;;30310:239:::1;;30343:17;30363:21;30375:8;30363:11;:21::i;:::-;30343:41:::0;-1:-1:-1;30402:13:0;;30399:87:::1;;-1:-1:-1::0;;;;;30436:21:0;::::1;;::::0;;;:10:::1;:21;::::0;;;;:34;;30461:9;;30436:21;:34:::1;::::0;30461:9;;30436:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;30399:87:0::1;30506:31;::::0;512:25:1;;;30506:31:0::1;::::0;500:2:1;485:18;30506:31:0::1;;;;;;;30328:221;30310:239;30248:308;30169:387:::0;;:::o;30564:163::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;30627:34:::1;30641:19;:8:::0;30652::::1;30641:19;:::i;:::-;30627:13;:34::i;:::-;30688:5;::::0;30672:47:::1;::::0;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;30688:5:0::1;30695:23;25450:42:::0;30695:17:::1;:23::i;:::-;30672:9;:47::i;:::-;30564:163:::0;:::o;27511:98::-;27558:7;25925:42;-1:-1:-1;;;;;27584:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31111:432::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;31201:1:::1;31175:23;-1:-1:-1::0;;;;;;;;;;;31175:17:0::1;:23::i;:::-;:27;31167:73;;;::::0;-1:-1:-1;;;31167:73:0;;2737:2:1;31167:73:0::1;::::0;::::1;2719:21:1::0;2776:2;2756:18;;;2749:30;2815:34;2795:18;;;2788:62;-1:-1:-1;;;2866:18:1;;;2859:31;2907:19;;31167:73:0::1;2535:397:1::0;31167:73:0::1;31265:6;::::0;31273::::1;::::0;31251:29:::1;::::0;-1:-1:-1;;;;;31265:6:0;;::::1;::::0;31273::::1;31251:13;:29::i;:::-;31305:6;::::0;31313::::1;::::0;31291:29:::1;::::0;-1:-1:-1;;;;;31305:6:0;;::::1;::::0;31313::::1;31291:13;:29::i;:::-;31345:6;::::0;31331:30:::1;::::0;-1:-1:-1;;;;;31345:6:0::1;-1:-1:-1::0;;;;;;;;;;;31331:13:0::1;:30::i;:::-;31386:6;::::0;31372:30:::1;::::0;-1:-1:-1;;;;;31386:6:0::1;-1:-1:-1::0;;;;;;;;;;;31372:13:0::1;:30::i;:::-;31413:28;-1:-1:-1::0;;;;;;;;;;;25925:42:0::1;31413:13;:28::i;:::-;31472:6;::::0;31452:27:::1;::::0;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;31472:6:0::1;31452:13;:27::i;:::-;31490:28;:26;:28::i;:::-;31529:6;:4;:6::i;29703:458::-:0;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;29777:14:::1;29794:21;:19;:21::i;:::-;29777:38;;29826:14;29843:16;:14;:16::i;:::-;29826:33;;29870:25;29888:6;29870:17;:25::i;:::-;29906:57;-1:-1:-1::0;;;;;;;;;;;29925:9:0::1;29936:26;-1:-1:-1::0;;;;;;;;;;;29936:17:0::1;:26::i;29906:57::-;29974:55;29984:6;29992:9;30003:25;30021:6;30003:17;:25::i;29974:55::-;30040:51;25192:42;30056:9;30067:23;25192:42;30067:17;:23::i;30040:51::-;30102;-1:-1:-1::0;;;;;;;;;;;30118:9:0::1;30129:23;-1:-1:-1::0;;;;;;;;;;;30129:17:0::1;:23::i;28314:1114::-:0;28382:16;;;28396:1;28382:16;;;;;;;;28358:21;;28382:16;;;;;;;;;;-1:-1:-1;28382:16:0;28358:40;;28409:14;28426:21;:19;:21::i;:::-;28409:38;;28458:19;28480:16;:14;:16::i;:::-;28536:6;;28458:38;;-1:-1:-1;28509:34:0;;28458:38;;-1:-1:-1;;;;;28536:6:0;28509:13;:34::i;:::-;28574:6;;28554:27;;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;28574:6:0;28554:13;:27::i;:::-;28612:6;;28592:27;;25192:42;;-1:-1:-1;;;;;28612:6:0;28592:13;:27::i;:::-;28636:10;;28632:757;;28694:25;28712:6;28694:17;:25::i;:::-;28736:16;28755:30;28773:11;28755:17;:30::i;:::-;28736:49;-1:-1:-1;28803:12:0;;28800:514;;28845:11;28835:4;28840:1;28835:7;;;;;;;;:::i;:::-;;;;;;:21;-1:-1:-1;;;;;28835:21:0;;;-1:-1:-1;;;;;28835:21:0;;;;;-1:-1:-1;;;;;;;;;;;28875:4:0;28880:1;28875:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;28875:14:0;;;-1:-1:-1;;;;;28875:14:0;;;;;28926:48;28950:17;;28941:8;:26;;;;:::i;:::-;28969:4;28926:14;:48::i;:::-;28917:57;;29005:3;28996:6;:12;28993:277;;;29059:6;;;29076:17;29033:75;;-1:-1:-1;;;;;29059:6:0;;29067:26;;:8;:26;:::i;:::-;29095:6;29103:4;29033:25;:75::i;:::-;29151:1;29131:17;:21;28993:277;;;29221:29;29241:8;29221:19;:29::i;:::-;29200:17;;:50;;;;;;;:::i;:::-;;;;-1:-1:-1;;28993:277:0;29288:10;:8;:10::i;:::-;29328:28;:26;:28::i;:::-;29371:6;:4;:6::i;:::-;;28648:741;28632:757;29406:14;;;;;;;28347:1081;;;28314:1114::o;31917:387::-;31981:7;-1:-1:-1;;;;;32004:14:0;;-1:-1:-1;;;;;;;;;;;32004:14:0;32001:105;;;32084:10;;32042:39;;-1:-1:-1;;;32042:39:0;;32075:4;32042:39;;;694:51:1;-1:-1:-1;;;;;32042:24:0;;;;;667:18:1;;32042:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;32035:59;31917:387;-1:-1:-1;;31917:387:0:o;32001:105::-;32129:16;:14;:16::i;:::-;-1:-1:-1;;;;;32119:26:0;:6;-1:-1:-1;;;;;32119:26:0;;32116:124;;;32211:17;;32169:39;;-1:-1:-1;;;32169:39:0;;32202:4;32169:39;;;694:51:1;-1:-1:-1;;;;;32169:24:0;;;;;667:18:1;;32169:39:0;548:203:1;32116:124:0;32257:39;;-1:-1:-1;;;32257:39:0;;32290:4;32257:39;;;694:51:1;-1:-1:-1;;;;;32257:24:0;;;;;667:18:1;;32257:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33306:206::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;33375:16:::1;33394:23;25192:42;33394:17;:23::i;:::-;33375:42:::0;-1:-1:-1;33431:12:0;;33428:77:::1;;33460:33;25192:42;33476:6;33484:8;33460:9;:33::i;:::-;33364:148;33306:206:::0;:::o;27731:139::-;27822:40;;-1:-1:-1;;;27822:40:0;;25689:1;27822:40;;;3694:25:1;27856:4:0;3735:18:1;;;3728:60;27783:14:0;;25925:42;;27822:20;;3667:18:1;;27822:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;27810:52:0;27731:139;-1:-1:-1;27731:139:0:o;38172:71::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;38222:13:::1;:11;:13::i;:::-;38172:71::o:0;29442:253::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31880:21:0;;29507:17:::1;31880:21:::0;;;:10;:21;;;;;;29565:13;;29562:126:::1;;29595:41;25370:42;29615:9;29626;29595;:41::i;:::-;-1:-1:-1::0;;;;;;29651:21:0::1;29675:1;29651:21:::0;;;:10:::1;:21;::::0;;;;:25;29442:253::o;33006:292::-;26609:5;;-1:-1:-1;;;;;26609:5:0;26595:10;:19;26587:55;;;;-1:-1:-1;;;26587:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33079:22:0;::::1;33071:70;;;::::0;-1:-1:-1;;;33071:70:0;;4251:2:1;33071:70:0::1;::::0;::::1;4233:21:1::0;4290:2;4270:18;;;4263:30;4329:34;4309:18;;;4302:62;-1:-1:-1;;;4380:18:1;;;4373:33;4423:19;;33071:70:0::1;4049:399:1::0;33071:70:0::1;33152:6;:17:::0;;-1:-1:-1;;;;;;33152:17:0::1;-1:-1:-1::0;;;;;33152:17:0;::::1;::::0;;::::1;::::0;;;33181:27:::1;::::0;-1:-1:-1;;;;;;;;;;;25450:42:0;33181:13:::1;:27::i;:::-;33234:6;::::0;33242::::1;::::0;33220:29:::1;::::0;-1:-1:-1;;;;;33234:6:0;;::::1;::::0;33242::::1;33220:13;:29::i;:::-;33275:6;::::0;33283::::1;::::0;33261:29:::1;::::0;-1:-1:-1;;;;;33275:6:0;;::::1;::::0;33283::::1;33261:13;:29::i;27882:244::-:0;27913:16;27952:26;-1:-1:-1;;;;;;;;;;;27952:17:0;:26::i;:::-;27941:37;-1:-1:-1;27992:12:0;;27989:130;;28021:34;;-1:-1:-1;;;28021:34:0;;25689:1;28021:34;;;4627:25:1;4668:18;;;4661:34;;;25925:42:0;;28021:19;;4600:18:1;;28021:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28075:32;28080:26;-1:-1:-1;;;;;;;;;;;28080:17:0;:26::i;:::-;28075:32;;512:25:1;;;500:2;485:18;28075:32:0;;;;;;;27882:244;:::o;31686:97::-;31734:7;31761:14;:12;:14::i;15026:616::-;15390:10;;;15389:62;;-1:-1:-1;15406:39:0;;-1:-1:-1;;;15406:39:0;;15430:4;15406:39;;;4918:34:1;-1:-1:-1;;;;;4988:15:1;;;4968:18;;;4961:43;15406:15:0;;;;;4853:18:1;;15406:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15389:62;15367:166;;;;-1:-1:-1;;;15367:166:0;;5217:2:1;15367:166:0;;;5199:21:1;5256:2;5236:18;;;5229:30;5295:34;5275:18;;;5268:62;-1:-1:-1;;;5346:18:1;;;5339:52;5408:19;;15367:166:0;5015:418:1;15367:166:0;15571:62;;;-1:-1:-1;;;;;5630:32:1;;15571:62:0;;;5612:51:1;5679:18;;;;5672:34;;;15571:62:0;;;;;;;;;;5585:18:1;;;;15571:62:0;;;;;;;;-1:-1:-1;;;;;15571:62:0;-1:-1:-1;;;15571:62:0;;;15544:90;;15564:5;;15544:19;:90::i;9235:229::-;9372:12;9404:52;9426:6;9434:4;9440:1;9443:12;9404:21;:52::i;:::-;9397:59;;9235:229;;;;;;:::o;34059:178::-;34132:35;-1:-1:-1;;;;;34132:26:0;;34159:4;34165:1;34132:26;:35::i;:::-;34178:51;-1:-1:-1;;;;;34178:26:0;;34205:4;-1:-1:-1;;34178:26:0;:51::i;38251:97::-;38303:13;:11;:13::i;:::-;38327;:11;:13::i;40595:168::-;40684:6;;40661:42;;-1:-1:-1;;;;;40684:6:0;40692:10;40661:22;:42::i;:::-;40732:6;;40714:41;;-1:-1:-1;;;;;40732:6:0;40740:14;40753:1;40740:10;:14;:::i;:::-;40714:17;:41::i;45175:757::-;45238:11;45274:4;45292:11;;45289:283;;45391:11;45404;45419:24;45435:7;45419:15;:24::i;:::-;45390:53;;;;45557:3;45553:1;45547:3;45528:16;:14;:16::i;:::-;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:32;;;;:::i;:::-;45522:38;;45305:267;;45289:283;45697:6;;45660:16;;45679:25;;-1:-1:-1;;;;;45697:6:0;45679:17;:25::i;:::-;45660:44;-1:-1:-1;45719:12:0;;45715:83;;45785:1;45774:8;45755:16;:14;:16::i;:::-;:27;;;;:::i;:::-;:31;;;;:::i;:::-;45748:38;;;;:::i;:::-;;;45715:83;45901:23;-1:-1:-1;;;;;;;;;;;45901:17:0;:23::i;:::-;45894:30;;;;:::i;:::-;;45175:757;-1:-1:-1;;;;45175:757:0:o;42145:544::-;42202:21;42236:23;42250:8;42236:13;:23::i;:::-;42296:22;42321:27;25370:42;42321:17;:27::i;:::-;42296:52;;42359:43;25370:42;25286;42359:13;:43::i;:::-;42413:39;-1:-1:-1;;;;;;;;;;;25286:42:0;42413:13;:39::i;:::-;42463:46;25286:42;25370;42463:16;:46::i;:::-;42626:14;42596:27;25370:42;42596:17;:27::i;:::-;:44;;;;:::i;:::-;42580:60;;42656:25;42667:13;42656:25;;;;512::1;;500:2;485:18;;366:177;42656:25:0;;;;;;;;42224:465;42145:544;;;:::o;41529:608::-;41590:16;41609:21;:19;:21::i;:::-;41590:40;-1:-1:-1;41645:12:0;;41641:489;;41674:59;41717:14;41693:19;41704:8;41693;:19;:::i;:::-;41692:40;;;;:::i;:::-;41674:17;:59::i;:::-;41748:19;41770:16;:14;:16::i;:::-;41830:6;;41748:38;;-1:-1:-1;41803:34:0;;41748:38;;-1:-1:-1;;;;;41830:6:0;41803:13;:34::i;:::-;41872:6;;41852:27;;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;;;;;41872:6:0;41852:13;:27::i;:::-;41931:29;41948:11;41931:16;:29::i;:::-;42023:18;:16;:18::i;:::-;42111:6;;42094:24;;-1:-1:-1;;;;;42111:6:0;42094:16;:24::i;33520:130::-;33605:37;;-1:-1:-1;;;33605:37:0;;-1:-1:-1;;;;;5630:32:1;;;33605:37:0;;;5612:51:1;5679:18;;;5672:34;;;33605:23:0;;;;;5585:18:1;;33605:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33520:130;;;:::o;37102:648::-;37160:19;:17;:19::i;:::-;37230:6;;37192:17;;37212:25;;-1:-1:-1;;;;;37230:6:0;37212:17;:25::i;:::-;37286:6;;37192:45;;-1:-1:-1;37248:17:0;;37268:25;;-1:-1:-1;;;;;37286:6:0;37268:17;:25::i;:::-;37248:45;;37321:3;37309:9;:15;:34;;;;;37340:3;37328:9;:15;37309:34;37306:425;;;37361:15;;37397:227;37436:9;37464;37538:3;37505:31;24915:1;37436:9;37505:31;:::i;:::-;37504:37;;;;:::i;:::-;37492:49;;:9;:49;:::i;:::-;37606:3;37573:31;24915:1;37573:9;:31;:::i;:::-;37572:37;;;;:::i;:::-;37560:49;;:9;:49;:::i;:::-;37397:20;:227::i;:::-;37360:264;;;;37642:7;37653:1;37642:12;;:27;;;;-1:-1:-1;37658:11:0;;;37642:27;37639:80;;;37688:31;37702:7;37711;37688:13;:31::i;27617:106::-;27681:34;;-1:-1:-1;;;27681:34:0;;25689:1;27681:34;;;4627:25:1;4668:18;;;4661:34;;;25925:42:0;;27681:20;;4600:18:1;;27681:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27617:106;:::o;32312:213::-;32453:6;;32445:44;;-1:-1:-1;;;32445:44:0;;32399:7;;;;-1:-1:-1;;;;;32453:6:0;;;;32445:29;;:44;;32475:7;;32484:4;;32445:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32445:44:0;;;;;;;;;;;;:::i;:::-;32418:71;;32507:7;32515:1;32507:10;;;;;;;;:::i;:::-;;;;;;;32500:17;;;32312:213;;;;:::o;43772:453::-;-1:-1:-1;;;;;43950:41:0;;;44006:7;44095:3;44063:30;24915:1;44063:8;:30;:::i;:::-;44062:36;;;;:::i;:::-;44051:47;;:8;:47;:::i;:::-;44133:5;44161:4;44181:25;:15;44197:9;44181:25;:::i;:::-;43950:267;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43950:267:0;;;;;;;;;;;;:::i;33658:393::-;33725:7;34040:3;34016:20;24851:2;34016:6;:20;:::i;:::-;34015:28;;;;:::i;34245:655::-;34309:16;;;34323:1;34309:16;;;;;;;;34285:21;;34309:16;;;;;;;;;;-1:-1:-1;34309:16:0;34285:40;;-1:-1:-1;;;;;;;;;;;34336:4:0;34341:1;34336:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;34336:14:0;;;-1:-1:-1;;;;;34336:14:0;;;;;25192:42;34361:4;34366:1;34361:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;34361:14:0;;;-1:-1:-1;;;;;34361:14:0;;;;;34386:24;34413:44;34433:23;-1:-1:-1;;;;;;;;;;;34433:17:0;:23::i;:::-;34413:19;:44::i;:::-;34386:71;-1:-1:-1;34471:20:0;;34468:425;;34508:14;34525:51;34559:10;;34540:16;:29;;;;:::i;:::-;34571:4;34525:14;:51::i;:::-;34508:68;;34603:3;34594:6;:12;34591:291;;;34653:6;;;34680:10;34627:78;;-1:-1:-1;;;;;34653:6:0;;34661:29;;:16;:29;:::i;:::-;34692:6;34700:4;34627:25;:78::i;:::-;34737:1;34724:14;;34762:33;;;4627:25:1;;;4683:2;4668:18;;4661:34;;;34762:33:0;;4600:18:1;34762:33:0;;;;;;;30248:308:::1;30169:387:::0;;:::o;34591:291::-;34850:16;34836:10;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;34493:400:0;34274:626;;34245:655::o;38356:810::-;38400:21;38423;38446;38484:64;-1:-1:-1;;;;;;;;;;;38484:46:0;:64::i;:::-;38597:18;;38399:149;;-1:-1:-1;38399:149:0;;-1:-1:-1;38399:149:0;-1:-1:-1;38559:18:0;;38580:35;;38597:18;;38399:149;38580:35;:::i;:::-;38559:56;;38814:4;38672:138;:116;38783:4;38672:96;;;;;;;;38755:11;38711:55;;38731:20;;38712:16;:39;;;;:::i;:::-;38711:55;;;;:::i;:::-;-1:-1:-1;;;;;38672:96:0;;;:110;;:116::i;:::-;1768:7;1499:3;1768:21;;1668:130;38672:138;-1:-1:-1;;;;;38664:147:0;:154;;;;:::i;:::-;38651:10;:167;;;;39006:4;38852:150;:124;38971:4;38852:100;;;;;;;;38939:11;38895:55;;38915:20;;38896:16;:39;;;;:::i;38852:150::-;-1:-1:-1;;;;;38844:159:0;:166;;;;:::i;:::-;38831:10;:179;-1:-1:-1;39023:20:0;:39;;;;39073:20;:39;39123:18;:35;;-1:-1:-1;;39123:35:0;;;;;;;;;;;38356:810::o;45940:876::-;46034:16;;;46048:1;46034:16;;;;;;;;45987:10;;;;46034:16;46048:1;46034:16;;;;;;;;;;-1:-1:-1;46034:16:0;46010:40;;46061:16;46080:21;:19;:21::i;:::-;46061:40;;-1:-1:-1;;;;;;;;;;;46112:4:0;46117:1;46112:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46112:14:0;;;:7;;;;;;;;;;;:14;46142:12;;46139:292;;46172:11;46185;46200:25;46216:8;46200:15;:25::i;:::-;46171:54;;;;46304:3;46311:1;46304:8;46301:119;;46343:6;;46333:7;;-1:-1:-1;;;;;46343:6:0;;;;46333:4;;46343:6;;46333:7;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;46333:16:0;;;-1:-1:-1;;;;;46333:16:0;;;;;46401:3;46373:25;46388:3;46393:4;46373:14;:25::i;:::-;:31;;;;:::i;:::-;46368:36;;46301:119;46156:275;;46139:292;46556:6;;46519:16;;46538:25;;-1:-1:-1;;;;;46556:6:0;46538:17;:25::i;:::-;46519:44;-1:-1:-1;46578:12:0;;46574:112;;46617:6;;46607:7;;-1:-1:-1;;;;;46617:6:0;;;;46607:4;;46617:6;;46607:7;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;46607:16:0;;;-1:-1:-1;;;;;46607:16:0;;;;;46644:30;46659:8;46669:4;46644:14;:30::i;:::-;46638:36;;;;:::i;:::-;;;46574:112;46785:23;-1:-1:-1;;;;;;;;;;;46785:17:0;:23::i;:::-;46779:29;;;;:::i;:::-;;;45999:817;;;45940:876;:::o;16863:716::-;17287:23;17313:69;17341:4;17313:69;;;;;;;;;;;;;;;;;17321:5;-1:-1:-1;;;;;17313:27:0;;;:69;;;;;:::i;:::-;17397:17;;17287:95;;-1:-1:-1;17397:21:0;17393:179;;17494:10;17483:30;;;;;;;;;;;;:::i;:::-;17475:85;;;;-1:-1:-1;;;17475:85:0;;9176:2:1;17475:85:0;;;9158:21:1;9215:2;9195:18;;;9188:30;9254:34;9234:18;;;9227:62;-1:-1:-1;;;9305:18:1;;;9298:40;9355:19;;17475:85:0;8974:406:1;10355:510:0;10525:12;10583:5;10558:21;:30;;10550:81;;;;-1:-1:-1;;;10550:81:0;;9587:2:1;10550:81:0;;;9569:21:1;9626:2;9606:18;;;9599:30;9665:34;9645:18;;;9638:62;-1:-1:-1;;;9716:18:1;;;9709:36;9762:19;;10550:81:0;9385:402:1;10550:81:0;6752:20;;10642:60;;;;-1:-1:-1;;;10642:60:0;;9994:2:1;10642:60:0;;;9976:21:1;10033:2;10013:18;;;10006:30;10072:31;10052:18;;;10045:59;10121:18;;10642:60:0;9792:353:1;10642:60:0;10716:12;10730:23;10757:6;-1:-1:-1;;;;;10757:11:0;10776:5;10783:4;10757:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10715:73;;;;10806:51;10823:7;10832:10;10844:12;10806:16;:51::i;:::-;10799:58;10355:510;-1:-1:-1;;;;;;;10355:510:0:o;39174:579::-;39326:16;:14;:16::i;:::-;39312:11;:30;;;;39355:22;:80;;;;;;;;;;;;;;;;;;;39463:11;;39449:10;;:25;39446:256;;25030:1;39526:10;;39506:11;;39520:3;39506:17;;;;:::i;:::-;:30;;;;:::i;:::-;39499:38;;:3;:38;:::i;:::-;:64;;39565:8;39491:83;;;;;-1:-1:-1;;;39491:83:0;;;;;;;;:::i;:::-;;39446:256;;;25030:1;39641:11;;39622:10;;39635:3;39622:16;;;;:::i;:::-;:30;;;;:::i;:::-;39615:38;;:3;:38;:::i;:::-;:64;;39681:8;39607:83;;;;;-1:-1:-1;;;39607:83:0;;;;;;;;:::i;:::-;;39446:256;39728:17;:15;:17::i;:::-;39714:11;:31;-1:-1:-1;39174:579:0:o;39761:826::-;39908:16;;;39922:1;39908:16;;;39849:24;39908:16;;;;;39849:24;39884:21;;39908:16;39922:1;39908:16;;;;;;;;;;-1:-1:-1;39908:16:0;39884:40;;-1:-1:-1;;;;;;;;;;;39935:4:0;39940:1;39935:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39935:14:0;;;:7;;;;;;;;;:14;40009;;-1:-1:-1;;;;;;;;;;;40009:14:0;40006:574;;40050:6;40040:4;40045:1;40040:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40040:16:0;;;:7;;;;;;;;;:16;40089:6;;;40081:29;40111:12;40122:1;40111:10;:12;:::i;:::-;40125:4;40081:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40081:49:0;;;;;;;;;;;;:::i;:::-;40071:59;;40145:26;40174:7;40182:1;40174:10;;;;;;;;:::i;:::-;;;;;;;40145:39;;40223:3;40202:18;:24;40199:370;;;40254:6;;-1:-1:-1;;;;;40254:6:0;40246:37;40290:12;40301:1;40290:10;:12;:::i;:::-;40389:3;40348:40;24915:1;40348:18;:40;:::i;:::-;:44;;;;:::i;:::-;40326:67;;:18;:67;:::i;:::-;40432:4;40467;40495:27;:15;40513:9;40495:27;:::i;:::-;40246:307;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40246:307:0;;;;;;;;;;;;:::i;:::-;;40025:555;39838:749;;39761:826;;:::o;40771:750::-;40860:26;40889:25;40907:6;40889:17;:25::i;:::-;40860:54;-1:-1:-1;40926:15:0;;40962:255;40997:16;40860:54;41121:3;41081:38;24915:1;40997:16;41081:38;:::i;40962:255::-;40925:292;;;;41231:7;41242:1;41231:12;;:27;;;;-1:-1:-1;41247:11:0;;;41231:27;:65;;;;;41262:34;41279:7;41288;41262:16;:34::i;:::-;41228:286;;;41313:35;41323:6;-1:-1:-1;;;;;;;;;;;41340:7:0;41313:9;:35::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;41363:19:0;;41390:7;41363:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41415:38:0;;-1:-1:-1;;;41415:38:0;;-1:-1:-1;;;;;;;;;;;41415:38:0;;;5612:51:1;5679:18;;;5672:34;;;-1:-1:-1;;;;;;;;;;;25450:42:0;-1:-1:-1;41415:20:0;;-1:-1:-1;5585:18:1;;;-1:-1:-1;41415:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41468:34:0;;-1:-1:-1;;;41468:34:0;;41496:4;41468:34;;;694:51:1;-1:-1:-1;;;;;;;;;;;25845:42:0;41468:19;;667:18:1;;41468:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32533:465::-;32616:19;32637;32670:17;32689;-1:-1:-1;;;;;;;;;;;;;;;;32711:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32669:70;-1:-1:-1;;;;;32669:70:0;;;-1:-1:-1;;;;;32669:70:0;;;32750:15;-1:-1:-1;;;;;;;;;;;;;;;;32791:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32768:20;:9;32781:6;32768:20;:::i;:::-;:51;;;;:::i;:::-;32750:69;-1:-1:-1;32928:6:0;32905:19;32915:9;32750:69;32905:19;:::i;:::-;:30;;;;:::i;:::-;32891:44;-1:-1:-1;32983:6:0;32960:19;32970:9;32960:7;:19;:::i;:::-;:30;;;;:::i;:::-;32946:44;;32658:340;;;32533:465;;;:::o;44686:236::-;44779:16;;;44793:1;44779:16;;;;;;;;44735:7;;;;44779:16;44793:1;44779:16;;;;;;;;-1:-1:-1;;44816:6:0;;44806:7;;;;-1:-1:-1;;;;;;44816:6:0;;44806:7;;-1:-1:-1;44816:6:0;;44806:7;;;;:::i;:::-;-1:-1:-1;;;;;44806:16:0;;;:7;;;;;;;;;:16;44843:6;;44833:7;;44843:6;;;44833:4;;44843:6;;44833:7;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;44833:16:0;;;-1:-1:-1;;;;;44833:16:0;;;;;44910:3;44875:32;44890:10;44902:4;44875:14;:32::i;:::-;:38;;;;:::i;:::-;44867:47;;:4;:47;:::i;43314:450::-;43417:16;;;43431:1;43417:16;;;;;;;;43393:21;;43417:16;;;;;;;;;;-1:-1:-1;43417:16:0;43393:40;;-1:-1:-1;;;;;;;;;;;43444:4:0;43449:1;43444:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;43444:14:0;;;-1:-1:-1;;;;;43444:14:0;;;;;43479:6;43469:4;43474:1;43469:7;;;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;43469:16:0;;;-1:-1:-1;;;;;43469:16:0;;;;;43496:20;43519:23;-1:-1:-1;;;;;;;;;;;43519:17:0;:23::i;:::-;43496:46;;43553:24;43588:7;-1:-1:-1;;;;;43580:30:0;;43611:12;43625:4;43580:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43580:50:0;;;;;;;;;;;;:::i;:::-;43553:77;;43657:3;43644:7;43652:1;43644:10;;;;;;;;:::i;:::-;;;;;;;:16;43641:116;;;43677:66;43703:7;43712:12;43726:7;43734:1;43726:10;;;;;;;;:::i;:::-;;;;;;;43738:4;43677:25;:66::i;42697:609::-;42783:16;;;42797:1;42783:16;;;;;;;;42759:21;;42783:16;;;;;;;;;;-1:-1:-1;42783:16:0;42759:40;;42810:24;-1:-1:-1;;;;;;;;;;;42888:4:0;42893:1;42888:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42888:14:0;;;:7;;;;;;;;;:14;42916;;-1:-1:-1;;;;;;;;;;;42916:14:0;42913:386;;42957:6;42947:4;42952:1;42947:7;;;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;42947:16:0;;;-1:-1:-1;;;;;42947:16:0;;;;;42978;42997:26;43015:4;43020:1;43015:7;;;;;;;;:::i;:::-;;;;;;;42997:17;:26::i;:::-;42978:45;-1:-1:-1;43041:12:0;;43038:250;;43092:6;;43084:45;;-1:-1:-1;;;43084:45:0;;-1:-1:-1;;;;;43092:6:0;;;;43084:29;;:45;;43114:8;;43124:4;;43084:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43084:45:0;;;;;;;;;;;;:::i;:::-;43074:55;;43164:3;43151:7;43159:1;43151:10;;;;;;;;:::i;:::-;;;;;;;:16;43148:125;;;43218:6;;43236:10;;43192:61;;-1:-1:-1;;;;;43218:6:0;;43226:8;;43236:7;;43218:6;;43236:10;;;;;;:::i;37758:406::-;37829:6;;37806:30;;-1:-1:-1;;;;;;;;;;;25845:42:0;-1:-1:-1;;;;;37829:6:0;37806:13;:30::i;:::-;37855:6;;37893;;37924;;-1:-1:-1;;;;;37855:6:0;;;;37847:31;;37893:6;;;37924;37955:26;-1:-1:-1;;;;;;;;;;;37955:17:0;:26::i;:::-;38009:1;;38079:4;38106:27;:15;38124:9;38106:27;:::i;:::-;37847:309;;;;;;-1:-1:-1;;;;;;37847:309:0;;;-1:-1:-1;;;;;12622:15:1;;;37847:309:0;;;12604:34:1;12674:15;;;12654:18;;;12647:43;12706:18;;;12699:34;;;;12749:18;;;12742:34;;;;12792:19;;;12785:35;12857:15;;;12836:19;;;12829:44;12889:19;;;12882:35;;;;12538:19;;37847:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44233:445::-;44306:16;;;44320:1;44306:16;;;;;;;;44282:21;;44306:16;;;;;;;;;;-1:-1:-1;44306:16:0;44282:40;;-1:-1:-1;;;;;;;;;;;44333:4:0;44338:1;44333:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;44333:14:0;;;-1:-1:-1;;;;;44333:14:0;;;;;44368:16;44413:1;44387:23;-1:-1:-1;;;;;;;;;;;44387:17:0;:23::i;:::-;:27;;;;:::i;:::-;44368:46;-1:-1:-1;44429:12:0;;44425:246;;44468:6;;44458:7;;-1:-1:-1;;;;;44468:6:0;;;;44458:4;;44468:6;;44458:7;;;;;;:::i;:::-;;;;;;:16;-1:-1:-1;;;;;44458:16:0;;;-1:-1:-1;;;;;44458:16:0;;;;;44489:14;44506:30;44521:8;44531:4;44506:14;:30::i;:::-;44489:47;;44563:3;44554:6;:12;44551:109;;;44613:6;;44587:57;;-1:-1:-1;;;;;44613:6:0;44621:8;44631:6;44639:4;44587:25;:57::i;34908:1201::-;35092:12;35106;35132:13;35147;-1:-1:-1;;;;;;;;;;;;;;;;35165:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35131:62;-1:-1:-1;;;;;35131:62:0;;;-1:-1:-1;;;;;35131:62:0;;;35208:8;35220:1;35208:13;:30;;;;-1:-1:-1;35225:13:0;;35208:30;35204:898;;;35277:14;;-1:-1:-1;35293:14:0;;-1:-1:-1;35204:898:0;;;35371:6;;35363:57;;-1:-1:-1;;;35363:57:0;;;;;13130:25:1;;;13171:18;;;13164:34;;;13214:18;;;13207:34;;;35341:19:0;;-1:-1:-1;;;;;35371:6:0;;35363:21;;13103:18:1;;35363:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35341:79;;35457:14;35439;:32;35435:656;;35513:10;35495:14;:28;35492:205;;35570:14;;-1:-1:-1;35586:14:0;-1:-1:-1;35586:14:0;35435:656;;35492:205;35672:1;;-1:-1:-1;35672:1:0;;-1:-1:-1;35435:656:0;;;35767:6;;35759:57;;-1:-1:-1;;;35759:57:0;;;;;13130:25:1;;;13171:18;;;13164:34;;;13214:18;;;13207:34;;;35737:19:0;;-1:-1:-1;;;;;35767:6:0;;35759:21;;13103:18:1;;35759:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35737:79;;35856:14;35838;:32;;:64;;;;;35892:10;35874:14;:28;;35838:64;35835:241;;;35949:14;-1:-1:-1;35965:14:0;;-1:-1:-1;35949:14:0;35835:241;;;36051:1;;-1:-1:-1;36051:1:0;;-1:-1:-1;35835:241:0;35718:373;35435:656;35326:776;35204:898;35120:989;;34908:1201;;;;;;;:::o;36117:296::-;36201:38;36218:9;36229;36201:16;:38::i;:::-;36198:208;;;36266:6;;36256:37;;-1:-1:-1;;;;;36266:6:0;-1:-1:-1;;;;;;;;;;;36283:9:0;36256;:37::i;:::-;36318:6;;36308:37;;-1:-1:-1;;;;;36318:6:0;-1:-1:-1;;;;;;;;;;;36335:9:0;36308;:37::i;:::-;36360:34;;-1:-1:-1;;;36360:34:0;;36388:4;36360:34;;;694:51:1;-1:-1:-1;;;;;;;;;;;25845:42:0;36360:19;;667:18:1;;36360:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23020:1031::-;23106:21;23129;23152;23203:23;:21;:23::i;:::-;23186:40;;23262:4;-1:-1:-1;;;;;23256:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23237:53;;23326:4;-1:-1:-1;;;;;23320:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23301:53;;23469:16;23487;23505:25;23540:4;-1:-1:-1;;;;;23534:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23468:91;;;;;;23596:14;23574:36;;:18;:36;;;23570:474;;23675:18;23696:35;23713:18;23696:14;:35;:::i;:::-;23675:56;;23893:11;23842:62;;23847:39;23867:8;-1:-1:-1;;;;;23847:39:0;23877:8;-1:-1:-1;;;;;23847:39:0;:19;:39::i;:::-;:42;23842:62;;;-1:-1:-1;;;;;23842:48:0;:62;:::i;:::-;23822:82;;;;:::i;:::-;;;24021:11;23970:62;;23975:39;23995:8;-1:-1:-1;;;;;23975:39:0;24005:8;-1:-1:-1;;;;;23975:39:0;:19;:39::i;:::-;:42;23970:62;;;-1:-1:-1;;;;;23970:48:0;:62;:::i;:::-;23950:82;;;;:::i;:::-;;;23612:432;23570:474;23175:876;;;23020:1031;;;;;:::o;1896:241::-;-1:-1:-1;;;;;;;;;;;;1995:9:0;2027:6;;;:42;;-1:-1:-1;2062:7:0;;-1:-1:-1;;;;;2037:32:0;2057:1;2042:11;2057:1;2037:32;2042:11;:::i;:::-;2038:15;-1:-1:-1;2037:21:0;;2038:15;2037:21;:::i;:::-;:32;2027:42;2019:80;;;;-1:-1:-1;;;2019:80:0;;13454:2:1;2019:80:0;;;13436:21:1;13493:2;13473:18;;;13466:30;13532:27;13512:18;;;13505:55;13577:18;;2019:80:0;13252:349:1;2019:80:0;2117:12;;;;;;;;;;;;;1896:241;-1:-1:-1;;;1896:241:0:o;13041:712::-;13191:12;13220:7;13216:530;;;-1:-1:-1;13251:10:0;13244:17;;13216:530;13365:17;;:21;13361:374;;13563:10;13557:17;13624:15;13611:10;13607:2;13603:19;13596:44;13361:374;13706:12;13699:20;;-1:-1:-1;;;13699:20:0;;;;;;;;:::i;44930:237::-;45024:16;;;45038:1;45024:16;;;;;;;;44980:7;;;;45024:16;45038:1;45024:16;;;;;;;;-1:-1:-1;;45061:6:0;;45051:7;;;;-1:-1:-1;;;;;;45061:6:0;;45051:7;;-1:-1:-1;45061:6:0;;45051:7;;;;:::i;:::-;-1:-1:-1;;;;;45051:16:0;;;:7;;;;;;;;;:16;45088:6;;45078:7;;45088:6;;;45078:4;;45088:6;;45078:7;;;;;;:::i;36421:673::-;36504:4;36522:17;36541;-1:-1:-1;;;;;;;;;;;;;;;;36563:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36521:70;;;;;36617:20;-1:-1:-1;;;;;;;;;;;;;;;;36640:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36617:51;;36679:17;36707:20;-1:-1:-1;;;;;;;;;;;;;;;;36730:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36707:57;-1:-1:-1;36781:17:0;36777:279;;36858:12;36827:28;36837:17;36847:7;36837;:17;:::i;:::-;36827:9;:28::i;:::-;:43;;;;:::i;:::-;36815:55;;36777:279;;;36915:129;-1:-1:-1;;;;;36942:34:0;;:22;36952:12;36942:7;:22;:::i;:::-;:34;;;;:::i;:::-;-1:-1:-1;;;;;36995:34:0;;:22;37005:12;36995:7;:22;:::i;:::-;:34;;;;:::i;:::-;36915:8;:129::i;:::-;36903:141;;36777:279;-1:-1:-1;37073:13:0;;;36421:673;-1:-1:-1;;;;;;36421:673:0:o;22791:123::-;22847:6;22880:25;22898:7;22880:15;:25;:::i;2257:737::-;-1:-1:-1;;;;;;;;;;;;2389:1:0;2375:11;:15;2367:66;;;;-1:-1:-1;;;2367:66:0;;13925:2:1;2367:66:0;;;13907:21:1;13964:2;13944:18;;;13937:30;14003:34;13983:18;;;13976:62;-1:-1:-1;;;14054:18:1;;;14047:36;14100:19;;2367:66:0;13723:402:1;2367:66:0;2448:14;2444:50;;-1:-1:-1;2471:23:0;;;;;;;;;-1:-1:-1;2471:23:0;;2464:30;;2444:50;-1:-1:-1;;;;;2511:30:0;;2507:480;;2558:14;2575:39;2603:11;1499:3;2576:23;;;2575:39;:::i;:::-;2558:56;-1:-1:-1;;;;;;2637:27:0;;;2629:70;;;;-1:-1:-1;;;2629:70:0;;14332:2:1;2629:70:0;;;14314:21:1;14371:2;14351:18;;;14344:30;14410:32;14390:18;;;14383:60;14460:18;;2629:70:0;14130:354:1;2629:70:0;2721:26;;;;;;;;2739:6;-1:-1:-1;;;;;2721:26:0;;;;2714:33;;;;;2507:480;2780:14;2797:45;2813:9;-1:-1:-1;;;2830:11:0;2797:15;:45::i;24294:303::-;24339:6;24366:1;24362;:5;24358:232;;;-1:-1:-1;24388:1:0;24404:6;24413:5;24417:1;24388;24413:5;:::i;:::-;:9;;24421:1;24413:9;:::i;:::-;24404:18;;24437:92;24448:1;24444;:5;24437:92;;;24474:1;-1:-1:-1;24474:1:0;24512;24474;24499:5;24474:1;24499;:5;:::i;:::-;:9;;;;:::i;:::-;24498:15;;;;:::i;:::-;24494:19;;24437:92;;24358:232;24550:6;;24546:44;;-1:-1:-1;24577:1:0;24546:44;24294:303;;;:::o;24080:96::-;24132:6;24159:1;24155;:5;:13;;24167:1;24155:13;;;-1:-1:-1;24163:1:0;;24151:17;-1:-1:-1;24080:96:0:o;809:388::-;915:7;936:9;947;960:13;968:1;971;960:7;:13::i;:::-;935:38;;;;986:10;1012:1;999:15;;;;;:::i;:::-;1009:1;1006;999:15;986:28;;1034:1;1029:2;:6;1025:18;;;1037:6;1042:1;1037:6;;:::i;:::-;;;1025:18;1054:7;1059:2;1054:7;;:::i;:::-;;-1:-1:-1;1078:6:0;1074:24;;1093:5;1097:1;1093;:5;:::i;:::-;1086:12;;;;;;;1074:24;1123:1;1119;:5;1111:44;;;;-1:-1:-1;;;1111:44:0;;14691:2:1;1111:44:0;;;14673:21:1;14730:2;14710:18;;;14703:30;14769:28;14749:18;;;14742:56;14815:18;;1111:44:0;14489:350:1;1111:44:0;1173:16;1181:1;1184;1187;1173:7;:16::i;88:217::-;150:9;;;-1:-1:-1;;206:1:0;203;196:31;183:44;-1:-1:-1;242:5:0;246:1;242;:5;:::i;:::-;238:9;-1:-1:-1;262:6:0;238:9;262:2;:6;:::i;:::-;258:10;;288:1;283:2;:6;279:18;;;291:6;296:1;291:6;;:::i;:::-;;;279:18;172:133;88:217;;;;;:::o;313:488::-;419:7;;459:4;:2;;462:1;459:4;:::i;:::-;454:10;;;-1:-1:-1;475:9:0;454:10;:1;475:9;:::i;:::-;;-1:-1:-1;495:9:0;500:4;495:9;;:::i;:::-;;-1:-1:-1;537:4:0;526:7;:5;;532:1;526:7;:::i;:::-;525:16;;;;:::i;:::-;:20;;544:1;525:20;:::i;:::-;520:26;;:1;:26;:::i;:::-;515:31;;;;:::i;:::-;;-1:-1:-1;569:1:0;590:5;569:1;590;:5;:::i;:::-;586:9;;:1;:9;:::i;:::-;581:14;;;;:::i;:::-;;-1:-1:-1;615:5:0;581:14;615:1;:5;:::i;:::-;611:9;;:1;:9;:::i;:::-;606:14;;;;:::i;:::-;;-1:-1:-1;640:5:0;606:14;640:1;:5;:::i;:::-;636:9;;:1;:9;:::i;:::-;631:14;;;;:::i;:::-;;-1:-1:-1;665:5:0;631:14;665:1;:5;:::i;:::-;661:9;;:1;:9;:::i;:::-;656:14;;;;:::i;:::-;;-1:-1:-1;690:5:0;656:14;690:1;:5;:::i;:::-;686:9;;:1;:9;:::i;:::-;681:14;;;;:::i;:::-;;-1:-1:-1;715:5:0;681:14;715:1;:5;:::i;:::-;711:9;;:1;:9;:::i;:::-;706:14;;;;:::i;:::-;;-1:-1:-1;740:5:0;706:14;740:1;:5;:::i;:::-;736:9;;:1;:9;:::i;:::-;731:14;;;;:::i;:::-;;-1:-1:-1;765:5:0;731:14;765:1;:5;:::i;:::-;761:9;;:1;:9;:::i;:::-;756:14;;;;:::i;:::-;;-1:-1:-1;788:5:0;756:14;788:1;:5;:::i;:::-;781:12;313:488;-1:-1:-1;;;;;;313:488:0:o;14:347:1:-;216:2;198:21;;;255:2;235:18;;;228:30;294:25;289:2;274:18;;267:53;352:2;337:18;;14:347::o;756:131::-;-1:-1:-1;;;;;831:31:1;;821:42;;811:70;;877:1;874;867:12;892:315;960:6;968;1021:2;1009:9;1000:7;996:23;992:32;989:52;;;1037:1;1034;1027:12;989:52;1076:9;1063:23;1095:31;1120:5;1095:31;:::i;:::-;1145:5;1197:2;1182:18;;;;1169:32;;-1:-1:-1;;;892:315:1:o;1212:180::-;1271:6;1324:2;1312:9;1303:7;1299:23;1295:32;1292:52;;;1340:1;1337;1330:12;1292:52;-1:-1:-1;1363:23:1;;1212:180;-1:-1:-1;1212:180:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;1841:127::-;1902:10;1897:3;1893:20;1890:1;1883:31;1933:4;1930:1;1923:15;1957:4;1954:1;1947:15;1973:128;2013:3;2044:1;2040:6;2037:1;2034:13;2031:39;;;2050:18;;:::i;:::-;-1:-1:-1;2086:9:1;;1973:128::o;2106:168::-;2146:7;2212:1;2208;2204:6;2200:14;2197:1;2194:21;2189:1;2182:9;2175:17;2171:45;2168:71;;;2219:18;;:::i;:::-;-1:-1:-1;2259:9:1;;2106:168::o;2279:251::-;2349:6;2402:2;2390:9;2381:7;2377:23;2373:32;2370:52;;;2418:1;2415;2408:12;2370:52;2450:9;2444:16;2469:31;2494:5;2469:31;:::i;2937:127::-;2998:10;2993:3;2989:20;2986:1;2979:31;3029:4;3026:1;3019:15;3053:4;3050:1;3043:15;3069:127;3130:10;3125:3;3121:20;3118:1;3111:31;3161:4;3158:1;3151:15;3185:4;3182:1;3175:15;3201:184;3271:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:52;;;3340:1;3337;3330:12;3292:52;-1:-1:-1;3363:16:1;;3201:184;-1:-1:-1;3201:184:1:o;3390:125::-;3430:4;3458:1;3455;3452:8;3449:34;;;3463:18;;:::i;:::-;-1:-1:-1;3500:9:1;;3390:125::o;3799:245::-;3878:6;3886;3939:2;3927:9;3918:7;3914:23;3910:32;3907:52;;;3955:1;3952;3945:12;3907:52;-1:-1:-1;;3978:16:1;;4034:2;4019:18;;;4013:25;3978:16;;4013:25;;-1:-1:-1;3799:245:1:o;5717:127::-;5778:10;5773:3;5769:20;5766:1;5759:31;5809:4;5806:1;5799:15;5833:4;5830:1;5823:15;5849:120;5889:1;5915;5905:35;;5920:18;;:::i;:::-;-1:-1:-1;5954:9:1;;5849:120::o;5974:277::-;6041:6;6094:2;6082:9;6073:7;6069:23;6065:32;6062:52;;;6110:1;6107;6100:12;6062:52;6142:9;6136:16;6195:5;6188:13;6181:21;6174:5;6171:32;6161:60;;6217:1;6214;6207:12;6256:461;6309:3;6347:5;6341:12;6374:6;6369:3;6362:19;6400:4;6429:2;6424:3;6420:12;6413:19;;6466:2;6459:5;6455:14;6487:1;6497:195;6511:6;6508:1;6505:13;6497:195;;;6576:13;;-1:-1:-1;;;;;6572:39:1;6560:52;;6632:12;;;;6667:15;;;;6608:1;6526:9;6497:195;;;-1:-1:-1;6708:3:1;;6256:461;-1:-1:-1;;;;;6256:461:1:o;6722:332::-;6929:6;6918:9;6911:25;6972:2;6967;6956:9;6952:18;6945:30;6892:4;6992:56;7044:2;7033:9;7029:18;7021:6;6992:56;:::i;7059:1105::-;7154:6;7185:2;7228;7216:9;7207:7;7203:23;7199:32;7196:52;;;7244:1;7241;7234:12;7196:52;7277:9;7271:16;7306:18;7347:2;7339:6;7336:14;7333:34;;;7363:1;7360;7353:12;7333:34;7401:6;7390:9;7386:22;7376:32;;7446:7;7439:4;7435:2;7431:13;7427:27;7417:55;;7468:1;7465;7458:12;7417:55;7497:2;7491:9;7519:2;7515;7512:10;7509:36;;;7525:18;;:::i;:::-;7571:2;7568:1;7564:10;7603:2;7597:9;7666:2;7662:7;7657:2;7653;7649:11;7645:25;7637:6;7633:38;7721:6;7709:10;7706:22;7701:2;7689:10;7686:18;7683:46;7680:72;;;7732:18;;:::i;:::-;7768:2;7761:22;7818:18;;;7852:15;;;;-1:-1:-1;7894:11:1;;;7890:20;;;7922:19;;;7919:39;;;7954:1;7951;7944:12;7919:39;7978:11;;;;7998:135;8014:6;8009:3;8006:15;7998:135;;;8080:10;;8068:23;;8031:12;;;;8111;;;;7998:135;;;8152:6;7059:1105;-1:-1:-1;;;;;;;;7059:1105:1:o;8169:574::-;8460:6;8449:9;8442:25;8503:6;8498:2;8487:9;8483:18;8476:34;8546:3;8541:2;8530:9;8526:18;8519:31;8423:4;8567:57;8619:3;8608:9;8604:19;8596:6;8567:57;:::i;:::-;-1:-1:-1;;;;;8660:32:1;;;;8655:2;8640:18;;8633:60;-1:-1:-1;8724:3:1;8709:19;8702:35;8559:65;8169:574;-1:-1:-1;;;8169:574:1:o;8748:221::-;8787:4;8816:10;8876;;;;8846;;8898:12;;;8895:38;;;8913:18;;:::i;:::-;8950:13;;8748:221;-1:-1:-1;;;8748:221:1:o;10150:258::-;10222:1;10232:113;10246:6;10243:1;10240:13;10232:113;;;10322:11;;;10316:18;10303:11;;;10296:39;10268:2;10261:10;10232:113;;;10363:6;10360:1;10357:13;10354:48;;;-1:-1:-1;;10398:1:1;10380:16;;10373:27;10150:258::o;10413:274::-;10542:3;10580:6;10574:13;10596:53;10642:6;10637:3;10630:4;10622:6;10618:17;10596:53;:::i;:::-;10665:16;;;;;10413:274;-1:-1:-1;;10413:274:1:o;10692:383::-;10841:2;10830:9;10823:21;10804:4;10873:6;10867:13;10916:6;10911:2;10900:9;10896:18;10889:34;10932:66;10991:6;10986:2;10975:9;10971:18;10966:2;10958:6;10954:15;10932:66;:::i;:::-;11059:2;11038:15;-1:-1:-1;;11034:29:1;11019:45;;;;11066:2;11015:54;;10692:383;-1:-1:-1;;10692:383:1:o;11080:502::-;11343:6;11332:9;11325:25;11386:3;11381:2;11370:9;11366:18;11359:31;11306:4;11407:57;11459:3;11448:9;11444:19;11436:6;11407:57;:::i;:::-;-1:-1:-1;;;;;11500:32:1;;;;11495:2;11480:18;;11473:60;-1:-1:-1;11564:2:1;11549:18;11542:34;11399:65;11080:502;-1:-1:-1;;11080:502:1:o;11587:188::-;11666:13;;-1:-1:-1;;;;;11708:42:1;;11698:53;;11688:81;;11765:1;11762;11755:12;11780:450;11867:6;11875;11883;11936:2;11924:9;11915:7;11911:23;11907:32;11904:52;;;11952:1;11949;11942:12;11904:52;11975:40;12005:9;11975:40;:::i;:::-;11965:50;;12034:49;12079:2;12068:9;12064:18;12034:49;:::i;:::-;12024:59;;12126:2;12115:9;12111:18;12105:25;12170:10;12163:5;12159:22;12152:5;12149:33;12139:61;;12196:1;12193;12186:12;12139:61;12219:5;12209:15;;;11780:450;;;;;:::o;13606:112::-;13638:1;13664;13654:35;;13669:18;;:::i;:::-;-1:-1:-1;13703:9:1;;13606:112::o
Swarm Source
ipfs://feab8d392617cce40194904d439604d51569d81869a195422e24067e813c7cee
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.