Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Vyper_contract
- Optimization enabled
- false
- Compiler version
- v0.3.1
- Verified at
- 2023-07-14T13:27:10.521882Z
Contract source code
# @version 0.3.1 # (c) Curve.Fi, 2023 # Math for crypto pools with 2 coins # # Unless otherwise agreed on, only contracts owned by Curve DAO or # Swiss Stake GmbH are allowed to call this contract. interface Curve: def fee_gamma() -> uint256: view def out_fee() -> uint256: view def mid_fee() -> uint256: view N_COINS: constant(int128) = 2 A_MULTIPLIER: constant(uint256) = 10000 MIN_GAMMA: constant(uint256) = 10**10 MAX_GAMMA: constant(uint256) = 2 * 10**16 MIN_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER / 10 MAX_A: constant(uint256) = N_COINS**N_COINS * A_MULTIPLIER * 100000 @internal @pure def geometric_mean(unsorted_x: uint256[N_COINS], sort: bool) -> uint256: """ (x[0] * x[1] * ...) ** (1/N) """ x: uint256[N_COINS] = unsorted_x if sort and x[0] < x[1]: x = [unsorted_x[1], unsorted_x[0]] D: uint256 = x[0] diff: uint256 = 0 for i in range(255): D_prev: uint256 = D # tmp: uint256 = 10**18 # for _x in x: # tmp = tmp * _x / D # D = D * ((N_COINS - 1) * 10**18 + tmp) / (N_COINS * 10**18) # line below makes it for 2 coins D = (D + x[0] * x[1] / D) / N_COINS if D > D_prev: diff = D - D_prev else: diff = D_prev - D if diff <= 1 or diff * 10**18 < D: return D raise "Did not converge" @external @view def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256: """ Finding the invariant using Newton method. ANN is higher by the factor A_MULTIPLIER ANN is already A * N**N Currently uses 60k gas """ # Safety checks assert ANN > MIN_A - 1 and ANN < MAX_A + 1 # dev: unsafe values A assert gamma > MIN_GAMMA - 1 and gamma < MAX_GAMMA + 1 # dev: unsafe values gamma # Initial value of invariant D is that for constant-product invariant x: uint256[N_COINS] = x_unsorted if x[0] < x[1]: x = [x_unsorted[1], x_unsorted[0]] assert x[0] > 10**9 - 1 and x[0] < 10**15 * 10**18 + 1 # dev: unsafe values x[0] assert x[1] * 10**18 / x[0] > 10**14-1 # dev: unsafe values x[i] (input) D: uint256 = N_COINS * self.geometric_mean(x, False) S: uint256 = x[0] + x[1] for i in range(255): D_prev: uint256 = D # K0: uint256 = 10**18 # for _x in x: # K0 = K0 * _x * N_COINS / D # collapsed for 2 coins K0: uint256 = (10**18 * N_COINS**2) * x[0] / D * x[1] / D _g1k0: uint256 = gamma + 10**18 if _g1k0 > K0: _g1k0 = _g1k0 - K0 + 1 else: _g1k0 = K0 - _g1k0 + 1 # D / (A * N**N) * _g1k0**2 / gamma**2 mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN # 2*N*K0 / _g1k0 mul2: uint256 = (2 * 10**18) * N_COINS * K0 / _g1k0 neg_fprime: uint256 = (S + S * mul2 / 10**18) + mul1 * N_COINS / K0 - mul2 * D / 10**18 # D -= f / fprime D_plus: uint256 = D * (neg_fprime + S) / neg_fprime D_minus: uint256 = D*D / neg_fprime if 10**18 > K0: D_minus += D * (mul1 / neg_fprime) / 10**18 * (10**18 - K0) / K0 else: D_minus -= D * (mul1 / neg_fprime) / 10**18 * (K0 - 10**18) / K0 if D_plus > D_minus: D = D_plus - D_minus else: D = (D_minus - D_plus) / 2 diff: uint256 = 0 if D > D_prev: diff = D - D_prev else: diff = D_prev - D if diff * 10**14 < max(10**16, D): # Could reduce precision for gas efficiency here # Test that we are safe with the next newton_y for _x in x: frac: uint256 = _x * 10**18 / D assert (frac > 10**16 - 1) and (frac < 10**20 + 1) # dev: unsafe values x[i] return D raise "Did not converge" @external @view def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256: """ Calculating x[i] given other balances x[0..N_COINS-1] and invariant D ANN = A * N**N """ # Safety checks assert ANN > MIN_A - 1 and ANN < MAX_A + 1 # dev: unsafe values A assert gamma > MIN_GAMMA - 1 and gamma < MAX_GAMMA + 1 # dev: unsafe values gamma assert D > 10**17 - 1 and D < 10**15 * 10**18 + 1 # dev: unsafe values D x_j: uint256 = x[1 - i] y: uint256 = D**2 / (x_j * N_COINS**2) K0_i: uint256 = (10**18 * N_COINS) * x_j / D # S_i = x_j # frac = x_j * 1e18 / D => frac = K0_i / N_COINS assert (K0_i > 10**16*N_COINS - 1) and (K0_i < 10**20*N_COINS + 1) # dev: unsafe values x[i] # x_sorted: uint256[N_COINS] = x # x_sorted[i] = 0 # x_sorted = self.sort(x_sorted) # From high to low # x[not i] instead of x_sorted since x_soted has only 1 element convergence_limit: uint256 = max(max(x_j / 10**14, D / 10**14), 100) for j in range(255): y_prev: uint256 = y K0: uint256 = K0_i * y * N_COINS / D S: uint256 = x_j + y _g1k0: uint256 = gamma + 10**18 if _g1k0 > K0: _g1k0 = _g1k0 - K0 + 1 else: _g1k0 = K0 - _g1k0 + 1 # D / (A * N**N) * _g1k0**2 / gamma**2 mul1: uint256 = 10**18 * D / gamma * _g1k0 / gamma * _g1k0 * A_MULTIPLIER / ANN # 2*K0 / _g1k0 mul2: uint256 = 10**18 + (2 * 10**18) * K0 / _g1k0 yfprime: uint256 = 10**18 * y + S * mul2 + mul1 _dyfprime: uint256 = D * mul2 if yfprime < _dyfprime: y = y_prev / 2 continue else: yfprime -= _dyfprime fprime: uint256 = yfprime / y # y -= f / f_prime; y = (y * fprime - f) / fprime # y = (yfprime + 10**18 * D - 10**18 * S) // fprime + mul1 // fprime * (10**18 - K0) // K0 y_minus: uint256 = mul1 / fprime y_plus: uint256 = (yfprime + 10**18 * D) / fprime + y_minus * 10**18 / K0 y_minus += 10**18 * S / fprime if y_plus < y_minus: y = y_prev / 2 else: y = y_plus - y_minus diff: uint256 = 0 if y > y_prev: diff = y - y_prev else: diff = y_prev - y if diff < max(convergence_limit, y / 10**14): frac: uint256 = y * 10**18 / D assert (frac > 10**16 - 1) and (frac < 10**20 + 1) # dev: unsafe value for y return y raise "Did not converge" @external @view def fee_calc(pool: address, xp: uint256[N_COINS]) -> uint256: """ f = fee_gamma / (fee_gamma + (1 - K)) where K = prod(x) / (sum(x) / N)**N (all normalized to 1e18) """ fee_gamma: uint256 = Curve(pool).fee_gamma() f: uint256 = xp[0] + xp[1] # sum f = fee_gamma * 10**18 / ( fee_gamma + 10**18 - (10**18 * N_COINS**N_COINS) * xp[0] / f * xp[1] / f ) return (Curve(pool).mid_fee() * f + Curve(pool).out_fee() * (10**18 - f)) / 10**18
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"newton_D","inputs":[{"type":"uint256","name":"ANN"},{"type":"uint256","name":"gamma"},{"type":"uint256[2]","name":"x_unsorted"}],"gas":2021722},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"newton_y","inputs":[{"type":"uint256","name":"ANN"},{"type":"uint256","name":"gamma"},{"type":"uint256[2]","name":"x"},{"type":"uint256","name":"D"},{"type":"uint256","name":"i"}],"gas":1538483},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":""}],"name":"fee_calc","inputs":[{"type":"address","name":"pool"},{"type":"uint256[2]","name":"xp"}],"gas":9449}]
Contract Creation Code
0x61129956600436101561000d576110bf565b60046000601c37600051346112905763b0872d5d81186107b157610f9f60043511610039576000610043565b63ee6b2801600435105b15611290576402540be3ff6024351161005d57600061006a565b66470de4df820001602435105b156112905760443561020052606435610220526102205161020051101561009a5760643561020052604435610220525b633b9ac9ff61020051116100af5760006100c4565b6d314dc6448d9338c15b0a0000000161020051105b1561129057655af3107a3fff61022051670de0b6b3a76400008082028215828483041417156112905790509050610200518080156112905782049050905011156112905760026102005160e052610220516101005260006101205261012a6102606110c5565b6102605180820282158284830414171561129057905090506102405261020051610220518181830110611290578082019050905061026052610280600060ff818352015b610240516102a052673782dace9d900000610200518082028215828483041417156112905790509050610240518080156112905782049050905061022051808202821582848304141715611290579050905061024051808015611290578204905090506102c052602435670de0b6b3a7640000818183011061129057808201905090506102e0526102c0516102e05111610233576102c0516102e05180821061129057808203905090506001818183011061129057808201905090506102e052610260565b6102e0516102c05180821061129057808203905090506001818183011061129057808201905090506102e0525b670de0b6b3a7640000610240518082028215828483041417156112905790509050602435808015611290578204905090506102e0518082028215828483041417156112905790509050602435808015611290578204905090506102e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061030052673782dace9d9000006102c05180820282158284830414171561129057905090506102e05180801561129057820490509050610320526102605161026051610320518082028215828483041417156112905790509050670de0b6b3a7640000808204905090508181830110611290578082019050905061030051600280820282158284830414171561129057905090506102c051808015611290578204905090508181830110611290578082019050905061032051610240518082028215828483041417156112905790509050670de0b6b3a764000080820490509050808210611290578082039050905061034052610240516103405161026051818183011061129057808201905090508082028215828483041417156112905790509050610340518080156112905782049050905061036052610240516102405180820282158284830414171561129057905090506103405180801561129057820490509050610380526102c051670de0b6b3a76400001161050b576103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a7640000808204905090506102c051670de0b6b3a7640000808210611290578082039050905080820282158284830414171561129057905090506102c0518080156112905782049050905080821061129057808203905090508152506105a1565b6103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a764000080820490509050670de0b6b3a76400006102c051808210611290578082039050905080820282158284830414171561129057905090506102c05180801561129057820490509050818183011061129057808201905090508152505b6103805161036051116105d65761038051610360518082106112905780820390509050600280820490509050610240526105f1565b61036051610380518082106112905780820390509050610240525b60006103a0526102a0516102405111610623576102a0516102405180821061129057808203905090506103a05261063e565b610240516102a05180821061129057808203905090506103a0525b662386f26fc10000610240518082106106575781610659565b805b905090506103a051655af3107a400080820282158284830414171561129057905090501015610727576103e060006002818352015b60206103e0510261020001516103c0526103c051670de0b6b3a76400008082028215828483041417156112905790509050610240518080156112905782049050905061040052662386f26fc0ffff61040051116106ec5760006106fc565b68056bc75e2d6310000161040051105b1561129057815160010180835281141561068e575050505050610240516103c05260206103c06107af565b815160010180835281141561016e5750506010610280527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102a0526102805061028051806102a001818260206001820306601f82010390500336823750506308c379a0610240526020610260526102805160206001820306601f820103905060440161025cfd5bf35b6329fcfcf28118610ec257610f9f600435116107ce5760006107d8565b63ee6b2801600435105b15611290576402540be3ff602435116107f25760006107ff565b66470de4df820001602435105b156112905767016345785d89ffff6084351161081c576000610830565b6d314dc6448d9338c15b0a00000001608435105b15611290576020600160a4358082106112905780820390509050026044013560e05270010000000000000000000000000000000060843510156112905760026084350a60e051600480820282158284830414171561129057905090508080156112905782049050905061010052671bc16d674ec8000060e0518082028215828483041417156112905790509050608435808015611290578204905090506101205266470de4df81ffff61012051116108e95760006108f9565b680ad78ebc5ac620000161012051105b156112905760e051655af3107a400080820490509050608435655af3107a40008082049050905080821061092d578161092f565b805b9050905060648082106109425781610944565b805b9050905061014052610160600060ff818352015b61010051610180526101205161010051808202821582848304141715611290579050905060028082028215828483041417156112905790509050608435808015611290578204905090506101a05260e05161010051818183011061129057808201905090506101c052602435670de0b6b3a7640000818183011061129057808201905090506101e0526101a0516101e05111610a1f576101a0516101e05180821061129057808203905090506001818183011061129057808201905090506101e052610a4c565b6101e0516101a05180821061129057808203905090506001818183011061129057808201905090506101e0525b670de0b6b3a76400006084358082028215828483041417156112905790509050602435808015611290578204905090506101e0518082028215828483041417156112905790509050602435808015611290578204905090506101e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061020052670de0b6b3a7640000671bc16d674ec800006101a05180820282158284830414171561129057905090506101e051808015611290578204905090508181830110611290578082019050905061022052670de0b6b3a76400006101005180820282158284830414171561129057905090506101c0516102205180820282158284830414171561129057905090508181830110611290578082019050905061020051818183011061129057808201905090506102405260843561022051808202821582848304141715611290579050905061026052610260516102405110610be6576102408051610260518082106112905780820390509050815250610bfc565b6101805160028082049050905061010052610e38565b610240516101005180801561129057820490509050610280526102005161028051808015611290578204905090506102a05261024051670de0b6b3a764000060843580820282158284830414171561129057905090508181830110611290578082019050905061028051808015611290578204905090506102a051670de0b6b3a764000080820282158284830414171561129057905090506101a05180801561129057820490509050818183011061129057808201905090506102c0526102a08051670de0b6b3a76400006101c05180820282158284830414171561129057905090506102805180801561129057820490509050818183011061129057808201905090508152506102a0516102c05110610d2f576102c0516102a051808210611290578082039050905061010052610d41565b61018051600280820490509050610100525b60006102e052610180516101005111610d7357610180516101005180821061129057808203905090506102e052610d8e565b610100516101805180821061129057808203905090506102e0525b6101405161010051655af3107a400080820490509050808210610db15781610db3565b805b905090506102e0511015610e385761010051670de0b6b3a764000080820282158284830414171561129057905090506084358080156112905782049050905061030052662386f26fc0ffff6103005111610e0e576000610e1e565b68056bc75e2d6310000161030051105b156112905750505061010051610320526020610320610ec0565b81516001018083528114156109585750506010610160527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101805261016050610160518061018001818260206001820306601f82010390500336823750506308c379a0610120526020610140526101605160206001820306601f820103905060440161013cfd5bf35b63e83502fa81186110bd576004358060a01c6112905760e0526372d4f0e2610120526020610120600461013c60e0515afa610f02573d600060003e3d6000fd5b601f3d1115611290576101205161010052602435604435818183011061129057808201905090506101205261010051670de0b6b3a7640000808202821582848304141715611290579050905061010051670de0b6b3a764000081818301106112905780820190509050673782dace9d9000006024358082028215828483041417156112905790509050610120518080156112905782049050905060443580820282158284830414171561129057905090506101205180801561129057820490509050808210611290578082039050905080801561129057820490509050610120526392526c0c610140526020610140600461015c60e0515afa61100a573d600060003e3d6000fd5b601f3d1115611290576101405161012051808202821582848304141715611290579050905063ee8de675610180526020610180600461019c60e0515afa611056573d600060003e3d6000fd5b601f3d11156112905761018051670de0b6b3a7640000610120518082106112905780820390509050808202821582848304141715611290579050905081818301106112905780820190509050670de0b6b3a7640000808204905090506101c05260206101c0f35b505b60006000fd5b60e051610140526101005161016052610120516110e35760006110ed565b6101605161014051105b1561110257610100516101405260e051610160525b610140516101805260006101a0526101c0600060ff818352015b610180516101e0526101805161014051610160518082028215828483041417156112905790509050610180518080156112905782049050905081818301106112905780820190509050600280820490509050610180526101e051610180511161119e576101e0516101805180821061129057808203905090506101a0526111b9565b610180516101e05180821061129057808203905090506101a0525b60016101a05111156111f057610180516101a051670de0b6b3a76400008082028215828483041417156112905790509050106111f3565b60015b156112065750506101805181525061128e565b815160010180835281141561111c57505060106101c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101e0526101c0506101c051806101e001818260206001820306601f82010390500336823750506308c379a06101805260206101a0526101c05160206001820306601f820103905060440161019cfd5b565b600080fd5b61000461129903610004600039610004611299036000f3
Deployed ByteCode
0x600436101561000d576110bf565b60046000601c37600051346112905763b0872d5d81186107b157610f9f60043511610039576000610043565b63ee6b2801600435105b15611290576402540be3ff6024351161005d57600061006a565b66470de4df820001602435105b156112905760443561020052606435610220526102205161020051101561009a5760643561020052604435610220525b633b9ac9ff61020051116100af5760006100c4565b6d314dc6448d9338c15b0a0000000161020051105b1561129057655af3107a3fff61022051670de0b6b3a76400008082028215828483041417156112905790509050610200518080156112905782049050905011156112905760026102005160e052610220516101005260006101205261012a6102606110c5565b6102605180820282158284830414171561129057905090506102405261020051610220518181830110611290578082019050905061026052610280600060ff818352015b610240516102a052673782dace9d900000610200518082028215828483041417156112905790509050610240518080156112905782049050905061022051808202821582848304141715611290579050905061024051808015611290578204905090506102c052602435670de0b6b3a7640000818183011061129057808201905090506102e0526102c0516102e05111610233576102c0516102e05180821061129057808203905090506001818183011061129057808201905090506102e052610260565b6102e0516102c05180821061129057808203905090506001818183011061129057808201905090506102e0525b670de0b6b3a7640000610240518082028215828483041417156112905790509050602435808015611290578204905090506102e0518082028215828483041417156112905790509050602435808015611290578204905090506102e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061030052673782dace9d9000006102c05180820282158284830414171561129057905090506102e05180801561129057820490509050610320526102605161026051610320518082028215828483041417156112905790509050670de0b6b3a7640000808204905090508181830110611290578082019050905061030051600280820282158284830414171561129057905090506102c051808015611290578204905090508181830110611290578082019050905061032051610240518082028215828483041417156112905790509050670de0b6b3a764000080820490509050808210611290578082039050905061034052610240516103405161026051818183011061129057808201905090508082028215828483041417156112905790509050610340518080156112905782049050905061036052610240516102405180820282158284830414171561129057905090506103405180801561129057820490509050610380526102c051670de0b6b3a76400001161050b576103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a7640000808204905090506102c051670de0b6b3a7640000808210611290578082039050905080820282158284830414171561129057905090506102c0518080156112905782049050905080821061129057808203905090508152506105a1565b6103808051610240516103005161034051808015611290578204905090508082028215828483041417156112905790509050670de0b6b3a764000080820490509050670de0b6b3a76400006102c051808210611290578082039050905080820282158284830414171561129057905090506102c05180801561129057820490509050818183011061129057808201905090508152505b6103805161036051116105d65761038051610360518082106112905780820390509050600280820490509050610240526105f1565b61036051610380518082106112905780820390509050610240525b60006103a0526102a0516102405111610623576102a0516102405180821061129057808203905090506103a05261063e565b610240516102a05180821061129057808203905090506103a0525b662386f26fc10000610240518082106106575781610659565b805b905090506103a051655af3107a400080820282158284830414171561129057905090501015610727576103e060006002818352015b60206103e0510261020001516103c0526103c051670de0b6b3a76400008082028215828483041417156112905790509050610240518080156112905782049050905061040052662386f26fc0ffff61040051116106ec5760006106fc565b68056bc75e2d6310000161040051105b1561129057815160010180835281141561068e575050505050610240516103c05260206103c06107af565b815160010180835281141561016e5750506010610280527f446964206e6f7420636f6e7665726765000000000000000000000000000000006102a0526102805061028051806102a001818260206001820306601f82010390500336823750506308c379a0610240526020610260526102805160206001820306601f820103905060440161025cfd5bf35b6329fcfcf28118610ec257610f9f600435116107ce5760006107d8565b63ee6b2801600435105b15611290576402540be3ff602435116107f25760006107ff565b66470de4df820001602435105b156112905767016345785d89ffff6084351161081c576000610830565b6d314dc6448d9338c15b0a00000001608435105b15611290576020600160a4358082106112905780820390509050026044013560e05270010000000000000000000000000000000060843510156112905760026084350a60e051600480820282158284830414171561129057905090508080156112905782049050905061010052671bc16d674ec8000060e0518082028215828483041417156112905790509050608435808015611290578204905090506101205266470de4df81ffff61012051116108e95760006108f9565b680ad78ebc5ac620000161012051105b156112905760e051655af3107a400080820490509050608435655af3107a40008082049050905080821061092d578161092f565b805b9050905060648082106109425781610944565b805b9050905061014052610160600060ff818352015b61010051610180526101205161010051808202821582848304141715611290579050905060028082028215828483041417156112905790509050608435808015611290578204905090506101a05260e05161010051818183011061129057808201905090506101c052602435670de0b6b3a7640000818183011061129057808201905090506101e0526101a0516101e05111610a1f576101a0516101e05180821061129057808203905090506001818183011061129057808201905090506101e052610a4c565b6101e0516101a05180821061129057808203905090506001818183011061129057808201905090506101e0525b670de0b6b3a76400006084358082028215828483041417156112905790509050602435808015611290578204905090506101e0518082028215828483041417156112905790509050602435808015611290578204905090506101e051808202821582848304141715611290579050905061271080820282158284830414171561129057905090506004358080156112905782049050905061020052670de0b6b3a7640000671bc16d674ec800006101a05180820282158284830414171561129057905090506101e051808015611290578204905090508181830110611290578082019050905061022052670de0b6b3a76400006101005180820282158284830414171561129057905090506101c0516102205180820282158284830414171561129057905090508181830110611290578082019050905061020051818183011061129057808201905090506102405260843561022051808202821582848304141715611290579050905061026052610260516102405110610be6576102408051610260518082106112905780820390509050815250610bfc565b6101805160028082049050905061010052610e38565b610240516101005180801561129057820490509050610280526102005161028051808015611290578204905090506102a05261024051670de0b6b3a764000060843580820282158284830414171561129057905090508181830110611290578082019050905061028051808015611290578204905090506102a051670de0b6b3a764000080820282158284830414171561129057905090506101a05180801561129057820490509050818183011061129057808201905090506102c0526102a08051670de0b6b3a76400006101c05180820282158284830414171561129057905090506102805180801561129057820490509050818183011061129057808201905090508152506102a0516102c05110610d2f576102c0516102a051808210611290578082039050905061010052610d41565b61018051600280820490509050610100525b60006102e052610180516101005111610d7357610180516101005180821061129057808203905090506102e052610d8e565b610100516101805180821061129057808203905090506102e0525b6101405161010051655af3107a400080820490509050808210610db15781610db3565b805b905090506102e0511015610e385761010051670de0b6b3a764000080820282158284830414171561129057905090506084358080156112905782049050905061030052662386f26fc0ffff6103005111610e0e576000610e1e565b68056bc75e2d6310000161030051105b156112905750505061010051610320526020610320610ec0565b81516001018083528114156109585750506010610160527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101805261016050610160518061018001818260206001820306601f82010390500336823750506308c379a0610120526020610140526101605160206001820306601f820103905060440161013cfd5bf35b63e83502fa81186110bd576004358060a01c6112905760e0526372d4f0e2610120526020610120600461013c60e0515afa610f02573d600060003e3d6000fd5b601f3d1115611290576101205161010052602435604435818183011061129057808201905090506101205261010051670de0b6b3a7640000808202821582848304141715611290579050905061010051670de0b6b3a764000081818301106112905780820190509050673782dace9d9000006024358082028215828483041417156112905790509050610120518080156112905782049050905060443580820282158284830414171561129057905090506101205180801561129057820490509050808210611290578082039050905080801561129057820490509050610120526392526c0c610140526020610140600461015c60e0515afa61100a573d600060003e3d6000fd5b601f3d1115611290576101405161012051808202821582848304141715611290579050905063ee8de675610180526020610180600461019c60e0515afa611056573d600060003e3d6000fd5b601f3d11156112905761018051670de0b6b3a7640000610120518082106112905780820390509050808202821582848304141715611290579050905081818301106112905780820190509050670de0b6b3a7640000808204905090506101c05260206101c0f35b505b60006000fd5b60e051610140526101005161016052610120516110e35760006110ed565b6101605161014051105b1561110257610100516101405260e051610160525b610140516101805260006101a0526101c0600060ff818352015b610180516101e0526101805161014051610160518082028215828483041417156112905790509050610180518080156112905782049050905081818301106112905780820190509050600280820490509050610180526101e051610180511161119e576101e0516101805180821061129057808203905090506101a0526111b9565b610180516101e05180821061129057808203905090506101a0525b60016101a05111156111f057610180516101a051670de0b6b3a76400008082028215828483041417156112905790509050106111f3565b60015b156112065750506101805181525061128e565b815160010180835281141561111c57505060106101c0527f446964206e6f7420636f6e7665726765000000000000000000000000000000006101e0526101c0506101c051806101e001818260206001820306601f82010390500336823750506308c379a06101805260206101a0526101c05160206001820306601f820103905060440161019cfd5b565b600080fd