ETH Price: $2,883.17 (-1.94%)
Gas: 8 Gwei

Contract

0xD51a44d3FaE010294C616388b506AcdA1bfAAE46
 

Overview

ETH Balance

0.083872897876096527 ETH

Eth Value

$241.82 (@ $2,883.17/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Exchange198224402024-05-08 2:43:476 days ago1715136227IN
Curve.fi: USDT/WBTC/WETH Pool
16.5 ETH0.002091885.79200743
Exchange198160902024-05-07 5:25:237 days ago1715059523IN
Curve.fi: USDT/WBTC/WETH Pool
0.00002 ETH0.001210473.8
Exchange197910782024-05-03 17:28:2310 days ago1714757303IN
Curve.fi: USDT/WBTC/WETH Pool
0.61387507 ETH0.003128439.20409911
Exchange197776412024-05-01 20:22:2312 days ago1714594943IN
Curve.fi: USDT/WBTC/WETH Pool
1.6 ETH0.002948147.99034339
Claim_admin_fees197209382024-04-23 22:00:5920 days ago1713909659IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0022536113.35580568
Claim_admin_fees197137802024-04-22 22:00:3521 days ago1713823235IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.00152679.18051927
Claim_admin_fees197066282024-04-21 22:00:5922 days ago1713736859IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.001464798.66324124
Remove_liquidity...197021712024-04-21 7:04:2323 days ago1713683063IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.001544416.92446104
Claim_admin_fees196994712024-04-20 22:00:5923 days ago1713650459IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.001518758.77771756
Claim_admin_fees196923222024-04-19 22:00:5924 days ago1713564059IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0018460710.85819765
Claim_admin_fees196851862024-04-18 22:01:1125 days ago1713477671IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0017678710.94259116
Exchange196811372024-04-18 8:25:1126 days ago1713428711IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.003359224.95599181
Claim_admin_fees196780352024-04-17 22:00:5926 days ago1713391259IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0024298513.54205304
Claim_admin_fees196708782024-04-16 22:00:1127 days ago1713304811IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0023401713.29125612
Remove_liquidity...196658882024-04-16 5:13:4728 days ago1713244427IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.002703548.65013812
Claim_admin_fees196637492024-04-15 22:00:5928 days ago1713218459IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0032270418.70024383
Exchange196635732024-04-15 21:25:2328 days ago1713216323IN
Curve.fi: USDT/WBTC/WETH Pool
10 ETH0.0022849717.31779508
Exchange196628962024-04-15 19:08:3528 days ago1713208115IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0061986242.82266773
Exchange196626452024-04-15 18:17:5928 days ago1713205079IN
Curve.fi: USDT/WBTC/WETH Pool
10 ETH0.0100163327.81567054
Exchange196626442024-04-15 18:17:4728 days ago1713205067IN
Curve.fi: USDT/WBTC/WETH Pool
10 ETH0.0036299127.51105223
Exchange196626432024-04-15 18:17:3528 days ago1713205055IN
Curve.fi: USDT/WBTC/WETH Pool
10 ETH0.0032798124.8576446
Claim_admin_fees196566152024-04-14 22:00:5929 days ago1713132059IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.002091212.0698435
Claim_admin_fees196494792024-04-13 22:00:5930 days ago1713045659IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.02810778155.97496652
Claim_admin_fees196423572024-04-12 22:00:1131 days ago1712959211IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0042258923.09143647
Claim_admin_fees196352192024-04-11 22:00:5932 days ago1712872859IN
Curve.fi: USDT/WBTC/WETH Pool
0 ETH0.0030460217.54331981
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
198694382024-05-14 16:32:2337 mins ago1715704343
Curve.fi: USDT/WBTC/WETH Pool
0.51589254 ETH
198694382024-05-14 16:32:2337 mins ago1715704343
Curve.fi: USDT/WBTC/WETH Pool
0.51589254 ETH
198694042024-05-14 16:25:2344 mins ago1715703923
Curve.fi: USDT/WBTC/WETH Pool
3.03756602 ETH
198694042024-05-14 16:25:2344 mins ago1715703923
Curve.fi: USDT/WBTC/WETH Pool
3.03756602 ETH
198693952024-05-14 16:23:3545 mins ago1715703815
Curve.fi: USDT/WBTC/WETH Pool
3.03756602 ETH
198693952024-05-14 16:23:3545 mins ago1715703815
Curve.fi: USDT/WBTC/WETH Pool
3.03756602 ETH
198692552024-05-14 15:55:111 hr ago1715702111
Curve.fi: USDT/WBTC/WETH Pool
2.012943 ETH
198692552024-05-14 15:55:111 hr ago1715702111
Curve.fi: USDT/WBTC/WETH Pool
2.012943 ETH
198678542024-05-14 11:09:116 hrs ago1715684951
Curve.fi: USDT/WBTC/WETH Pool
0.00003437 ETH
198678542024-05-14 11:09:116 hrs ago1715684951
Curve.fi: USDT/WBTC/WETH Pool
0.00003437 ETH
198670572024-05-14 8:27:598 hrs ago1715675279
Curve.fi: USDT/WBTC/WETH Pool
0.95712 ETH
198670572024-05-14 8:27:598 hrs ago1715675279
Curve.fi: USDT/WBTC/WETH Pool
0.95712 ETH
198656272024-05-14 3:40:1113 hrs ago1715658011
Curve.fi: USDT/WBTC/WETH Pool
9.97 ETH
198656272024-05-14 3:40:1113 hrs ago1715658011
Curve.fi: USDT/WBTC/WETH Pool
9.97 ETH
198656242024-05-14 3:39:3513 hrs ago1715657975
Curve.fi: USDT/WBTC/WETH Pool
2.991 ETH
198656242024-05-14 3:39:3513 hrs ago1715657975
Curve.fi: USDT/WBTC/WETH Pool
2.991 ETH
198652142024-05-14 2:16:5914 hrs ago1715653019
Curve.fi: USDT/WBTC/WETH Pool
8.4745 ETH
198652142024-05-14 2:16:5914 hrs ago1715653019
Curve.fi: USDT/WBTC/WETH Pool
8.4745 ETH
198648712024-05-14 1:07:4716 hrs ago1715648867
Curve.fi: USDT/WBTC/WETH Pool
6.2811 ETH
198648712024-05-14 1:07:4716 hrs ago1715648867
Curve.fi: USDT/WBTC/WETH Pool
6.2811 ETH
198646422024-05-14 0:21:4716 hrs ago1715646107
Curve.fi: USDT/WBTC/WETH Pool
2.54235 ETH
198646422024-05-14 0:21:4716 hrs ago1715646107
Curve.fi: USDT/WBTC/WETH Pool
2.54235 ETH
198644432024-05-13 23:41:5917 hrs ago1715643719
Curve.fi: USDT/WBTC/WETH Pool
4.4865 ETH
198644432024-05-13 23:41:5917 hrs ago1715643719
Curve.fi: USDT/WBTC/WETH Pool
4.4865 ETH
198644392024-05-13 23:41:1117 hrs ago1715643671
Curve.fi: USDT/WBTC/WETH Pool
5.1844 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
None license

Contract Source Code (Vyper language format)

# @version 0.2.12
# (c) Curve.Fi, 2021
# Pool for USDT/BTC/ETH or similar

interface ERC20:  # Custom ERC20 which works for USDT, WETH and WBTC
    def transfer(_to: address, _amount: uint256): nonpayable
    def transferFrom(_from: address, _to: address, _amount: uint256): nonpayable
    def balanceOf(_user: address) -> uint256: view

interface CurveToken:
    def totalSupply() -> uint256: view
    def mint(_to: address, _value: uint256) -> bool: nonpayable
    def mint_relative(_to: address, frac: uint256) -> uint256: nonpayable
    def burnFrom(_to: address, _value: uint256) -> bool: nonpayable


interface Math:
    def geometric_mean(unsorted_x: uint256[N_COINS]) -> uint256: view
    def reduction_coefficient(x: uint256[N_COINS], fee_gamma: uint256) -> uint256: view
    def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256: view
    def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256: view
    def halfpow(power: uint256, precision: uint256) -> uint256: view
    def sqrt_int(x: uint256) -> uint256: view


interface Views:
    def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256: view
    def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256: view


interface WETH:
    def deposit(): payable
    def withdraw(_amount: uint256): nonpayable


# Events
event TokenExchange:
    buyer: indexed(address)
    sold_id: uint256
    tokens_sold: uint256
    bought_id: uint256
    tokens_bought: uint256

event AddLiquidity:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    fee: uint256
    token_supply: uint256

event RemoveLiquidity:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    token_supply: uint256

event RemoveLiquidityOne:
    provider: indexed(address)
    token_amount: uint256
    coin_index: uint256
    coin_amount: uint256

event CommitNewAdmin:
    deadline: indexed(uint256)
    admin: indexed(address)

event NewAdmin:
    admin: indexed(address)

event CommitNewParameters:
    deadline: indexed(uint256)
    admin_fee: uint256
    mid_fee: uint256
    out_fee: uint256
    fee_gamma: uint256
    allowed_extra_profit: uint256
    adjustment_step: uint256
    ma_half_time: uint256

event NewParameters:
    admin_fee: uint256
    mid_fee: uint256
    out_fee: uint256
    fee_gamma: uint256
    allowed_extra_profit: uint256
    adjustment_step: uint256
    ma_half_time: uint256

event RampAgamma:
    initial_A: uint256
    future_A: uint256
    initial_gamma: uint256
    future_gamma: uint256
    initial_time: uint256
    future_time: uint256

event StopRampA:
    current_A: uint256
    current_gamma: uint256
    time: uint256

event ClaimAdminFee:
    admin: indexed(address)
    tokens: uint256


N_COINS: constant(int128) = 3  # <- change
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
A_MULTIPLIER: constant(uint256) = 10000

# These addresses are replaced by the deployer
math: constant(address) = 0x8F68f4810CcE3194B6cB6F3d50fa58c2c9bDD1d5
token: constant(address) = 0xc4AD29ba4B3c580e6D59105FFf484999997675Ff
views: constant(address) = 0x40745803C2faA8E8402E2Ae935933D07cA8f355c
coins: constant(address[N_COINS]) = [
    0xdAC17F958D2ee523a2206206994597C13D831ec7,
    0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,
    0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,
]

price_scale_packed: uint256   # Internal price scale
price_oracle_packed: uint256  # Price target given by MA

last_prices_packed: uint256
last_prices_timestamp: public(uint256)

initial_A_gamma: public(uint256)
future_A_gamma: public(uint256)
initial_A_gamma_time: public(uint256)
future_A_gamma_time: public(uint256)

allowed_extra_profit: public(uint256)  # 2 * 10**12 - recommended value
future_allowed_extra_profit: public(uint256)

fee_gamma: public(uint256)
future_fee_gamma: public(uint256)

adjustment_step: public(uint256)
future_adjustment_step: public(uint256)

ma_half_time: public(uint256)
future_ma_half_time: public(uint256)

mid_fee: public(uint256)
out_fee: public(uint256)
admin_fee: public(uint256)
future_mid_fee: public(uint256)
future_out_fee: public(uint256)
future_admin_fee: public(uint256)

balances: public(uint256[N_COINS])
D: public(uint256)

owner: public(address)
future_owner: public(address)

xcp_profit: public(uint256)
xcp_profit_a: public(uint256)  # Full profit at last claim of admin fees
virtual_price: public(uint256)  # Cached (fast to read) virtual price also used internally
not_adjusted: bool

is_killed: public(bool)
kill_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
admin_actions_deadline: public(uint256)

admin_fee_receiver: public(address)

KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400
ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400

MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MIN_FEE: constant(uint256) = 5 * 10 ** 5  # 0.5 bps
MAX_FEE: constant(uint256) = 10 * 10 ** 9
MAX_A: constant(uint256) = 10000 * A_MULTIPLIER * N_COINS**N_COINS
MAX_A_CHANGE: constant(uint256) = 10
MIN_GAMMA: constant(uint256) = 10**10
MAX_GAMMA: constant(uint256) = 10**16
NOISE_FEE: constant(uint256) = 10**5  # 0.1 bps

PRICE_SIZE: constant(int128) = 256 / (N_COINS-1)
PRICE_MASK: constant(uint256) = 2**PRICE_SIZE - 1

# This must be changed for different N_COINS
# For example:
# N_COINS = 3 -> 1  (10**18 -> 10**18)
# N_COINS = 4 -> 10**8  (10**18 -> 10**10)
# PRICE_PRECISION_MUL: constant(uint256) = 1
PRECISIONS: constant(uint256[N_COINS]) = [
    1000000000000,
    10000000000,
    1,
]

INF_COINS: constant(uint256) = 15


@external
def __init__(
    owner: address,
    admin_fee_receiver: address,
    A: uint256,
    gamma: uint256,
    mid_fee: uint256,
    out_fee: uint256,
    allowed_extra_profit: uint256,
    fee_gamma: uint256,
    adjustment_step: uint256,
    admin_fee: uint256,
    ma_half_time: uint256,
    initial_prices: uint256[N_COINS-1]
):
    self.owner = owner

    # Pack A and gamma:
    # shifted A + gamma
    A_gamma: uint256 = shift(A, 128)
    A_gamma = bitwise_or(A_gamma, gamma)
    self.initial_A_gamma = A_gamma
    self.future_A_gamma = A_gamma

    self.mid_fee = mid_fee
    self.out_fee = out_fee
    self.allowed_extra_profit = allowed_extra_profit
    self.fee_gamma = fee_gamma
    self.adjustment_step = adjustment_step
    self.admin_fee = admin_fee

    # Packing prices
    packed_prices: uint256 = 0
    for k in range(N_COINS-1):
        packed_prices = shift(packed_prices, PRICE_SIZE)
        p: uint256 = initial_prices[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
        assert p < PRICE_MASK
        packed_prices = bitwise_or(p, packed_prices)

    self.price_scale_packed = packed_prices
    self.price_oracle_packed = packed_prices
    self.last_prices_packed = packed_prices
    self.last_prices_timestamp = block.timestamp
    self.ma_half_time = ma_half_time

    self.xcp_profit_a = 10**18

    self.kill_deadline = block.timestamp + KILL_DEADLINE_DT

    self.admin_fee_receiver = admin_fee_receiver


@payable
@external
def __default__():
    pass


@internal
@view
def _packed_view(k: uint256, p: uint256) -> uint256:
    assert k < N_COINS-1
    return bitwise_and(
        shift(p, -PRICE_SIZE * convert(k, int256)),
        PRICE_MASK
    )  # * PRICE_PRECISION_MUL


@external
@view
def price_oracle(k: uint256) -> uint256:
    return self._packed_view(k, self.price_oracle_packed)


@external
@view
def price_scale(k: uint256) -> uint256:
    return self._packed_view(k, self.price_scale_packed)


@external
@view
def last_prices(k: uint256) -> uint256:
    return self._packed_view(k, self.last_prices_packed)


@external
@view
def token() -> address:
    return token


@external
@view
def coins(i: uint256) -> address:
    _coins: address[N_COINS] = coins
    return _coins[i]


@internal
@view
def xp() -> uint256[N_COINS]:
    result: uint256[N_COINS] = self.balances
    packed_prices: uint256 = self.price_scale_packed

    precisions: uint256[N_COINS] = PRECISIONS

    result[0] *= PRECISIONS[0]
    for i in range(1, N_COINS):
        p: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i]  # * PRICE_PRECISION_MUL
        result[i] = result[i] * p / PRECISION
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    return result


@view
@internal
def _A_gamma() -> uint256[2]:
    t1: uint256 = self.future_A_gamma_time

    A_gamma_1: uint256 = self.future_A_gamma
    gamma1: uint256 = bitwise_and(A_gamma_1, 2**128-1)
    A1: uint256 = shift(A_gamma_1, -128)

    if block.timestamp < t1:
        # handle ramping up and down of A
        A_gamma_0: uint256 = self.initial_A_gamma
        t0: uint256 = self.initial_A_gamma_time

        # Less readable but more compact way of writing and converting to uint256
        # gamma0: uint256 = bitwise_and(A_gamma_0, 2**128-1)
        # A0: uint256 = shift(A_gamma_0, -128)
        # A1 = A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
        # gamma1 = gamma0 + (gamma1 - gamma0) * (block.timestamp - t0) / (t1 - t0)

        t1 -= t0
        t0 = block.timestamp - t0
        t2: uint256 = t1 - t0

        A1 = (shift(A_gamma_0, -128) * t2 + A1 * t0) / t1
        gamma1 = (bitwise_and(A_gamma_0, 2**128-1) * t2 + gamma1 * t0) / t1

    return [A1, gamma1]


@view
@external
def A() -> uint256:
    return self._A_gamma()[0]


@view
@external
def gamma() -> uint256:
    return self._A_gamma()[1]


@internal
@view
def _fee(xp: uint256[N_COINS]) -> uint256:
    f: uint256 = Math(math).reduction_coefficient(xp, self.fee_gamma)
    return (self.mid_fee * f + self.out_fee * (10**18 - f)) / 10**18


@external
@view
def fee() -> uint256:
    return self._fee(self.xp())


@external
@view
def fee_calc(xp: uint256[N_COINS]) -> uint256:
    return self._fee(xp)


@internal
@view
def get_xcp(D: uint256) -> uint256:
    x: uint256[N_COINS] = empty(uint256[N_COINS])
    x[0] = D / N_COINS
    packed_prices: uint256 = self.price_scale_packed
    # No precisions here because we don't switch to "real" units

    for i in range(1, N_COINS):
        x[i] = D * 10**18 / (N_COINS * bitwise_and(packed_prices, PRICE_MASK))  # ... * PRICE_PRECISION_MUL)
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    return Math(math).geometric_mean(x)


@external
@view
def get_virtual_price() -> uint256:
    return 10**18 * self.get_xcp(self.D) / CurveToken(token).totalSupply()


@internal
def _claim_admin_fees():
    A_gamma: uint256[2] = self._A_gamma()

    xcp_profit: uint256 = self.xcp_profit
    xcp_profit_a: uint256 = self.xcp_profit_a

    # Gulp here
    _coins: address[N_COINS] = coins
    for i in range(N_COINS):
        self.balances[i] = ERC20(_coins[i]).balanceOf(self)

    vprice: uint256 = self.virtual_price

    if xcp_profit > xcp_profit_a:
        fees: uint256 = (xcp_profit - xcp_profit_a) * self.admin_fee / (2 * 10**10)
        if fees > 0:
            receiver: address = self.admin_fee_receiver
            frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18
            claimed: uint256 = CurveToken(token).mint_relative(receiver, frac)
            xcp_profit -= fees*2
            self.xcp_profit = xcp_profit
            log ClaimAdminFee(receiver, claimed)

    total_supply: uint256 = CurveToken(token).totalSupply()

    # Recalculate D b/c we gulped
    D: uint256 = Math(math).newton_D(A_gamma[0], A_gamma[1], self.xp())
    self.D = D

    self.virtual_price = 10**18 * self.get_xcp(D) / total_supply

    if xcp_profit > xcp_profit_a:
        self.xcp_profit_a = xcp_profit


@internal
def tweak_price(A_gamma: uint256[2],
                _xp: uint256[N_COINS], i: uint256, p_i: uint256,
                new_D: uint256):
    price_oracle: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
    xp: uint256[N_COINS] = empty(uint256[N_COINS])
    p_new: uint256[N_COINS-1] = empty(uint256[N_COINS-1])

    # Update MA if needed
    packed_prices: uint256 = self.price_oracle_packed
    for k in range(N_COINS-1):
        price_oracle[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    last_prices_timestamp: uint256 = self.last_prices_timestamp
    packed_prices = self.last_prices_packed
    for k in range(N_COINS-1):
        last_prices[k] = bitwise_and(packed_prices, PRICE_MASK)   # * PRICE_PRECISION_MUL
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    if last_prices_timestamp < block.timestamp:
        # MA update required
        ma_half_time: uint256 = self.ma_half_time
        alpha: uint256 = Math(math).halfpow((block.timestamp - last_prices_timestamp) * 10**18 / ma_half_time, 10**10)
        packed_prices = 0
        for k in range(N_COINS-1):
            price_oracle[k] = (last_prices[k] * (10**18 - alpha) + price_oracle[k] * alpha) / 10**18
        for k in range(N_COINS-1):
            packed_prices = shift(packed_prices, PRICE_SIZE)
            p: uint256 = price_oracle[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
            assert p < PRICE_MASK
            packed_prices = bitwise_or(p, packed_prices)
        self.price_oracle_packed = packed_prices
        self.last_prices_timestamp = block.timestamp

    D_unadjusted: uint256 = new_D  # Withdrawal methods know new D already
    if new_D == 0:
        # We will need this a few times (35k gas)
        D_unadjusted = Math(math).newton_D(A_gamma[0], A_gamma[1], _xp)
    packed_prices = self.price_scale_packed
    for k in range(N_COINS-1):
        price_scale[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
        packed_prices = shift(packed_prices, -PRICE_SIZE)

    if p_i > 0:
        # Save the last price
        if i > 0:
            last_prices[i-1] = p_i
        else:
            # If 0th price changed - change all prices instead
            for k in range(N_COINS-1):
                last_prices[k] = last_prices[k] * 10**18 / p_i
    else:
        # calculate real prices
        # it would cost 70k gas for a 3-token pool. Sad. How do we do better?
        __xp: uint256[N_COINS] = _xp
        dx_price: uint256 = __xp[0] / 10**6
        __xp[0] += dx_price
        for k in range(N_COINS-1):
            last_prices[k] = price_scale[k] * dx_price / (_xp[k+1] - Math(math).newton_y(A_gamma[0], A_gamma[1], __xp, D_unadjusted, k+1))

    packed_prices = 0
    for k in range(N_COINS-1):
        packed_prices = shift(packed_prices, PRICE_SIZE)
        p: uint256 = last_prices[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
        assert p < PRICE_MASK
        packed_prices = bitwise_or(p, packed_prices)
    self.last_prices_packed = packed_prices

    total_supply: uint256 = CurveToken(token).totalSupply()
    old_xcp_profit: uint256 = self.xcp_profit
    old_virtual_price: uint256 = self.virtual_price

    # Update profit numbers without price adjustment first
    xp[0] = D_unadjusted / N_COINS
    for k in range(N_COINS-1):
        xp[k+1] = D_unadjusted * 10**18 / (N_COINS * price_scale[k])
    xcp_profit: uint256 = 10**18
    virtual_price: uint256 = 10**18

    if old_virtual_price > 0:
        xcp: uint256 = Math(math).geometric_mean(xp)
        virtual_price = 10**18 * xcp / total_supply
        xcp_profit = old_xcp_profit * virtual_price / old_virtual_price

        t: uint256 = self.future_A_gamma_time
        if virtual_price < old_virtual_price and t == 0:
            raise "Loss"
        if t == 1:
            self.future_A_gamma_time = 0

    self.xcp_profit = xcp_profit

    needs_adjustment: bool = self.not_adjusted
    # if not needs_adjustment and (virtual_price-10**18 > (xcp_profit-10**18)/2 + self.allowed_extra_profit):
    # (re-arrange for gas efficiency)
    if not needs_adjustment and (virtual_price * 2 - 10**18 > xcp_profit + 2*self.allowed_extra_profit):
        needs_adjustment = True
        self.not_adjusted = True

    if needs_adjustment:
        adjustment_step: uint256 = self.adjustment_step
        norm: uint256 = 0

        for k in range(N_COINS-1):
            ratio: uint256 = price_oracle[k] * 10**18 / price_scale[k]
            if ratio > 10**18:
                ratio -= 10**18
            else:
                ratio = 10**18 - ratio
            norm += ratio**2

        if norm > adjustment_step ** 2 and old_virtual_price > 0:
            norm = Math(math).sqrt_int(norm / 10**18)  # Need to convert to 1e18 units!

            for k in range(N_COINS-1):
                p_new[k] = (price_scale[k] * (norm - adjustment_step) + adjustment_step * price_oracle[k]) / norm

            # Calculate balances*prices
            xp = _xp
            for k in range(N_COINS-1):
                xp[k+1] = _xp[k+1] * p_new[k] / price_scale[k]

            # Calculate "extended constant product" invariant xCP and virtual price
            D: uint256 = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)
            xp[0] = D / N_COINS
            for k in range(N_COINS-1):
                xp[k+1] = D * 10**18 / (N_COINS * p_new[k])
            # We reuse old_virtual_price here but it's not old anymore
            old_virtual_price = 10**18 * Math(math).geometric_mean(xp) / total_supply

            # Proceed if we've got enough profit
            # if (old_virtual_price > 10**18) and (2 * (old_virtual_price - 10**18) > xcp_profit - 10**18):
            if (old_virtual_price > 10**18) and (2 * old_virtual_price - 10**18 > xcp_profit):
                packed_prices = 0
                for k in range(N_COINS-1):
                    packed_prices = shift(packed_prices, PRICE_SIZE)
                    p: uint256 = p_new[N_COINS-2 - k]  # / PRICE_PRECISION_MUL
                    assert p < PRICE_MASK
                    packed_prices = bitwise_or(p, packed_prices)
                self.price_scale_packed = packed_prices
                self.D = D
                self.virtual_price = old_virtual_price

                return

            else:
                self.not_adjusted = False

    # If we are here, the price_scale adjustment did not happen
    # Still need to update the profit counter and D
    self.D = D_unadjusted
    self.virtual_price = virtual_price



@payable
@external
@nonreentrant('lock')
def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool = False):
    assert not self.is_killed  # dev: the pool is killed
    assert i != j  # dev: coin index out of range
    assert i < N_COINS  # dev: coin index out of range
    assert j < N_COINS  # dev: coin index out of range
    assert dx > 0  # dev: do not exchange 0 coins

    A_gamma: uint256[2] = self._A_gamma()
    xp: uint256[N_COINS] = self.balances
    ix: uint256 = j
    p: uint256 = 0
    dy: uint256 = 0

    if True:  # scope to reduce size of memory when making internal calls later
        _coins: address[N_COINS] = coins
        if i == 2 and use_eth:
            assert msg.value == dx  # dev: incorrect eth amount
            WETH(coins[2]).deposit(value=msg.value)
        else:
            assert msg.value == 0  # dev: nonzero eth amount
            # assert might be needed for some tokens - removed one to save bytespace
            ERC20(_coins[i]).transferFrom(msg.sender, self, dx)

        y: uint256 = xp[j]
        x0: uint256 = xp[i]
        xp[i] = x0 + dx
        self.balances[i] = xp[i]

        price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
        packed_prices: uint256 = self.price_scale_packed
        for k in range(N_COINS-1):
            price_scale[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
            packed_prices = shift(packed_prices, -PRICE_SIZE)

        precisions: uint256[N_COINS] = PRECISIONS
        xp[0] *= PRECISIONS[0]
        for k in range(1, N_COINS):
            xp[k] = xp[k] * price_scale[k-1] * precisions[k] / PRECISION

        prec_i: uint256 = precisions[i]

        # In case ramp is happening
        if True:
            t: uint256 = self.future_A_gamma_time
            if t > 0:
                x0 *= prec_i
                if i > 0:
                    x0 = x0 * price_scale[i-1] / PRECISION
                x1: uint256 = xp[i]  # Back up old value in xp
                xp[i] = x0
                self.D = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)
                xp[i] = x1  # And restore
                if block.timestamp >= t:
                    self.future_A_gamma_time = 1

        prec_j: uint256 = precisions[j]

        dy = xp[j] - Math(math).newton_y(A_gamma[0], A_gamma[1], xp, self.D, j)
        # Not defining new "y" here to have less variables / make subsequent calls cheaper
        xp[j] -= dy
        dy -= 1

        if j > 0:
            dy = dy * PRECISION / price_scale[j-1]
        dy /= prec_j

        dy -= self._fee(xp) * dy / 10**10
        assert dy >= min_dy, "Slippage"
        y -= dy

        self.balances[j] = y
        # assert might be needed for some tokens - removed one to save bytespace
        if j == 2 and use_eth:
            WETH(coins[2]).withdraw(dy)
            raw_call(msg.sender, b"", value=dy)
        else:
            ERC20(_coins[j]).transfer(msg.sender, dy)

        y *= prec_j
        if j > 0:
            y = y * price_scale[j-1] / PRECISION
        xp[j] = y

        # Calculate price
        if dx > 10**5 and dy > 10**5:
            _dx: uint256 = dx * prec_i
            _dy: uint256 = dy * prec_j
            if i != 0 and j != 0:
                p = bitwise_and(
                    shift(self.last_prices_packed, -PRICE_SIZE * convert(i-1, int256)),
                    PRICE_MASK
                ) * _dx / _dy  # * PRICE_PRECISION_MUL
            elif i == 0:
                p = _dx * 10**18 / _dy
            else:  # j == 0
                p = _dy * 10**18 / _dx
                ix = i

    self.tweak_price(A_gamma, xp, ix, p, 0)

    log TokenExchange(msg.sender, i, dx, j, dy)


@external
@view
def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256:
    return Views(views).get_dy(i, j, dx)


@view
@internal
def _calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256:
    # fee = sum(amounts_i - avg(amounts)) * fee' / sum(amounts)
    fee: uint256 = self._fee(xp) * N_COINS / (4 * (N_COINS-1))
    S: uint256 = 0
    for _x in amounts:
        S += _x
    avg: uint256 = S / N_COINS
    Sdiff: uint256 = 0
    for _x in amounts:
        if _x > avg:
            Sdiff += _x - avg
        else:
            Sdiff += avg - _x
    return fee * Sdiff / S + NOISE_FEE


@external
@view
def calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256:
    return self._calc_token_fee(amounts, xp)


@external
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
    assert not self.is_killed  # dev: the pool is killed

    A_gamma: uint256[2] = self._A_gamma()

    _coins: address[N_COINS] = coins

    xp: uint256[N_COINS] = self.balances
    amountsp: uint256[N_COINS] = empty(uint256[N_COINS])
    xx: uint256[N_COINS] = empty(uint256[N_COINS])
    d_token: uint256 = 0
    d_token_fee: uint256 = 0
    old_D: uint256 = 0
    ix: uint256 = INF_COINS

    if True:  # Scope to avoid having extra variables in memory later
        xp_old: uint256[N_COINS] = xp

        for i in range(N_COINS):
            bal: uint256 = xp[i] + amounts[i]
            xp[i] = bal
            self.balances[i] = bal
        xx = xp

        precisions: uint256[N_COINS] = PRECISIONS
        packed_prices: uint256 = self.price_scale_packed
        xp[0] *= PRECISIONS[0]
        xp_old[0] *= PRECISIONS[0]
        for i in range(1, N_COINS):
            price_scale: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i]  # * PRICE_PRECISION_MUL
            xp[i] = xp[i] * price_scale / PRECISION
            xp_old[i] = xp_old[i] * price_scale / PRECISION
            packed_prices = shift(packed_prices, -PRICE_SIZE)

        for i in range(N_COINS):
            if amounts[i] > 0:
                # assert might be needed for some tokens - removed one to save bytespace
                ERC20(_coins[i]).transferFrom(msg.sender, self, amounts[i])
                amountsp[i] = xp[i] - xp_old[i]
                if ix == INF_COINS:
                    ix = i
                else:
                    ix = INF_COINS-1
        assert ix != INF_COINS  # dev: no coins to add

        t: uint256 = self.future_A_gamma_time
        if t > 0:
            old_D = Math(math).newton_D(A_gamma[0], A_gamma[1], xp_old)
            if block.timestamp >= t:
                self.future_A_gamma_time = 1
        else:
            old_D = self.D

    D: uint256 = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)

    token_supply: uint256 = CurveToken(token).totalSupply()
    if old_D > 0:
        d_token = token_supply * D / old_D - token_supply
    else:
        d_token = self.get_xcp(D)  # making initial virtual price equal to 1
    assert d_token > 0  # dev: nothing minted

    if old_D > 0:
        d_token_fee = self._calc_token_fee(amountsp, xp) * d_token / 10**10 + 1
        d_token -= d_token_fee
        token_supply += d_token
        CurveToken(token).mint(msg.sender, d_token)

        # Calculate price
        # p_i * (dx_i - dtoken / token_supply * xx_i) = sum{k!=i}(p_k * (dtoken / token_supply * xx_k - dx_k))
        # Only ix is nonzero
        p: uint256 = 0
        if d_token > 10**5:
            if ix < N_COINS:
                S: uint256 = 0
                last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
                packed_prices: uint256 = self.last_prices_packed
                precisions: uint256[N_COINS] = PRECISIONS
                for k in range(N_COINS-1):
                    last_prices[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
                    packed_prices = shift(packed_prices, -PRICE_SIZE)
                for i in range(N_COINS):
                    if i != ix:
                        if i == 0:
                            S += xx[0] * PRECISIONS[0]
                        else:
                            S += xx[i] * last_prices[i-1] * precisions[i] / PRECISION
                S = S * d_token / token_supply
                p = S * PRECISION / (amounts[ix] * precisions[ix] - d_token * xx[ix] * precisions[ix] / token_supply)

        self.tweak_price(A_gamma, xp, ix, p, D)

    else:
        self.D = D
        self.virtual_price = 10**18
        self.xcp_profit = 10**18
        CurveToken(token).mint(msg.sender, d_token)

    assert d_token >= min_mint_amount, "Slippage"

    log AddLiquidity(msg.sender, amounts, d_token_fee, token_supply)


@external
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
    """
    This withdrawal method is very safe, does no complex math
    """
    _coins: address[N_COINS] = coins
    total_supply: uint256 = CurveToken(token).totalSupply()
    CurveToken(token).burnFrom(msg.sender, _amount)
    balances: uint256[N_COINS] = self.balances
    amount: uint256 = _amount - 1  # Make rounding errors favoring other LPs a tiny bit

    for i in range(N_COINS):
        d_balance: uint256 = balances[i] * amount / total_supply
        assert d_balance >= min_amounts[i]
        self.balances[i] = balances[i] - d_balance
        balances[i] = d_balance  # now it's the amounts going out
        # assert might be needed for some tokens - removed one to save bytespace
        ERC20(_coins[i]).transfer(msg.sender, d_balance)

    D: uint256 = self.D
    self.D = D - D * amount / total_supply

    log RemoveLiquidity(msg.sender, balances, total_supply - _amount)


@view
@external
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256:
    return Views(views).calc_token_amount(amounts, deposit)


@internal
@view
def _calc_withdraw_one_coin(A_gamma: uint256[2], token_amount: uint256, i: uint256, update_D: bool,
                            calc_price: bool) -> (uint256, uint256, uint256, uint256[N_COINS]):
    token_supply: uint256 = CurveToken(token).totalSupply()
    assert token_amount <= token_supply  # dev: token amount more than supply
    assert i < N_COINS  # dev: coin out of range

    xx: uint256[N_COINS] = self.balances
    xp: uint256[N_COINS] = PRECISIONS
    D0: uint256 = 0

    price_scale_i: uint256 = PRECISION * PRECISIONS[0]
    if True:  # To remove packed_prices from memory
        packed_prices: uint256 = self.price_scale_packed
        xp[0] *= xx[0]
        for k in range(1, N_COINS):
            p: uint256 = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
            if i == k:
                price_scale_i = p * xp[i]
            xp[k] = xp[k] * xx[k] * p / PRECISION
            packed_prices = shift(packed_prices, -PRICE_SIZE)

    if update_D:
        D0 = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)
    else:
        D0 = self.D

    D: uint256 = D0

    # Charge the fee on D, not on y, e.g. reducing invariant LESS than charging the user
    fee: uint256 = self._fee(xp)
    dD: uint256 = token_amount * D / token_supply
    D -= (dD - (fee * dD / (2 * 10**10) + 1))
    y: uint256 = Math(math).newton_y(A_gamma[0], A_gamma[1], xp, D, i)
    dy: uint256 = (xp[i] - y) * PRECISION / price_scale_i
    xp[i] = y

    # Price calc
    p: uint256 = 0
    if calc_price and dy > 10**5 and token_amount > 10**5:
        # p_i = dD / D0 * sum'(p_k * x_k) / (dy - dD / D0 * y0)
        S: uint256 = 0
        precisions: uint256[N_COINS] = PRECISIONS
        last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
        packed_prices: uint256 = self.last_prices_packed
        for k in range(N_COINS-1):
            last_prices[k] = bitwise_and(packed_prices, PRICE_MASK)  # * PRICE_PRECISION_MUL
            packed_prices = shift(packed_prices, -PRICE_SIZE)
        for k in range(N_COINS):
            if k != i:
                if k == 0:
                    S += xx[0] * PRECISIONS[0]
                else:
                    S += xx[k] * last_prices[k-1] * precisions[k] / PRECISION
        S = S * dD / D0
        p = S * PRECISION / (dy * precisions[i] - dD * xx[i] * precisions[i] / D0)

    return dy, p, D, xp


@view
@external
def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256:
    return self._calc_withdraw_one_coin(self._A_gamma(), token_amount, i, True, False)[0]


@external
@nonreentrant('lock')
def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256):
    assert not self.is_killed  # dev: the pool is killed

    A_gamma: uint256[2] = self._A_gamma()

    dy: uint256 = 0
    D: uint256 = 0
    p: uint256 = 0
    xp: uint256[N_COINS] = empty(uint256[N_COINS])
    future_A_gamma_time: uint256 = self.future_A_gamma_time
    dy, p, D, xp = self._calc_withdraw_one_coin(A_gamma, token_amount, i, (future_A_gamma_time > 0), True)
    assert dy >= min_amount, "Slippage"

    if block.timestamp >= future_A_gamma_time:
        self.future_A_gamma_time = 1

    self.balances[i] -= dy
    CurveToken(token).burnFrom(msg.sender, token_amount)
    self.tweak_price(A_gamma, xp, i, p, D)

    _coins: address[N_COINS] = coins
    # assert might be needed for some tokens - removed one to save bytespace
    ERC20(_coins[i]).transfer(msg.sender, dy)

    log RemoveLiquidityOne(msg.sender, token_amount, i, dy)


