More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 5,718 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove_liquidity... | 21540914 | 23 hrs ago | IN | 0 ETH | 0.00238663 | ||||
Add_liquidity | 21540675 | 24 hrs ago | IN | 0 ETH | 0.00336541 | ||||
Remove_liquidity... | 21534901 | 44 hrs ago | IN | 0 ETH | 0.00766475 | ||||
Add_liquidity | 21533847 | 47 hrs ago | IN | 0 ETH | 0.02679026 | ||||
Exchange_underly... | 21533824 | 47 hrs ago | IN | 0 ETH | 0.02143232 | ||||
Exchange_underly... | 21533819 | 47 hrs ago | IN | 0 ETH | 0.02041078 | ||||
Remove_liquidity... | 21531152 | 2 days ago | IN | 0 ETH | 0.01014339 | ||||
Remove_liquidity... | 21525095 | 3 days ago | IN | 0 ETH | 0.00231464 | ||||
Remove_liquidity... | 21517979 | 4 days ago | IN | 0 ETH | 0.002633 | ||||
Remove_liquidity... | 21515875 | 4 days ago | IN | 0 ETH | 0.00403067 | ||||
Remove_liquidity... | 21513839 | 4 days ago | IN | 0 ETH | 0.00104506 | ||||
Remove_liquidity | 21512280 | 4 days ago | IN | 0 ETH | 0.00146646 | ||||
Add_liquidity | 21510722 | 5 days ago | IN | 0 ETH | 0.0023709 | ||||
Remove_liquidity... | 21505571 | 5 days ago | IN | 0 ETH | 0.00149299 | ||||
Add_liquidity | 21504718 | 6 days ago | IN | 0 ETH | 0.00149137 | ||||
Add_liquidity | 21500647 | 6 days ago | IN | 0 ETH | 0.00149963 | ||||
Add_liquidity | 21500177 | 6 days ago | IN | 0 ETH | 0.00200746 | ||||
Remove_liquidity... | 21484810 | 8 days ago | IN | 0 ETH | 0.00224527 | ||||
Add_liquidity | 21483704 | 8 days ago | IN | 0 ETH | 0.0017208 | ||||
Add_liquidity | 21483161 | 9 days ago | IN | 0 ETH | 0.00180733 | ||||
Exchange | 21482613 | 9 days ago | IN | 0 ETH | 0.00269111 | ||||
Add_liquidity | 21481883 | 9 days ago | IN | 0 ETH | 0.00248607 | ||||
Add_liquidity | 21481299 | 9 days ago | IN | 0 ETH | 0.00210498 | ||||
Add_liquidity | 21481209 | 9 days ago | IN | 0 ETH | 0.00203241 | ||||
Add_liquidity | 21480028 | 9 days ago | IN | 0 ETH | 0.00363096 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.8
Contract Source Code (Vyper language format)
# @version 0.2.8 """ @title Curve IronBank Pool @author Curve.Fi @license Copyright (c) Curve.Fi, 2021 - all rights reserved @notice Pool for swapping between cyTokens (cyDAI, cyUSDC, cyUSDT) """ # External Contracts interface cyToken: def transfer(_to: address, _value: uint256) -> bool: nonpayable def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable def mint(mintAmount: uint256) -> uint256: nonpayable def redeem(redeemTokens: uint256) -> uint256: nonpayable def exchangeRateStored() -> uint256: view def exchangeRateCurrent() -> uint256: nonpayable def supplyRatePerBlock() -> uint256: view def accrualBlockNumber() -> uint256: view interface CurveToken: def mint(_to: address, _value: uint256) -> bool: nonpayable def burnFrom(_to: address, _value: uint256) -> bool: nonpayable interface ERC20: def transfer(_to: address, _value: uint256): nonpayable def transferFrom(_from: address, _to: address, _value: uint256): nonpayable def totalSupply() -> uint256: view def balanceOf(_addr: address) -> uint256: view # Events event TokenExchange: buyer: indexed(address) sold_id: int128 tokens_sold: uint256 bought_id: int128 tokens_bought: uint256 event TokenExchangeUnderlying: buyer: indexed(address) sold_id: int128 tokens_sold: uint256 bought_id: int128 tokens_bought: uint256 event AddLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event RemoveLiquidity: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] token_supply: uint256 event RemoveLiquidityOne: provider: indexed(address) token_amount: uint256 coin_amount: uint256 event RemoveLiquidityImbalance: provider: indexed(address) token_amounts: uint256[N_COINS] fees: uint256[N_COINS] invariant: uint256 token_supply: uint256 event CommitNewAdmin: deadline: indexed(uint256) admin: indexed(address) event NewAdmin: admin: indexed(address) event CommitNewFee: deadline: indexed(uint256) fee: uint256 admin_fee: uint256 event NewFee: fee: uint256 admin_fee: uint256 event RampA: old_A: uint256 new_A: uint256 initial_time: uint256 future_time: uint256 event StopRampA: A: uint256 t: uint256 # These constants must be set prior to compiling N_COINS: constant(int128) = 3 PRECISION_MUL: constant(uint256[N_COINS]) = [1, 1000000000000, 1000000000000] # fixed constants FEE_DENOMINATOR: constant(uint256) = 10 ** 10 PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9 MAX_FEE: constant(uint256) = 5 * 10 ** 9 MAX_A: constant(uint256) = 10 ** 6 MAX_A_CHANGE: constant(uint256) = 10 ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400 MIN_RAMP_TIME: constant(uint256) = 86400 coins: public(address[N_COINS]) underlying_coins: public(address[N_COINS]) balances: public(uint256[N_COINS]) previous_balances: public(uint256[N_COINS]) block_timestamp_last: public(uint256) fee: public(uint256) # fee * 1e10 admin_fee: public(uint256) # admin_fee * 1e10 owner: public(address) lp_token: public(address) A_PRECISION: constant(uint256) = 100 initial_A: public(uint256) future_A: public(uint256) initial_A_time: public(uint256) future_A_time: public(uint256) admin_actions_deadline: public(uint256) transfer_ownership_deadline: public(uint256) future_fee: public(uint256) future_admin_fee: public(uint256) future_owner: public(address) is_killed: bool kill_deadline: uint256 KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400 @external def __init__( _owner: address, _coins: address[N_COINS], _underlying_coins: address[N_COINS], _pool_token: address, _A: uint256, _fee: uint256, _admin_fee: uint256, ): """ @notice Contract constructor @param _owner Contract owner address @param _coins Addresses of ERC20 contracts of wrapped coins @param _underlying_coins Addresses of ERC20 contracts of underlying coins @param _pool_token Address of the token representing LP share @param _A Amplification coefficient multiplied by n * (n - 1) @param _fee Fee to charge for exchanges @param _admin_fee Admin fee """ for i in range(N_COINS): assert _coins[i] != ZERO_ADDRESS assert _underlying_coins[i] != ZERO_ADDRESS # approve underlying coins for infinite transfers _response: Bytes[32] = raw_call( _underlying_coins[i], concat( method_id("approve(address,uint256)"), convert(_coins[i], bytes32), convert(MAX_UINT256, bytes32), ), max_outsize=32, ) if len(_response) > 0: assert convert(_response, bool) self.coins = _coins self.underlying_coins = _underlying_coins self.initial_A = _A * A_PRECISION self.future_A = _A * A_PRECISION self.fee = _fee self.admin_fee = _admin_fee self.owner = _owner self.kill_deadline = block.timestamp + KILL_DEADLINE_DT self.lp_token = _pool_token @view @internal def _A() -> uint256: """ Handle ramping A up or down """ t1: uint256 = self.future_A_time A1: uint256 = self.future_A if block.timestamp < t1: A0: uint256 = self.initial_A t0: uint256 = self.initial_A_time # Expressions in uint256 cannot have negative numbers, thus "if" if A1 > A0: return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0) else: return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0) else: # when t1 == 0 or block.timestamp >= t1 return A1 @view @external def A() -> uint256: return self._A() / A_PRECISION @view @external def A_precise() -> uint256: return self._A() @view @internal def _stored_rates() -> uint256[N_COINS]: # exchangeRateStored * (1 + supplyRatePerBlock * (getBlockNumber - accrualBlockNumber) / 1e18) result: uint256[N_COINS] = PRECISION_MUL for i in range(N_COINS): coin: address = self.coins[i] rate: uint256 = cyToken(coin).exchangeRateStored() rate += rate * cyToken(coin).supplyRatePerBlock() * (block.number - cyToken(coin).accrualBlockNumber()) / PRECISION result[i] *= rate return result @internal def _update(): """ Commits pre-change balances for the previous block Can be used to compare against current values for flash loan checks """ if block.timestamp > self.block_timestamp_last: self.previous_balances = self.balances self.block_timestamp_last = block.timestamp @internal def _current_rates() -> uint256[N_COINS]: self._update() result: uint256[N_COINS] = PRECISION_MUL for i in range(N_COINS): result[i] *= cyToken(self.coins[i]).exchangeRateCurrent() return result @view @internal def _xp(rates: uint256[N_COINS]) -> uint256[N_COINS]: result: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): result[i] = rates[i] * self.balances[i] / PRECISION return result @pure @internal def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256: S: uint256 = 0 Dprev: uint256 = 0 for _x in xp: S += _x if S == 0: return 0 D: uint256 = S Ann: uint256 = amp * N_COINS for _i in range(255): D_P: uint256 = D for _x in xp: D_P = D_P * D / (_x * N_COINS) # If division by 0, this will be borked: only withdrawal will work. And that is good Dprev = D D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P) # Equality with the precision of 1 if D > Dprev: if D - Dprev <= 1: return D else: if Dprev - D <= 1: return D # convergence typically occurs in 4 rounds or less, this should be unreachable! # if it does happen the pool is borked and LPs can withdraw via `remove_liquidity` raise @view @internal def get_D_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS], _amp: uint256) -> uint256: xp: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): xp[i] = rates[i] * _balances[i] / PRECISION return self.get_D(xp, _amp) @view @external def get_virtual_price() -> uint256: """ @notice The current virtual price of the pool LP token @dev Useful for calculating profits @return LP token virtual price normalized to 1e18 """ D: uint256 = self.get_D(self._xp(self._stored_rates()), self._A()) # D is in the units similar to DAI (e.g. converted to precision 1e18) # When balanced, D = n * x_u - total virtual value of the portfolio return D * PRECISION / ERC20(self.lp_token).totalSupply() @view @external def calc_token_amount(amounts: uint256[N_COINS], is_deposit: bool) -> uint256: """ @notice Calculate addition or reduction in token supply from a deposit or withdrawal @dev This calculation accounts for slippage, but not fees. Needed to prevent front-running, not for precise calculations! @param amounts Amount of each coin being deposited @param is_deposit set True for deposits, False for withdrawals @return Expected amount of LP tokens received """ amp: uint256 = self._A() rates: uint256[N_COINS] = self._stored_rates() _balances: uint256[N_COINS] = self.balances D0: uint256 = self.get_D_mem(rates, _balances, amp) for i in range(N_COINS): _amount: uint256 = amounts[i] if is_deposit: _balances[i] += _amount else: _balances[i] -= _amount D1: uint256 = self.get_D_mem(rates, _balances, amp) token_amount: uint256 = ERC20(self.lp_token).totalSupply() diff: uint256 = 0 if is_deposit: diff = D1 - D0 else: diff = D0 - D1 return diff * token_amount / D0 @external @nonreentrant('lock') def add_liquidity( _amounts: uint256[N_COINS], _min_mint_amount: uint256, _use_underlying: bool = False ) -> uint256: """ @notice Deposit coins into the pool @param _amounts List of amounts of coins to deposit @param _min_mint_amount Minimum amount of LP tokens to mint from the deposit @param _use_underlying If True, deposit underlying assets instead of cyTokens @return Amount of LP tokens received by depositing """ assert not self.is_killed amp: uint256 = self._A() rates: uint256[N_COINS] = self._current_rates() _lp_token: address = self.lp_token token_supply: uint256 = ERC20(_lp_token).totalSupply() # Initial invariant old_balances: uint256[N_COINS] = self.balances D0: uint256 = self.get_D_mem(rates, old_balances, amp) # Take coins from the sender new_balances: uint256[N_COINS] = old_balances amounts: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): amount: uint256 = _amounts[i] if amount == 0: assert token_supply > 0 else: coin: address = self.coins[i] if _use_underlying: ERC20(self.underlying_coins[i]).transferFrom(msg.sender, self, amount) before: uint256 = ERC20(coin).balanceOf(self) assert cyToken(coin).mint(amount) == 0 amount = ERC20(coin).balanceOf(self) - before else: assert cyToken(coin).transferFrom(msg.sender, self, amount) amounts[i] = amount new_balances[i] += amount # Invariant after change D1: uint256 = self.get_D_mem(rates, new_balances, amp) assert D1 > D0 # We need to recalculate the invariant accounting for fees # to calculate fair user's share fees: uint256[N_COINS] = empty(uint256[N_COINS]) mint_amount: uint256 = 0 if token_supply != 0: # Only account for fees if we are not the first to deposit _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) _admin_fee: uint256 = self.admin_fee difference: uint256 = 0 for i in range(N_COINS): new_balance: uint256 = new_balances[i] ideal_balance: uint256 = D1 * old_balances[i] / D0 if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance fees[i] = _fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (fees[i] * _admin_fee / FEE_DENOMINATOR) new_balances[i] -= fees[i] D2: uint256 = self.get_D_mem(rates, new_balances, amp) mint_amount = token_supply * (D2 - D0) / D0 else: self.balances = new_balances mint_amount = D1 # Take the dust if there was any assert mint_amount >= _min_mint_amount, "Slippage screwed you" # Mint pool tokens CurveToken(_lp_token).mint(msg.sender, mint_amount) log AddLiquidity(msg.sender, amounts, fees, D1, token_supply + mint_amount) return mint_amount @view @internal def get_y(i: int128, j: int128, x: uint256, xp_: uint256[N_COINS]) -> uint256: # x in the input is converted to the same price/precision assert i != j # dev: same coin assert j >= 0 # dev: j below zero assert j < N_COINS # dev: j above N_COINS # should be unreachable, but good for safety assert i >= 0 assert i < N_COINS A_: uint256 = self._A() D: uint256 = self.get_D(xp_, A_) Ann: uint256 = A_ * N_COINS c: uint256 = D S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 for _i in range(N_COINS): if _i == i: _x = x elif _i != j: _x = xp_[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann # - D y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @external def get_dy(i: int128, j: int128, dx: uint256) -> uint256: # dx and dy in c-units rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) x: uint256 = xp[i] + dx * rates[i] / PRECISION y: uint256 = self.get_y(i, j, x, xp) dy: uint256 = xp[j] - y - 1 return (dy - (self.fee * dy / FEE_DENOMINATOR)) * PRECISION / rates[j] @view @external def get_dx(i: int128, j: int128, dy: uint256) -> uint256: # dx and dy in c-units rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * rates[j] / PRECISION x: uint256 = self.get_y(j, i, y, xp) return (x - xp[i]) * PRECISION / rates[i] @view @external def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256: # dx and dy in underlying units rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) precisions: uint256[N_COINS] = PRECISION_MUL x: uint256 = xp[i] + dx * precisions[i] dy: uint256 = xp[j] - self.get_y(i, j, x, xp) - 1 _fee: uint256 = self.fee * dy / FEE_DENOMINATOR return (dy - _fee) / precisions[j] @external @view def get_dx_underlying(i: int128, j: int128, dy: uint256) -> uint256: # dx and dy in underlying units rates: uint256[N_COINS] = self._stored_rates() xp: uint256[N_COINS] = self._xp(rates) precisions: uint256[N_COINS] = PRECISION_MUL y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * precisions[j] return (self.get_y(j, i, y, xp) - xp[i]) / precisions[i] @internal def _exchange(i: int128, j: int128, dx: uint256) -> uint256: assert not self.is_killed # dx and dy are in cy tokens rates: uint256[N_COINS] = self._current_rates() old_balances: uint256[N_COINS] = self.balances xp: uint256[N_COINS] = empty(uint256[N_COINS]) for k in range(N_COINS): xp[k] = rates[k] * old_balances[k] / PRECISION x: uint256 = xp[i] + dx * rates[i] / PRECISION dy: uint256 = xp[j] - self.get_y(i, j, x, xp) - 1 # -1 just in case there were some rounding errors dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR dy = (dy - dy_fee) * PRECISION / rates[j] dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR dy_admin_fee = dy_admin_fee * PRECISION / rates[j] self.balances[i] = old_balances[i] + dx self.balances[j] = old_balances[j] - dy - dy_admin_fee return dy @external @nonreentrant('lock') def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256: """ @notice Perform an exchange between two coins @dev Index values can be found via the `coins` public getter method @param i Index value for the coin to send @param j Index valie of the coin to recieve @param dx Amount of `i` being exchanged @param min_dy Minimum amount of `j` to receive @return Actual amount of `j` received """ dy: uint256 = self._exchange(i, j, dx) assert dy >= min_dy, "Too few coins in result" assert cyToken(self.coins[i]).transferFrom(msg.sender, self, dx) assert cyToken(self.coins[j]).transfer(msg.sender, dy) log TokenExchange(msg.sender, i, dx, j, dy) return dy @external @nonreentrant('lock') def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256: """ @notice Perform an exchange between two underlying coins @dev Index values can be found via the `underlying_coins` public getter method @param i Index value for the underlying coin to send @param j Index valie of the underlying coin to recieve @param dx Amount of `i` being exchanged @param min_dy Minimum amount of `j` to receive @return Actual amount of `j` received """ ERC20(self.underlying_coins[i]).transferFrom(msg.sender, self, dx) coin: address = self.coins[i] dx_: uint256 = ERC20(coin).balanceOf(self) assert cyToken(coin).mint(dx) == 0 dx_ = ERC20(coin).balanceOf(self) - dx_ dy_: uint256 = self._exchange(i, j, dx_) assert cyToken(self.coins[j]).redeem(dy_) == 0 underlying: address = self.underlying_coins[j] dy: uint256 = ERC20(underlying).balanceOf(self) assert dy >= min_dy, "Too few coins in result" ERC20(underlying).transfer(msg.sender, dy) log TokenExchangeUnderlying(msg.sender, i, dx, j, dy) return dy @external @nonreentrant('lock') def remove_liquidity( _amount: uint256, _min_amounts: uint256[N_COINS], _use_underlying: bool = False ) -> uint256[N_COINS]: """ @notice Withdraw coins from the pool @dev Withdrawal amounts are based on current deposit ratios @param _amount Quantity of LP tokens to burn in the withdrawal @param _min_amounts Minimum amounts of underlying coins to receive @param _use_underlying If True, withdraw underlying assets instead of cyTokens @return List of amounts of coins that were withdrawn """ self._update() _lp_token: address = self.lp_token total_supply: uint256 = ERC20(_lp_token).totalSupply() amounts: uint256[N_COINS] = empty(uint256[N_COINS]) for i in range(N_COINS): _balance: uint256 = self.balances[i] value: uint256 = _balance * _amount / total_supply self.balances[i] = _balance - value amounts[i] = value coin: address = self.coins[i] if _use_underlying: assert cyToken(coin).redeem(value) == 0 underlying: address = self.underlying_coins[i] value = ERC20(underlying).balanceOf(self) ERC20(underlying).transfer(msg.sender, value) else: assert cyToken(coin).transfer(msg.sender, value) assert value >= _min_amounts[i] CurveToken(_lp_token).burnFrom(msg.sender, _amount) # Will raise if not enough log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply - _amount) return amounts @external @nonreentrant('lock') def remove_liquidity_imbalance( _amounts: uint256[N_COINS], _max_burn_amount: uint256, _use_underlying: bool = False ) -> uint256: """ @notice Withdraw coins from the pool in an imbalanced amount @param _amounts List of amounts of underlying coins to withdraw @param _max_burn_amount Maximum amount of LP token to burn in the withdrawal @param _use_underlying If True, withdraw underlying assets instead of cyTokens @return Actual amount of the LP token burned in the withdrawal """ assert not self.is_killed amp: uint256 = self._A() rates: uint256[N_COINS] = self._current_rates() old_balances: uint256[N_COINS] = self.balances D0: uint256 = self.get_D_mem(rates, old_balances, amp) new_balances: uint256[N_COINS] = old_balances amounts: uint256[N_COINS] = _amounts precisions: uint256[N_COINS] = PRECISION_MUL for i in range(N_COINS): amount: uint256 = amounts[i] if amount > 0: if _use_underlying: amount = amount * precisions[i] * PRECISION / rates[i] amounts[i] = amount new_balances[i] -= amount D1: uint256 = self.get_D_mem(rates, new_balances, amp) fees: uint256[N_COINS] = empty(uint256[N_COINS]) _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) _admin_fee: uint256 = self.admin_fee for i in range(N_COINS): ideal_balance: uint256 = D1 * old_balances[i] / D0 new_balance: uint256 = new_balances[i] difference: uint256 = 0 if ideal_balance > new_balance: difference = ideal_balance - new_balance else: difference = new_balance - ideal_balance coin_fee: uint256 = _fee * difference / FEE_DENOMINATOR self.balances[i] = new_balance - (coin_fee * _admin_fee / FEE_DENOMINATOR) new_balances[i] -= coin_fee fees[i] = coin_fee D2: uint256 = self.get_D_mem(rates, new_balances, amp) lp_token: address = self.lp_token token_supply: uint256 = ERC20(lp_token).totalSupply() token_amount: uint256 = (D0 - D2) * token_supply / D0 assert token_amount != 0 assert token_amount <= _max_burn_amount, "Slippage screwed you" CurveToken(lp_token).burnFrom(msg.sender, token_amount) # dev: insufficient funds for i in range(N_COINS): amount: uint256 = amounts[i] if amount != 0: coin: address = self.coins[i] if _use_underlying: assert cyToken(coin).redeem(amount) == 0 underlying: address = self.underlying_coins[i] ERC20(underlying).transfer(msg.sender, ERC20(underlying).balanceOf(self)) else: assert cyToken(coin).transfer(msg.sender, amount) log RemoveLiquidityImbalance(msg.sender, amounts, fees, D1, token_supply - token_amount) return token_amount @pure @internal def get_y_D(A_: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256: """ Calculate x[i] if one reduces D from being calculated for xp to D Done by solving quadratic equation iteratively. x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A) x_1**2 + b*x_1 = c x_1 = (x_1**2 + c) / (2*x_1 + b) """ # x in the input is converted to the same price/precision assert i >= 0 # dev: i below zero assert i < N_COINS # dev: i above N_COINS Ann: uint256 = A_ * N_COINS c: uint256 = D S_: uint256 = 0 _x: uint256 = 0 y_prev: uint256 = 0 for _i in range(N_COINS): if _i != i: _x = xp[_i] else: continue S_ += _x c = c * D / (_x * N_COINS) c = c * D * A_PRECISION / (Ann * N_COINS) b: uint256 = S_ + D * A_PRECISION / Ann y: uint256 = D for _i in range(255): y_prev = y y = (y*y + c) / (2 * y + b - D) # Equality with the precision of 1 if y > y_prev: if y - y_prev <= 1: return y else: if y_prev - y <= 1: return y raise @view @internal def _calc_withdraw_one_coin(_token_amount: uint256, i: int128, _use_underlying: bool, _rates: uint256[N_COINS]) -> uint256[2]: # First, need to calculate # * Get current D # * Solve Eqn against y_i for D - _token_amount amp: uint256 = self._A() xp: uint256[N_COINS] = self._xp(_rates) D0: uint256 = self.get_D(xp, amp) total_supply: uint256 = ERC20(self.lp_token).totalSupply() D1: uint256 = D0 - _token_amount * D0 / total_supply new_y: uint256 = self.get_y_D(amp, i, xp, D1) xp_reduced: uint256[N_COINS] = xp _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1)) rate: uint256 = _rates[i] for j in range(N_COINS): dx_expected: uint256 = 0 xp_j: uint256 = xp[j] if j == i: dx_expected = xp_j * D1 / D0 - new_y else: dx_expected = xp_j - xp_j * D1 / D0 xp_reduced[j] -= _fee * dx_expected / FEE_DENOMINATOR dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1) dy = (dy - 1) * PRECISION / rate # Withdraw less to account for rounding errors dy_fee: uint256 = ((xp[i] - new_y) * PRECISION / rate) - dy if _use_underlying: # this branch is only reachable when called via `calc_withdraw_one_coin`, which # only needs `dy` - so we don't bother converting `dy_fee` to the underlying precisions: uint256[N_COINS] = PRECISION_MUL dy = dy * rate / precisions[i] / PRECISION return [dy, dy_fee] @view @external def calc_withdraw_one_coin(_token_amount: uint256, i: int128, _use_underlying: bool = False) -> uint256: """ @notice Calculate the amount received when withdrawing a single coin @param _token_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @return Amount of coin received """ return self._calc_withdraw_one_coin(_token_amount, i, _use_underlying, self._stored_rates())[0] @external @nonreentrant('lock') def remove_liquidity_one_coin( _token_amount: uint256, i: int128, _min_amount: uint256, _use_underlying: bool = False ) -> uint256: """ @notice Withdraw a single coin from the pool @param _token_amount Amount of LP tokens to burn in the withdrawal @param i Index value of the coin to withdraw @param _min_amount Minimum amount of coin to receive @param _use_underlying If True, withdraw underlying assets instead of cyTokens @return Amount of coin received """ assert not self.is_killed # dev: is killed dy: uint256[2] = self._calc_withdraw_one_coin(_token_amount, i, False, self._current_rates()) amount: uint256 = dy[0] self.balances[i] -= (dy[0] + dy[1] * self.admin_fee / FEE_DENOMINATOR) CurveToken(self.lp_token).burnFrom(msg.sender, _token_amount) # dev: insufficient funds coin: address = self.coins[i] if _use_underlying: assert cyToken(coin).redeem(dy[0]) == 0 underlying: address = self.underlying_coins[i] amount = ERC20(underlying).balanceOf(self) ERC20(underlying).transfer(msg.sender, amount) else: assert cyToken(coin).transfer(msg.sender, amount) assert amount >= _min_amount, "Not enough coins removed" log RemoveLiquidityOne(msg.sender, _token_amount, dy[0]) return dy[0] ### Admin functions ### @external def ramp_A(_future_A: uint256, _future_time: uint256): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME assert _future_time >= block.timestamp + MIN_RAMP_TIME # dev: insufficient time _initial_A: uint256 = self._A() _future_A_p: uint256 = _future_A * A_PRECISION assert _future_A > 0 and _future_A < MAX_A if _future_A_p < _initial_A: assert _future_A_p * MAX_A_CHANGE >= _initial_A else: assert _future_A_p <= _initial_A * MAX_A_CHANGE self.initial_A = _initial_A self.future_A = _future_A_p self.initial_A_time = block.timestamp self.future_A_time = _future_time log RampA(_initial_A, _future_A_p, block.timestamp, _future_time) @external def stop_ramp_A(): assert msg.sender == self.owner # dev: only owner current_A: uint256 = self._A() self.initial_A = current_A self.future_A = current_A self.initial_A_time = block.timestamp self.future_A_time = block.timestamp # now (block.timestamp < t1) is always False, so we return saved A log StopRampA(current_A, block.timestamp) @external def commit_new_fee(new_fee: uint256, new_admin_fee: uint256): assert msg.sender == self.owner # dev: only owner assert self.admin_actions_deadline == 0 # dev: active action assert new_fee <= MAX_FEE # dev: fee exceeds maximum assert new_admin_fee <= MAX_ADMIN_FEE # dev: admin fee exceeds maximum _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.admin_actions_deadline = _deadline self.future_fee = new_fee self.future_admin_fee = new_admin_fee log CommitNewFee(_deadline, new_fee, new_admin_fee) @external def apply_new_fee(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time assert self.admin_actions_deadline != 0 # dev: no active action self.admin_actions_deadline = 0 _fee: uint256 = self.future_fee _admin_fee: uint256 = self.future_admin_fee self.fee = _fee self.admin_fee = _admin_fee log NewFee(_fee, _admin_fee) @external def revert_new_parameters(): assert msg.sender == self.owner # dev: only owner self.admin_actions_deadline = 0 @external def commit_transfer_ownership(_owner: address): assert msg.sender == self.owner # dev: only owner assert self.transfer_ownership_deadline == 0 # dev: active transfer _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY self.transfer_ownership_deadline = _deadline self.future_owner = _owner log CommitNewAdmin(_deadline, _owner) @external def apply_transfer_ownership(): assert msg.sender == self.owner # dev: only owner assert block.timestamp >= self.transfer_ownership_deadline # dev: insufficient time assert self.transfer_ownership_deadline != 0 # dev: no active transfer self.transfer_ownership_deadline = 0 _owner: address = self.future_owner self.owner = _owner log NewAdmin(_owner) @external def revert_transfer_ownership(): assert msg.sender == self.owner # dev: only owner self.transfer_ownership_deadline = 0 @view @external def admin_balances(i: uint256) -> uint256: return ERC20(self.coins[i]).balanceOf(self) - self.balances[i] @external def withdraw_admin_fees(): assert msg.sender == self.owner # dev: only owner for i in range(N_COINS): coin: address = self.coins[i] value: uint256 = ERC20(coin).balanceOf(self) - self.balances[i] if value > 0: assert cyToken(coin).transfer(msg.sender, value) @external def kill_me(): assert msg.sender == self.owner # dev: only owner assert self.kill_deadline > block.timestamp # dev: deadline has passed self.is_killed = True @external def unkill_me(): assert msg.sender == self.owner # dev: only owner self.is_killed = False
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false},{"type":"uint256","name":"future_time","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"_owner"},{"type":"address[3]","name":"_coins"},{"type":"address[3]","name":"_underlying_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"uint256","name":"_admin_fee"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5199},{"name":"A_precise","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5161},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1198966},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"amounts"},{"type":"bool","name":"is_deposit"}],"stateMutability":"view","type":"function","gas":4731095},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2814151},{"name":"get_dx","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"stateMutability":"view","type":"function","gas":2814012},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2813991},{"name":"get_dx_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"stateMutability":"view","type":"function","gas":2813825},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function","gas":6347170},{"name":"exchange_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function","gas":6354444},{"name":"remove_liquidity","outputs":[{"type":"uint256[3]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[3]","name":"_min_amounts"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity","outputs":[{"type":"uint256[3]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[3]","name":"_min_amounts"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"}],"stateMutability":"view","type":"function"},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"view","type":"function"},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","name":"_future_time"}],"stateMutability":"nonpayable","type":"function","gas":151984},{"name":"stop_ramp_A","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":148745},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"stateMutability":"nonpayable","type":"function","gas":110581},{"name":"apply_new_fee","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":97362},{"name":"revert_new_parameters","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22015},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"stateMutability":"nonpayable","type":"function","gas":74753},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":60830},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22105},{"name":"admin_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"i"}],"stateMutability":"view","type":"function","gas":3601},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":12875},{"name":"kill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38088},{"name":"unkill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22225},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2310},{"name":"underlying_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2340},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2370},{"name":"previous_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2400},{"name":"block_timestamp_last","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"lp_token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2501},{"name":"initial_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2531},{"name":"future_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2561},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2591},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2621},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2651},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2681},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2711}]
Contract Creation Code
61016061639f61014039602061639f60c03960c05160a01c1561002157600080fd5b6020602061639f0160c03960c05160a01c1561003c57600080fd5b6020604061639f0160c03960c05160a01c1561005757600080fd5b6020606061639f0160c03960c05160a01c1561007257600080fd5b6020608061639f0160c03960c05160a01c1561008d57600080fd5b602060a061639f0160c03960c05160a01c156100a857600080fd5b602060c061639f0160c03960c05160a01c156100c357600080fd5b602060e061639f0160c03960c05160a01c156100de57600080fd5b6102a060006003818352015b60006101606102a0516003811061010057600080fd5b60200201511861010f57600080fd5b60006101c06102a0516003811061012557600080fd5b60200201511861013457600080fd5b60006004610320527f095ea7b3000000000000000000000000000000000000000000000000000000006103405261032060048060208461038001018260208501600060045af15050805182019150506101606102a0516003811061019757600080fd5b60200201516020826103800101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610380010152602081019050806103805261038090508051602001806104208284600060045af16101ff57600080fd5b505060206104e06104205161044060006101c06102a0516003811061022357600080fd5b60200201515af161023357600080fd5b60203d808211156102445780610246565b815b905090506104c0526104c08051602001806102c08284600060045af161026b57600080fd5b505060006102c05111156102be576102c080602001516000825180602090131561029457600080fd5b80919012156102a257600080fd5b806020036101000a820490509050905015156102bd57600080fd5b5b5b81516001018083528114156100ea575b5050600060c052602060c0206101605181556101805160018201556101a051600282015550600160c052602060c0206101c05181556101e051600182015561020051600282015550610240516064808202821582848304141761033157600080fd5b80905090509050600955610240516064808202821582848304141761035557600080fd5b80905090509050600a5561026051600555610280516006556101405160075542624f1a0081818301101561038857600080fd5b808201905090506013556102205160085561638756341561000a57600080fd5b600436101561001857615fe3565b600035601c526000156101c1575b61014052600c5461016052600a5461018052610160514210156101ae576009546101a052600b546101c0526101a051610180511115610107576101a051610180516101a0518082101561007857600080fd5b80820390509050426101c0518082101561009157600080fd5b8082039050905080820282158284830414176100ac57600080fd5b80905090509050610160516101c051808210156100c857600080fd5b8082039050905080806100da57600080fd5b8204905090508181830110156100ef57600080fd5b808201905090506000526000516101405156506101a9565b6101a0516101a051610180518082101561012057600080fd5b80820390509050426101c0518082101561013957600080fd5b80820390509050808202821582848304141761015457600080fd5b80905090509050610160516101c0518082101561017057600080fd5b80820390509050808061018257600080fd5b8204905090508082101561019557600080fd5b808203905090506000526000516101405156505b6101bf565b610180516000526000516101405156505b005b63f446c1d060005114156101f45760065801610026565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561021e5760065801610026565b610140526101405160005260206000f350005b60001561041f575b6101405260016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101c0516003811061026157600080fd5b600060c052602060c02001546101e0526020610280600463182df0f56102205261023c6101e0515afa61029357600080fd5b601f3d116102a057600080fd5b60005061028051610200526102008051610200516020610280600463ae9d70b06102205261023c6101e0515afa6102d657600080fd5b601f3d116102e357600080fd5b6000506102805180820282158284830414176102fe57600080fd5b809050905090504360206103006004636c540baf6102a0526102bc6101e0515afa61032857600080fd5b601f3d1161033557600080fd5b600050610300518082101561034957600080fd5b80820390509050808202821582848304141761036457600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561038a57600080fd5b808201905090508152506101606101c051600381106103a857600080fd5b6020020180516102005180820282158284830414176103c657600080fd5b809050905090508152505b8151600101808352811415610250575b505060606101c0525b60006101c0511115156103fc57610418565b60206101c05103610160015160206101c051036101c0526103ea565b6101405156005b60001561047e575b6101405260045442111561047857600360c052602060c02060028060c052602060c02054825560018160c052602060c0200154600183015560028160c052602060c020015460028301555050426004555b61014051565b60001561059c575b610140526101405160065801610427565b6101405260005060016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101606101c051600381106104d857600080fd5b6020020180516020610240600463bd6d894d6101e0526101fc60006101c0516003811061050457600080fd5b600060c052602060c02001545af161051b57600080fd5b601f3d1161052857600080fd5b60005061024051808202821582848304141761054357600080fd5b809050905090508152505b81516001018083528114156104c4575b505060606101c0525b60006101c05111151561057957610595565b60206101c05103610160015160206101c051036101c052610567565b6101405156005b600015610690575b6101a0526101405261016052610180526060366101c03761022060006003818352015b61014061022051600381106105db57600080fd5b602002015161022051600381106105f157600080fd5b600260c052602060c0200154808202821582848304141761061157600080fd5b80905090509050670de0b6b3a7640000808204905090506101c0610220516003811061063c57600080fd5b60200201525b81516001018083528114156105c7575b50506060610220525b60006102205111151561066d57610689565b602061022051036101c00151602061022051036102205261065b565b6101a05156005b60001561099c575b6101c0526101405261016052610180526101a0526040366101e03761024060006003818352015b602061024051026101400151610220526101e08051610220518181830110156106e757600080fd5b808201905090508152505b81516001018083528114156106bf575b50506101e051151561071d5760006000526000516101c05156505b6101e051610220526101a0516003808202821582848304141761073f57600080fd5b8090509050905061024052610260600060ff818352015b61022051610280526102c060006003818352015b60206102c0510261014001516102a0526102805161022051808202821582848304141761079657600080fd5b809050905090506102a051600380820282158284830414176107b757600080fd5b8090509050905080806107c957600080fd5b820490509050610280525b815160010180835281141561076a575b50506102205161020052610240516101e051808202821582848304141761080a57600080fd5b80905090509050606480820490509050610280516003808202821582848304141761083457600080fd5b8090509050905081818301101561084a57600080fd5b8082019050905061022051808202821582848304141761086957600080fd5b809050905090506102405160648082101561088357600080fd5b808203905090506102205180820282158284830414176108a257600080fd5b8090509050905060648082049050905060046102805180820282158284830414176108cc57600080fd5b809050905090508181830110156108e257600080fd5b8082019050905080806108f457600080fd5b820490509050610220526102005161022051111561094957600161022051610200518082101561092357600080fd5b80820390509050111515610944576102205160005250506000516101c05156505b610982565b600161020051610220518082101561096057600080fd5b80820390509050111515610981576102205160005250506000516101c05156505b5b5b8151600101808352811415610756575b505060006000fd005b600015610b07575b610220526101405261016052610180526101a0526101c0526101e05261020052606036610240376102a060006003818352015b6101406102a051600381106109eb57600080fd5b60200201516101a06102a05160038110610a0457600080fd5b60200201518082028215828483041417610a1d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406102a05160038110610a4857600080fd5b60200201525b81516001018083528114156109d7575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c052610280516102e0526102005161030052610300516102e0516102c0516102a05160065801610698565b6103605261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051600052600051610220515650005b63bb7b8b806000511415610dde576101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526102005161026052610260516102405161022051600658016105a4565b6102c0526102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102c0805161032052806020015161034052806040015161036052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605160065801610026565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516103a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a051610320516103c052610340516103e05261036051610400526103a0516104205261042051610400516103e0516103c05160065801610698565b610480526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516101405261014051670de0b6b3a76400008082028215828483041417610d8657600080fd5b8090509050905060206101c060046318160ddd6101605261017c6008545afa610dae57600080fd5b601f3d11610dbb57600080fd5b6000506101c0518080610dcd57600080fd5b82049050905060005260206000f350005b633883e119600051141561117c5760643560011c15610dfc57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405161016051610180516101a05160065801610226565b6101c0526101e052610200526101a0526101805261016052610140526101c080516101605280602001516101805280604001516101a0525060028060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c020015461020052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526101405161030052610300516102e0516102c0516102a051610280516102605161024051600658016109a4565b6103605261022052610200526101e0526101c0526101a052610180526101605261014052610360516102205261024060006003818352015b60046102405160038110610f6557600080fd5b60200201356102605260643515610fb2576101c06102405160038110610f8a57600080fd5b60200201805161026051818183011015610fa357600080fd5b80820190509050815250610fe8565b6101c06102405160038110610fc657600080fd5b6020020180516102605180821015610fdd57600080fd5b808203905090508152505b5b8151600101808352811415610f52575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610140516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102405260206102e060046318160ddd6102805261029c6008545afa6110cd57600080fd5b601f3d116110da57600080fd5b6000506102e05161026052600061028052606435156111185761024051610220518082101561110857600080fd5b8082039050905061028052611139565b61022051610240518082101561112d57600080fd5b80820390509050610280525b6102805161026051808202821582848304141761115557600080fd5b8090509050905061022051808061116b57600080fd5b82049050905060005260206000f350005b634515cef36000511415611195576000610140526111cb565b632b6e993a60005114156111c35760843560011c156111b357600080fd5b60206084610140376000506111cb565b600015611c09575b62ffffff54156111da57600080fd5b600162ffffff55601254156111ee57600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c052506008546101e052602061028060046318160ddd6102205261023c6101e0515afa61129557600080fd5b601f3d116112a257600080fd5b600050610280516102005260028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610180516102a0526101a0516102c0526101c0516102e0526102205161030052610240516103205261026051610340526101605161036052610360516103405161032051610300516102e0516102c0516102a051600658016109a4565b6103c05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c05161028052610220516102a052610240516102c052610260516102e0526060366103003761036060006003818352015b600461036051600381106113df57600080fd5b602002013561038052610380511515611407576000610200511161140257600080fd5b611634565b610360516003811061141857600080fd5b600060c052602060c02001546103a052610140511561158b57610360516003811061144257600080fd5b600160c052602060c02001543b61145857600080fd5b6000600060646323b872dd6103c052336103e052306104005261038051610420526103dc6000610360516003811061148f57600080fd5b600160c052602060c02001545af16114a657600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa6114cd57600080fd5b601f3d116114da57600080fd5b600050610460516103c0526020610460602463a0712d686103e05261038051610400526103fc60006103a0515af161151157600080fd5b601f3d1161151e57600080fd5b600050610460511561152f57600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa61155657600080fd5b601f3d1161156357600080fd5b600050610460516103c0518082101561157b57600080fd5b80820390509050610380526115df565b602061048060646323b872dd6103c052336103e052306104005261038051610420526103dc60006103a0515af16115c157600080fd5b601f3d116115ce57600080fd5b600050610480516115de57600080fd5b5b6103805161030061036051600381106115f757600080fd5b60200201526102a0610360516003811061161057600080fd5b6020020180516103805181818301101561162957600080fd5b808201905090508152505b5b81516001018083528114156113cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161018051610380526101a0516103a0526101c0516103c0526102a0516103e0526102c051610400526102e0516104205261016051610440526104405161042051610400516103e0516103c0516103a05161038051600658016109a4565b6104a052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104a0516103605261028051610360511161175257600080fd5b608036610380376000610200511815611aa4576005546003808202821582848304141761177e57600080fd5b80905090509050600880820490509050610400526006546104205260006104405261046060006003818352015b6102a061046051600381106117bf57600080fd5b6020020151610480526103605161022061046051600381106117e057600080fd5b602002015180820282158284830414176117f957600080fd5b8090509050905061028051808061180f57600080fd5b8204905090506104a052610480516104a051111561184c576104a051610480518082101561183c57600080fd5b808203905090506104405261186d565b610480516104a0518082101561186157600080fd5b80820390509050610440525b6104005161044051808202821582848304141761188957600080fd5b809050905090506402540be4008082049050905061038061046051600381106118b157600080fd5b60200201526104805161038061046051600381106118ce57600080fd5b60200201516104205180820282158284830414176118eb57600080fd5b809050905090506402540be400808204905090508082101561190c57600080fd5b80820390509050610460516003811061192457600080fd5b600260c052602060c02001556102a0610460516003811061194457600080fd5b602002018051610380610460516003811061195e57600080fd5b60200201518082101561197057600080fd5b808203905090508152505b81516001018083528114156117ab575b5050610140610480525b610480515160206104805101610480526104806104805110156119b757611995565b610180516104a0526101a0516104c0526101c0516104e0526102a051610500526102c051610520526102e051610540526101605161056052610560516105405161052051610500516104e0516104c0516104a051600658016109a4565b6105c052610460610480525b6104805152602061048051036104805261014061048051101515611a4357611a20565b6105c0516104605261020051610460516102805180821015611a6457600080fd5b808203905090508082028215828483041417611a7f57600080fd5b80905090509050610280518080611a9557600080fd5b8204905090506103e052611ad0565b600260c052602060c0206102a05181556102c05160018201556102e051600282015550610360516103e0525b6064356103e05110151515611b24576308c379a0610400526020610420526014610440527f536c697070616765207363726577656420796f750000000000000000000000006104605261044050606461041cfd5b60206104a060446340c10f196104005233610420526103e0516104405261041c60006101e0515af1611b5557600080fd5b601f3d11611b6257600080fd5b6000506104a05061030051610400526103205161042052610340516104405261038051610460526103a051610480526103c0516104a052610360516104c052610200516103e051818183011015611bb857600080fd5b808201905090506104e052337f423f6495a08fc652425cf4ed0d1f9e37e571d9b9529b1c1c23cce780b2e7df0d610100610400a26103e051600052600062ffffff5560206000f350600062ffffff55005b6000156120ab575b610200526101405261016052610180526101a0526101c0526101e052610160516101405118611c3f57600080fd5b6000610160511215611c5057600080fd5b60036101605112611c6057600080fd5b6000610140511215611c7157600080fd5b60036101405112611c8157600080fd5b6101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516101a051610260526101c051610280526101e0516102a052610220516102c0526102c0516102a051610280516102605160065801610698565b610320526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032051610240526102205160038082028215828483041417611d7d57600080fd5b809050905090506102605261024051610280526060366102a03761030060006003818352015b61014051610300511415611dbe57610180516102c052611df4565b61016051610300511815611dee576101a06103005160038110611de057600080fd5b60200201516102c052611df3565b611e70565b5b6102a080516102c051818183011015611e0c57600080fd5b8082019050905081525061028051610240518082028215828483041417611e3257600080fd5b809050905090506102c05160038082028215828483041417611e5357600080fd5b809050905090508080611e6557600080fd5b820490509050610280525b8151600101808352811415611da3575b505061028051610240518082028215828483041417611e9e57600080fd5b8090509050905060648082028215828483041417611ebb57600080fd5b809050905090506102605160038082028215828483041417611edc57600080fd5b809050905090508080611eee57600080fd5b820490509050610280526102a0516102405160648082028215828483041417611f1657600080fd5b80905090509050610260518080611f2c57600080fd5b820490509050818183011015611f4157600080fd5b80820190509050610300526102405161032052610340600060ff818352015b610320516102e05261032051610320518082028215828483041417611f8457600080fd5b8090509050905061028051818183011015611f9e57600080fd5b808201905090506002610320518082028215828483041417611fbf57600080fd5b8090509050905061030051818183011015611fd957600080fd5b808201905090506102405180821015611ff157600080fd5b80820390509050808061200357600080fd5b820490509050610320526102e051610320511115612058576001610320516102e0518082101561203257600080fd5b80820390509050111515612053576103205160005250506000516102005156505b612091565b60016102e051610320518082101561206f57600080fd5b80820390509050111515612090576103205160005250506000516102005156505b5b5b8151600101808352811415611f60575b505060006000fd005b635e0d443f60005114156123c357600435808060008112156120c957195b607f1c156120d657600080fd5b905050602435808060008112156120e957195b607f1c156120f657600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0600435600381106121da57600080fd5b6020020151604435610140600435600381106121f557600080fd5b6020020151808202821582848304141761220e57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561223457600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610220526101a0602435600381106122ed57600080fd5b6020020151610220518082101561230357600080fd5b8082039050905060018082101561231957600080fd5b80820390509050610240526102405160055461024051808202821582848304141761234357600080fd5b809050905090506402540be400808204905090508082101561236457600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761238857600080fd5b80905090509050610140602435600381106123a257600080fd5b602002015180806123b257600080fd5b82049050905060005260206000f350005b6367df02ca60005114156126c757600435808060008112156123e157195b607f1c156123ee57600080fd5b9050506024358080600081121561240157195b607f1c1561240e57600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0602435600381106124f257600080fd5b60200201516044356402540be400808202821582848304141761251457600080fd5b809050905090506402540be4006005548082101561253157600080fd5b80820390509050808061254357600080fd5b8204905090506101406024356003811061255c57600080fd5b6020020151808202821582848304141761257557600080fd5b80905090509050670de0b6b3a7640000808204905090508082101561259957600080fd5b80820390509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051602435610240526004356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a0526101805261016052610140526103405161022052610220516101a06004356003811061265657600080fd5b60200201518082101561266857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761268c57600080fd5b80905090509050610140600435600381106126a657600080fd5b602002015180806126b657600080fd5b82049050905060005260206000f350005b6307211ef760005114156129dd57600435808060008112156126e557195b607f1c156126f257600080fd5b9050506024358080600081121561270557195b607f1c1561271257600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a06004356003811061281057600080fd5b60200201516044356102006004356003811061282b57600080fd5b6020020151808202821582848304141761284457600080fd5b8090509050905081818301101561285a57600080fd5b80820190509050610260526101a06024356003811061287857600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516004356102a0526024356102c052610260516102e0526101a051610300526101c051610320526101e051610340526103405161032051610300516102e0516102c0516102a05160065801611c11565b6103a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a0518082101561293957600080fd5b8082039050905060018082101561294f57600080fd5b808203905090506102805260055461028051808202821582848304141761297557600080fd5b809050905090506402540be400808204905090506102a052610280516102a051808210156129a257600080fd5b80820390509050610200602435600381106129bc57600080fd5b602002015180806129cc57600080fd5b82049050905060005260206000f350005b630e71d1b96000511415612ccf57600435808060008112156129fb57195b607f1c15612a0857600080fd5b90505060243580806000811215612a1b57195b607f1c15612a2857600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a060243560038110612b2657600080fd5b60200201516044356402540be4008082028215828483041417612b4857600080fd5b809050905090506402540be40060055480821015612b6557600080fd5b808203905090508080612b7757600080fd5b82049050905061020060243560038110612b9057600080fd5b60200201518082028215828483041417612ba957600080fd5b8090509050905080821015612bbd57600080fd5b80820390509050610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610260516102c0526101a0516102e0526101c051610300526101e0516103205261032051610300516102e0516102c0516102a0516102805160065801611c11565b61038052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516101a060043560038110612c8257600080fd5b602002015180821015612c9457600080fd5b8082039050905061020060043560038110612cae57600080fd5b60200201518080612cbe57600080fd5b82049050905060005260206000f350005b6000156131b1575b6101a05261014052610160526101805260125415612cf457600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801610486565b610220526102405261026052610200526101e0526101c0526101a05261018052610160526101405261022080516101c05280602001516101e0528060400151610200525060028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c02001546102605250606036610280376102e060006003818352015b6101c06102e05160038110612db757600080fd5b60200201516102206102e05160038110612dd057600080fd5b60200201518082028215828483041417612de957600080fd5b80905090509050670de0b6b3a7640000808204905090506102806102e05160038110612e1457600080fd5b60200201525b8151600101808352811415612da3575b50506102806101405160038110612e4057600080fd5b6020020151610180516101c06101405160038110612e5d57600080fd5b60200201518082028215828483041417612e7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015612e9c57600080fd5b808201905090506102e0526102806101605160038110612ebb57600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610140516103205261016051610340526102e0516103605261028051610380526102a0516103a0526102c0516103c0526103c0516103a0516103805161036051610340516103205160065801611c11565b61042052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104205180821015612f9e57600080fd5b80820390509050600180821015612fb457600080fd5b8082039050905061030052610300516005548082028215828483041417612fda57600080fd5b809050905090506402540be400808204905090506103205261030051610320518082101561300757600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761302b57600080fd5b809050905090506101c0610160516003811061304657600080fd5b6020020151808061305657600080fd5b8204905090506103005261032051600654808202821582848304141761307b57600080fd5b809050905090506402540be400808204905090506103405261034051670de0b6b3a764000080820282158284830414176130b457600080fd5b809050905090506101c061016051600381106130cf57600080fd5b602002015180806130df57600080fd5b8204905090506103405261022061014051600381106130fd57600080fd5b60200201516101805181818301101561311557600080fd5b80820190509050610140516003811061312d57600080fd5b600260c052602060c0200155610220610160516003811061314d57600080fd5b6020020151610300518082101561316357600080fd5b80820390509050610340518082101561317b57600080fd5b80820390509050610160516003811061319357600080fd5b600260c052602060c0200155610300516000526000516101a0515650005b633df0212460005114156133d95762ffffff54156131ce57600080fd5b600162ffffff55600435808060008112156131e557195b607f1c156131f257600080fd5b9050506024358080600081121561320557195b607f1c1561321257600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801612cd7565b6102005261014052610200516101405260643561014051101515156132a7576308c379a06101605260206101805260176101a0527f546f6f2066657720636f696e7320696e20726573756c740000000000000000006101c0526101a050606461017cfd5b602061022060646323b872dd610160523361018052306101a0526044356101c05261017c6000600435600381106132dd57600080fd5b600060c052602060c02001545af16132f457600080fd5b601f3d1161330157600080fd5b6000506102205161331157600080fd5b6020610200604463a9059cbb610160523361018052610140516101a05261017c60006024356003811061334357600080fd5b600060c052602060c02001545af161335a57600080fd5b601f3d1161336757600080fd5b6000506102005161337757600080fd5b60043561016052604435610180526024356101a052610140516101c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610160a261014051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed660005114156137b25762ffffff54156133f657600080fd5b600162ffffff556004358080600081121561340d57195b607f1c1561341a57600080fd5b9050506024358080600081121561342d57195b607f1c1561343a57600080fd5b9050506004356003811061344d57600080fd5b600160c052602060c02001543b61346357600080fd5b6000600060646323b872dd61014052336101605230610180526044356101a05261015c60006004356003811061349857600080fd5b600160c052602060c02001545af16134af57600080fd5b600435600381106134bf57600080fd5b600060c052602060c020015461014052602061020060246370a0823161018052306101a05261019c610140515afa6134f657600080fd5b601f3d1161350357600080fd5b60005061020051610160526020610200602463a0712d68610180526044356101a05261019c6000610140515af161353957600080fd5b601f3d1161354657600080fd5b600050610200511561355757600080fd5b602061020060246370a0823161018052306101a05261019c610140515afa61357e57600080fd5b601f3d1161358b57600080fd5b6000506102005161016051808210156135a357600080fd5b80820390509050610160526101405161016051610180516004356101a0526024356101c052610160516101e0526101e0516101c0516101a05160065801612cd7565b6102405261018052610160526101405261024051610180526020610220602463db006a756101a052610180516101c0526101bc60006024356003811061362a57600080fd5b600060c052602060c02001545af161364157600080fd5b601f3d1161364e57600080fd5b600050610220511561365f57600080fd5b6024356003811061366f57600080fd5b600160c052602060c02001546101a052602061026060246370a082316101e05230610200526101fc6101a0515afa6136a657600080fd5b601f3d116136b357600080fd5b600050610260516101c0526064356101c05110151515613712576308c379a06101e0526020610200526017610220527f546f6f2066657720636f696e7320696e20726573756c74000000000000000000610240526102205060646101fcfd5b6101a0513b61372057600080fd5b60006000604463a9059cbb6101e05233610200526101c051610220526101fc60006101a0515af161375057600080fd5b6004356101e05260443561020052602435610220526101c05161024052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b60806101e0a26101c051600052600062ffffff5560206000f350600062ffffff55005b63ecb586a560005114156137cb57600061014052613801565b63fce6473660005114156137f95760843560011c156137e957600080fd5b6020608461014037600050613801565b600015613b91575b62ffffff541561381057600080fd5b600162ffffff556101405160065801610427565b6101405260005060085461016052602061020060046318160ddd6101a0526101bc610160515afa61385457600080fd5b601f3d1161386157600080fd5b60005061020051610180526060366101a03761020060006003818352015b610200516003811061389057600080fd5b600260c052602060c0200154610220526102205160043580820282158284830414176138bb57600080fd5b809050905090506101805180806138d157600080fd5b820490509050610240526102205161024051808210156138f057600080fd5b80820390509050610200516003811061390857600080fd5b600260c052602060c0200155610240516101a0610200516003811061392c57600080fd5b6020020152610200516003811061394257600080fd5b600060c052602060c0200154610260526101405115613a48576020610300602463db006a7561028052610240516102a05261029c6000610260515af161398757600080fd5b601f3d1161399457600080fd5b60005061030051156139a557600080fd5b61020051600381106139b657600080fd5b600160c052602060c020015461028052602061032060246370a082316102a052306102c0526102bc610280515afa6139ed57600080fd5b601f3d116139fa57600080fd5b6000506103205161024052610280513b613a1357600080fd5b60006000604463a9059cbb6102a052336102c052610240516102e0526102bc6000610280515af1613a4357600080fd5b613a97565b6020610320604463a9059cbb61028052336102a052610240516102c05261029c6000610260515af1613a7957600080fd5b601f3d11613a8657600080fd5b60005061032051613a9657600080fd5b5b60246102005160038110613aaa57600080fd5b6020020135610240511015613abe57600080fd5b5b815160010180835281141561387f575b505060206102a060446379cc67906102005233610220526004356102405261021c6000610160515af1613b0157600080fd5b601f3d11613b0e57600080fd5b6000506102a0506101a051610200526101c051610220526101e05161024052606036610260376101805160043580821015613b4857600080fd5b808203905090506102c052337fa49d4cf02656aebf8c771f5a8585638a2a15ee6c97cf7205d4208ed7c1df252d60e0610200a2600062ffffff5560606101a0f3600062ffffff55005b639fdaea0c6000511415613baa57600061014052613be0565b635b8369f56000511415613bd85760843560011c15613bc857600080fd5b6020608461014037600050613be0565b600015614630575b62ffffff5415613bef57600080fd5b600162ffffff5560125415613c0357600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c0525060028060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526102205161030052610160516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610240526101e051610260526102005161028052610220516102a052600480356102c05280602001356102e0528060400135610300525060016103205264e8d4a510006103405264e8d4a510006103605261038060006003818352015b6102c06103805160038110613dd257600080fd5b60200201516103a05260006103a0511115613ece576101405115613e98576103a0516103206103805160038110613e0857600080fd5b60200201518082028215828483041417613e2157600080fd5b80905090509050670de0b6b3a76400008082028215828483041417613e4557600080fd5b809050905090506101806103805160038110613e6057600080fd5b60200201518080613e7057600080fd5b8204905090506103a0526103a0516102c06103805160038110613e9257600080fd5b60200201525b6102606103805160038110613eac57600080fd5b6020020180516103a05180821015613ec357600080fd5b808203905090508152505b5b8151600101808352811415613dbe575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161038051610180516103a0526101a0516103c0526101c0516103e052610260516104005261028051610420526102a051610440526101605161046052610460516104405161042051610400516103e0516103c0516103a051600658016109a4565b6104c05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c051610380526060366103a0376005546003808202821582848304141761400257600080fd5b80905090509050600880820490509050610400526006546104205261044060006003818352015b610380516101e0610440516003811061404157600080fd5b6020020151808202821582848304141761405a57600080fd5b8090509050905061024051808061407057600080fd5b82049050905061046052610260610440516003811061408e57600080fd5b60200201516104805260006104a052610480516104605111156140d0576104605161048051808210156140c057600080fd5b808203905090506104a0526140f1565b6104805161046051808210156140e557600080fd5b808203905090506104a0525b610400516104a051808202821582848304141761410d57600080fd5b809050905090506402540be400808204905090506104c052610480516104c05161042051808202821582848304141761414557600080fd5b809050905090506402540be400808204905090508082101561416657600080fd5b80820390509050610440516003811061417e57600080fd5b600260c052602060c0200155610260610440516003811061419e57600080fd5b6020020180516104c051808210156141b557600080fd5b808203905090508152506104c0516103a061044051600381106141d757600080fd5b60200201525b8151600101808352811415614029575b5050610140610460525b61046051516020610460510161046052610460610460511015614219576141f7565b61018051610480526101a0516104a0526101c0516104c052610260516104e05261028051610500526102a0516105205261016051610540526105405161052051610500516104e0516104c0516104a05161048051600658016109a4565b6105a052610440610460525b61046051526020610460510361046052610140610460511015156142a557614282565b6105a0516104405260085461046052602061050060046318160ddd6104a0526104bc610460515afa6142d657600080fd5b601f3d116142e357600080fd5b600050610500516104805261024051610440518082101561430357600080fd5b8082039050905061048051808202821582848304141761432257600080fd5b8090509050905061024051808061433857600080fd5b8204905090506104a05260006104a0511861435257600080fd5b6064356104a051111515156143a6576308c379a06104c05260206104e0526014610500527f536c697070616765207363726577656420796f75000000000000000000000000610520526105005060646104dcfd5b602061056060446379cc67906104c052336104e0526104a051610500526104dc6000610460515af16143d757600080fd5b601f3d116143e457600080fd5b600050610560506104c060006003818352015b6102c06104c0516003811061440b57600080fd5b60200201516104e05260006104e051181561457f576104c0516003811061443157600080fd5b600060c052602060c020015461050052610140511561452f5760206105a0602463db006a75610520526104e0516105405261053c6000610500515af161447657600080fd5b601f3d1161448357600080fd5b6000506105a0511561449457600080fd5b6104c051600381106144a557600080fd5b600160c052602060c020015461052052610520513b6144c357600080fd5b60006000604463a9059cbb6105e052336106005260206105c060246370a0823161054052306105605261055c610520515afa6144fe57600080fd5b601f3d1161450b57600080fd5b6000506105c051610620526105fc6000610520515af161452a57600080fd5b61457e565b60206105c0604463a9059cbb6105205233610540526104e0516105605261053c6000610500515af161456057600080fd5b601f3d1161456d57600080fd5b6000506105c05161457d57600080fd5b5b5b5b81516001018083528114156143f7575b50506102c0516104c0526102e0516104e05261030051610500526103a051610520526103c051610540526103e051610560526103805161058052610480516104a051808210156145df57600080fd5b808203905090506105a052337f173599dbf9c6ca6f7c3b590df07ae98a45d74ff54065505141e7de6c46a624c26101006104c0a26104a051600052600062ffffff5560206000f350600062ffffff55005b6000156149a1575b610200526101405261016052610180526101a0526101c0526101e052600061016051121561466557600080fd5b6003610160511261467557600080fd5b610140516003808202821582848304141761468f57600080fd5b80905090509050610220526101e05161024052606036610260376102c060006003818352015b610160516102c05118156146e5576101806102c051600381106146d757600080fd5b6020020151610280526146ea565b614766565b61026080516102805181818301101561470257600080fd5b80820190509050815250610240516101e051808202821582848304141761472857600080fd5b80905090509050610280516003808202821582848304141761474957600080fd5b80905090509050808061475b57600080fd5b820490509050610240525b81516001018083528114156146b5575b5050610240516101e051808202821582848304141761479457600080fd5b80905090509050606480820282158284830414176147b157600080fd5b8090509050905061022051600380820282158284830414176147d257600080fd5b8090509050905080806147e457600080fd5b82049050905061024052610260516101e0516064808202821582848304141761480c57600080fd5b8090509050905061022051808061482257600080fd5b82049050905081818301101561483757600080fd5b808201905090506102c0526101e0516102e052610300600060ff818352015b6102e0516102a0526102e0516102e051808202821582848304141761487a57600080fd5b809050905090506102405181818301101561489457600080fd5b8082019050905060026102e05180820282158284830414176148b557600080fd5b809050905090506102c0518181830110156148cf57600080fd5b808201905090506101e051808210156148e757600080fd5b8082039050905080806148f957600080fd5b8204905090506102e0526102a0516102e051111561494e5760016102e0516102a0518082101561492857600080fd5b80820390509050111515614949576102e05160005250506000516102005156505b614987565b60016102a0516102e0518082101561496557600080fd5b80820390509050111515614986576102e05160005250506000516102005156505b5b5b8151600101808352811415614856575b505060006000fd005b6000156150fa575b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a051600658016105a4565b61034052610360526103805261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340805161024052806020015161026052806040015161028052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610240516102c052610260516102e0526102805161030052610220516103205261032051610300516102e0516102c05160065801610698565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102a052602061034060046318160ddd6102e0526102fc6008545afa614b8d57600080fd5b601f3d11614b9a57600080fd5b600050610340516102c0526102a051610140516102a0518082028215828483041417614bc557600080fd5b809050905090506102c0518080614bdb57600080fd5b82049050905080821015614bee57600080fd5b808203905090506102e052610140610320525b61032051516020610320510161032052610320610320511015614c2357614c01565b610220516103405261016051610360526102405161038052610260516103a052610280516103c0526102e0516103e0526103e0516103c0516103a05161038051610360516103405160065801614638565b61044052610300610320525b6103205152602061032051036103205261014061032051101515614ca357614c80565b610440516103005261024051610320526102605161034052610280516103605260055460038082028215828483041417614cdc57600080fd5b80905090509050600880820490509050610380526101a06101605160038110614d0457600080fd5b60200201516103a0526103c060006003818352015b60006103e0526102406103c05160038110614d3357600080fd5b602002015161040052610160516103c0511415614da357610400516102e0518082028215828483041417614d6657600080fd5b809050905090506102a0518080614d7c57600080fd5b8204905090506103005180821015614d9357600080fd5b808203905090506103e052614df8565b61040051610400516102e0518082028215828483041417614dc357600080fd5b809050905090506102a0518080614dd957600080fd5b82049050905080821015614dec57600080fd5b808203905090506103e0525b6103206103c05160038110614e0c57600080fd5b602002018051610380516103e0518082028215828483041417614e2e57600080fd5b809050905090506402540be4008082049050905080821015614e4f57600080fd5b808203905090508152505b8151600101808352811415614d19575b50506103206101605160038110614e8057600080fd5b60200201516101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015614eaf57614e8d565b610220516104005261016051610420526103205161044052610340516104605261036051610480526102e0516104a0526104a051610480516104605161044051610420516104005160065801614638565b610500526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515614f2f57614f0c565b6105005180821015614f4057600080fd5b808203905090506103c0526103c051600180821015614f5e57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614f8257600080fd5b809050905090506103a0518080614f9857600080fd5b8204905090506103c0526102406101605160038110614fb657600080fd5b60200201516103005180821015614fcc57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614ff057600080fd5b809050905090506103a051808061500657600080fd5b8204905090506103c0518082101561501d57600080fd5b808203905090506103e05261018051156150ad5760016104005264e8d4a510006104205264e8d4a51000610440526103c0516103a051808202821582848304141761506757600080fd5b80905090509050610400610160516003811061508257600080fd5b6020020151808061509257600080fd5b820490509050670de0b6b3a7640000808204905090506103c0525b6103c051610420526103e051610440526040610400525b6000610400511115156150d6576150f2565b60206104005103610420015160206104005103610400526150c4565b610200515650005b63cc2b27d7600051141561511357600061014052615149565b63c532a77460005114156151415760443560011c1561513157600080fd5b6020604461014037600050615149565b600015615240575b6024358080600081121561515957195b607f1c1561516657600080fd5b9050506101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e05161020051600435610220526024356102405261014051610260526101c051610280526101e0516102a052610200516102c0526102c0516102a05161028051610260516102405161022051600658016149a9565b6103205261034052610200526101e0526101c0526101a0526101805261016052610140526103205160005260206000f350005b631a4d01d260005114156152595760006101405261528f565b63517a55a360005114156152875760643560011c1561527757600080fd5b602060646101403760005061528f565b60001561569f575b62ffffff541561529e57600080fd5b600162ffffff55602435808060008112156152b557195b607f1c156152c257600080fd5b905050601254156152d257600080fd5b61014051610160516101805160065801610486565b6101a0526101c0526101e0526101805261016052610140526101a0805161020052806020015161022052806040015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051600435610260526024356102805260006102a052610200516102c052610220516102e0526102405161030052610300516102e0516102c0516102a0516102805161026051600658016149a9565b61036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516101605280602001516101805250610160516101a052602435600381106153e357600080fd5b600260c052602060c0200180546101605161018051600654808202821582848304141761540f57600080fd5b809050905090506402540be4008082049050905081818301101561543257600080fd5b808201905090508082101561544657600080fd5b80820390509050815550602061026060446379cc67906101c052336101e052600435610200526101dc60006008545af161547f57600080fd5b601f3d1161548c57600080fd5b60005061026050602435600381106154a357600080fd5b600060c052602060c02001546101c05261014051156155a8576020610260602463db006a756101e05261016051610200526101fc60006101c0515af16154e857600080fd5b601f3d116154f557600080fd5b600050610260511561550657600080fd5b6024356003811061551657600080fd5b600160c052602060c02001546101e052602061028060246370a0823161020052306102205261021c6101e0515afa61554d57600080fd5b601f3d1161555a57600080fd5b600050610280516101a0526101e0513b61557357600080fd5b60006000604463a9059cbb6102005233610220526101a0516102405261021c60006101e0515af16155a357600080fd5b6155f7565b6020610280604463a9059cbb6101e05233610200526101a051610220526101fc60006101c0515af16155d957600080fd5b601f3d116155e657600080fd5b600050610280516155f657600080fd5b5b6044356101a0511015151561564b576308c379a06101e0526020610200526018610220527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610240526102205060646101fcfd5b6004356101e0526101605161020052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101e0a261016051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156158435760075433146156bb57600080fd5b600b54620151808181830110156156d157600080fd5b808201905090504210156156e457600080fd5b42620151808181830110156156f857600080fd5b80820190509050602435101561570d57600080fd5b6101405160065801610026565b610160526101405261016051610140526004356064808202821582848304141761574357600080fd5b80905090509050610160526000600435111561576657620f424060043510615769565b60005b61577257600080fd5b610140516101605110156157b5576101405161016051600a808202821582848304141761579e57600080fd5b8090509050905010156157b057600080fd5b6157e6565b61014051600a80820282158284830414176157cf57600080fd5b809050905090506101605111156157e557600080fd5b5b6101405160095561016051600a5542600b55602435600c556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156158c857600754331461585f57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405160095561014051600a5542600b5542600c55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146760005114156159865760075433146158e457600080fd5b600d54156158f157600080fd5b64012a05f200600435111561590557600080fd5b6402540be400602435111561591957600080fd5b426203f48081818301101561592d57600080fd5b808201905090506101405261014051600d55600435600f556024356010556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe976000511415615a1a5760075433146159a257600080fd5b600d544210156159b157600080fd5b6000600d54186159c057600080fd5b6000600d55600f54610140526010546101605261014051600555610160516006556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb6000511415615a3d576007543314615a3657600080fd5b6000600d55005b636b441a406000511415615ad15760043560a01c15615a5b57600080fd5b6007543314615a6957600080fd5b600e5415615a7657600080fd5b426203f480818183011015615a8a57600080fd5b808201905090506101405261014051600e55600435601155600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415615b4a576007543314615aed57600080fd5b600e54421015615afc57600080fd5b6000600e5418615b0b57600080fd5b6000600e556011546101405261014051600755610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415615b6d576007543314615b6657600080fd5b6000600e55005b63e2e7d2646000511415615c095760206101c060246370a0823161014052306101605261015c60043560038110615ba357600080fd5b600060c052602060c02001545afa615bba57600080fd5b601f3d11615bc757600080fd5b6000506101c05160043560038110615bde57600080fd5b600260c052602060c020015480821015615bf757600080fd5b8082039050905060005260206000f350005b6330c540856000511415615d32576007543314615c2557600080fd5b61014060006003818352015b6101405160038110615c4257600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa615c7957600080fd5b601f3d11615c8657600080fd5b600050610220516101405160038110615c9e57600080fd5b600260c052602060c020015480821015615cb757600080fd5b80820390509050610180526000610180511115615d1d576020610240604463a9059cbb6101a052336101c052610180516101e0526101bc6000610160515af1615cff57600080fd5b601f3d11615d0c57600080fd5b60005061024051615d1c57600080fd5b5b5b8151600101808352811415615c31575b5050005b63e36988536000511415615d63576007543314615d4e57600080fd5b4260135411615d5c57600080fd5b6001601255005b633046f9726000511415615d86576007543314615d7f57600080fd5b6000601255005b63c66106576000511415615dbb5760043560038110615da457600080fd5b600060c052602060c020015460005260206000f350005b63b9947eb06000511415615df05760043560038110615dd957600080fd5b600160c052602060c020015460005260206000f350005b634903b0d16000511415615e255760043560038110615e0e57600080fd5b600260c052602060c020015460005260206000f350005b639e266d4f6000511415615e5a5760043560038110615e4357600080fd5b600360c052602060c020015460005260206000f350005b6363543f066000511415615e765760045460005260206000f350005b63ddca3f436000511415615e925760055460005260206000f350005b63fee3f7f96000511415615eae5760065460005260206000f350005b638da5cb5b6000511415615eca5760075460005260206000f350005b6382c630666000511415615ee65760085460005260206000f350005b635409491a6000511415615f025760095460005260206000f350005b63b4b577ad6000511415615f1e57600a5460005260206000f350005b632081066c6000511415615f3a57600b5460005260206000f350005b63140522886000511415615f5657600c5460005260206000f350005b63405e28f86000511415615f7257600d5460005260206000f350005b63e0a0b5866000511415615f8e57600e5460005260206000f350005b6358680d0b6000511415615faa57600f5460005260206000f350005b63e38244626000511415615fc65760105460005260206000f350005b631ec0cdc16000511415615fe25760115460005260206000f350005b5b60006000fd5b61039e6163870361039e60003961039e616387036000f30000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a0000000000000000000000008e595470ed749b85c6f7669de83eae304c2ec68f00000000000000000000000076eb2fe28b36b3ee97f3adae0c69606eedb2a37c00000000000000000000000048759f220ed983db51fa7a8c0d2aab8f3ce4166a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000005282a4ef67d9c33135340fb3289cc1711c13638c000000000000000000000000000000000000000000000000000000000000025800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200
Deployed Bytecode
0x341561000a57600080fd5b600436101561001857615fe3565b600035601c526000156101c1575b61014052600c5461016052600a5461018052610160514210156101ae576009546101a052600b546101c0526101a051610180511115610107576101a051610180516101a0518082101561007857600080fd5b80820390509050426101c0518082101561009157600080fd5b8082039050905080820282158284830414176100ac57600080fd5b80905090509050610160516101c051808210156100c857600080fd5b8082039050905080806100da57600080fd5b8204905090508181830110156100ef57600080fd5b808201905090506000526000516101405156506101a9565b6101a0516101a051610180518082101561012057600080fd5b80820390509050426101c0518082101561013957600080fd5b80820390509050808202821582848304141761015457600080fd5b80905090509050610160516101c0518082101561017057600080fd5b80820390509050808061018257600080fd5b8204905090508082101561019557600080fd5b808203905090506000526000516101405156505b6101bf565b610180516000526000516101405156505b005b63f446c1d060005114156101f45760065801610026565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561021e5760065801610026565b610140526101405160005260206000f350005b60001561041f575b6101405260016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101c0516003811061026157600080fd5b600060c052602060c02001546101e0526020610280600463182df0f56102205261023c6101e0515afa61029357600080fd5b601f3d116102a057600080fd5b60005061028051610200526102008051610200516020610280600463ae9d70b06102205261023c6101e0515afa6102d657600080fd5b601f3d116102e357600080fd5b6000506102805180820282158284830414176102fe57600080fd5b809050905090504360206103006004636c540baf6102a0526102bc6101e0515afa61032857600080fd5b601f3d1161033557600080fd5b600050610300518082101561034957600080fd5b80820390509050808202821582848304141761036457600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561038a57600080fd5b808201905090508152506101606101c051600381106103a857600080fd5b6020020180516102005180820282158284830414176103c657600080fd5b809050905090508152505b8151600101808352811415610250575b505060606101c0525b60006101c0511115156103fc57610418565b60206101c05103610160015160206101c051036101c0526103ea565b6101405156005b60001561047e575b6101405260045442111561047857600360c052602060c02060028060c052602060c02054825560018160c052602060c0200154600183015560028160c052602060c020015460028301555050426004555b61014051565b60001561059c575b610140526101405160065801610427565b6101405260005060016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101606101c051600381106104d857600080fd5b6020020180516020610240600463bd6d894d6101e0526101fc60006101c0516003811061050457600080fd5b600060c052602060c02001545af161051b57600080fd5b601f3d1161052857600080fd5b60005061024051808202821582848304141761054357600080fd5b809050905090508152505b81516001018083528114156104c4575b505060606101c0525b60006101c05111151561057957610595565b60206101c05103610160015160206101c051036101c052610567565b6101405156005b600015610690575b6101a0526101405261016052610180526060366101c03761022060006003818352015b61014061022051600381106105db57600080fd5b602002015161022051600381106105f157600080fd5b600260c052602060c0200154808202821582848304141761061157600080fd5b80905090509050670de0b6b3a7640000808204905090506101c0610220516003811061063c57600080fd5b60200201525b81516001018083528114156105c7575b50506060610220525b60006102205111151561066d57610689565b602061022051036101c00151602061022051036102205261065b565b6101a05156005b60001561099c575b6101c0526101405261016052610180526101a0526040366101e03761024060006003818352015b602061024051026101400151610220526101e08051610220518181830110156106e757600080fd5b808201905090508152505b81516001018083528114156106bf575b50506101e051151561071d5760006000526000516101c05156505b6101e051610220526101a0516003808202821582848304141761073f57600080fd5b8090509050905061024052610260600060ff818352015b61022051610280526102c060006003818352015b60206102c0510261014001516102a0526102805161022051808202821582848304141761079657600080fd5b809050905090506102a051600380820282158284830414176107b757600080fd5b8090509050905080806107c957600080fd5b820490509050610280525b815160010180835281141561076a575b50506102205161020052610240516101e051808202821582848304141761080a57600080fd5b80905090509050606480820490509050610280516003808202821582848304141761083457600080fd5b8090509050905081818301101561084a57600080fd5b8082019050905061022051808202821582848304141761086957600080fd5b809050905090506102405160648082101561088357600080fd5b808203905090506102205180820282158284830414176108a257600080fd5b8090509050905060648082049050905060046102805180820282158284830414176108cc57600080fd5b809050905090508181830110156108e257600080fd5b8082019050905080806108f457600080fd5b820490509050610220526102005161022051111561094957600161022051610200518082101561092357600080fd5b80820390509050111515610944576102205160005250506000516101c05156505b610982565b600161020051610220518082101561096057600080fd5b80820390509050111515610981576102205160005250506000516101c05156505b5b5b8151600101808352811415610756575b505060006000fd005b600015610b07575b610220526101405261016052610180526101a0526101c0526101e05261020052606036610240376102a060006003818352015b6101406102a051600381106109eb57600080fd5b60200201516101a06102a05160038110610a0457600080fd5b60200201518082028215828483041417610a1d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406102a05160038110610a4857600080fd5b60200201525b81516001018083528114156109d7575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c052610280516102e0526102005161030052610300516102e0516102c0516102a05160065801610698565b6103605261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051600052600051610220515650005b63bb7b8b806000511415610dde576101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526102005161026052610260516102405161022051600658016105a4565b6102c0526102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102c0805161032052806020015161034052806040015161036052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605160065801610026565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516103a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a051610320516103c052610340516103e05261036051610400526103a0516104205261042051610400516103e0516103c05160065801610698565b610480526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516101405261014051670de0b6b3a76400008082028215828483041417610d8657600080fd5b8090509050905060206101c060046318160ddd6101605261017c6008545afa610dae57600080fd5b601f3d11610dbb57600080fd5b6000506101c0518080610dcd57600080fd5b82049050905060005260206000f350005b633883e119600051141561117c5760643560011c15610dfc57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405161016051610180516101a05160065801610226565b6101c0526101e052610200526101a0526101805261016052610140526101c080516101605280602001516101805280604001516101a0525060028060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c020015461020052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526101405161030052610300516102e0516102c0516102a051610280516102605161024051600658016109a4565b6103605261022052610200526101e0526101c0526101a052610180526101605261014052610360516102205261024060006003818352015b60046102405160038110610f6557600080fd5b60200201356102605260643515610fb2576101c06102405160038110610f8a57600080fd5b60200201805161026051818183011015610fa357600080fd5b80820190509050815250610fe8565b6101c06102405160038110610fc657600080fd5b6020020180516102605180821015610fdd57600080fd5b808203905090508152505b5b8151600101808352811415610f52575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610140516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102405260206102e060046318160ddd6102805261029c6008545afa6110cd57600080fd5b601f3d116110da57600080fd5b6000506102e05161026052600061028052606435156111185761024051610220518082101561110857600080fd5b8082039050905061028052611139565b61022051610240518082101561112d57600080fd5b80820390509050610280525b6102805161026051808202821582848304141761115557600080fd5b8090509050905061022051808061116b57600080fd5b82049050905060005260206000f350005b634515cef36000511415611195576000610140526111cb565b632b6e993a60005114156111c35760843560011c156111b357600080fd5b60206084610140376000506111cb565b600015611c09575b62ffffff54156111da57600080fd5b600162ffffff55601254156111ee57600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c052506008546101e052602061028060046318160ddd6102205261023c6101e0515afa61129557600080fd5b601f3d116112a257600080fd5b600050610280516102005260028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610180516102a0526101a0516102c0526101c0516102e0526102205161030052610240516103205261026051610340526101605161036052610360516103405161032051610300516102e0516102c0516102a051600658016109a4565b6103c05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c05161028052610220516102a052610240516102c052610260516102e0526060366103003761036060006003818352015b600461036051600381106113df57600080fd5b602002013561038052610380511515611407576000610200511161140257600080fd5b611634565b610360516003811061141857600080fd5b600060c052602060c02001546103a052610140511561158b57610360516003811061144257600080fd5b600160c052602060c02001543b61145857600080fd5b6000600060646323b872dd6103c052336103e052306104005261038051610420526103dc6000610360516003811061148f57600080fd5b600160c052602060c02001545af16114a657600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa6114cd57600080fd5b601f3d116114da57600080fd5b600050610460516103c0526020610460602463a0712d686103e05261038051610400526103fc60006103a0515af161151157600080fd5b601f3d1161151e57600080fd5b600050610460511561152f57600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa61155657600080fd5b601f3d1161156357600080fd5b600050610460516103c0518082101561157b57600080fd5b80820390509050610380526115df565b602061048060646323b872dd6103c052336103e052306104005261038051610420526103dc60006103a0515af16115c157600080fd5b601f3d116115ce57600080fd5b600050610480516115de57600080fd5b5b6103805161030061036051600381106115f757600080fd5b60200201526102a0610360516003811061161057600080fd5b6020020180516103805181818301101561162957600080fd5b808201905090508152505b5b81516001018083528114156113cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161018051610380526101a0516103a0526101c0516103c0526102a0516103e0526102c051610400526102e0516104205261016051610440526104405161042051610400516103e0516103c0516103a05161038051600658016109a4565b6104a052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104a0516103605261028051610360511161175257600080fd5b608036610380376000610200511815611aa4576005546003808202821582848304141761177e57600080fd5b80905090509050600880820490509050610400526006546104205260006104405261046060006003818352015b6102a061046051600381106117bf57600080fd5b6020020151610480526103605161022061046051600381106117e057600080fd5b602002015180820282158284830414176117f957600080fd5b8090509050905061028051808061180f57600080fd5b8204905090506104a052610480516104a051111561184c576104a051610480518082101561183c57600080fd5b808203905090506104405261186d565b610480516104a0518082101561186157600080fd5b80820390509050610440525b6104005161044051808202821582848304141761188957600080fd5b809050905090506402540be4008082049050905061038061046051600381106118b157600080fd5b60200201526104805161038061046051600381106118ce57600080fd5b60200201516104205180820282158284830414176118eb57600080fd5b809050905090506402540be400808204905090508082101561190c57600080fd5b80820390509050610460516003811061192457600080fd5b600260c052602060c02001556102a0610460516003811061194457600080fd5b602002018051610380610460516003811061195e57600080fd5b60200201518082101561197057600080fd5b808203905090508152505b81516001018083528114156117ab575b5050610140610480525b610480515160206104805101610480526104806104805110156119b757611995565b610180516104a0526101a0516104c0526101c0516104e0526102a051610500526102c051610520526102e051610540526101605161056052610560516105405161052051610500516104e0516104c0516104a051600658016109a4565b6105c052610460610480525b6104805152602061048051036104805261014061048051101515611a4357611a20565b6105c0516104605261020051610460516102805180821015611a6457600080fd5b808203905090508082028215828483041417611a7f57600080fd5b80905090509050610280518080611a9557600080fd5b8204905090506103e052611ad0565b600260c052602060c0206102a05181556102c05160018201556102e051600282015550610360516103e0525b6064356103e05110151515611b24576308c379a0610400526020610420526014610440527f536c697070616765207363726577656420796f750000000000000000000000006104605261044050606461041cfd5b60206104a060446340c10f196104005233610420526103e0516104405261041c60006101e0515af1611b5557600080fd5b601f3d11611b6257600080fd5b6000506104a05061030051610400526103205161042052610340516104405261038051610460526103a051610480526103c0516104a052610360516104c052610200516103e051818183011015611bb857600080fd5b808201905090506104e052337f423f6495a08fc652425cf4ed0d1f9e37e571d9b9529b1c1c23cce780b2e7df0d610100610400a26103e051600052600062ffffff5560206000f350600062ffffff55005b6000156120ab575b610200526101405261016052610180526101a0526101c0526101e052610160516101405118611c3f57600080fd5b6000610160511215611c5057600080fd5b60036101605112611c6057600080fd5b6000610140511215611c7157600080fd5b60036101405112611c8157600080fd5b6101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516101a051610260526101c051610280526101e0516102a052610220516102c0526102c0516102a051610280516102605160065801610698565b610320526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032051610240526102205160038082028215828483041417611d7d57600080fd5b809050905090506102605261024051610280526060366102a03761030060006003818352015b61014051610300511415611dbe57610180516102c052611df4565b61016051610300511815611dee576101a06103005160038110611de057600080fd5b60200201516102c052611df3565b611e70565b5b6102a080516102c051818183011015611e0c57600080fd5b8082019050905081525061028051610240518082028215828483041417611e3257600080fd5b809050905090506102c05160038082028215828483041417611e5357600080fd5b809050905090508080611e6557600080fd5b820490509050610280525b8151600101808352811415611da3575b505061028051610240518082028215828483041417611e9e57600080fd5b8090509050905060648082028215828483041417611ebb57600080fd5b809050905090506102605160038082028215828483041417611edc57600080fd5b809050905090508080611eee57600080fd5b820490509050610280526102a0516102405160648082028215828483041417611f1657600080fd5b80905090509050610260518080611f2c57600080fd5b820490509050818183011015611f4157600080fd5b80820190509050610300526102405161032052610340600060ff818352015b610320516102e05261032051610320518082028215828483041417611f8457600080fd5b8090509050905061028051818183011015611f9e57600080fd5b808201905090506002610320518082028215828483041417611fbf57600080fd5b8090509050905061030051818183011015611fd957600080fd5b808201905090506102405180821015611ff157600080fd5b80820390509050808061200357600080fd5b820490509050610320526102e051610320511115612058576001610320516102e0518082101561203257600080fd5b80820390509050111515612053576103205160005250506000516102005156505b612091565b60016102e051610320518082101561206f57600080fd5b80820390509050111515612090576103205160005250506000516102005156505b5b5b8151600101808352811415611f60575b505060006000fd005b635e0d443f60005114156123c357600435808060008112156120c957195b607f1c156120d657600080fd5b905050602435808060008112156120e957195b607f1c156120f657600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0600435600381106121da57600080fd5b6020020151604435610140600435600381106121f557600080fd5b6020020151808202821582848304141761220e57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561223457600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610220526101a0602435600381106122ed57600080fd5b6020020151610220518082101561230357600080fd5b8082039050905060018082101561231957600080fd5b80820390509050610240526102405160055461024051808202821582848304141761234357600080fd5b809050905090506402540be400808204905090508082101561236457600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761238857600080fd5b80905090509050610140602435600381106123a257600080fd5b602002015180806123b257600080fd5b82049050905060005260206000f350005b6367df02ca60005114156126c757600435808060008112156123e157195b607f1c156123ee57600080fd5b9050506024358080600081121561240157195b607f1c1561240e57600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0602435600381106124f257600080fd5b60200201516044356402540be400808202821582848304141761251457600080fd5b809050905090506402540be4006005548082101561253157600080fd5b80820390509050808061254357600080fd5b8204905090506101406024356003811061255c57600080fd5b6020020151808202821582848304141761257557600080fd5b80905090509050670de0b6b3a7640000808204905090508082101561259957600080fd5b80820390509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051602435610240526004356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a0526101805261016052610140526103405161022052610220516101a06004356003811061265657600080fd5b60200201518082101561266857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761268c57600080fd5b80905090509050610140600435600381106126a657600080fd5b602002015180806126b657600080fd5b82049050905060005260206000f350005b6307211ef760005114156129dd57600435808060008112156126e557195b607f1c156126f257600080fd5b9050506024358080600081121561270557195b607f1c1561271257600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a06004356003811061281057600080fd5b60200201516044356102006004356003811061282b57600080fd5b6020020151808202821582848304141761284457600080fd5b8090509050905081818301101561285a57600080fd5b80820190509050610260526101a06024356003811061287857600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516004356102a0526024356102c052610260516102e0526101a051610300526101c051610320526101e051610340526103405161032051610300516102e0516102c0516102a05160065801611c11565b6103a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a0518082101561293957600080fd5b8082039050905060018082101561294f57600080fd5b808203905090506102805260055461028051808202821582848304141761297557600080fd5b809050905090506402540be400808204905090506102a052610280516102a051808210156129a257600080fd5b80820390509050610200602435600381106129bc57600080fd5b602002015180806129cc57600080fd5b82049050905060005260206000f350005b630e71d1b96000511415612ccf57600435808060008112156129fb57195b607f1c15612a0857600080fd5b90505060243580806000811215612a1b57195b607f1c15612a2857600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a060243560038110612b2657600080fd5b60200201516044356402540be4008082028215828483041417612b4857600080fd5b809050905090506402540be40060055480821015612b6557600080fd5b808203905090508080612b7757600080fd5b82049050905061020060243560038110612b9057600080fd5b60200201518082028215828483041417612ba957600080fd5b8090509050905080821015612bbd57600080fd5b80820390509050610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610260516102c0526101a0516102e0526101c051610300526101e0516103205261032051610300516102e0516102c0516102a0516102805160065801611c11565b61038052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516101a060043560038110612c8257600080fd5b602002015180821015612c9457600080fd5b8082039050905061020060043560038110612cae57600080fd5b60200201518080612cbe57600080fd5b82049050905060005260206000f350005b6000156131b1575b6101a05261014052610160526101805260125415612cf457600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801610486565b610220526102405261026052610200526101e0526101c0526101a05261018052610160526101405261022080516101c05280602001516101e0528060400151610200525060028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c02001546102605250606036610280376102e060006003818352015b6101c06102e05160038110612db757600080fd5b60200201516102206102e05160038110612dd057600080fd5b60200201518082028215828483041417612de957600080fd5b80905090509050670de0b6b3a7640000808204905090506102806102e05160038110612e1457600080fd5b60200201525b8151600101808352811415612da3575b50506102806101405160038110612e4057600080fd5b6020020151610180516101c06101405160038110612e5d57600080fd5b60200201518082028215828483041417612e7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015612e9c57600080fd5b808201905090506102e0526102806101605160038110612ebb57600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610140516103205261016051610340526102e0516103605261028051610380526102a0516103a0526102c0516103c0526103c0516103a0516103805161036051610340516103205160065801611c11565b61042052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104205180821015612f9e57600080fd5b80820390509050600180821015612fb457600080fd5b8082039050905061030052610300516005548082028215828483041417612fda57600080fd5b809050905090506402540be400808204905090506103205261030051610320518082101561300757600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761302b57600080fd5b809050905090506101c0610160516003811061304657600080fd5b6020020151808061305657600080fd5b8204905090506103005261032051600654808202821582848304141761307b57600080fd5b809050905090506402540be400808204905090506103405261034051670de0b6b3a764000080820282158284830414176130b457600080fd5b809050905090506101c061016051600381106130cf57600080fd5b602002015180806130df57600080fd5b8204905090506103405261022061014051600381106130fd57600080fd5b60200201516101805181818301101561311557600080fd5b80820190509050610140516003811061312d57600080fd5b600260c052602060c0200155610220610160516003811061314d57600080fd5b6020020151610300518082101561316357600080fd5b80820390509050610340518082101561317b57600080fd5b80820390509050610160516003811061319357600080fd5b600260c052602060c0200155610300516000526000516101a0515650005b633df0212460005114156133d95762ffffff54156131ce57600080fd5b600162ffffff55600435808060008112156131e557195b607f1c156131f257600080fd5b9050506024358080600081121561320557195b607f1c1561321257600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801612cd7565b6102005261014052610200516101405260643561014051101515156132a7576308c379a06101605260206101805260176101a0527f546f6f2066657720636f696e7320696e20726573756c740000000000000000006101c0526101a050606461017cfd5b602061022060646323b872dd610160523361018052306101a0526044356101c05261017c6000600435600381106132dd57600080fd5b600060c052602060c02001545af16132f457600080fd5b601f3d1161330157600080fd5b6000506102205161331157600080fd5b6020610200604463a9059cbb610160523361018052610140516101a05261017c60006024356003811061334357600080fd5b600060c052602060c02001545af161335a57600080fd5b601f3d1161336757600080fd5b6000506102005161337757600080fd5b60043561016052604435610180526024356101a052610140516101c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610160a261014051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed660005114156137b25762ffffff54156133f657600080fd5b600162ffffff556004358080600081121561340d57195b607f1c1561341a57600080fd5b9050506024358080600081121561342d57195b607f1c1561343a57600080fd5b9050506004356003811061344d57600080fd5b600160c052602060c02001543b61346357600080fd5b6000600060646323b872dd61014052336101605230610180526044356101a05261015c60006004356003811061349857600080fd5b600160c052602060c02001545af16134af57600080fd5b600435600381106134bf57600080fd5b600060c052602060c020015461014052602061020060246370a0823161018052306101a05261019c610140515afa6134f657600080fd5b601f3d1161350357600080fd5b60005061020051610160526020610200602463a0712d68610180526044356101a05261019c6000610140515af161353957600080fd5b601f3d1161354657600080fd5b600050610200511561355757600080fd5b602061020060246370a0823161018052306101a05261019c610140515afa61357e57600080fd5b601f3d1161358b57600080fd5b6000506102005161016051808210156135a357600080fd5b80820390509050610160526101405161016051610180516004356101a0526024356101c052610160516101e0526101e0516101c0516101a05160065801612cd7565b6102405261018052610160526101405261024051610180526020610220602463db006a756101a052610180516101c0526101bc60006024356003811061362a57600080fd5b600060c052602060c02001545af161364157600080fd5b601f3d1161364e57600080fd5b600050610220511561365f57600080fd5b6024356003811061366f57600080fd5b600160c052602060c02001546101a052602061026060246370a082316101e05230610200526101fc6101a0515afa6136a657600080fd5b601f3d116136b357600080fd5b600050610260516101c0526064356101c05110151515613712576308c379a06101e0526020610200526017610220527f546f6f2066657720636f696e7320696e20726573756c74000000000000000000610240526102205060646101fcfd5b6101a0513b61372057600080fd5b60006000604463a9059cbb6101e05233610200526101c051610220526101fc60006101a0515af161375057600080fd5b6004356101e05260443561020052602435610220526101c05161024052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b60806101e0a26101c051600052600062ffffff5560206000f350600062ffffff55005b63ecb586a560005114156137cb57600061014052613801565b63fce6473660005114156137f95760843560011c156137e957600080fd5b6020608461014037600050613801565b600015613b91575b62ffffff541561381057600080fd5b600162ffffff556101405160065801610427565b6101405260005060085461016052602061020060046318160ddd6101a0526101bc610160515afa61385457600080fd5b601f3d1161386157600080fd5b60005061020051610180526060366101a03761020060006003818352015b610200516003811061389057600080fd5b600260c052602060c0200154610220526102205160043580820282158284830414176138bb57600080fd5b809050905090506101805180806138d157600080fd5b820490509050610240526102205161024051808210156138f057600080fd5b80820390509050610200516003811061390857600080fd5b600260c052602060c0200155610240516101a0610200516003811061392c57600080fd5b6020020152610200516003811061394257600080fd5b600060c052602060c0200154610260526101405115613a48576020610300602463db006a7561028052610240516102a05261029c6000610260515af161398757600080fd5b601f3d1161399457600080fd5b60005061030051156139a557600080fd5b61020051600381106139b657600080fd5b600160c052602060c020015461028052602061032060246370a082316102a052306102c0526102bc610280515afa6139ed57600080fd5b601f3d116139fa57600080fd5b6000506103205161024052610280513b613a1357600080fd5b60006000604463a9059cbb6102a052336102c052610240516102e0526102bc6000610280515af1613a4357600080fd5b613a97565b6020610320604463a9059cbb61028052336102a052610240516102c05261029c6000610260515af1613a7957600080fd5b601f3d11613a8657600080fd5b60005061032051613a9657600080fd5b5b60246102005160038110613aaa57600080fd5b6020020135610240511015613abe57600080fd5b5b815160010180835281141561387f575b505060206102a060446379cc67906102005233610220526004356102405261021c6000610160515af1613b0157600080fd5b601f3d11613b0e57600080fd5b6000506102a0506101a051610200526101c051610220526101e05161024052606036610260376101805160043580821015613b4857600080fd5b808203905090506102c052337fa49d4cf02656aebf8c771f5a8585638a2a15ee6c97cf7205d4208ed7c1df252d60e0610200a2600062ffffff5560606101a0f3600062ffffff55005b639fdaea0c6000511415613baa57600061014052613be0565b635b8369f56000511415613bd85760843560011c15613bc857600080fd5b6020608461014037600050613be0565b600015614630575b62ffffff5415613bef57600080fd5b600162ffffff5560125415613c0357600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c0525060028060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526102205161030052610160516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610240526101e051610260526102005161028052610220516102a052600480356102c05280602001356102e0528060400135610300525060016103205264e8d4a510006103405264e8d4a510006103605261038060006003818352015b6102c06103805160038110613dd257600080fd5b60200201516103a05260006103a0511115613ece576101405115613e98576103a0516103206103805160038110613e0857600080fd5b60200201518082028215828483041417613e2157600080fd5b80905090509050670de0b6b3a76400008082028215828483041417613e4557600080fd5b809050905090506101806103805160038110613e6057600080fd5b60200201518080613e7057600080fd5b8204905090506103a0526103a0516102c06103805160038110613e9257600080fd5b60200201525b6102606103805160038110613eac57600080fd5b6020020180516103a05180821015613ec357600080fd5b808203905090508152505b5b8151600101808352811415613dbe575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161038051610180516103a0526101a0516103c0526101c0516103e052610260516104005261028051610420526102a051610440526101605161046052610460516104405161042051610400516103e0516103c0516103a051600658016109a4565b6104c05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c051610380526060366103a0376005546003808202821582848304141761400257600080fd5b80905090509050600880820490509050610400526006546104205261044060006003818352015b610380516101e0610440516003811061404157600080fd5b6020020151808202821582848304141761405a57600080fd5b8090509050905061024051808061407057600080fd5b82049050905061046052610260610440516003811061408e57600080fd5b60200201516104805260006104a052610480516104605111156140d0576104605161048051808210156140c057600080fd5b808203905090506104a0526140f1565b6104805161046051808210156140e557600080fd5b808203905090506104a0525b610400516104a051808202821582848304141761410d57600080fd5b809050905090506402540be400808204905090506104c052610480516104c05161042051808202821582848304141761414557600080fd5b809050905090506402540be400808204905090508082101561416657600080fd5b80820390509050610440516003811061417e57600080fd5b600260c052602060c0200155610260610440516003811061419e57600080fd5b6020020180516104c051808210156141b557600080fd5b808203905090508152506104c0516103a061044051600381106141d757600080fd5b60200201525b8151600101808352811415614029575b5050610140610460525b61046051516020610460510161046052610460610460511015614219576141f7565b61018051610480526101a0516104a0526101c0516104c052610260516104e05261028051610500526102a0516105205261016051610540526105405161052051610500516104e0516104c0516104a05161048051600658016109a4565b6105a052610440610460525b61046051526020610460510361046052610140610460511015156142a557614282565b6105a0516104405260085461046052602061050060046318160ddd6104a0526104bc610460515afa6142d657600080fd5b601f3d116142e357600080fd5b600050610500516104805261024051610440518082101561430357600080fd5b8082039050905061048051808202821582848304141761432257600080fd5b8090509050905061024051808061433857600080fd5b8204905090506104a05260006104a0511861435257600080fd5b6064356104a051111515156143a6576308c379a06104c05260206104e0526014610500527f536c697070616765207363726577656420796f75000000000000000000000000610520526105005060646104dcfd5b602061056060446379cc67906104c052336104e0526104a051610500526104dc6000610460515af16143d757600080fd5b601f3d116143e457600080fd5b600050610560506104c060006003818352015b6102c06104c0516003811061440b57600080fd5b60200201516104e05260006104e051181561457f576104c0516003811061443157600080fd5b600060c052602060c020015461050052610140511561452f5760206105a0602463db006a75610520526104e0516105405261053c6000610500515af161447657600080fd5b601f3d1161448357600080fd5b6000506105a0511561449457600080fd5b6104c051600381106144a557600080fd5b600160c052602060c020015461052052610520513b6144c357600080fd5b60006000604463a9059cbb6105e052336106005260206105c060246370a0823161054052306105605261055c610520515afa6144fe57600080fd5b601f3d1161450b57600080fd5b6000506105c051610620526105fc6000610520515af161452a57600080fd5b61457e565b60206105c0604463a9059cbb6105205233610540526104e0516105605261053c6000610500515af161456057600080fd5b601f3d1161456d57600080fd5b6000506105c05161457d57600080fd5b5b5b5b81516001018083528114156143f7575b50506102c0516104c0526102e0516104e05261030051610500526103a051610520526103c051610540526103e051610560526103805161058052610480516104a051808210156145df57600080fd5b808203905090506105a052337f173599dbf9c6ca6f7c3b590df07ae98a45d74ff54065505141e7de6c46a624c26101006104c0a26104a051600052600062ffffff5560206000f350600062ffffff55005b6000156149a1575b610200526101405261016052610180526101a0526101c0526101e052600061016051121561466557600080fd5b6003610160511261467557600080fd5b610140516003808202821582848304141761468f57600080fd5b80905090509050610220526101e05161024052606036610260376102c060006003818352015b610160516102c05118156146e5576101806102c051600381106146d757600080fd5b6020020151610280526146ea565b614766565b61026080516102805181818301101561470257600080fd5b80820190509050815250610240516101e051808202821582848304141761472857600080fd5b80905090509050610280516003808202821582848304141761474957600080fd5b80905090509050808061475b57600080fd5b820490509050610240525b81516001018083528114156146b5575b5050610240516101e051808202821582848304141761479457600080fd5b80905090509050606480820282158284830414176147b157600080fd5b8090509050905061022051600380820282158284830414176147d257600080fd5b8090509050905080806147e457600080fd5b82049050905061024052610260516101e0516064808202821582848304141761480c57600080fd5b8090509050905061022051808061482257600080fd5b82049050905081818301101561483757600080fd5b808201905090506102c0526101e0516102e052610300600060ff818352015b6102e0516102a0526102e0516102e051808202821582848304141761487a57600080fd5b809050905090506102405181818301101561489457600080fd5b8082019050905060026102e05180820282158284830414176148b557600080fd5b809050905090506102c0518181830110156148cf57600080fd5b808201905090506101e051808210156148e757600080fd5b8082039050905080806148f957600080fd5b8204905090506102e0526102a0516102e051111561494e5760016102e0516102a0518082101561492857600080fd5b80820390509050111515614949576102e05160005250506000516102005156505b614987565b60016102a0516102e0518082101561496557600080fd5b80820390509050111515614986576102e05160005250506000516102005156505b5b5b8151600101808352811415614856575b505060006000fd005b6000156150fa575b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a051600658016105a4565b61034052610360526103805261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340805161024052806020015161026052806040015161028052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610240516102c052610260516102e0526102805161030052610220516103205261032051610300516102e0516102c05160065801610698565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102a052602061034060046318160ddd6102e0526102fc6008545afa614b8d57600080fd5b601f3d11614b9a57600080fd5b600050610340516102c0526102a051610140516102a0518082028215828483041417614bc557600080fd5b809050905090506102c0518080614bdb57600080fd5b82049050905080821015614bee57600080fd5b808203905090506102e052610140610320525b61032051516020610320510161032052610320610320511015614c2357614c01565b610220516103405261016051610360526102405161038052610260516103a052610280516103c0526102e0516103e0526103e0516103c0516103a05161038051610360516103405160065801614638565b61044052610300610320525b6103205152602061032051036103205261014061032051101515614ca357614c80565b610440516103005261024051610320526102605161034052610280516103605260055460038082028215828483041417614cdc57600080fd5b80905090509050600880820490509050610380526101a06101605160038110614d0457600080fd5b60200201516103a0526103c060006003818352015b60006103e0526102406103c05160038110614d3357600080fd5b602002015161040052610160516103c0511415614da357610400516102e0518082028215828483041417614d6657600080fd5b809050905090506102a0518080614d7c57600080fd5b8204905090506103005180821015614d9357600080fd5b808203905090506103e052614df8565b61040051610400516102e0518082028215828483041417614dc357600080fd5b809050905090506102a0518080614dd957600080fd5b82049050905080821015614dec57600080fd5b808203905090506103e0525b6103206103c05160038110614e0c57600080fd5b602002018051610380516103e0518082028215828483041417614e2e57600080fd5b809050905090506402540be4008082049050905080821015614e4f57600080fd5b808203905090508152505b8151600101808352811415614d19575b50506103206101605160038110614e8057600080fd5b60200201516101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015614eaf57614e8d565b610220516104005261016051610420526103205161044052610340516104605261036051610480526102e0516104a0526104a051610480516104605161044051610420516104005160065801614638565b610500526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515614f2f57614f0c565b6105005180821015614f4057600080fd5b808203905090506103c0526103c051600180821015614f5e57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614f8257600080fd5b809050905090506103a0518080614f9857600080fd5b8204905090506103c0526102406101605160038110614fb657600080fd5b60200201516103005180821015614fcc57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614ff057600080fd5b809050905090506103a051808061500657600080fd5b8204905090506103c0518082101561501d57600080fd5b808203905090506103e05261018051156150ad5760016104005264e8d4a510006104205264e8d4a51000610440526103c0516103a051808202821582848304141761506757600080fd5b80905090509050610400610160516003811061508257600080fd5b6020020151808061509257600080fd5b820490509050670de0b6b3a7640000808204905090506103c0525b6103c051610420526103e051610440526040610400525b6000610400511115156150d6576150f2565b60206104005103610420015160206104005103610400526150c4565b610200515650005b63cc2b27d7600051141561511357600061014052615149565b63c532a77460005114156151415760443560011c1561513157600080fd5b6020604461014037600050615149565b600015615240575b6024358080600081121561515957195b607f1c1561516657600080fd5b9050506101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e05161020051600435610220526024356102405261014051610260526101c051610280526101e0516102a052610200516102c0526102c0516102a05161028051610260516102405161022051600658016149a9565b6103205261034052610200526101e0526101c0526101a0526101805261016052610140526103205160005260206000f350005b631a4d01d260005114156152595760006101405261528f565b63517a55a360005114156152875760643560011c1561527757600080fd5b602060646101403760005061528f565b60001561569f575b62ffffff541561529e57600080fd5b600162ffffff55602435808060008112156152b557195b607f1c156152c257600080fd5b905050601254156152d257600080fd5b61014051610160516101805160065801610486565b6101a0526101c0526101e0526101805261016052610140526101a0805161020052806020015161022052806040015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051600435610260526024356102805260006102a052610200516102c052610220516102e0526102405161030052610300516102e0516102c0516102a0516102805161026051600658016149a9565b61036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516101605280602001516101805250610160516101a052602435600381106153e357600080fd5b600260c052602060c0200180546101605161018051600654808202821582848304141761540f57600080fd5b809050905090506402540be4008082049050905081818301101561543257600080fd5b808201905090508082101561544657600080fd5b80820390509050815550602061026060446379cc67906101c052336101e052600435610200526101dc60006008545af161547f57600080fd5b601f3d1161548c57600080fd5b60005061026050602435600381106154a357600080fd5b600060c052602060c02001546101c05261014051156155a8576020610260602463db006a756101e05261016051610200526101fc60006101c0515af16154e857600080fd5b601f3d116154f557600080fd5b600050610260511561550657600080fd5b6024356003811061551657600080fd5b600160c052602060c02001546101e052602061028060246370a0823161020052306102205261021c6101e0515afa61554d57600080fd5b601f3d1161555a57600080fd5b600050610280516101a0526101e0513b61557357600080fd5b60006000604463a9059cbb6102005233610220526101a0516102405261021c60006101e0515af16155a357600080fd5b6155f7565b6020610280604463a9059cbb6101e05233610200526101a051610220526101fc60006101c0515af16155d957600080fd5b601f3d116155e657600080fd5b600050610280516155f657600080fd5b5b6044356101a0511015151561564b576308c379a06101e0526020610200526018610220527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610240526102205060646101fcfd5b6004356101e0526101605161020052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101e0a261016051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156158435760075433146156bb57600080fd5b600b54620151808181830110156156d157600080fd5b808201905090504210156156e457600080fd5b42620151808181830110156156f857600080fd5b80820190509050602435101561570d57600080fd5b6101405160065801610026565b610160526101405261016051610140526004356064808202821582848304141761574357600080fd5b80905090509050610160526000600435111561576657620f424060043510615769565b60005b61577257600080fd5b610140516101605110156157b5576101405161016051600a808202821582848304141761579e57600080fd5b8090509050905010156157b057600080fd5b6157e6565b61014051600a80820282158284830414176157cf57600080fd5b809050905090506101605111156157e557600080fd5b5b6101405160095561016051600a5542600b55602435600c556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156158c857600754331461585f57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405160095561014051600a5542600b5542600c55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146760005114156159865760075433146158e457600080fd5b600d54156158f157600080fd5b64012a05f200600435111561590557600080fd5b6402540be400602435111561591957600080fd5b426203f48081818301101561592d57600080fd5b808201905090506101405261014051600d55600435600f556024356010556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe976000511415615a1a5760075433146159a257600080fd5b600d544210156159b157600080fd5b6000600d54186159c057600080fd5b6000600d55600f54610140526010546101605261014051600555610160516006556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb6000511415615a3d576007543314615a3657600080fd5b6000600d55005b636b441a406000511415615ad15760043560a01c15615a5b57600080fd5b6007543314615a6957600080fd5b600e5415615a7657600080fd5b426203f480818183011015615a8a57600080fd5b808201905090506101405261014051600e55600435601155600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415615b4a576007543314615aed57600080fd5b600e54421015615afc57600080fd5b6000600e5418615b0b57600080fd5b6000600e556011546101405261014051600755610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415615b6d576007543314615b6657600080fd5b6000600e55005b63e2e7d2646000511415615c095760206101c060246370a0823161014052306101605261015c60043560038110615ba357600080fd5b600060c052602060c02001545afa615bba57600080fd5b601f3d11615bc757600080fd5b6000506101c05160043560038110615bde57600080fd5b600260c052602060c020015480821015615bf757600080fd5b8082039050905060005260206000f350005b6330c540856000511415615d32576007543314615c2557600080fd5b61014060006003818352015b6101405160038110615c4257600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa615c7957600080fd5b601f3d11615c8657600080fd5b600050610220516101405160038110615c9e57600080fd5b600260c052602060c020015480821015615cb757600080fd5b80820390509050610180526000610180511115615d1d576020610240604463a9059cbb6101a052336101c052610180516101e0526101bc6000610160515af1615cff57600080fd5b601f3d11615d0c57600080fd5b60005061024051615d1c57600080fd5b5b5b8151600101808352811415615c31575b5050005b63e36988536000511415615d63576007543314615d4e57600080fd5b4260135411615d5c57600080fd5b6001601255005b633046f9726000511415615d86576007543314615d7f57600080fd5b6000601255005b63c66106576000511415615dbb5760043560038110615da457600080fd5b600060c052602060c020015460005260206000f350005b63b9947eb06000511415615df05760043560038110615dd957600080fd5b600160c052602060c020015460005260206000f350005b634903b0d16000511415615e255760043560038110615e0e57600080fd5b600260c052602060c020015460005260206000f350005b639e266d4f6000511415615e5a5760043560038110615e4357600080fd5b600360c052602060c020015460005260206000f350005b6363543f066000511415615e765760045460005260206000f350005b63ddca3f436000511415615e925760055460005260206000f350005b63fee3f7f96000511415615eae5760065460005260206000f350005b638da5cb5b6000511415615eca5760075460005260206000f350005b6382c630666000511415615ee65760085460005260206000f350005b635409491a6000511415615f025760095460005260206000f350005b63b4b577ad6000511415615f1e57600a5460005260206000f350005b632081066c6000511415615f3a57600b5460005260206000f350005b63140522886000511415615f5657600c5460005260206000f350005b63405e28f86000511415615f7257600d5460005260206000f350005b63e0a0b5866000511415615f8e57600e5460005260206000f350005b6358680d0b6000511415615faa57600f5460005260206000f350005b63e38244626000511415615fc65760105460005260206000f350005b631ec0cdc16000511415615fe25760115460005260206000f350005b5b60006000fd
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a0000000000000000000000008e595470ed749b85c6f7669de83eae304c2ec68f00000000000000000000000076eb2fe28b36b3ee97f3adae0c69606eedb2a37c00000000000000000000000048759f220ed983db51fa7a8c0d2aab8f3ce4166a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000005282a4ef67d9c33135340fb3289cc1711c13638c000000000000000000000000000000000000000000000000000000000000025800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200
-----Decoded View---------------
Arg [0] : _owner (address): 0x7EeAC6CDdbd1D0B8aF061742D41877D7F707289a
Arg [1] : _coins (address[3]): 0x8e595470Ed749b85C6F7669de83EAe304C2ec68F,0x76Eb2FE28b36B3ee97F3Adae0C69606eeDB2A37c,0x48759F220ED983dB51fA7A8C0D2AAb8f3ce4166a
Arg [2] : _underlying_coins (address[3]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [3] : _pool_token (address): 0x5282a4eF67D9C33135340fB3289cc1711c13638C
Arg [4] : _A (uint256): 600
Arg [5] : _fee (uint256): 4000000
Arg [6] : _admin_fee (uint256): 5000000000
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a
Arg [1] : 0000000000000000000000008e595470ed749b85c6f7669de83eae304c2ec68f
Arg [2] : 00000000000000000000000076eb2fe28b36b3ee97f3adae0c69606eedb2a37c
Arg [3] : 00000000000000000000000048759f220ed983db51fa7a8c0d2aab8f3ce4166a
Arg [4] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000005282a4ef67d9c33135340fb3289cc1711c13638c
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [9] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [10] : 000000000000000000000000000000000000000000000000000000012a05f200
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.516385 | 0.0001 | $0.000052 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.