@external
@nonreentrant('lock')
def claim_admin_fees():
    self._claim_admin_fees()


# Admin parameters
@external
def ramp_A_gamma(future_A: uint256, future_gamma: uint256, future_time: uint256):
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp > self.initial_A_gamma_time + (MIN_RAMP_TIME-1)
    assert future_time > block.timestamp + (MIN_RAMP_TIME-1)  # dev: insufficient time

    A_gamma: uint256[2] = self._A_gamma()
    initial_A_gamma: uint256 = shift(A_gamma[0], 128)
    initial_A_gamma = bitwise_or(initial_A_gamma, A_gamma[1])

    assert future_A > 0
    assert future_A < MAX_A+1
    assert future_gamma > MIN_GAMMA-1
    assert future_gamma < MAX_GAMMA+1

    ratio: uint256 = 10**18 * future_A / A_gamma[0]
    assert ratio < 10**18 * MAX_A_CHANGE + 1
    assert ratio > 10**18 / MAX_A_CHANGE - 1

    ratio = 10**18 * future_gamma / A_gamma[1]
    assert ratio < 10**18 * MAX_A_CHANGE + 1
    assert ratio > 10**18 / MAX_A_CHANGE - 1

    self.initial_A_gamma = initial_A_gamma
    self.initial_A_gamma_time = block.timestamp

    future_A_gamma: uint256 = shift(future_A, 128)
    future_A_gamma = bitwise_or(future_A_gamma, future_gamma)
    self.future_A_gamma_time = future_time
    self.future_A_gamma = future_A_gamma

    log RampAgamma(A_gamma[0], future_A, A_gamma[1], future_gamma, block.timestamp, future_time)


@external
def stop_ramp_A_gamma():
    assert msg.sender == self.owner  # dev: only owner

    A_gamma: uint256[2] = self._A_gamma()
    current_A_gamma: uint256 = shift(A_gamma[0], 128)
    current_A_gamma = bitwise_or(current_A_gamma, A_gamma[1])
    self.initial_A_gamma = current_A_gamma
    self.future_A_gamma = current_A_gamma
    self.initial_A_gamma_time = block.timestamp
    self.future_A_gamma_time = block.timestamp
    # now (block.timestamp < t1) is always False, so we return saved A

    log StopRampA(A_gamma[0], A_gamma[1], block.timestamp)


@external
def commit_new_parameters(
    _new_mid_fee: uint256,
    _new_out_fee: uint256,
    _new_admin_fee: uint256,
    _new_fee_gamma: uint256,
    _new_allowed_extra_profit: uint256,
    _new_adjustment_step: uint256,
    _new_ma_half_time: uint256,
    ):
    assert msg.sender == self.owner  # dev: only owner
    assert self.admin_actions_deadline == 0  # dev: active action

    new_mid_fee: uint256 = _new_mid_fee
    new_out_fee: uint256 = _new_out_fee
    new_admin_fee: uint256 = _new_admin_fee
    new_fee_gamma: uint256 = _new_fee_gamma
    new_allowed_extra_profit: uint256 = _new_allowed_extra_profit
    new_adjustment_step: uint256 = _new_adjustment_step
    new_ma_half_time: uint256 = _new_ma_half_time

    # Fees
    if new_out_fee < MAX_FEE+1:
        assert new_out_fee > MIN_FEE-1  # dev: fee is out of range
    else:
        new_out_fee = self.out_fee
    if new_mid_fee > MAX_FEE:
        new_mid_fee = self.mid_fee
    assert new_mid_fee <= new_out_fee  # dev: mid-fee is too high
    if new_admin_fee > MAX_ADMIN_FEE:
        new_admin_fee = self.admin_fee

    # AMM parameters
    if new_fee_gamma < 10**18:
        assert new_fee_gamma > 0  # dev: fee_gamma out of range [1 .. 10**18]
    else:
        new_fee_gamma = self.fee_gamma
    if new_allowed_extra_profit > 10**18:
        new_allowed_extra_profit = self.allowed_extra_profit
    if new_adjustment_step > 10**18:
        new_adjustment_step = self.adjustment_step

    # MA
    if new_ma_half_time < 7*86400:
        assert new_ma_half_time > 0  # dev: MA time should be longer than 1 second
    else:
        new_ma_half_time = self.ma_half_time

    _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
    self.admin_actions_deadline = _deadline

    self.future_admin_fee = new_admin_fee
    self.future_mid_fee = new_mid_fee
    self.future_out_fee = new_out_fee
    self.future_fee_gamma = new_fee_gamma
    self.future_allowed_extra_profit = new_allowed_extra_profit
    self.future_adjustment_step = new_adjustment_step
    self.future_ma_half_time = new_ma_half_time

    log CommitNewParameters(_deadline, new_admin_fee, new_mid_fee, new_out_fee,
                            new_fee_gamma,
                            new_allowed_extra_profit, new_adjustment_step,
                            new_ma_half_time)


@external
@nonreentrant('lock')
def apply_new_parameters():
    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

    admin_fee: uint256 = self.future_admin_fee
    if self.admin_fee != admin_fee:
        self._claim_admin_fees()
        self.admin_fee = admin_fee

    mid_fee: uint256 = self.future_mid_fee
    self.mid_fee = mid_fee
    out_fee: uint256 = self.future_out_fee
    self.out_fee = out_fee
    fee_gamma: uint256 = self.future_fee_gamma
    self.fee_gamma = fee_gamma
    allowed_extra_profit: uint256 = self.future_allowed_extra_profit
    self.allowed_extra_profit = allowed_extra_profit
    adjustment_step: uint256 = self.future_adjustment_step
    self.adjustment_step = adjustment_step
    ma_half_time: uint256 = self.future_ma_half_time
    self.ma_half_time = ma_half_time

    log NewParameters(admin_fee, mid_fee, out_fee,
                      fee_gamma,
                      allowed_extra_profit, adjustment_step,
                      ma_half_time)


@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


@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


@external
def set_admin_fee_receiver(_admin_fee_receiver: address):
    assert msg.sender == self.owner  # dev: only owner
    self.admin_fee_receiver = _admin_fee_receiver

Contract Security Audit

Contract ABI

[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"uint256","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"uint256","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[3]","indexed":false},{"name":"fee","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[3]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_index","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewParameters","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"allowed_extra_profit","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"allowed_extra_profit","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampAgamma","inputs":[{"name":"initial_A","type":"uint256","indexed":false},{"name":"future_A","type":"uint256","indexed":false},{"name":"initial_gamma","type":"uint256","indexed":false},{"name":"future_gamma","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"current_A","type":"uint256","indexed":false},{"name":"current_gamma","type":"uint256","indexed":false},{"name":"time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ClaimAdminFee","inputs":[{"name":"admin","type":"address","indexed":true},{"name":"tokens","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"owner","type":"address"},{"name":"admin_fee_receiver","type":"address"},{"name":"A","type":"uint256"},{"name":"gamma","type":"uint256"},{"name":"mid_fee","type":"uint256"},{"name":"out_fee","type":"uint256"},{"name":"allowed_extra_profit","type":"uint256"},{"name":"fee_gamma","type":"uint256"},{"name":"adjustment_step","type":"uint256"},{"name":"admin_fee","type":"uint256"},{"name":"ma_half_time","type":"uint256"},{"name":"initial_prices","type":"uint256[2]"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3361},{"stateMutability":"view","type":"function","name":"price_scale","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3391},{"stateMutability":"view","type":"function","name":"last_prices","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3421},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":468},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":582},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":597},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11991},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":21673},{"stateMutability":"view","type":"function","name":"fee_calc","inputs":[{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":11096},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11582},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3122},{"stateMutability":"view","type":"function","name":"calc_token_fee","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":26582},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[],"gas":738687},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[3]"}],"outputs":[],"gas":233981},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3429},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":13432},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"}],"outputs":[],"gas":648579},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[],"gas":389808},{"stateMutability":"nonpayable","type":"function","name":"ramp_A_gamma","inputs":[{"name":"future_A","type":"uint256"},{"name":"future_gamma","type":"uint256"},{"name":"future_time","type":"uint256"}],"outputs":[],"gas":163102},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[],"gas":157247},{"stateMutability":"nonpayable","type":"function","name":"commit_new_parameters","inputs":[{"name":"_new_mid_fee","type":"uint256"},{"name":"_new_out_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"},{"name":"_new_fee_gamma","type":"uint256"},{"name":"_new_allowed_extra_profit","type":"uint256"},{"name":"_new_adjustment_step","type":"uint256"},{"name":"_new_ma_half_time","type":"uint256"}],"outputs":[],"gas":306190},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[],"gas":683438},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23222},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77260},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65937},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23312},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40535},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23372},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38505},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"future_allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3828},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3858},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3888},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3918},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4057},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3978},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4008},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4038},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4068},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4098},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4128},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":4158},{"stateMutability":"view","type":"function","name":"kill_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4188},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4218},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4248},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4278}]

6101a06160fb6101403960206160fb60c03960c05160a01c1561002157600080fd5b602060206160fb0160c03960c05160a01c1561003c57600080fd5b610140516018556101805160801b6102e0526101a0516102e051176102e0526102e0516004556102e0516005556101c0516010556101e0516011556102005160085561022051600a5561024051600c556102605160125560006103005261032060006002818352015b6103005160801b610300526102a0600161032051808210156100c657600080fd5b80820390509050600281106100da57600080fd5b6020020151610340526fffffffffffffffffffffffffffffffff610340511061010257600080fd5b610300516103405117610300525b81516001018083528114156100a5575b50506103005160005561030051600155610300516002554260035561028051600e55670de0b6b3a7640000601b5542624f1a0081818301101561016257600080fd5b80820190509050601f55610160516022556160e356600436101561000d57613762565b600035601c52600051635b41b90881141561002d5760006101405261005e565b63394747c58114156100595760843560011c1561004957600080fd5b602060846101403760005061005e565b610e29565b6023541561006b57600080fd5b6001602355601e541561007d57600080fd5b6024356004351861008d57600080fd5b60036004351061009c57600080fd5b6003602435106100ab57600080fd5b6000604435116100ba57600080fd5b610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a08051610160528060200151610180525060168060c052602060c020546101a05260018160c052602060c02001546101c05260028160c052602060c02001546101e052506024356102005260403661022037600115610d2b5773dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a0526002600435141561019d57610140516101a0565b60005b1561020a5760443534146101b357600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6101d257600080fd5b60006000600463d0e30db06102c0526102dc3473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161020557600080fd5b61027f565b341561021557600080fd5b6102606004356003811061022857600080fd5b60200201513b61023757600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc60006102606004356003811061026f57600080fd5b60200201515af161027f57600080fd5b6101a06024356003811061029257600080fd5b60200201516102c0526101a0600435600381106102ae57600080fd5b60200201516102e0526102e0516044358181830110156102cd57600080fd5b808201905090506101a0600435600381106102e757600080fd5b60200201526101a0600435600381106102ff57600080fd5b60200201516004356003811061031457600080fd5b601660c052602060c0200155604036610300376000546103405261036060006002818352015b6fffffffffffffffffffffffffffffffff6103405116610300610360516002811061036457600080fd5b60200201526103405160801c610340525b815160010180835281141561033a575b505064e8d4a51000610360526402540be4006103805260016103a0526101a0805164e8d4a5100080820282158284830414176103c057600080fd5b809050905090508152506103c060016002818352015b6101a06103c051600381106103ea57600080fd5b60200201516103006103c05160018082101561040557600080fd5b808203905090506002811061041957600080fd5b6020020151808202821582848304141761043257600080fd5b809050905090506103606103c0516003811061044d57600080fd5b6020020151808202821582848304141761046657600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06103c0516003811061049157600080fd5b60200201525b81516001018083528114156103d6575b5050610360600435600381106104bc57600080fd5b60200201516103c05260011561064b576007546103e05260006103e051111561064b576102e080516103c05180820282158284830414176104fc57600080fd5b8090509050905081525060006004351115610573576102e05161030060043560018082101561052a57600080fd5b808203905090506002811061053e57600080fd5b6020020151808202821582848304141761055757600080fd5b80905090509050670de0b6b3a7640000808204905090506102e0525b6101a06004356003811061058657600080fd5b6020020151610400526102e0516101a0600435600381106105a657600080fd5b6020020152602061052060a463c7fab70861042052610160516104405261018051610460526101a051610480526101c0516104a0526101e0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61060657600080fd5b601f3d1161061357600080fd5b60005061052051601755610400516101a06004356003811061063457600080fd5b60200201526103e0514210151561064b5760016007555b6103606024356003811061065e57600080fd5b60200201516103e0526101a06024356003811061067a57600080fd5b6020020151602061054060e46336bc885561040052610160516104205261018051610440526101a051610460526101c051610480526101e0516104a0526017546104c0526024356104e05261041c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6106e857600080fd5b601f3d116106f557600080fd5b600050610540518082101561070957600080fd5b80820390509050610240526101a06024356003811061072757600080fd5b602002018051610240518082101561073e57600080fd5b80820390509050815250610240805160018082101561075c57600080fd5b80820390509050815250600060243511156107dd5761024051670de0b6b3a7640000808202821582848304141761079257600080fd5b809050905090506103006024356001808210156107ae57600080fd5b80820390509050600281106107c257600080fd5b602002015180806107d257600080fd5b820490509050610240525b61024080516103e05180806107f157600080fd5b8204905090508152506102408051610140610400525b6104005151602061040051016104005261040061040051101561082957610807565b6101a051610420526101c051610440526101e0516104605261046051610440516104205160065801613b9b565b6104c0526103e0610400525b610400515260206104005103610400526101406104005110151561088557610862565b6104c0516102405180820282158284830414176108a157600080fd5b809050905090506402540be40080820490509050808210156108c257600080fd5b808203905090508152506064356102405110151515610920576308c379a0610400526020610420526008610440527f536c6970706167650000000000000000000000000000000000000000000000006104605261044050606461041cfd5b6102c08051610240518082101561093657600080fd5b808203905090508152506102c0516024356003811061095457600080fd5b601660c052602060c0200155600260243514156109745761014051610977565b60005b15610a1c5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61099b57600080fd5b600060006024632e1a7d4d61040052610240516104205261041c600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16109d757600080fd5b6000610400526104008051602001806104408284600060045af16109fa57600080fd5b5050600060006104405161046061024051335af1610a1757600080fd5b610a82565b61026060243560038110610a2f57600080fd5b60200201513b610a3e57600080fd5b60006000604463a9059cbb610400523361042052610240516104405261041c600061026060243560038110610a7257600080fd5b60200201515af1610a8257600080fd5b6102c080516103e0518082028215828483041417610a9f57600080fd5b8090509050905081525060006024351115610b16576102c051610300602435600180821015610acd57600080fd5b8082039050905060028110610ae157600080fd5b60200201518082028215828483041417610afa57600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0525b6102c0516101a060243560038110610b2d57600080fd5b6020020152620186a06044351115610b4d57620186a06102405111610b50565b60005b15610d2b576044356103c0518082028215828483041417610b7057600080fd5b8090509050905061040052610240516103e0518082028215828483041417610b9757600080fd5b809050905090506104205260006004351815610bb95760006024351415610bbc565b60005b15610c93576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610c0557600080fd5b80820390509050600160ff1b8110610c1c57600080fd5b8082028215828483051417610c3057600080fd5b809050905090506000811215610c4d57600254816000031c610c53565b600254811b5b905016610400518082028215828483041417610c6e57600080fd5b80905090509050610420518080610c8457600080fd5b82049050905061022052610d2b565b6004351515610ce25761040051670de0b6b3a76400008082028215828483041417610cbd57600080fd5b80905090509050610420518080610cd357600080fd5b82049050905061022052610d2b565b61042051670de0b6b3a76400008082028215828483041417610d0357600080fd5b80905090509050610400518080610d1957600080fd5b82049050905061022052600435610200525b6101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e052610200516103005261022051610320526000610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561026052604435610280526024356102a052610240516102c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610260a26000602355005b6368727653811415610e70573415610e4057600080fd5b6004356101405260015461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63a3f7cdd5811415610eb7573415610e8757600080fd5b6004356101405260005461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b6359189017811415610efe573415610ece57600080fd5b6004356101405260025461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63fc0c546a811415610f33573415610f1557600080fd5b73c4ad29ba4b3c580e6d59105fff484999997675ff60005260206000f35b63c6610657811415610fb6573415610f4a57600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101805261014060043560038110610fa857600080fd5b602002015160005260206000f35b63f446c1d0811415610feb573415610fcd57600080fd5b600658016139a3565b61014052610160526101405160005260206000f35b63b137392981141561102357341561100257600080fd5b600658016139a3565b61014052610160526101406020015160005260206000f35b63ddca3f438114156110d957341561103a57600080fd5b6006580161380e565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e0516102405261024051610220516102005160065801613b9b565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e56258114156111315734156110f057600080fd5b60048035610140528060200135610160528060400135610180525061018051610160516101405160065801613b9b565b6101e0526101e05160005260206000f35b63bb7b8b808114156111e957341561114857600080fd5b670de0b6b3a7640000601754610140526101405160065801613ca8565b6101a0526101a051808202821582848304141761118157600080fd5b80905090509050602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6111bb57600080fd5b601f3d116111c857600080fd5b6000506102205180806111da57600080fd5b82049050905060005260206000f35b63556d6e9f81141561125857341561120057600080fd5b6020610200606463556d6e9f61014052606060046101603761015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa61123b57600080fd5b601f3d1161124857600080fd5b6000506102005160005260206000f35b63cde699fa8114156112d757341561126f57600080fd5b600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a0516101805161016051610140516006580161543f565b610240526102405160005260206000f35b634515cef38114156120a757602354156112f057600080fd5b6001602355341561130057600080fd5b601e541561130d57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525073dac17f958d2ee523a2206206994597c13d831ec761018052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101203661024037600f6103605260011561184c576101e05161038052610200516103a052610220516103c0526103e060006003818352015b6101e06103e0516003811061140c57600080fd5b602002015160046103e0516003811061142457600080fd5b602002013581818301101561143857600080fd5b8082019050905061040052610400516101e06103e0516003811061145b57600080fd5b6020020152610400516103e0516003811061147557600080fd5b601660c052602060c02001555b81516001018083528114156113f8575b50506101e0516102a052610200516102c052610220516102e05264e8d4a510006103e0526402540be40061040052600161042052600054610440526101e0805164e8d4a5100080820282158284830414176114ec57600080fd5b80905090509050815250610380805164e8d4a51000808202821582848304141761151557600080fd5b8090509050905081525061046060016002818352015b6fffffffffffffffffffffffffffffffff61044051166103e0610460516003811061155557600080fd5b6020020151808202821582848304141761156e57600080fd5b80905090509050610480526101e0610460516003811061158d57600080fd5b60200201516104805180820282158284830414176115aa57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e061046051600381106115d557600080fd5b602002015261038061046051600381106115ee57600080fd5b602002015161048051808202821582848304141761160b57600080fd5b80905090509050670de0b6b3a764000080820490509050610380610460516003811061163657600080fd5b60200201526104405160801c610440525b815160010180835281141561152b575b505061046060006003818352015b60006004610460516003811061167a57600080fd5b6020020135111561178557610180610460516003811061169957600080fd5b60200201513b6116a857600080fd5b6000600060646323b872dd61048052336104a052306104c052600461046051600381106116d457600080fd5b60200201356104e05261049c600061018061046051600381106116f657600080fd5b60200201515af161170657600080fd5b6101e0610460516003811061171a57600080fd5b6020020151610380610460516003811061173357600080fd5b60200201518082101561174557600080fd5b80820390509050610240610460516003811061176057600080fd5b6020020152600f61036051141561177e576104605161036052611785565b600e610360525b8151600101808352811415611665575b5050600f61036051186117a757600080fd5b60075461046052600061046051111561184457602061058060a463c7fab70861048052610140516104a052610160516104c052610380516104e0526103a051610500526103c0516105205261049c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61181557600080fd5b601f3d1161182257600080fd5b6000506105805161034052610460514210151561183f5760016007555b61184c565b601754610340525b60206104a060a463c7fab7086103a052610140516103c052610160516103e0526101e05161040052610200516104205261022051610440526103bc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6118a757600080fd5b601f3d116118b457600080fd5b6000506104a05161038052602061042060046318160ddd6103c0526103dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6118f257600080fd5b601f3d116118ff57600080fd5b600050610420516103a052600061034051111561196f576103a05161038051808202821582848304141761193257600080fd5b8090509050905061034051808061194857600080fd5b8204905090506103a0518082101561195f57600080fd5b80820390509050610300526119e6565b6101406103c0525b6103c0515160206103c051016103c0526103c06103c051101561199957611977565b610380516103e0526103e05160065801613ca8565b610440526103a06103c0525b6103c0515260206103c051036103c0526101406103c0511015156119dd576119ba565b61044051610300525b600061030051116119f657600080fd5b6000610340511115611f96576101406103c0525b6103c0515160206103c051016103c0526103c06103c0511015611a2c57611a0a565b610240516103e052610260516104005261028051610420526101e051610440526102005161046052610220516104805261048051610460516104405161042051610400516103e0516006580161543f565b6104e0526103a06103c0525b6103c0515260206103c051036103c0526101406103c051101515611aac57611a89565b6104e051610300518082028215828483041417611ac857600080fd5b809050905090506402540be400808204905090506001818183011015611aed57600080fd5b808201905090506103205261030080516103205180821015611b0e57600080fd5b808203905090508152506103a0805161030051818183011015611b3057600080fd5b80820190509050815250602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611b7c57600080fd5b601f3d11611b8957600080fd5b6000506104605060006103c052620186a0610300511115611ed0576003610360511015611ed0576060366103e0376002546104405264e8d4a51000610460526402540be4006104805260016104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff61044051166104006104c05160028110611c0e57600080fd5b60200201526104405160801c610440525b8151600101808352811415611be4575b50506104c060006003818352015b610360516104c0511815611d63576104c0511515611c9d576103e080516102a05164e8d4a510008082028215828483041417611c7857600080fd5b80905090509050818183011015611c8e57600080fd5b80820190509050815250611d63565b6103e080516102a06104c05160038110611cb657600080fd5b60200201516104006104c051600180821015611cd157600080fd5b8082039050905060028110611ce557600080fd5b60200201518082028215828483041417611cfe57600080fd5b809050905090506104606104c05160038110611d1957600080fd5b60200201518082028215828483041417611d3257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611d5857600080fd5b808201905090508152505b8151600101808352811415611c3d575b50506103e051610300518082028215828483041417611d9157600080fd5b809050905090506103a0518080611da757600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417611dd257600080fd5b8090509050905060046103605160038110611dec57600080fd5b60200201356104606103605160038110611e0557600080fd5b60200201518082028215828483041417611e1e57600080fd5b80905090509050610300516102a06103605160038110611e3d57600080fd5b60200201518082028215828483041417611e5657600080fd5b809050905090506104606103605160038110611e7157600080fd5b60200201518082028215828483041417611e8a57600080fd5b809050905090506103a0518080611ea057600080fd5b82049050905080821015611eb357600080fd5b808203905090508080611ec557600080fd5b8204905090506103c0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611efa57611ed8565b610140516104005261016051610420526101e0516104405261020051610460526102205161048052610360516104a0526103c0516104c052610380516104e0526104e0516104c0516104a0516104805161046051610440516104205161040051600658016142cf565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611f8e57611f6b565b60005061200c565b61038051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611ff757600080fd5b601f3d1161200457600080fd5b600050610460505b6064356103005110151515612060576308c379a06103c05260206103e0526008610400527f536c697070616765000000000000000000000000000000000000000000000000610420526104005060646103dcfd5b606060046103c03761032051610420526103a05161044052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103c0a26000602355005b63ecb586a581141561243457602354156120c057600080fd5b600160235534156120d057600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261018052602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa61214e57600080fd5b601f3d1161215b57600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af16121a757600080fd5b601f3d116121b457600080fd5b6000506102605060168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c0200154610200525060043560018082101561220057600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061222b57600080fd5b602002015161022051808202821582848304141761224857600080fd5b809050905090506101a051808061225e57600080fd5b820490509050610260526024610240516003811061227b57600080fd5b602002013561026051101561228f57600080fd5b6101c061024051600381106122a357600080fd5b602002015161026051808210156122b957600080fd5b8082039050905061024051600381106122d157600080fd5b601660c052602060c0200155610260516101c061024051600381106122f557600080fd5b6020020152610140610240516003811061230e57600080fd5b60200201513b61231d57600080fd5b60006000604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061235257600080fd5b60200201515af161236257600080fd5b8151600101808352811415612217575b505060175461024052610240516102405161022051808202821582848304141761239b57600080fd5b809050905090506101a05180806123b157600080fd5b820490509050808210156123c457600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156123fa57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156124cd57341561244b57600080fd5b60643560011c1561245b57600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa6124b057600080fd5b601f3d116124bd57600080fd5b6000506102205160005260206000f35b634fb08c5e8114156125f65734156124e457600080fd5b600658016139a3565b610140526101605261014080516101805280602001516101a052506101405161016051610180516101a051610180516101c0526101a0516101e0526040600461020037600161024052600061026052610260516102405161022051610200516101e0516101c0516006580161567c565b6102c0526102e052610300526103205261034052610360526101a0526101805261016052610140526102c08080808051610380525050602081019050808080516103a0525050602081019050808080516103c05250506020810190508080808080516103e05250506020810190508080805161040052505060208101905080808051610420525050505050506103805160005260206000f35b63f1dc3cc9811415612a4b576023541561260f57600080fd5b6001602355341561261f57600080fd5b601e541561262c57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525060c03661018037600754610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161014051610260526101605161028052604060046102a037600061024051116102e052600161030052610300516102e0516102c0516102a05161028051610260516006580161567c565b61036052610380526103a0526103c0526103e052610400526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080808080516104205250506020810190508080805161044052505060208101905080808051610460525050602081019050808080808051610480525050602081019050808080516104a0525050602081019050808080516104c05250505050505061042080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612809576308c379a06102605260206102805260086102a0527f536c6970706167650000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b610240514210151561281b5760016007555b6024356003811061282b57600080fd5b601660c052602060c020018054610180518082101561284957600080fd5b80820390509050815550602061030060446379cc67906102605233610280526004356102a05261027c600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161289457600080fd5b601f3d116128a157600080fd5b600050610300506101405161016051610180516101a0516101c0516101e051610200516102205161024051610140516102605261016051610280526101e0516102a052610200516102c052610220516102e052602435610300526101c051610320526101a051610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005073dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a052610260602435600381106129b957600080fd5b60200201513b6129c857600080fd5b60006000604463a9059cbb6102c052336102e05261018051610300526102dc6000610260602435600381106129fc57600080fd5b60200201515af1612a0c57600080fd5b604060046102c0376101805161030052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606102c0a26000602355005b63c93f49e8811415612a875760235415612a6457600080fd5b60016023553415612a7457600080fd5b60065801613de9565b6000506000602355005b635e248072811415612cee573415612a9e57600080fd5b6018543314612aac57600080fd5b6006546201517f818183011015612ac257600080fd5b808201905090504211612ad457600080fd5b426201517f818183011015612ae857600080fd5b8082019050905060443511612afc57600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b6101805261016051610180511761018052600060043511612b5757600080fd5b63a0eebb0160043510612b6957600080fd5b6402540be3ff60243511612b7c57600080fd5b662386f26fc1000160243510612b9157600080fd5b670de0b6b3a76400006004358082028215828483041417612bb157600080fd5b80905090509050610140518080612bc757600080fd5b8204905090506101a052678ac7230489e800016101a05110612be857600080fd5b67016345785d89ffff6101a05111612bff57600080fd5b670de0b6b3a76400006024358082028215828483041417612c1f57600080fd5b80905090509050610160518080612c3557600080fd5b8204905090506101a052678ac7230489e800016101a05110612c5657600080fd5b67016345785d89ffff6101a05111612c6d57600080fd5b610180516004554260065560043560801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e052600435610200526101605161022052602435610240524261026052604435610280527fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd0560c06101e0a1005b63244c7c2e811415612db3573415612d0557600080fd5b6018543314612d1357600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612fac573415612dca57600080fd5b6018543314612dd857600080fd5b60215415612de557600080fd5b60e06004610140376402540be401610160511015612e14576207a11f6101605111612e0f57600080fd5b612e1c565b601154610160525b6402540be400610140511115612e3457601054610140525b61016051610140511115612e4757600080fd5b6402540be400610180511115612e5f57601254610180525b670de0b6b3a76400006101a0511015612e875760006101a05111612e8257600080fd5b612e8f565b600a546101a0525b670de0b6b3a76400006101c0511115612eaa576008546101c0525b670de0b6b3a76400006101e0511115612ec557600c546101e0525b62093a80610200511015612ee85760006102005111612ee357600080fd5b612ef0565b600e54610200525b426203f480818183011015612f0457600080fd5b8082019050905061022052610220516021556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd8114156130f05760235415612fc557600080fd5b60016023553415612fd557600080fd5b6018543314612fe357600080fd5b602154421015612ff257600080fd5b60006021541861300157600080fd5b600060215560155461014052610140516012541815613036576101405160065801613de9565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb81141561311c57341561310757600080fd5b601854331461311557600080fd5b6000602155005b636b441a408114156131b957341561313357600080fd5b60043560a01c1561314357600080fd5b601854331461315157600080fd5b6020541561315e57600080fd5b426203f48081818301101561317257600080fd5b808201905090506101405261014051602055600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561323b5734156131d057600080fd5b60185433146131de57600080fd5b6020544210156131ed57600080fd5b6000602054186131fc57600080fd5b60006020556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561326757341561325257600080fd5b601854331461326057600080fd5b6000602055005b63e36988538114156132a157341561327e57600080fd5b601854331461328c57600080fd5b42601f541161329a57600080fd5b6001601e55005b633046f9728114156132cd5734156132b857600080fd5b60185433146132c657600080fd5b6000601e55005b637242e52481141561330a5734156132e457600080fd5b60043560a01c156132f457600080fd5b601854331461330257600080fd5b600435602255005b636112c74781141561332d57341561332157600080fd5b60035460005260206000f35b63204fe3d581141561335057341561334457600080fd5b60045460005260206000f35b63f30cfad581141561337357341561336757600080fd5b60055460005260206000f35b63e89876ff81141561339657341561338a57600080fd5b60065460005260206000f35b63f9ed95978114156133b95734156133ad57600080fd5b60075460005260206000f35b6349fe9e778114156133dc5734156133d057600080fd5b60085460005260206000f35b63727ced578114156133ff5734156133f357600080fd5b60095460005260206000f35b6372d4f0e281141561342257341561341657600080fd5b600a5460005260206000f35b63d7c3dcbe81141561344557341561343957600080fd5b600b5460005260206000f35b63083812e581141561346857341561345c57600080fd5b600c5460005260206000f35b634ea12c7d81141561348b57341561347f57600080fd5b600d5460005260206000f35b63662b62748114156134ae5734156134a257600080fd5b600e5460005260206000f35b630c5e23d48114156134d15734156134c557600080fd5b600f5460005260206000f35b6392526c0c8114156134f45734156134e857600080fd5b60105460005260206000f35b63ee8de67581141561351757341561350b57600080fd5b60115460005260206000f35b63fee3f7f981141561353a57341561352e57600080fd5b60125460005260206000f35b637cf9aedc81141561355d57341561355157600080fd5b60135460005260206000f35b637d1b060c81141561358057341561357457600080fd5b60145460005260206000f35b63e38244628114156135a357341561359757600080fd5b60155460005260206000f35b634903b0d18114156135df5734156135ba57600080fd5b600435600381106135ca57600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156136025734156135f657600080fd5b60175460005260206000f35b638da5cb5b81141561362557341561361957600080fd5b60185460005260206000f35b631ec0cdc181141561364857341561363c57600080fd5b60195460005260206000f35b637ba1a74d81141561366b57341561365f57600080fd5b601a5460005260206000f35b630b7b594b81141561368e57341561368257600080fd5b601b5460005260206000f35b630c46b72a8114156136b15734156136a557600080fd5b601c5460005260206000f35b639c868ac08114156136d45734156136c857600080fd5b601e5460005260206000f35b632a4268968114156136f75734156136eb57600080fd5b601f5460005260206000f35b63e0a0b58681141561371a57341561370e57600080fd5b60205460005260206000f35b63405e28f881141561373d57341561373157600080fd5b60215460005260206000f35b636e42e4d281141561376057341561375457600080fd5b60225460005260206000f35b505b005b6101805261014052610160526002610140511061378057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061014051600160ff1b81106137c657600080fd5b80820282158284830514176137da57600080fd5b8090509050905060008112156137f85761016051816000031c6137ff565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05264e8d4a510006101e0526402540be40061020052600161022052610160805164e8d4a51000808202821582848304141761388557600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e061024051600381106138c557600080fd5b602002015180820282158284830414176138de57600080fd5b809050905090506102605261016061024051600381106138fd57600080fd5b602002015161026051808202821582848304141761391a57600080fd5b80905090509050670de0b6b3a764000080820490509050610160610240516003811061394557600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561389b575b50506060610240525b6000610240511115156139815761399d565b602061024051036101600151602061024051036102405261396f565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613b50576004546101e0526006546102005261016080516102005180821015613a0957600080fd5b80820390509050815250426102005180821015613a2557600080fd5b8082039050905061020052610160516102005180821015613a4557600080fd5b80820390509050610220526101e05160801c610220518082028215828483041417613a6f57600080fd5b809050905090506101c051610200518082028215828483041417613a9257600080fd5b80905090509050818183011015613aa857600080fd5b80820190509050610160518080613abe57600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e05116610220518082028215828483041417613af657600080fd5b809050905090506101a051610200518082028215828483041417613b1957600080fd5b80905090509050818183011015613b2f57600080fd5b80820190509050610160518080613b4557600080fd5b8204905090506101a0525b6101c051610200526101a0516102205260406101e0525b60006101e051111515613b7957613b95565b60206101e05103610200015160206101e051036101e052613b67565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613bfd57600080fd5b601f3d11613c0a57600080fd5b6000506102c0516101c0526010546101c0518082028215828483041417613c3057600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613c5457600080fd5b808203905090508082028215828483041417613c6f57600080fd5b80905090509050818183011015613c8557600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613cfc57600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613d2f57600080fd5b809050905090508080613d4157600080fd5b8204905090506101806102005160038110613d5b57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613cdb575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613dc957600080fd5b601f3d11613dd657600080fd5b6000506102c05160005260005161016051565b61014052610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a080516101605280602001516101805250601a546101a052601b546101c05273dac17f958d2ee523a2206206994597c13d831ec76101e052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102005273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102205261024060006003818352015b60206102e060246370a0823161026052306102805261027c6101e06102405160038110613eba57600080fd5b60200201515afa613eca57600080fd5b601f3d11613ed757600080fd5b6000506102e0516102405160038110613eef57600080fd5b601660c052602060c02001555b8151600101808352811415613e8e575b5050601c54610240526101c0516101a05111156140cc576101a0516101c05180821015613f3857600080fd5b808203905090506012548082028215828483041417613f5657600080fd5b809050905090506404a817c800808204905090506102605260006102605111156140cc576022546102805261024051670de0b6b3a76400008082028215828483041417613fa257600080fd5b80905090509050610240516102605180821015613fbe57600080fd5b808203905090508080613fd057600080fd5b820490509050670de0b6b3a764000080821015613fec57600080fd5b808203905090506102a05260206103806044636962f8456102e05261028051610300526102a051610320526102fc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161403c57600080fd5b601f3d1161404957600080fd5b600050610380516102c0526101a08051610260516002808202821582848304141761407357600080fd5b809050905090508082101561408757600080fd5b808203905090508152506101a051601a556102c0516102e052610280517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf5960206102e0a25b60206102e060046318160ddd6102805261029c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6140ff57600080fd5b601f3d1161410c57600080fd5b6000506102e05161026052602061040060a463c7fab70861030052610160516103205261018051610340526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516006580161380e565b6102a0526102c0526102e05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102a080516103605280602001516103805280604001516103a0525061031c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6141e357600080fd5b601f3d116141f057600080fd5b600050610400516102805261028051601755670de0b6b3a76400006101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610280516102a0526102a05160065801613ca8565b6103005261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051808202821582848304141761429457600080fd5b809050905090506102605180806142aa57600080fd5b820490509050601c556101c0516101a05111156142c9576101a051601b555b61014051565b610240526101405261016052610180526101a0526101c0526101e052610200526102205261016036610260376001546103c0526103e060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102606103e0516002811061433857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561430e575b50506003546103e0526002546103c05261040060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102a0610400516002811061439f57600080fd5b60200201526103c05160801c6103c0525b8151600101808352811415614375575b5050426103e051101561460557600e546104005260206104e0604463571bae3f61044052426103e051808210156143f657600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761441a57600080fd5b8090509050905061040051808061443057600080fd5b820490509050610460526402540be4006104805261045c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61446757600080fd5b601f3d1161447457600080fd5b6000506104e0516104205260006103c05261044060006002818352015b6102a061044051600281106144a557600080fd5b6020020151670de0b6b3a764000061042051808210156144c457600080fd5b8082039050905080820282158284830414176144df57600080fd5b8090509050905061026061044051600281106144fa57600080fd5b602002015161042051808202821582848304141761451757600080fd5b8090509050905081818301101561452d57600080fd5b80820190509050670de0b6b3a764000080820490509050610260610440516002811061455857600080fd5b60200201525b8151600101808352811415614491575b505061044060006002818352015b6103c05160801b6103c0526102606001610440518082101561459d57600080fd5b80820390509050600281106145b157600080fd5b6020020151610460526fffffffffffffffffffffffffffffffff61046051106145d957600080fd5b6103c05161046051176103c0525b815160010180835281141561457c575b50506103c051600155426003555b610220516104005261022051151561468b57602061052060a463c7fab708610420526101405161044052610160516104605261018051610480526101a0516104a0526101c0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61467257600080fd5b601f3d1161467f57600080fd5b60005061052051610400525b6000546103c05261042060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102e061042051600281106146c857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561469e575b505060006102005111156147cb5760006101e051111561473b57610200516102a06101e05160018082101561471d57600080fd5b808203905090506002811061473157600080fd5b60200201526147c6565b61042060006002818352015b6102a0610420516002811061475b57600080fd5b6020020151670de0b6b3a7640000808202821582848304141761477d57600080fd5b8090509050905061020051808061479357600080fd5b8204905090506102a061042051600281106147ad57600080fd5b60200201525b8151600101808352811415614747575b50505b614976565b61018051610420526101a051610440526101c0516104605261042051620f4240808204905090506104805261042080516104805181818301101561480e57600080fd5b808201905090508152506104a060006002818352015b6102e06104a0516002811061483857600080fd5b602002015161048051808202821582848304141761485557600080fd5b809050905090506101806104a051600181818301101561487457600080fd5b808201905090506003811061488857600080fd5b6020020151602061060060e46336bc88556104c052610140516104e052610160516105005261042051610520526104405161054052610460516105605261040051610580526104a05160018181830110156148e257600080fd5b808201905090506105a0526104dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61491057600080fd5b601f3d1161491d57600080fd5b600050610600518082101561493157600080fd5b80820390509050808061494357600080fd5b8204905090506102a06104a0516002811061495d57600080fd5b60200201525b8151600101808352811415614824575b50505b60006103c05261042060006002818352015b6103c05160801b6103c0526102a0600161042051808210156149a957600080fd5b80820390509050600281106149bd57600080fd5b6020020151610440526fffffffffffffffffffffffffffffffff61044051106149e557600080fd5b6103c05161044051176103c0525b8151600101808352811415614988575b50506103c05160025560206104a060046318160ddd6104405261045c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa614a3f57600080fd5b601f3d11614a4c57600080fd5b6000506104a05161042052601a5461044052601c5461046052610400516003808204905090506103205261048060006002818352015b61040051670de0b6b3a76400008082028215828483041417614aa357600080fd5b8090509050905060036102e06104805160028110614ac057600080fd5b60200201518082028215828483041417614ad957600080fd5b809050905090508080614aeb57600080fd5b820490509050610320610480516001818183011015614b0957600080fd5b8082019050905060038110614b1d57600080fd5b60200201525b8151600101808352811415614a82575b5050670de0b6b3a764000061048052670de0b6b3a76400006104a0526000610460511115614cb95760206105a0606463bad1dc266104e0526103205161050052610340516105205261036051610540526104fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614ba657600080fd5b601f3d11614bb357600080fd5b6000506105a0516104c052670de0b6b3a76400006104c0518082028215828483041417614bdf57600080fd5b80905090509050610420518080614bf557600080fd5b8204905090506104a052610440516104a0518082028215828483041417614c1b57600080fd5b80905090509050610460518080614c3157600080fd5b820490509050610480526007546104e052610460516104a0511015614c5a576104e05115614c5d565b60005b15614ca7576308c379a0610500526020610520526004610540527f4c6f7373000000000000000000000000000000000000000000000000000000006105605261054050606461051cfd5b60016104e0511415614cb95760006007555b61048051601a55601d546104c0526104c0511515614d4f576104805160026008548082028215828483041417614cee57600080fd5b80905090509050818183011015614d0457600080fd5b808201905090506104a05160028082028215828483041417614d2557600080fd5b80905090509050670de0b6b3a764000080821015614d4257600080fd5b8082039050905011614d52565b60005b15614d635760016104c0526001601d555b6104c0511561542b57600c546104e05260006105005261052060006002818352015b6102606105205160028110614d9957600080fd5b6020020151670de0b6b3a76400008082028215828483041417614dbb57600080fd5b809050905090506102e06105205160028110614dd657600080fd5b60200201518080614de657600080fd5b82049050905061054052670de0b6b3a7640000610540511115614e2d576105408051670de0b6b3a764000080821015614e1e57600080fd5b80820390509050815250614e53565b670de0b6b3a76400006105405180821015614e4757600080fd5b80820390509050610540525b61050080517001000000000000000000000000000000006105405110614e7857600080fd5b6002610540510a818183011015614e8e57600080fd5b808201905090508152505b8151600101808352811415614d85575b50507001000000000000000000000000000000006104e05110614ecb57600080fd5b60026104e0510a610500511115614ee85760006104605111614eeb565b60005b1561542b5760206105a06024634e60b1416105205261050051670de0b6b3a7640000808204905090506105405261053c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614f3b57600080fd5b601f3d11614f4857600080fd5b6000506105a0516105005261052060006002818352015b6102e06105205160028110614f7357600080fd5b6020020151610500516104e05180821015614f8d57600080fd5b808203905090508082028215828483041417614fa857600080fd5b809050905090506104e0516102606105205160028110614fc757600080fd5b60200201518082028215828483041417614fe057600080fd5b80905090509050818183011015614ff657600080fd5b8082019050905061050051808061500c57600080fd5b820490509050610380610520516002811061502657600080fd5b60200201525b8151600101808352811415614f5f575b505061018051610320526101a051610340526101c0516103605261052060006002818352015b61018061052051600181818301101561507a57600080fd5b808201905090506003811061508e57600080fd5b602002015161038061052051600281106150a757600080fd5b602002015180820282158284830414176150c057600080fd5b809050905090506102e061052051600281106150db57600080fd5b602002015180806150eb57600080fd5b82049050905061032061052051600181818301101561510957600080fd5b808201905090506003811061511d57600080fd5b60200201525b8151600101808352811415615062575b5050602061064060a463c7fab7086105405261014051610560526101605161058052610320516105a052610340516105c052610360516105e05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61519057600080fd5b601f3d1161519d57600080fd5b6000506106405161052052610520516003808204905090506103205261054060006002818352015b61052051670de0b6b3a764000080820282158284830414176151e657600080fd5b809050905090506003610380610540516002811061520357600080fd5b6020020151808202821582848304141761521c57600080fd5b80905090509050808061522e57600080fd5b82049050905061032061054051600181818301101561524c57600080fd5b808201905090506003811061526057600080fd5b60200201525b81516001018083528114156151c5575b5050670de0b6b3a76400006020610600606463bad1dc266105405261032051610560526103405161058052610360516105a05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6152cc57600080fd5b601f3d116152d957600080fd5b6000506106005180820282158284830414176152f457600080fd5b8090509050905061042051808061530a57600080fd5b82049050905061046052670de0b6b3a764000061046051111561536f5761048051600261046051808202821582848304141761534557600080fd5b80905090509050670de0b6b3a76400008082101561536257600080fd5b8082039050905011615372565b60005b156154255760006103c05261054060006002818352015b6103c05160801b6103c052610380600161054051808210156153aa57600080fd5b80820390509050600281106153be57600080fd5b6020020151610560526fffffffffffffffffffffffffffffffff61056051106153e657600080fd5b6103c05161056051176103c0525b8151600101808352811415615389575b50506103c0516000556105205160175561046051601c55610240515661542b565b6000601d555b610400516017556104a051601c5561024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e0516102805261028051610260516102405160065801613b9b565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051600380820282158284830414176154e657600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b6020610280510261014001516102605261024080516102605181818301101561553457600080fd5b808201905090508152505b815160010180835281141561550c575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156155d15761028080516102a05161026051808210156155ac57600080fd5b808203905090508181830110156155c257600080fd5b8082019050905081525061560c565b6102808051610260516102a051808210156155eb57600080fd5b8082039050905081818301101561560157600080fd5b808201905090508152505b8151600101808352811415615574575b50506102205161028051808202821582848304141761563a57600080fd5b8090509050905061024051808061565057600080fd5b820490509050620186a081818301101561566957600080fd5b8082019050905060005260005161020051565b610200526101405261016052610180526101a0526101c0526101e05260206102a060046318160ddd6102405261025c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6156cb57600080fd5b601f3d116156d857600080fd5b6000506102a05161022052610220516101805111156156f657600080fd5b60036101a0511061570657600080fd5b60168060c052602060c020546102405260018160c052602060c02001546102605260028160c052602060c0200154610280525064e8d4a510006102a0526402540be4006102c05260016102e0526000610300526c0c9f2c9cd04674edea40000000610320526001156158c557600054610340526102a0805161024051808202821582848304141761579657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a051141561581157610380516102a06101a051600381106157ec57600080fd5b6020020151808202821582848304141761580557600080fd5b80905090509050610320525b6102a0610360516003811061582557600080fd5b6020020151610240610360516003811061583e57600080fd5b6020020151808202821582848304141761585757600080fd5b8090509050905061038051808202821582848304141761587657600080fd5b80905090509050670de0b6b3a7640000808204905090506102a061036051600381106158a157600080fd5b60200201526103405160801c610340525b81516001018083528114156157ac575b50505b6101c0511561594657602061044060a463c7fab70861034052610140516103605261016051610380526102a0516103a0526102c0516103c0526102e0516103e05261035c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61592957600080fd5b601f3d1161593657600080fd5b600050610440516103005261594e565b601754610300525b6103005161034052610140610380525b610380515160206103805101610380526103806103805110156159805761595e565b6102a0516103a0526102c0516103c0526102e0516103e0526103e0516103c0516103a05160065801613b9b565b61044052610360610380525b61038051526020610380510361038052610140610380511015156159dc576159b9565b610440516103605261018051610340518082028215828483041417615a0057600080fd5b80905090509050610220518080615a1657600080fd5b8204905090506103805261034080516103805161036051610380518082028215828483041417615a4557600080fd5b809050905090506404a817c800808204905090506001818183011015615a6a57600080fd5b8082019050905080821015615a7e57600080fd5b8082039050905080821015615a9257600080fd5b80820390509050815250602061050060e46336bc88556103c052610140516103e05261016051610400526102a051610420526102c051610440526102e0516104605261034051610480526101a0516104a0526103dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa615b0757600080fd5b601f3d11615b1457600080fd5b600050610500516103a0526102a06101a05160038110615b3357600080fd5b60200201516103a05180821015615b4957600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b6d57600080fd5b80905090509050610320518080615b8357600080fd5b8204905090506103c0526103a0516102a06101a05160038110615ba557600080fd5b602002015260006103e0526101e05115615bdd57620186a06103c0511115615bd557620186a06101805111615bd8565b60005b615be0565b60005b15615ef75760006104005264e8d4a51000610420526402540be40061044052600161046052604036610480376002546104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff6104c051166104806104e05160028110615c4957600080fd5b60200201526104c05160801c6104c0525b8151600101808352811415615c1f575b50506104e060006003818352015b6101a0516104e0511815615d9e576104e0511515615cd85761040080516102405164e8d4a510008082028215828483041417615cb357600080fd5b80905090509050818183011015615cc957600080fd5b80820190509050815250615d9e565b61040080516102406104e05160038110615cf157600080fd5b60200201516104806104e051600180821015615d0c57600080fd5b8082039050905060028110615d2057600080fd5b60200201518082028215828483041417615d3957600080fd5b809050905090506104206104e05160038110615d5457600080fd5b60200201518082028215828483041417615d6d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9357600080fd5b808201905090508152505b8151600101808352811415615c78575b505061040051610380518082028215828483041417615dcc57600080fd5b80905090509050610300518080615de257600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417615e0d57600080fd5b809050905090506103c0516104206101a05160038110615e2c57600080fd5b60200201518082028215828483041417615e4557600080fd5b80905090509050610380516102406101a05160038110615e6457600080fd5b60200201518082028215828483041417615e7d57600080fd5b809050905090506104206101a05160038110615e9857600080fd5b60200201518082028215828483041417615eb157600080fd5b80905090509050610300518080615ec757600080fd5b82049050905080821015615eda57600080fd5b808203905090508080615eec57600080fd5b8204905090506103e0525b6104c06103c05181526103e0518160200152610340518160400152806060016102a05181526102c05181602001526102e0518160400152505060c0610580525b600061058051111515615f4957615f65565b602061058051036104c001516020610580510361058052615f37565b61020051565b6101786160e3036101786000396101786160e3036000f3000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000c6f3b40b6c0000000000000000000000000000000000000000000000000000000000000a7d8c00000000000000000000000000000000000000000000000000000000002aea540000000000000000000000000000000000000000000000000000001d1a94a20000000000000000000000000000000000000000000000000000001c6bf526340000000000000000000000000000000000000000000000000000001bda703f0a000000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000006e514c561b9fec00000000000000000000000000000000000000000000000000069eff91234645c0000

Deployed Bytecode

0x600436101561000d57613762565b600035601c52600051635b41b90881141561002d5760006101405261005e565b63394747c58114156100595760843560011c1561004957600080fd5b602060846101403760005061005e565b610e29565b6023541561006b57600080fd5b6001602355601e541561007d57600080fd5b6024356004351861008d57600080fd5b60036004351061009c57600080fd5b6003602435106100ab57600080fd5b6000604435116100ba57600080fd5b610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a08051610160528060200151610180525060168060c052602060c020546101a05260018160c052602060c02001546101c05260028160c052602060c02001546101e052506024356102005260403661022037600115610d2b5773dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a0526002600435141561019d57610140516101a0565b60005b1561020a5760443534146101b357600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6101d257600080fd5b60006000600463d0e30db06102c0526102dc3473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161020557600080fd5b61027f565b341561021557600080fd5b6102606004356003811061022857600080fd5b60200201513b61023757600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc60006102606004356003811061026f57600080fd5b60200201515af161027f57600080fd5b6101a06024356003811061029257600080fd5b60200201516102c0526101a0600435600381106102ae57600080fd5b60200201516102e0526102e0516044358181830110156102cd57600080fd5b808201905090506101a0600435600381106102e757600080fd5b60200201526101a0600435600381106102ff57600080fd5b60200201516004356003811061031457600080fd5b601660c052602060c0200155604036610300376000546103405261036060006002818352015b6fffffffffffffffffffffffffffffffff6103405116610300610360516002811061036457600080fd5b60200201526103405160801c610340525b815160010180835281141561033a575b505064e8d4a51000610360526402540be4006103805260016103a0526101a0805164e8d4a5100080820282158284830414176103c057600080fd5b809050905090508152506103c060016002818352015b6101a06103c051600381106103ea57600080fd5b60200201516103006103c05160018082101561040557600080fd5b808203905090506002811061041957600080fd5b6020020151808202821582848304141761043257600080fd5b809050905090506103606103c0516003811061044d57600080fd5b6020020151808202821582848304141761046657600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06103c0516003811061049157600080fd5b60200201525b81516001018083528114156103d6575b5050610360600435600381106104bc57600080fd5b60200201516103c05260011561064b576007546103e05260006103e051111561064b576102e080516103c05180820282158284830414176104fc57600080fd5b8090509050905081525060006004351115610573576102e05161030060043560018082101561052a57600080fd5b808203905090506002811061053e57600080fd5b6020020151808202821582848304141761055757600080fd5b80905090509050670de0b6b3a7640000808204905090506102e0525b6101a06004356003811061058657600080fd5b6020020151610400526102e0516101a0600435600381106105a657600080fd5b6020020152602061052060a463c7fab70861042052610160516104405261018051610460526101a051610480526101c0516104a0526101e0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61060657600080fd5b601f3d1161061357600080fd5b60005061052051601755610400516101a06004356003811061063457600080fd5b60200201526103e0514210151561064b5760016007555b6103606024356003811061065e57600080fd5b60200201516103e0526101a06024356003811061067a57600080fd5b6020020151602061054060e46336bc885561040052610160516104205261018051610440526101a051610460526101c051610480526101e0516104a0526017546104c0526024356104e05261041c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6106e857600080fd5b601f3d116106f557600080fd5b600050610540518082101561070957600080fd5b80820390509050610240526101a06024356003811061072757600080fd5b602002018051610240518082101561073e57600080fd5b80820390509050815250610240805160018082101561075c57600080fd5b80820390509050815250600060243511156107dd5761024051670de0b6b3a7640000808202821582848304141761079257600080fd5b809050905090506103006024356001808210156107ae57600080fd5b80820390509050600281106107c257600080fd5b602002015180806107d257600080fd5b820490509050610240525b61024080516103e05180806107f157600080fd5b8204905090508152506102408051610140610400525b6104005151602061040051016104005261040061040051101561082957610807565b6101a051610420526101c051610440526101e0516104605261046051610440516104205160065801613b9b565b6104c0526103e0610400525b610400515260206104005103610400526101406104005110151561088557610862565b6104c0516102405180820282158284830414176108a157600080fd5b809050905090506402540be40080820490509050808210156108c257600080fd5b808203905090508152506064356102405110151515610920576308c379a0610400526020610420526008610440527f536c6970706167650000000000000000000000000000000000000000000000006104605261044050606461041cfd5b6102c08051610240518082101561093657600080fd5b808203905090508152506102c0516024356003811061095457600080fd5b601660c052602060c0200155600260243514156109745761014051610977565b60005b15610a1c5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61099b57600080fd5b600060006024632e1a7d4d61040052610240516104205261041c600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16109d757600080fd5b6000610400526104008051602001806104408284600060045af16109fa57600080fd5b5050600060006104405161046061024051335af1610a1757600080fd5b610a82565b61026060243560038110610a2f57600080fd5b60200201513b610a3e57600080fd5b60006000604463a9059cbb610400523361042052610240516104405261041c600061026060243560038110610a7257600080fd5b60200201515af1610a8257600080fd5b6102c080516103e0518082028215828483041417610a9f57600080fd5b8090509050905081525060006024351115610b16576102c051610300602435600180821015610acd57600080fd5b8082039050905060028110610ae157600080fd5b60200201518082028215828483041417610afa57600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0525b6102c0516101a060243560038110610b2d57600080fd5b6020020152620186a06044351115610b4d57620186a06102405111610b50565b60005b15610d2b576044356103c0518082028215828483041417610b7057600080fd5b8090509050905061040052610240516103e0518082028215828483041417610b9757600080fd5b809050905090506104205260006004351815610bb95760006024351415610bbc565b60005b15610c93576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610c0557600080fd5b80820390509050600160ff1b8110610c1c57600080fd5b8082028215828483051417610c3057600080fd5b809050905090506000811215610c4d57600254816000031c610c53565b600254811b5b905016610400518082028215828483041417610c6e57600080fd5b80905090509050610420518080610c8457600080fd5b82049050905061022052610d2b565b6004351515610ce25761040051670de0b6b3a76400008082028215828483041417610cbd57600080fd5b80905090509050610420518080610cd357600080fd5b82049050905061022052610d2b565b61042051670de0b6b3a76400008082028215828483041417610d0357600080fd5b80905090509050610400518080610d1957600080fd5b82049050905061022052600435610200525b6101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e052610200516103005261022051610320526000610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561026052604435610280526024356102a052610240516102c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610260a26000602355005b6368727653811415610e70573415610e4057600080fd5b6004356101405260015461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63a3f7cdd5811415610eb7573415610e8757600080fd5b6004356101405260005461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b6359189017811415610efe573415610ece57600080fd5b6004356101405260025461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63fc0c546a811415610f33573415610f1557600080fd5b73c4ad29ba4b3c580e6d59105fff484999997675ff60005260206000f35b63c6610657811415610fb6573415610f4a57600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101805261014060043560038110610fa857600080fd5b602002015160005260206000f35b63f446c1d0811415610feb573415610fcd57600080fd5b600658016139a3565b61014052610160526101405160005260206000f35b63b137392981141561102357341561100257600080fd5b600658016139a3565b61014052610160526101406020015160005260206000f35b63ddca3f438114156110d957341561103a57600080fd5b6006580161380e565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e0516102405261024051610220516102005160065801613b9b565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e56258114156111315734156110f057600080fd5b60048035610140528060200135610160528060400135610180525061018051610160516101405160065801613b9b565b6101e0526101e05160005260206000f35b63bb7b8b808114156111e957341561114857600080fd5b670de0b6b3a7640000601754610140526101405160065801613ca8565b6101a0526101a051808202821582848304141761118157600080fd5b80905090509050602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6111bb57600080fd5b601f3d116111c857600080fd5b6000506102205180806111da57600080fd5b82049050905060005260206000f35b63556d6e9f81141561125857341561120057600080fd5b6020610200606463556d6e9f61014052606060046101603761015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa61123b57600080fd5b601f3d1161124857600080fd5b6000506102005160005260206000f35b63cde699fa8114156112d757341561126f57600080fd5b600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a0516101805161016051610140516006580161543f565b610240526102405160005260206000f35b634515cef38114156120a757602354156112f057600080fd5b6001602355341561130057600080fd5b601e541561130d57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525073dac17f958d2ee523a2206206994597c13d831ec761018052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101203661024037600f6103605260011561184c576101e05161038052610200516103a052610220516103c0526103e060006003818352015b6101e06103e0516003811061140c57600080fd5b602002015160046103e0516003811061142457600080fd5b602002013581818301101561143857600080fd5b8082019050905061040052610400516101e06103e0516003811061145b57600080fd5b6020020152610400516103e0516003811061147557600080fd5b601660c052602060c02001555b81516001018083528114156113f8575b50506101e0516102a052610200516102c052610220516102e05264e8d4a510006103e0526402540be40061040052600161042052600054610440526101e0805164e8d4a5100080820282158284830414176114ec57600080fd5b80905090509050815250610380805164e8d4a51000808202821582848304141761151557600080fd5b8090509050905081525061046060016002818352015b6fffffffffffffffffffffffffffffffff61044051166103e0610460516003811061155557600080fd5b6020020151808202821582848304141761156e57600080fd5b80905090509050610480526101e0610460516003811061158d57600080fd5b60200201516104805180820282158284830414176115aa57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e061046051600381106115d557600080fd5b602002015261038061046051600381106115ee57600080fd5b602002015161048051808202821582848304141761160b57600080fd5b80905090509050670de0b6b3a764000080820490509050610380610460516003811061163657600080fd5b60200201526104405160801c610440525b815160010180835281141561152b575b505061046060006003818352015b60006004610460516003811061167a57600080fd5b6020020135111561178557610180610460516003811061169957600080fd5b60200201513b6116a857600080fd5b6000600060646323b872dd61048052336104a052306104c052600461046051600381106116d457600080fd5b60200201356104e05261049c600061018061046051600381106116f657600080fd5b60200201515af161170657600080fd5b6101e0610460516003811061171a57600080fd5b6020020151610380610460516003811061173357600080fd5b60200201518082101561174557600080fd5b80820390509050610240610460516003811061176057600080fd5b6020020152600f61036051141561177e576104605161036052611785565b600e610360525b8151600101808352811415611665575b5050600f61036051186117a757600080fd5b60075461046052600061046051111561184457602061058060a463c7fab70861048052610140516104a052610160516104c052610380516104e0526103a051610500526103c0516105205261049c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61181557600080fd5b601f3d1161182257600080fd5b6000506105805161034052610460514210151561183f5760016007555b61184c565b601754610340525b60206104a060a463c7fab7086103a052610140516103c052610160516103e0526101e05161040052610200516104205261022051610440526103bc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6118a757600080fd5b601f3d116118b457600080fd5b6000506104a05161038052602061042060046318160ddd6103c0526103dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6118f257600080fd5b601f3d116118ff57600080fd5b600050610420516103a052600061034051111561196f576103a05161038051808202821582848304141761193257600080fd5b8090509050905061034051808061194857600080fd5b8204905090506103a0518082101561195f57600080fd5b80820390509050610300526119e6565b6101406103c0525b6103c0515160206103c051016103c0526103c06103c051101561199957611977565b610380516103e0526103e05160065801613ca8565b610440526103a06103c0525b6103c0515260206103c051036103c0526101406103c0511015156119dd576119ba565b61044051610300525b600061030051116119f657600080fd5b6000610340511115611f96576101406103c0525b6103c0515160206103c051016103c0526103c06103c0511015611a2c57611a0a565b610240516103e052610260516104005261028051610420526101e051610440526102005161046052610220516104805261048051610460516104405161042051610400516103e0516006580161543f565b6104e0526103a06103c0525b6103c0515260206103c051036103c0526101406103c051101515611aac57611a89565b6104e051610300518082028215828483041417611ac857600080fd5b809050905090506402540be400808204905090506001818183011015611aed57600080fd5b808201905090506103205261030080516103205180821015611b0e57600080fd5b808203905090508152506103a0805161030051818183011015611b3057600080fd5b80820190509050815250602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611b7c57600080fd5b601f3d11611b8957600080fd5b6000506104605060006103c052620186a0610300511115611ed0576003610360511015611ed0576060366103e0376002546104405264e8d4a51000610460526402540be4006104805260016104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff61044051166104006104c05160028110611c0e57600080fd5b60200201526104405160801c610440525b8151600101808352811415611be4575b50506104c060006003818352015b610360516104c0511815611d63576104c0511515611c9d576103e080516102a05164e8d4a510008082028215828483041417611c7857600080fd5b80905090509050818183011015611c8e57600080fd5b80820190509050815250611d63565b6103e080516102a06104c05160038110611cb657600080fd5b60200201516104006104c051600180821015611cd157600080fd5b8082039050905060028110611ce557600080fd5b60200201518082028215828483041417611cfe57600080fd5b809050905090506104606104c05160038110611d1957600080fd5b60200201518082028215828483041417611d3257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611d5857600080fd5b808201905090508152505b8151600101808352811415611c3d575b50506103e051610300518082028215828483041417611d9157600080fd5b809050905090506103a0518080611da757600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417611dd257600080fd5b8090509050905060046103605160038110611dec57600080fd5b60200201356104606103605160038110611e0557600080fd5b60200201518082028215828483041417611e1e57600080fd5b80905090509050610300516102a06103605160038110611e3d57600080fd5b60200201518082028215828483041417611e5657600080fd5b809050905090506104606103605160038110611e7157600080fd5b60200201518082028215828483041417611e8a57600080fd5b809050905090506103a0518080611ea057600080fd5b82049050905080821015611eb357600080fd5b808203905090508080611ec557600080fd5b8204905090506103c0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611efa57611ed8565b610140516104005261016051610420526101e0516104405261020051610460526102205161048052610360516104a0526103c0516104c052610380516104e0526104e0516104c0516104a0516104805161046051610440516104205161040051600658016142cf565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611f8e57611f6b565b60005061200c565b61038051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611ff757600080fd5b601f3d1161200457600080fd5b600050610460505b6064356103005110151515612060576308c379a06103c05260206103e0526008610400527f536c697070616765000000000000000000000000000000000000000000000000610420526104005060646103dcfd5b606060046103c03761032051610420526103a05161044052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103c0a26000602355005b63ecb586a581141561243457602354156120c057600080fd5b600160235534156120d057600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261018052602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa61214e57600080fd5b601f3d1161215b57600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af16121a757600080fd5b601f3d116121b457600080fd5b6000506102605060168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c0200154610200525060043560018082101561220057600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061222b57600080fd5b602002015161022051808202821582848304141761224857600080fd5b809050905090506101a051808061225e57600080fd5b820490509050610260526024610240516003811061227b57600080fd5b602002013561026051101561228f57600080fd5b6101c061024051600381106122a357600080fd5b602002015161026051808210156122b957600080fd5b8082039050905061024051600381106122d157600080fd5b601660c052602060c0200155610260516101c061024051600381106122f557600080fd5b6020020152610140610240516003811061230e57600080fd5b60200201513b61231d57600080fd5b60006000604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061235257600080fd5b60200201515af161236257600080fd5b8151600101808352811415612217575b505060175461024052610240516102405161022051808202821582848304141761239b57600080fd5b809050905090506101a05180806123b157600080fd5b820490509050808210156123c457600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156123fa57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156124cd57341561244b57600080fd5b60643560011c1561245b57600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa6124b057600080fd5b601f3d116124bd57600080fd5b6000506102205160005260206000f35b634fb08c5e8114156125f65734156124e457600080fd5b600658016139a3565b610140526101605261014080516101805280602001516101a052506101405161016051610180516101a051610180516101c0526101a0516101e0526040600461020037600161024052600061026052610260516102405161022051610200516101e0516101c0516006580161567c565b6102c0526102e052610300526103205261034052610360526101a0526101805261016052610140526102c08080808051610380525050602081019050808080516103a0525050602081019050808080516103c05250506020810190508080808080516103e05250506020810190508080805161040052505060208101905080808051610420525050505050506103805160005260206000f35b63f1dc3cc9811415612a4b576023541561260f57600080fd5b6001602355341561261f57600080fd5b601e541561262c57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525060c03661018037600754610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161014051610260526101605161028052604060046102a037600061024051116102e052600161030052610300516102e0516102c0516102a05161028051610260516006580161567c565b61036052610380526103a0526103c0526103e052610400526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080808080516104205250506020810190508080805161044052505060208101905080808051610460525050602081019050808080808051610480525050602081019050808080516104a0525050602081019050808080516104c05250505050505061042080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612809576308c379a06102605260206102805260086102a0527f536c6970706167650000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b610240514210151561281b5760016007555b6024356003811061282b57600080fd5b601660c052602060c020018054610180518082101561284957600080fd5b80820390509050815550602061030060446379cc67906102605233610280526004356102a05261027c600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161289457600080fd5b601f3d116128a157600080fd5b600050610300506101405161016051610180516101a0516101c0516101e051610200516102205161024051610140516102605261016051610280526101e0516102a052610200516102c052610220516102e052602435610300526101c051610320526101a051610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005073dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a052610260602435600381106129b957600080fd5b60200201513b6129c857600080fd5b60006000604463a9059cbb6102c052336102e05261018051610300526102dc6000610260602435600381106129fc57600080fd5b60200201515af1612a0c57600080fd5b604060046102c0376101805161030052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606102c0a26000602355005b63c93f49e8811415612a875760235415612a6457600080fd5b60016023553415612a7457600080fd5b60065801613de9565b6000506000602355005b635e248072811415612cee573415612a9e57600080fd5b6018543314612aac57600080fd5b6006546201517f818183011015612ac257600080fd5b808201905090504211612ad457600080fd5b426201517f818183011015612ae857600080fd5b8082019050905060443511612afc57600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b6101805261016051610180511761018052600060043511612b5757600080fd5b63a0eebb0160043510612b6957600080fd5b6402540be3ff60243511612b7c57600080fd5b662386f26fc1000160243510612b9157600080fd5b670de0b6b3a76400006004358082028215828483041417612bb157600080fd5b80905090509050610140518080612bc757600080fd5b8204905090506101a052678ac7230489e800016101a05110612be857600080fd5b67016345785d89ffff6101a05111612bff57600080fd5b670de0b6b3a76400006024358082028215828483041417612c1f57600080fd5b80905090509050610160518080612c3557600080fd5b8204905090506101a052678ac7230489e800016101a05110612c5657600080fd5b67016345785d89ffff6101a05111612c6d57600080fd5b610180516004554260065560043560801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e052600435610200526101605161022052602435610240524261026052604435610280527fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd0560c06101e0a1005b63244c7c2e811415612db3573415612d0557600080fd5b6018543314612d1357600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612fac573415612dca57600080fd5b6018543314612dd857600080fd5b60215415612de557600080fd5b60e06004610140376402540be401610160511015612e14576207a11f6101605111612e0f57600080fd5b612e1c565b601154610160525b6402540be400610140511115612e3457601054610140525b61016051610140511115612e4757600080fd5b6402540be400610180511115612e5f57601254610180525b670de0b6b3a76400006101a0511015612e875760006101a05111612e8257600080fd5b612e8f565b600a546101a0525b670de0b6b3a76400006101c0511115612eaa576008546101c0525b670de0b6b3a76400006101e0511115612ec557600c546101e0525b62093a80610200511015612ee85760006102005111612ee357600080fd5b612ef0565b600e54610200525b426203f480818183011015612f0457600080fd5b8082019050905061022052610220516021556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd8114156130f05760235415612fc557600080fd5b60016023553415612fd557600080fd5b6018543314612fe357600080fd5b602154421015612ff257600080fd5b60006021541861300157600080fd5b600060215560155461014052610140516012541815613036576101405160065801613de9565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb81141561311c57341561310757600080fd5b601854331461311557600080fd5b6000602155005b636b441a408114156131b957341561313357600080fd5b60043560a01c1561314357600080fd5b601854331461315157600080fd5b6020541561315e57600080fd5b426203f48081818301101561317257600080fd5b808201905090506101405261014051602055600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561323b5734156131d057600080fd5b60185433146131de57600080fd5b6020544210156131ed57600080fd5b6000602054186131fc57600080fd5b60006020556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561326757341561325257600080fd5b601854331461326057600080fd5b6000602055005b63e36988538114156132a157341561327e57600080fd5b601854331461328c57600080fd5b42601f541161329a57600080fd5b6001601e55005b633046f9728114156132cd5734156132b857600080fd5b60185433146132c657600080fd5b6000601e55005b637242e52481141561330a5734156132e457600080fd5b60043560a01c156132f457600080fd5b601854331461330257600080fd5b600435602255005b636112c74781141561332d57341561332157600080fd5b60035460005260206000f35b63204fe3d581141561335057341561334457600080fd5b60045460005260206000f35b63f30cfad581141561337357341561336757600080fd5b60055460005260206000f35b63e89876ff81141561339657341561338a57600080fd5b60065460005260206000f35b63f9ed95978114156133b95734156133ad57600080fd5b60075460005260206000f35b6349fe9e778114156133dc5734156133d057600080fd5b60085460005260206000f35b63727ced578114156133ff5734156133f357600080fd5b60095460005260206000f35b6372d4f0e281141561342257341561341657600080fd5b600a5460005260206000f35b63d7c3dcbe81141561344557341561343957600080fd5b600b5460005260206000f35b63083812e581141561346857341561345c57600080fd5b600c5460005260206000f35b634ea12c7d81141561348b57341561347f57600080fd5b600d5460005260206000f35b63662b62748114156134ae5734156134a257600080fd5b600e5460005260206000f35b630c5e23d48114156134d15734156134c557600080fd5b600f5460005260206000f35b6392526c0c8114156134f45734156134e857600080fd5b60105460005260206000f35b63ee8de67581141561351757341561350b57600080fd5b60115460005260206000f35b63fee3f7f981141561353a57341561352e57600080fd5b60125460005260206000f35b637cf9aedc81141561355d57341561355157600080fd5b60135460005260206000f35b637d1b060c81141561358057341561357457600080fd5b60145460005260206000f35b63e38244628114156135a357341561359757600080fd5b60155460005260206000f35b634903b0d18114156135df5734156135ba57600080fd5b600435600381106135ca57600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156136025734156135f657600080fd5b60175460005260206000f35b638da5cb5b81141561362557341561361957600080fd5b60185460005260206000f35b631ec0cdc181141561364857341561363c57600080fd5b60195460005260206000f35b637ba1a74d81141561366b57341561365f57600080fd5b601a5460005260206000f35b630b7b594b81141561368e57341561368257600080fd5b601b5460005260206000f35b630c46b72a8114156136b15734156136a557600080fd5b601c5460005260206000f35b639c868ac08114156136d45734156136c857600080fd5b601e5460005260206000f35b632a4268968114156136f75734156136eb57600080fd5b601f5460005260206000f35b63e0a0b58681141561371a57341561370e57600080fd5b60205460005260206000f35b63405e28f881141561373d57341561373157600080fd5b60215460005260206000f35b636e42e4d281141561376057341561375457600080fd5b60225460005260206000f35b505b005b6101805261014052610160526002610140511061378057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061014051600160ff1b81106137c657600080fd5b80820282158284830514176137da57600080fd5b8090509050905060008112156137f85761016051816000031c6137ff565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05264e8d4a510006101e0526402540be40061020052600161022052610160805164e8d4a51000808202821582848304141761388557600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e061024051600381106138c557600080fd5b602002015180820282158284830414176138de57600080fd5b809050905090506102605261016061024051600381106138fd57600080fd5b602002015161026051808202821582848304141761391a57600080fd5b80905090509050670de0b6b3a764000080820490509050610160610240516003811061394557600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561389b575b50506060610240525b6000610240511115156139815761399d565b602061024051036101600151602061024051036102405261396f565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613b50576004546101e0526006546102005261016080516102005180821015613a0957600080fd5b80820390509050815250426102005180821015613a2557600080fd5b8082039050905061020052610160516102005180821015613a4557600080fd5b80820390509050610220526101e05160801c610220518082028215828483041417613a6f57600080fd5b809050905090506101c051610200518082028215828483041417613a9257600080fd5b80905090509050818183011015613aa857600080fd5b80820190509050610160518080613abe57600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e05116610220518082028215828483041417613af657600080fd5b809050905090506101a051610200518082028215828483041417613b1957600080fd5b80905090509050818183011015613b2f57600080fd5b80820190509050610160518080613b4557600080fd5b8204905090506101a0525b6101c051610200526101a0516102205260406101e0525b60006101e051111515613b7957613b95565b60206101e05103610200015160206101e051036101e052613b67565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613bfd57600080fd5b601f3d11613c0a57600080fd5b6000506102c0516101c0526010546101c0518082028215828483041417613c3057600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613c5457600080fd5b808203905090508082028215828483041417613c6f57600080fd5b80905090509050818183011015613c8557600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613cfc57600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613d2f57600080fd5b809050905090508080613d4157600080fd5b8204905090506101806102005160038110613d5b57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613cdb575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613dc957600080fd5b601f3d11613dd657600080fd5b6000506102c05160005260005161016051565b61014052610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a080516101605280602001516101805250601a546101a052601b546101c05273dac17f958d2ee523a2206206994597c13d831ec76101e052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102005273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102205261024060006003818352015b60206102e060246370a0823161026052306102805261027c6101e06102405160038110613eba57600080fd5b60200201515afa613eca57600080fd5b601f3d11613ed757600080fd5b6000506102e0516102405160038110613eef57600080fd5b601660c052602060c02001555b8151600101808352811415613e8e575b5050601c54610240526101c0516101a05111156140cc576101a0516101c05180821015613f3857600080fd5b808203905090506012548082028215828483041417613f5657600080fd5b809050905090506404a817c800808204905090506102605260006102605111156140cc576022546102805261024051670de0b6b3a76400008082028215828483041417613fa257600080fd5b80905090509050610240516102605180821015613fbe57600080fd5b808203905090508080613fd057600080fd5b820490509050670de0b6b3a764000080821015613fec57600080fd5b808203905090506102a05260206103806044636962f8456102e05261028051610300526102a051610320526102fc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161403c57600080fd5b601f3d1161404957600080fd5b600050610380516102c0526101a08051610260516002808202821582848304141761407357600080fd5b809050905090508082101561408757600080fd5b808203905090508152506101a051601a556102c0516102e052610280517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf5960206102e0a25b60206102e060046318160ddd6102805261029c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6140ff57600080fd5b601f3d1161410c57600080fd5b6000506102e05161026052602061040060a463c7fab70861030052610160516103205261018051610340526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516006580161380e565b6102a0526102c0526102e05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102a080516103605280602001516103805280604001516103a0525061031c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6141e357600080fd5b601f3d116141f057600080fd5b600050610400516102805261028051601755670de0b6b3a76400006101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610280516102a0526102a05160065801613ca8565b6103005261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051808202821582848304141761429457600080fd5b809050905090506102605180806142aa57600080fd5b820490509050601c556101c0516101a05111156142c9576101a051601b555b61014051565b610240526101405261016052610180526101a0526101c0526101e052610200526102205261016036610260376001546103c0526103e060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102606103e0516002811061433857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561430e575b50506003546103e0526002546103c05261040060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102a0610400516002811061439f57600080fd5b60200201526103c05160801c6103c0525b8151600101808352811415614375575b5050426103e051101561460557600e546104005260206104e0604463571bae3f61044052426103e051808210156143f657600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761441a57600080fd5b8090509050905061040051808061443057600080fd5b820490509050610460526402540be4006104805261045c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61446757600080fd5b601f3d1161447457600080fd5b6000506104e0516104205260006103c05261044060006002818352015b6102a061044051600281106144a557600080fd5b6020020151670de0b6b3a764000061042051808210156144c457600080fd5b8082039050905080820282158284830414176144df57600080fd5b8090509050905061026061044051600281106144fa57600080fd5b602002015161042051808202821582848304141761451757600080fd5b8090509050905081818301101561452d57600080fd5b80820190509050670de0b6b3a764000080820490509050610260610440516002811061455857600080fd5b60200201525b8151600101808352811415614491575b505061044060006002818352015b6103c05160801b6103c0526102606001610440518082101561459d57600080fd5b80820390509050600281106145b157600080fd5b6020020151610460526fffffffffffffffffffffffffffffffff61046051106145d957600080fd5b6103c05161046051176103c0525b815160010180835281141561457c575b50506103c051600155426003555b610220516104005261022051151561468b57602061052060a463c7fab708610420526101405161044052610160516104605261018051610480526101a0516104a0526101c0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61467257600080fd5b601f3d1161467f57600080fd5b60005061052051610400525b6000546103c05261042060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102e061042051600281106146c857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561469e575b505060006102005111156147cb5760006101e051111561473b57610200516102a06101e05160018082101561471d57600080fd5b808203905090506002811061473157600080fd5b60200201526147c6565b61042060006002818352015b6102a0610420516002811061475b57600080fd5b6020020151670de0b6b3a7640000808202821582848304141761477d57600080fd5b8090509050905061020051808061479357600080fd5b8204905090506102a061042051600281106147ad57600080fd5b60200201525b8151600101808352811415614747575b50505b614976565b61018051610420526101a051610440526101c0516104605261042051620f4240808204905090506104805261042080516104805181818301101561480e57600080fd5b808201905090508152506104a060006002818352015b6102e06104a0516002811061483857600080fd5b602002015161048051808202821582848304141761485557600080fd5b809050905090506101806104a051600181818301101561487457600080fd5b808201905090506003811061488857600080fd5b6020020151602061060060e46336bc88556104c052610140516104e052610160516105005261042051610520526104405161054052610460516105605261040051610580526104a05160018181830110156148e257600080fd5b808201905090506105a0526104dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61491057600080fd5b601f3d1161491d57600080fd5b600050610600518082101561493157600080fd5b80820390509050808061494357600080fd5b8204905090506102a06104a0516002811061495d57600080fd5b60200201525b8151600101808352811415614824575b50505b60006103c05261042060006002818352015b6103c05160801b6103c0526102a0600161042051808210156149a957600080fd5b80820390509050600281106149bd57600080fd5b6020020151610440526fffffffffffffffffffffffffffffffff61044051106149e557600080fd5b6103c05161044051176103c0525b8151600101808352811415614988575b50506103c05160025560206104a060046318160ddd6104405261045c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa614a3f57600080fd5b601f3d11614a4c57600080fd5b6000506104a05161042052601a5461044052601c5461046052610400516003808204905090506103205261048060006002818352015b61040051670de0b6b3a76400008082028215828483041417614aa357600080fd5b8090509050905060036102e06104805160028110614ac057600080fd5b60200201518082028215828483041417614ad957600080fd5b809050905090508080614aeb57600080fd5b820490509050610320610480516001818183011015614b0957600080fd5b8082019050905060038110614b1d57600080fd5b60200201525b8151600101808352811415614a82575b5050670de0b6b3a764000061048052670de0b6b3a76400006104a0526000610460511115614cb95760206105a0606463bad1dc266104e0526103205161050052610340516105205261036051610540526104fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614ba657600080fd5b601f3d11614bb357600080fd5b6000506105a0516104c052670de0b6b3a76400006104c0518082028215828483041417614bdf57600080fd5b80905090509050610420518080614bf557600080fd5b8204905090506104a052610440516104a0518082028215828483041417614c1b57600080fd5b80905090509050610460518080614c3157600080fd5b820490509050610480526007546104e052610460516104a0511015614c5a576104e05115614c5d565b60005b15614ca7576308c379a0610500526020610520526004610540527f4c6f7373000000000000000000000000000000000000000000000000000000006105605261054050606461051cfd5b60016104e0511415614cb95760006007555b61048051601a55601d546104c0526104c0511515614d4f576104805160026008548082028215828483041417614cee57600080fd5b80905090509050818183011015614d0457600080fd5b808201905090506104a05160028082028215828483041417614d2557600080fd5b80905090509050670de0b6b3a764000080821015614d4257600080fd5b8082039050905011614d52565b60005b15614d635760016104c0526001601d555b6104c0511561542b57600c546104e05260006105005261052060006002818352015b6102606105205160028110614d9957600080fd5b6020020151670de0b6b3a76400008082028215828483041417614dbb57600080fd5b809050905090506102e06105205160028110614dd657600080fd5b60200201518080614de657600080fd5b82049050905061054052670de0b6b3a7640000610540511115614e2d576105408051670de0b6b3a764000080821015614e1e57600080fd5b80820390509050815250614e53565b670de0b6b3a76400006105405180821015614e4757600080fd5b80820390509050610540525b61050080517001000000000000000000000000000000006105405110614e7857600080fd5b6002610540510a818183011015614e8e57600080fd5b808201905090508152505b8151600101808352811415614d85575b50507001000000000000000000000000000000006104e05110614ecb57600080fd5b60026104e0510a610500511115614ee85760006104605111614eeb565b60005b1561542b5760206105a06024634e60b1416105205261050051670de0b6b3a7640000808204905090506105405261053c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614f3b57600080fd5b601f3d11614f4857600080fd5b6000506105a0516105005261052060006002818352015b6102e06105205160028110614f7357600080fd5b6020020151610500516104e05180821015614f8d57600080fd5b808203905090508082028215828483041417614fa857600080fd5b809050905090506104e0516102606105205160028110614fc757600080fd5b60200201518082028215828483041417614fe057600080fd5b80905090509050818183011015614ff657600080fd5b8082019050905061050051808061500c57600080fd5b820490509050610380610520516002811061502657600080fd5b60200201525b8151600101808352811415614f5f575b505061018051610320526101a051610340526101c0516103605261052060006002818352015b61018061052051600181818301101561507a57600080fd5b808201905090506003811061508e57600080fd5b602002015161038061052051600281106150a757600080fd5b602002015180820282158284830414176150c057600080fd5b809050905090506102e061052051600281106150db57600080fd5b602002015180806150eb57600080fd5b82049050905061032061052051600181818301101561510957600080fd5b808201905090506003811061511d57600080fd5b60200201525b8151600101808352811415615062575b5050602061064060a463c7fab7086105405261014051610560526101605161058052610320516105a052610340516105c052610360516105e05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61519057600080fd5b601f3d1161519d57600080fd5b6000506106405161052052610520516003808204905090506103205261054060006002818352015b61052051670de0b6b3a764000080820282158284830414176151e657600080fd5b809050905090506003610380610540516002811061520357600080fd5b6020020151808202821582848304141761521c57600080fd5b80905090509050808061522e57600080fd5b82049050905061032061054051600181818301101561524c57600080fd5b808201905090506003811061526057600080fd5b60200201525b81516001018083528114156151c5575b5050670de0b6b3a76400006020610600606463bad1dc266105405261032051610560526103405161058052610360516105a05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6152cc57600080fd5b601f3d116152d957600080fd5b6000506106005180820282158284830414176152f457600080fd5b8090509050905061042051808061530a57600080fd5b82049050905061046052670de0b6b3a764000061046051111561536f5761048051600261046051808202821582848304141761534557600080fd5b80905090509050670de0b6b3a76400008082101561536257600080fd5b8082039050905011615372565b60005b156154255760006103c05261054060006002818352015b6103c05160801b6103c052610380600161054051808210156153aa57600080fd5b80820390509050600281106153be57600080fd5b6020020151610560526fffffffffffffffffffffffffffffffff61056051106153e657600080fd5b6103c05161056051176103c0525b8151600101808352811415615389575b50506103c0516000556105205160175561046051601c55610240515661542b565b6000601d555b610400516017556104a051601c5561024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e0516102805261028051610260516102405160065801613b9b565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051600380820282158284830414176154e657600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b6020610280510261014001516102605261024080516102605181818301101561553457600080fd5b808201905090508152505b815160010180835281141561550c575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156155d15761028080516102a05161026051808210156155ac57600080fd5b808203905090508181830110156155c257600080fd5b8082019050905081525061560c565b6102808051610260516102a051808210156155eb57600080fd5b8082039050905081818301101561560157600080fd5b808201905090508152505b8151600101808352811415615574575b50506102205161028051808202821582848304141761563a57600080fd5b8090509050905061024051808061565057600080fd5b820490509050620186a081818301101561566957600080fd5b8082019050905060005260005161020051565b610200526101405261016052610180526101a0526101c0526101e05260206102a060046318160ddd6102405261025c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6156cb57600080fd5b601f3d116156d857600080fd5b6000506102a05161022052610220516101805111156156f657600080fd5b60036101a0511061570657600080fd5b60168060c052602060c020546102405260018160c052602060c02001546102605260028160c052602060c0200154610280525064e8d4a510006102a0526402540be4006102c05260016102e0526000610300526c0c9f2c9cd04674edea40000000610320526001156158c557600054610340526102a0805161024051808202821582848304141761579657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a051141561581157610380516102a06101a051600381106157ec57600080fd5b6020020151808202821582848304141761580557600080fd5b80905090509050610320525b6102a0610360516003811061582557600080fd5b6020020151610240610360516003811061583e57600080fd5b6020020151808202821582848304141761585757600080fd5b8090509050905061038051808202821582848304141761587657600080fd5b80905090509050670de0b6b3a7640000808204905090506102a061036051600381106158a157600080fd5b60200201526103405160801c610340525b81516001018083528114156157ac575b50505b6101c0511561594657602061044060a463c7fab70861034052610140516103605261016051610380526102a0516103a0526102c0516103c0526102e0516103e05261035c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61592957600080fd5b601f3d1161593657600080fd5b600050610440516103005261594e565b601754610300525b6103005161034052610140610380525b610380515160206103805101610380526103806103805110156159805761595e565b6102a0516103a0526102c0516103c0526102e0516103e0526103e0516103c0516103a05160065801613b9b565b61044052610360610380525b61038051526020610380510361038052610140610380511015156159dc576159b9565b610440516103605261018051610340518082028215828483041417615a0057600080fd5b80905090509050610220518080615a1657600080fd5b8204905090506103805261034080516103805161036051610380518082028215828483041417615a4557600080fd5b809050905090506404a817c800808204905090506001818183011015615a6a57600080fd5b8082019050905080821015615a7e57600080fd5b8082039050905080821015615a9257600080fd5b80820390509050815250602061050060e46336bc88556103c052610140516103e05261016051610400526102a051610420526102c051610440526102e0516104605261034051610480526101a0516104a0526103dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa615b0757600080fd5b601f3d11615b1457600080fd5b600050610500516103a0526102a06101a05160038110615b3357600080fd5b60200201516103a05180821015615b4957600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b6d57600080fd5b80905090509050610320518080615b8357600080fd5b8204905090506103c0526103a0516102a06101a05160038110615ba557600080fd5b602002015260006103e0526101e05115615bdd57620186a06103c0511115615bd557620186a06101805111615bd8565b60005b615be0565b60005b15615ef75760006104005264e8d4a51000610420526402540be40061044052600161046052604036610480376002546104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff6104c051166104806104e05160028110615c4957600080fd5b60200201526104c05160801c6104c0525b8151600101808352811415615c1f575b50506104e060006003818352015b6101a0516104e0511815615d9e576104e0511515615cd85761040080516102405164e8d4a510008082028215828483041417615cb357600080fd5b80905090509050818183011015615cc957600080fd5b80820190509050815250615d9e565b61040080516102406104e05160038110615cf157600080fd5b60200201516104806104e051600180821015615d0c57600080fd5b8082039050905060028110615d2057600080fd5b60200201518082028215828483041417615d3957600080fd5b809050905090506104206104e05160038110615d5457600080fd5b60200201518082028215828483041417615d6d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9357600080fd5b808201905090508152505b8151600101808352811415615c78575b505061040051610380518082028215828483041417615dcc57600080fd5b80905090509050610300518080615de257600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417615e0d57600080fd5b809050905090506103c0516104206101a05160038110615e2c57600080fd5b60200201518082028215828483041417615e4557600080fd5b80905090509050610380516102406101a05160038110615e6457600080fd5b60200201518082028215828483041417615e7d57600080fd5b809050905090506104206101a05160038110615e9857600080fd5b60200201518082028215828483041417615eb157600080fd5b80905090509050610300518080615ec757600080fd5b82049050905080821015615eda57600080fd5b808203905090508080615eec57600080fd5b8204905090506103e0525b6104c06103c05181526103e0518160200152610340518160400152806060016102a05181526102c05181602001526102e0518160400152505060c0610580525b600061058051111515615f4957615f65565b602061058051036104c001516020610580510361058052615f37565b6102005156

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000c6f3b40b6c0000000000000000000000000000000000000000000000000000000000000a7d8c00000000000000000000000000000000000000000000000000000000002aea540000000000000000000000000000000000000000000000000000001d1a94a20000000000000000000000000000000000000000000000000000001c6bf526340000000000000000000000000000000000000000000000000000001bda703f0a000000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000006e514c561b9fec00000000000000000000000000000000000000000000000000069eff91234645c0000

-----Decoded View---------------
Arg [0] : owner (address): 0xbabe61887f1de2713c6f97e567623453d3C79f67
Arg [1] : admin_fee_receiver (address): 0xeCb456EA5365865EbAb8a2661B0c503410e9B347
Arg [2] : A (uint256): 54000
Arg [3] : gamma (uint256): 3500000000000000
Arg [4] : mid_fee (uint256): 11000000
Arg [5] : out_fee (uint256): 45000000
Arg [6] : allowed_extra_profit (uint256): 2000000000000
Arg [7] : fee_gamma (uint256): 500000000000000
Arg [8] : adjustment_step (uint256): 490000000000000
Arg [9] : admin_fee (uint256): 5000000000
Arg [10] : ma_half_time (uint256): 600
Arg [11] : initial_prices (uint256[2]): 32560000000000000000000,1954200000000000000000

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347
Arg [2] : 000000000000000000000000000000000000000000000000000000000000d2f0
Arg [3] : 000000000000000000000000000000000000000000000000000c6f3b40b6c000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000a7d8c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000002aea540
Arg [6] : 000000000000000000000000000000000000000000000000000001d1a94a2000
Arg [7] : 0000000000000000000000000000000000000000000000000001c6bf52634000
Arg [8] : 0000000000000000000000000000000000000000000000000001bda703f0a000
Arg [9] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [11] : 0000000000000000000000000000000000000000000006e514c561b9fec00000
Arg [12] : 000000000000000000000000000000000000000000000069eff91234645c0000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.