ETH Price: $3,052.07 (+1.41%)
Gas: 3 Gwei

Contract

0x7fC77b5c7614E1533320Ea6DDc2Eb61fa00A9714
 
Transaction Hash
Method
Block
From
To
Value
Remove_liquidity...202172922024-07-02 7:18:476 days ago1719904727IN
Curve.fi: sBTC Swap
0 ETH0.000469412.8657523
Remove_liquidity...201211622024-06-18 20:55:3519 days ago1718744135IN
Curve.fi: sBTC Swap
0 ETH0.001956367.7386141
Remove_liquidity...201095062024-06-17 5:45:1121 days ago1718603111IN
Curve.fi: sBTC Swap
0 ETH0.000666272.63529366
Remove_liquidity200969652024-06-15 11:42:3523 days ago1718451755IN
Curve.fi: sBTC Swap
0 ETH0.000944483.46953309
Remove_liquidity...200965712024-06-15 10:23:2323 days ago1718447003IN
Curve.fi: sBTC Swap
0 ETH0.000639713.90479371
Remove_liquidity...200656692024-06-11 2:41:3527 days ago1718073695IN
Curve.fi: sBTC Swap
0 ETH0.00249715.24173478
Remove_liquidity...200004042024-06-01 23:57:4736 days ago1717286267IN
Curve.fi: sBTC Swap
0 ETH0.001264025
Remove_liquidity199958782024-06-01 8:48:4737 days ago1717231727IN
Curve.fi: sBTC Swap
0 ETH0.001269424.66235921
Remove_liquidity...199287142024-05-22 23:30:3546 days ago1716420635IN
Curve.fi: sBTC Swap
0 ETH0.00213028.43028327
Remove_liquidity...198833612024-05-16 15:13:5952 days ago1715872439IN
Curve.fi: sBTC Swap
0 ETH0.0018599911.35504355
Remove_liquidity...198111482024-05-06 12:49:3562 days ago1714999775IN
Curve.fi: sBTC Swap
0 ETH0.002355749.31841138
Remove_liquidity...197885932024-05-03 9:07:3566 days ago1714727255IN
Curve.fi: sBTC Swap
0 ETH0.001210217.43682885
Remove_liquidity...196807542024-04-18 7:08:2381 days ago1713424103IN
Curve.fi: sBTC Swap
0 ETH0.0018998111.87401532
Remove_liquidity...196583072024-04-15 3:42:3584 days ago1713152555IN
Curve.fi: sBTC Swap
0 ETH0.001222828.55519054
Remove_liquidity...196243642024-04-10 9:33:3589 days ago1712741615IN
Curve.fi: sBTC Swap
0 ETH0.0023272614.12092265
Exchange194982222024-03-23 15:34:23106 days ago1711208063IN
Curve.fi: sBTC Swap
0 ETH0.0038542717.78169106
Remove_liquidity194981822024-03-23 15:26:23106 days ago1711207583IN
Curve.fi: sBTC Swap
0 ETH0.0061789622.93099476
Remove_liquidity...193991532024-03-09 17:52:35120 days ago1710006755IN
Curve.fi: sBTC Swap
0 ETH0.0131104581.93524266
Remove_liquidity...193989812024-03-09 17:17:59120 days ago1710004679IN
Curve.fi: sBTC Swap
0 ETH0.0115142771.94892174
Exchange192730902024-02-21 2:31:47138 days ago1708482707IN
Curve.fi: sBTC Swap
0 ETH0.003693629.01884061
Remove_liquidity...192704132024-02-20 17:30:59138 days ago1708450259IN
Curve.fi: sBTC Swap
0 ETH0.0079035449.39405473
Remove_liquidity192663572024-02-20 3:52:11139 days ago1708401131IN
Curve.fi: sBTC Swap
0 ETH0.0047539524.41595371
Remove_liquidity...192581622024-02-19 0:14:23140 days ago1708301663IN
Curve.fi: sBTC Swap
0 ETH0.0054625134.13860495
Remove_liquidity...192520112024-02-18 3:24:47141 days ago1708226687IN
Curve.fi: sBTC Swap
0 ETH0.0019615913.72607805
Remove_liquidity...191323072024-02-01 8:09:59158 days ago1706774999IN
Curve.fi: sBTC Swap
0 ETH0.0030824119.26389053
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.1.0b17

Optimization Enabled:
N/A

Other Settings:
None license

Contract Source Code (Vyper language format)

# (c) Curve.Fi, 2020
# Pools for renBTC/wBTC. Ren can potentially change amount of underlying bitcoins


# External Contracts
contract ERC20m:
    def totalSupply() -> uint256: constant
    def allowance(_owner: address, _spender: address) -> uint256: constant
    def transfer(_to: address, _value: uint256) -> bool: modifying
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: modifying
    def approve(_spender: address, _value: uint256) -> bool: modifying
    def mint(_to: address, _value: uint256): modifying
    def burn(_value: uint256): modifying
    def burnFrom(_to: address, _value: uint256): modifying
    def name() -> string[64]: constant
    def symbol() -> string[32]: constant
    def decimals() -> uint256: constant
    def balanceOf(arg0: address) -> uint256: constant
    def set_minter(_minter: address): modifying



# External Contracts
contract cERC20:
    def totalSupply() -> uint256: constant
    def allowance(_owner: address, _spender: address) -> uint256: constant
    def transfer(_to: address, _value: uint256) -> bool: modifying
    def transferFrom(_from: address, _to: address, _value: uint256) -> bool: modifying
    def approve(_spender: address, _value: uint256) -> bool: modifying
    def burn(_value: uint256): modifying
    def burnFrom(_to: address, _value: uint256): modifying
    def name() -> string[64]: constant
    def symbol() -> string[32]: constant
    def decimals() -> uint256: constant
    def balanceOf(arg0: address) -> uint256: constant
    def mint(mintAmount: uint256) -> uint256: modifying
    def redeem(redeemTokens: uint256) -> uint256: modifying
    def redeemUnderlying(redeemAmount: uint256) -> uint256: modifying
    def exchangeRateStored() -> uint256: constant
    def exchangeRateCurrent() -> uint256: constant
    def supplyRatePerBlock() -> uint256: constant
    def accrualBlockNumber() -> uint256: constant


from vyper.interfaces import ERC20


# This can (and needs to) be changed at compile time
N_COINS: constant(int128) = 3  # <- change

ZERO256: constant(uint256) = 0  # This hack is really bad XXX
ZEROS: constant(uint256[N_COINS]) = [ZERO256, ZERO256, ZERO256]  # <- change

USE_LENDING: constant(bool[N_COINS]) = [True, False, False]

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
LENDING_PRECISION: constant(uint256) = 10 ** 18
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
PRECISION_MUL: constant(uint256[N_COINS]) = [convert(10000000000, uint256), convert(10000000000, uint256), convert(1, uint256)]
# PRECISION_MUL: constant(uint256[N_COINS]) = [
#     PRECISION / convert(PRECISION, uint256),  # DAI
#     PRECISION / convert(10 ** 6, uint256),   # USDC
#     PRECISION / convert(10 ** 6, uint256)]   # USDT


admin_actions_delay: constant(uint256) = 3 * 86400
min_ramp_time: constant(uint256) = 86400

# Events
TokenExchange: event({buyer: indexed(address), sold_id: int128, tokens_sold: uint256, bought_id: int128, tokens_bought: uint256})
AddLiquidity: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], invariant: uint256, token_supply: uint256})
RemoveLiquidity: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], token_supply: uint256})
RemoveLiquidityOne: event({provider: indexed(address), token_amount: uint256, coin_amount: uint256})
RemoveLiquidityImbalance: event({provider: indexed(address), token_amounts: uint256[N_COINS], fees: uint256[N_COINS], invariant: uint256, token_supply: uint256})
CommitNewAdmin: event({deadline: indexed(timestamp), admin: indexed(address)})
NewAdmin: event({admin: indexed(address)})

CommitNewFee: event({deadline: indexed(timestamp), fee: uint256, admin_fee: uint256})
NewFee: event({fee: uint256, admin_fee: uint256})
RampA: event({old_A: uint256, new_A: uint256, initial_time: timestamp, future_time: timestamp})
StopRampA: event({A: uint256, t: timestamp})

coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
fee: public(uint256)  # fee * 1e10
admin_fee: public(uint256)  # admin_fee * 1e10

max_admin_fee: constant(uint256) = 5 * 10 ** 9
max_fee: constant(uint256) = 5 * 10 ** 9
max_A: constant(uint256) = 10 ** 6
max_A_change: constant(uint256) = 10

owner: public(address)
token: ERC20m

initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(timestamp)
future_A_time: public(timestamp)

admin_actions_deadline: public(timestamp)
transfer_ownership_deadline: public(timestamp)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_owner: public(address)

kill_deadline: timestamp
kill_deadline_dt: constant(uint256) = 2 * 30 * 86400
is_killed: bool


@public
def __init__(_coins: address[N_COINS],
             _pool_token: address,
             _A: uint256, _fee: uint256):
    """
    _coins: Addresses of ERC20 conracts of coins
    _pool_token: Address of the token representing LP share
    _A: Amplification coefficient multiplied by n * (n - 1)
    _fee: Fee to charge for exchanges
    """
    for i in range(N_COINS):
        assert _coins[i] != ZERO_ADDRESS
        self.balances[i] = 0
    self.coins = _coins
    self.initial_A = _A
    self.future_A = _A
    self.fee = _fee
    self.owner = msg.sender
    self.kill_deadline = block.timestamp + kill_deadline_dt
    self.is_killed = False
    self.token = ERC20m(_pool_token)


@constant
@private
def _A() -> uint256:
    """
    Handle ramping A up or down
    """
    t1: timestamp = self.future_A_time
    A1: uint256 = self.future_A

    if block.timestamp < t1:
        A0: uint256 = self.initial_A
        t0: timestamp = self.initial_A_time
        # Expressions in uint256 cannot have negative numbers, thus "if"
        if A1 > A0:
            return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
        else:
            return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0)

    else:  # when t1 == 0 or block.timestamp >= t1
        return A1


@constant
@public
def A() -> uint256:
    return self._A()


@private
@constant
def _rates() -> uint256[N_COINS]:
    result: uint256[N_COINS] = PRECISION_MUL
    use_lending: bool[N_COINS] = USE_LENDING
    for i in range(N_COINS):
        rate: uint256 = LENDING_PRECISION  # Used with no lending
        if use_lending[i]:
            rate = cERC20(self.coins[i]).exchangeRateCurrent()
        result[i] *= rate
    return result


@private
@constant
def _xp(rates: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = rates
    for i in range(N_COINS):
        result[i] = result[i] * self.balances[i] / LENDING_PRECISION
    return result


@private
@constant
def _xp_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = rates
    for i in range(N_COINS):
        result[i] = result[i] * _balances[i] / PRECISION
    return result


@private
@constant
def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256:
    S: uint256 = 0
    for _x in xp:
        S += _x
    if S == 0:
        return 0

    Dprev: uint256 = 0
    D: uint256 = S
    Ann: uint256 = amp * N_COINS
    for _i in range(255):
        D_P: uint256 = D
        for _x in xp:
            D_P = D_P * D / (_x * N_COINS)  # If division by 0, this will be borked: only withdrawal will work. And that is good
        Dprev = D
        D = (Ann * S + D_P * N_COINS) * D / ((Ann - 1) * D + (N_COINS + 1) * D_P)
        # Equality with the precision of 1
        if D > Dprev:
            if D - Dprev <= 1:
                break
        else:
            if Dprev - D <= 1:
                break
    return D


@private
@constant
def get_D_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS], amp: uint256) -> uint256:
    return self.get_D(self._xp_mem(rates, _balances), amp)


@public
@constant
def get_virtual_price() -> uint256:
    """
    Returns portfolio virtual price (for calculating profit)
    scaled up by 1e18
    """
    D: uint256 = self.get_D(self._xp(self._rates()), self._A())
    # D is in the units similar to DAI (e.g. converted to precision 1e18)
    # When balanced, D = n * x_u - total virtual value of the portfolio
    token_supply: uint256 = self.token.totalSupply()
    return D * PRECISION / token_supply


@public
@constant
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256:
    """
    Simplified method to calculate addition or reduction in token supply at
    deposit or withdrawal without taking fees into account (but looking at
    slippage).
    Needed to prevent front-running, not for precise calculations!
    """
    _balances: uint256[N_COINS] = self.balances
    rates: uint256[N_COINS] = self._rates()
    amp: uint256 = self._A()
    D0: uint256 = self.get_D_mem(rates, _balances, amp)
    for i in range(N_COINS):
        if deposit:
            _balances[i] += amounts[i]
        else:
            _balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, _balances, amp)
    token_amount: uint256 = self.token.totalSupply()
    diff: uint256 = 0
    if deposit:
        diff = D1 - D0
    else:
        diff = D0 - D1
    return diff * token_amount / D0


@public
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
    # Amounts is amounts of c-tokens
    assert not self.is_killed

    use_lending: bool[N_COINS] = USE_LENDING
    fees: uint256[N_COINS] = ZEROS
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee
    amp: uint256 = self._A()

    token_supply: uint256 = self.token.totalSupply()
    rates: uint256[N_COINS] = self._rates()
    # Initial invariant
    D0: uint256 = 0
    old_balances: uint256[N_COINS] = self.balances
    if token_supply > 0:
        D0 = self.get_D_mem(rates, old_balances, amp)
    new_balances: uint256[N_COINS] = old_balances

    for i in range(N_COINS):
        if token_supply == 0:
            assert amounts[i] > 0
        # balances store amounts of c-tokens
        new_balances[i] = old_balances[i] + amounts[i]

    # Invariant after change
    D1: uint256 = self.get_D_mem(rates, new_balances, amp)
    assert D1 > D0

    # We need to recalculate the invariant accounting for fees
    # to calculate fair user's share
    D2: uint256 = D1
    if token_supply > 0:
        # Only account for fees if we are not the first to deposit
        for i in range(N_COINS):
            ideal_balance: uint256 = D1 * old_balances[i] / D0
            difference: uint256 = 0
            if ideal_balance > new_balances[i]:
                difference = ideal_balance - new_balances[i]
            else:
                difference = new_balances[i] - ideal_balance
            fees[i] = _fee * difference / FEE_DENOMINATOR
            self.balances[i] = new_balances[i] - (fees[i] * _admin_fee / FEE_DENOMINATOR)
            new_balances[i] -= fees[i]
        D2 = self.get_D_mem(rates, new_balances, amp)
    else:
        self.balances = new_balances

    # Calculate, how much pool tokens to mint
    mint_amount: uint256 = 0
    if token_supply == 0:
        mint_amount = D1  # Take the dust if there was any
    else:
        mint_amount = token_supply * (D2 - D0) / D0

    assert mint_amount >= min_mint_amount, "Slippage screwed you"

    # Take coins from the sender
    for i in range(N_COINS):
        if amounts[i] > 0:
            assert_modifiable(
                cERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i]))

    # Mint pool tokens
    self.token.mint(msg.sender, mint_amount)

    log.AddLiquidity(msg.sender, amounts, fees, D1, token_supply + mint_amount)


@private
@constant
def get_y(i: int128, j: int128, x: uint256, _xp: uint256[N_COINS]) -> uint256:
    # x in the input is converted to the same price/precision

    assert (i != j) and (i >= 0) and (j >= 0) and (i < N_COINS) and (j < N_COINS)

    amp: uint256 = self._A()
    D: uint256 = self.get_D(_xp, amp)
    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = amp * N_COINS

    _x: uint256 = 0
    for _i in range(N_COINS):
        if _i == i:
            _x = x
        elif _i != j:
            _x = _xp[_i]
        else:
            continue
        S_ += _x
        c = c * D / (_x * N_COINS)
    c = c * D / (Ann * N_COINS)
    b: uint256 = S_ + D / Ann  # - D
    y_prev: uint256 = 0
    y: uint256 = D
    for _i in range(255):
        y_prev = y
        y = (y*y + c) / (2 * y + b - D)
        # Equality with the precision of 1
        if y > y_prev:
            if y - y_prev <= 1:
                break
        else:
            if y_prev - y <= 1:
                break
    return y


@public
@constant
def get_dy(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in c-units
    rates: uint256[N_COINS] = self._rates()
    xp: uint256[N_COINS] = self._xp(rates)

    x: uint256 = xp[i] + (dx * rates[i] / PRECISION)
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = (xp[j] - y - 1) * PRECISION / rates[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee


@public
@constant
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in underlying units
    rates: uint256[N_COINS] = self._rates()
    xp: uint256[N_COINS] = self._xp(rates)
    precisions: uint256[N_COINS] = PRECISION_MUL

    x: uint256 = xp[i] + dx * precisions[i]
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = (xp[j] - y - 1) / precisions[j]
    _fee: uint256 = self.fee * dy / FEE_DENOMINATOR
    return dy - _fee


@private
def _exchange(i: int128, j: int128, dx: uint256, rates: uint256[N_COINS]) -> uint256:
    assert not self.is_killed
    # dx and dy are in c-tokens

    old_balances: uint256[N_COINS] = self.balances
    xp: uint256[N_COINS] = self._xp_mem(rates, old_balances)

    x: uint256 = xp[i] + dx * rates[i] / PRECISION
    y: uint256 = self.get_y(i, j, x, xp)

    dy: uint256 = xp[j] - y - 1  # -1 just in case there were some rounding errors
    dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR
    dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR

    # Convert all to real units
    dy = (dy - dy_fee) * PRECISION / rates[j]
    dy_admin_fee = dy_admin_fee * PRECISION / rates[j]

    # Change balances exactly in same way as we change actual ERC20 coin amounts
    self.balances[i] = old_balances[i] + dx
    # When rounding errors happen, we undercharge admin fee in favor of LP
    self.balances[j] = old_balances[j] - dy - dy_admin_fee

    return dy


@public
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256):
    rates: uint256[N_COINS] = self._rates()
    dy: uint256 = self._exchange(i, j, dx, rates)
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
    use_lending: bool[N_COINS] = USE_LENDING

    assert_modifiable(cERC20(self.coins[i]).transferFrom(msg.sender, self, dx))
    assert_modifiable(cERC20(self.coins[j]).transfer(msg.sender, dy))

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


@public
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
    total_supply: uint256 = self.token.totalSupply()
    amounts: uint256[N_COINS] = ZEROS
    fees: uint256[N_COINS] = ZEROS  # Fees are unused but we've got them historically in event
    use_lending: bool[N_COINS] = USE_LENDING

    for i in range(N_COINS):
        value: uint256 = self.balances[i] * _amount / total_supply
        assert value >= min_amounts[i], "Withdrawal resulted in fewer coins than expected"
        self.balances[i] -= value
        amounts[i] = value
        assert_modifiable(cERC20(self.coins[i]).transfer(msg.sender, value))

    self.token.burnFrom(msg.sender, _amount)  # Will raise if not enough

    log.RemoveLiquidity(msg.sender, amounts, fees, total_supply - _amount)


@public
@nonreentrant('lock')
def remove_liquidity_imbalance(amounts: uint256[N_COINS], max_burn_amount: uint256):
    assert not self.is_killed
    use_lending: bool[N_COINS] = USE_LENDING

    token_supply: uint256 = self.token.totalSupply()
    assert token_supply > 0
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee
    rates: uint256[N_COINS] = self._rates()
    amp: uint256 = self._A()

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(rates, old_balances, amp)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, new_balances, amp)
    fees: uint256[N_COINS] = ZEROS
    for i in range(N_COINS):
        ideal_balance: uint256 = D1 * old_balances[i] / D0
        difference: uint256 = 0
        if ideal_balance > new_balances[i]:
            difference = ideal_balance - new_balances[i]
        else:
            difference = new_balances[i] - ideal_balance
        fees[i] = _fee * difference / FEE_DENOMINATOR
        self.balances[i] = new_balances[i] - (fees[i] * _admin_fee / FEE_DENOMINATOR)
        new_balances[i] -= fees[i]
    D2: uint256 = self.get_D_mem(rates, new_balances, amp)

    token_amount: uint256 = (D0 - D2) * token_supply / D0 + 1
    assert token_amount <= max_burn_amount, "Slippage screwed you"

    for i in range(N_COINS):
        if amounts[i] > 0:
            assert_modifiable(cERC20(self.coins[i]).transfer(msg.sender, amounts[i]))
    self.token.burnFrom(msg.sender, token_amount)  # Will raise if not enough

    log.RemoveLiquidityImbalance(msg.sender, amounts, fees, D1, token_supply - token_amount)


@private
@constant
def get_y_D(A: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256:
    """
    Calculate x[i] if one reduces D from being calculated for xp to D

    Done by solving quadratic equation iteratively.
    x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
    x_1**2 + b*x_1 = c

    x_1 = (x_1**2 + c) / (2*x_1 + b)
    """
    # x in the input is converted to the same price/precision

    assert (i >= 0) and (i < N_COINS)

    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = A * N_COINS

    _x: uint256 = 0
    for _i in range(N_COINS):
        if _i != i:
            _x = xp[_i]
        else:
            continue
        S_ += _x
        c = c * D / (_x * N_COINS)
    c = c * D / (Ann * N_COINS)
    b: uint256 = S_ + D / Ann
    y_prev: uint256 = 0
    y: uint256 = D
    for _i in range(255):
        y_prev = y
        y = (y*y + c) / (2 * y + b - D)
        # Equality with the precision of 1
        if y > y_prev:
            if y - y_prev <= 1:
                break
        else:
            if y_prev - y <= 1:
                break
    return y


@private
@constant
def _calc_withdraw_one_coin(_token_amount: uint256, i: int128, rates: uint256[N_COINS]) -> (uint256, uint256):
    # First, need to calculate
    # * Get current D
    # * Solve Eqn against y_i for D - _token_amount
    amp: uint256 = self._A()
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    precisions: uint256[N_COINS] = PRECISION_MUL
    total_supply: uint256 = self.token.totalSupply()

    xp: uint256[N_COINS] = self._xp(rates)

    D0: uint256 = self.get_D(xp, amp)
    D1: uint256 = D0 - _token_amount * D0 / total_supply
    xp_reduced: uint256[N_COINS] = xp

    new_y: uint256 = self.get_y_D(amp, i, xp, D1)
    dy_0: uint256 = (xp[i] - new_y) / precisions[i]  # w/o fees

    for j in range(N_COINS):
        dx_expected: uint256 = 0
        if j == i:
            dx_expected = xp[j] * D1 / D0 - new_y
        else:
            dx_expected = xp[j] - xp[j] * D1 / D0
        xp_reduced[j] -= _fee * dx_expected / FEE_DENOMINATOR

    dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1)
    dy = (dy - 1) / precisions[i]  # Withdraw less to account for rounding errors

    return dy, dy_0 - dy


@public
@constant
def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256:
    rates: uint256[N_COINS] = self._rates()
    return self._calc_withdraw_one_coin(_token_amount, i, rates)[0]


@public
@nonreentrant('lock')
def remove_liquidity_one_coin(_token_amount: uint256, i: int128, min_amount: uint256):
    """
    Remove _amount of liquidity all in a form of coin i
    """
    dy: uint256 = 0
    dy_fee: uint256 = 0
    rates: uint256[N_COINS] = self._rates()
    dy, dy_fee = self._calc_withdraw_one_coin(_token_amount, i, rates)
    assert dy >= min_amount, "Not enough coins removed"

    self.balances[i] -= (dy + dy_fee * self.admin_fee / FEE_DENOMINATOR)
    self.token.burnFrom(msg.sender, _token_amount)
    assert_modifiable(ERC20(self.coins[i]).transfer(msg.sender, dy))

    log.RemoveLiquidityOne(msg.sender, _token_amount, dy)


### Admin functions ###
@public
def ramp_A(_future_A: uint256, _future_time: timestamp):
    assert msg.sender == self.owner
    assert block.timestamp >= self.initial_A_time + min_ramp_time
    assert _future_time >= block.timestamp + min_ramp_time

    _initial_A: uint256 = self._A()
    assert (_future_A > 0) and (_future_A < max_A)
    assert ((_future_A >= _initial_A) and (_future_A <= _initial_A * max_A_change)) or\
           ((_future_A < _initial_A) and (_future_A * max_A_change >= _initial_A))
    self.initial_A = _initial_A
    self.future_A = _future_A
    self.initial_A_time = block.timestamp
    self.future_A_time = _future_time

    log.RampA(_initial_A, _future_A, block.timestamp, _future_time)


@public
def stop_ramp_A():
    assert msg.sender == self.owner

    current_A: uint256 = self._A()
    self.initial_A = current_A
    self.future_A = current_A
    self.initial_A_time = block.timestamp
    self.future_A_time = block.timestamp
    # now (block.timestamp < t1) is always False, so we return saved A

    log.StopRampA(current_A, block.timestamp)


@public
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256):
    assert msg.sender == self.owner
    assert self.admin_actions_deadline == 0
    assert new_admin_fee <= max_admin_fee
    assert new_fee <= max_fee

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.admin_actions_deadline = _deadline
    self.future_fee = new_fee
    self.future_admin_fee = new_admin_fee

    log.CommitNewFee(_deadline, new_fee, new_admin_fee)


@public
def apply_new_fee():
    assert msg.sender == self.owner
    assert self.admin_actions_deadline <= block.timestamp\
        and self.admin_actions_deadline > 0

    self.admin_actions_deadline = 0
    _fee: uint256 = self.future_fee
    _admin_fee: uint256 = self.future_admin_fee
    self.fee = _fee
    self.admin_fee = _admin_fee

    log.NewFee(_fee, _admin_fee)


@public
def revert_new_parameters():
    assert msg.sender == self.owner

    self.admin_actions_deadline = 0


@public
def commit_transfer_ownership(_owner: address):
    assert msg.sender == self.owner
    assert self.transfer_ownership_deadline == 0

    _deadline: timestamp = block.timestamp + admin_actions_delay
    self.transfer_ownership_deadline = _deadline
    self.future_owner = _owner

    log.CommitNewAdmin(_deadline, _owner)


@public
def apply_transfer_ownership():
    assert msg.sender == self.owner
    assert block.timestamp >= self.transfer_ownership_deadline\
        and self.transfer_ownership_deadline > 0

    self.transfer_ownership_deadline = 0
    _owner: address = self.future_owner
    self.owner = _owner

    log.NewAdmin(_owner)


@public
def revert_transfer_ownership():
    assert msg.sender == self.owner

    self.transfer_ownership_deadline = 0


@public
def withdraw_admin_fees():
    assert msg.sender == self.owner

    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = cERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            assert_modifiable(cERC20(c).transfer(msg.sender, value))


@public
def kill_me():
    assert msg.sender == self.owner
    assert self.kill_deadline > block.timestamp
    self.is_killed = True


@public
def unkill_me():
    assert msg.sender == self.owner
    self.is_killed = False

Contract Security Audit

Contract ABI

[{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false,"unit":"sec"},{"type":"uint256","name":"future_time","indexed":false,"unit":"sec"}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false,"unit":"sec"}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address[3]","name":"_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"}],"constant":false,"payable":false,"type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":5227},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1150488},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"amounts"},{"type":"bool","name":"deposit"}],"constant":true,"payable":false,"type":"function","gas":4526955},{"name":"add_liquidity","outputs":[],"inputs":[{"type":"uint256[3]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"constant":false,"payable":false,"type":"function","gas":6972762},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":2687932},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"constant":true,"payable":false,"type":"function","gas":2687745},{"name":"exchange","outputs":[],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"constant":false,"payable":false,"type":"function","gas":5499133},{"name":"remove_liquidity","outputs":[],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[3]","name":"min_amounts"}],"constant":false,"payable":false,"type":"function","gas":196975},{"name":"remove_liquidity_imbalance","outputs":[],"inputs":[{"type":"uint256[3]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"constant":false,"payable":false,"type":"function","gas":6972281},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"}],"constant":true,"payable":false,"type":"function","gas":15405},{"name":"remove_liquidity_one_coin","outputs":[],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"min_amount"}],"constant":false,"payable":false,"type":"function","gas":4044074},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","unit":"sec","name":"_future_time"}],"constant":false,"payable":false,"type":"function","gas":151937},{"name":"stop_ramp_A","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":148697},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"constant":false,"payable":false,"type":"function","gas":110521},{"name":"apply_new_fee","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":97220},{"name":"revert_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21955},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"constant":false,"payable":false,"type":"function","gas":74632},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":60688},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":22045},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":17565},{"name":"kill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":37998},{"name":"unkill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":22135},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2310},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2340},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2171},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2201},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2231},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2261},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2291},{"name":"initial_A_time","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2321},{"name":"future_A_time","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2351},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2381},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2411},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2441},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2471},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2501}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05260c06158a26101403934156100a157600080fd5b60206158a260c03960c05160205181106100ba57600080fd5b50602060206158a20160c03960c05160205181106100d757600080fd5b50602060406158a20160c03960c05160205181106100f457600080fd5b50602060606158a20160c03960c051602051811061011157600080fd5b5061020060006003818352015b6000610140610200516003811061013457600080fd5b60200201511861014357600080fd5b6000610200516003811061015657600080fd5b600160c052602060c02001555b815160010180835281141561011e575b5050600060c052602060c02061014080518255806020015160018301558060400151600283015550506101c0516006556101c0516007556101e0516002553360045542624f1a008181830110156101c957600080fd5b80820190509050600f5560006010556101a05160055561588a56600436101561000d576156a0565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610244575b61014052600954610160526007546101805261016051421015610231576006546101c0526008546101e0526101c05161018051111561018a576101c051610180516101c051808210156100fb57600080fd5b80820390509050426101e0518082101561011457600080fd5b80820390509050808202821582848304141761012f57600080fd5b80905090509050610160516101e0518082101561014b57600080fd5b80820390509050808061015d57600080fd5b82049050905081818301101561017257600080fd5b8082019050905060005260005161014051565061022c565b6101c0516101c05161018051808210156101a357600080fd5b80820390509050426101e051808210156101bc57600080fd5b8082039050905080820282158284830414176101d757600080fd5b80905090509050610160516101e051808210156101f357600080fd5b80820390509050808061020557600080fd5b8204905090508082101561021857600080fd5b808203905090506000526000516101405156505b610242565b610180516000526000516101405156505b005b63f446c1d0600051141561027957341561025d57600080fd5b600658016100a9565b610140526101405160005260206000f350005b600015610411575b610140526101606402540be40081526402540be400816020015260018160400152506101c06001815260008160200152600081604001525061022060006003818352015b670de0b6b3a7640000610240526101c061022051600381106102e657600080fd5b60200201511561038657610220516003811061030157600080fd5b600060c052602060c02001543b61031757600080fd5b610220516003811061032857600080fd5b600060c052602060c0200154301861033f57600080fd5b60206102c0600463bd6d894d6102605261027c610220516003811061036357600080fd5b600060c052602060c02001545afa61037a57600080fd5b6000506102c051610240525b610160610220516003811061039a57600080fd5b6020020180516102405180820282158284830414176103b857600080fd5b809050905090508152505b81516001018083528114156102c5575b505060606102e0525b60006102e0511115156103ee5761040a565b60206102e05103610160015160206102e051036102e0526103dc565b6101405156005b600015610528575b6101a0526101405261016052610180526101c0610140805182528060200151826020015280604001518260400152505061022060006003818352015b6101c0610220516003811061046957600080fd5b6020020151610220516003811061047f57600080fd5b600160c052602060c0200154808202821582848304141761049f57600080fd5b80905090509050670de0b6b3a764000080806104ba57600080fd5b8204905090506101c061022051600381106104d457600080fd5b60200201525b8151600101808352811415610455575b50506060610240525b60006102405111151561050557610521565b602061024051036101c0015160206102405103610240526104f3565b6101a05156005b600015610647575b610200526101405261016052610180526101a0526101c0526101e052610220610140805182528060200151826020015280604001518260400152505061028060006003818352015b610220610280516003811061058c57600080fd5b60200201516101a061028051600381106105a557600080fd5b602002015180820282158284830414176105be57600080fd5b80905090509050670de0b6b3a764000080806105d957600080fd5b82049050905061022061028051600381106105f357600080fd5b60200201525b8151600101808352811415610578575b505060606102a0525b60006102a05111151561062457610640565b60206102a05103610220015160206102a051036102a052610612565b6102005156005b600015610935575b6101c0526101405261016052610180526101a05260006101e05261022060006003818352015b602061022051026101400151610200526101e080516102005181818301101561069d57600080fd5b808201905090508152505b8151600101808352811415610675575b50506101e05115156106d35760006000526000516101c05156505b6000610260526101e051610280526101a051600380820282158284830414176106fb57600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006003818352015b602061032051026101400151610300526102e05161028051808202821582848304141761075257600080fd5b80905090509050610300516003808202821582848304141761077357600080fd5b80905090509050808061078557600080fd5b8204905090506102e0525b8151600101808352811415610726575b505061028051610260526102a0516101e05180820282158284830414176107c657600080fd5b809050905090506102e051600380820282158284830414176107e757600080fd5b809050905090508181830110156107fd57600080fd5b8082019050905061028051808202821582848304141761081c57600080fd5b809050905090506102a05160018082101561083657600080fd5b8082039050905061028051808202821582848304141761085557600080fd5b8090509050905060046102e051808202821582848304141761087657600080fd5b8090509050905081818301101561088c57600080fd5b80820190509050808061089e57600080fd5b82049050905061028052610260516102805111156108e55760016102805161026051808210156108cd57600080fd5b808203905090501115156108e057610921565b610910565b60016102605161028051808210156108fc57600080fd5b8082039050905011151561090f57610921565b5b5b8151600101808352811415610712575b5050610280516000526000516101c0515650005b600015610add575b610220526101405261016052610180526101a0526101c0526101e05261020052610140610580525b6105805151602061058051016105805261058061058051101561098757610965565b633a8da8986105a0526105c06101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156109bd5761099b565b6368a4db616104005261042061014080518252806020015182602001528060400151826040015250506104806101a080518252806020015182602001528060400151826040015250506104c0516104a0516104805161046051610440516104205160065801610530565b6105205261054052610560526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515610a5e57610a3b565b6105208051825280602001518260200152806040015182604001525050610200516106205261062051610600516105e0516105c0516006580161064f565b61068052610560610580525b6105805152602061058051036105805261014061058051101515610acb57610aa8565b61068051600052600051610220515650005b63bb7b8b806000511415610d9b573415610af657600080fd5b610140610660525b61066051516020610660510161066052610660610660511015610b2057610afe565b633a8da898610680526106a06101406104e0525b6104e0515160206104e051016104e0526104e06104e0511015610b5657610b34565b637aca288a61050052610520610140610460525b61046051516020610460510161046052610460610460511015610b8c57610b6a565b60065801610281565b610480526104a0526104c052610440610460525b6104605152602061046051036104605261014061046051101515610bcc57610ba9565b610480805182528060200151826020015280604001518260400152505061056051610540516105205160065801610419565b6105c0526105e052610600526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515610c3557610c12565b6105c08051825280602001518260200152806040015182604001525050610140610620525b61062051516020610620510161062052610620610620511015610c7c57610c5a565b600658016100a9565b61064052610600610620525b6106205152602061062051036106205261014061062051101515610cb457610c91565b6106405161070052610700516106e0516106c0516106a0516006580161064f565b61076052610640610660525b6106605152602061066051036106605261014061066051101515610d0457610ce1565b61076051610140526005543b610d1957600080fd5b6005543018610d2757600080fd5b602061080060046318160ddd6107a0526107bc6005545afa610d4857600080fd5b600050610800516107805261014051670de0b6b3a76400008082028215828483041417610d7457600080fd5b80905090509050610780518080610d8a57600080fd5b82049050905060005260206000f350005b633883e1196000511415611218573415610db457600080fd5b60643560028110610dc457600080fd5b5061014060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015250506101a06101405161016051610180516101a0516101c0516101e05160065801610281565b6102205261024052610260526101e0526101c0526101a05261018052610160526101405261022080518252806020015182602001528060400151826040015250506101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015610e8b57610e69565b600658016100a9565b6102c0526102806102a0525b6102a0515260206102a051036102a0526101406102a051101515610ec357610ea0565b6102c05161028052610140610300525b61030051516020610300510161030052610300610300511015610ef557610ed3565b63d564a75f610320526103406101a080518252806020015182602001528060400151826040015250506103a061014080518252806020015182602001528060400151826040015250506102805161040052610400516103e0516103c0516103a0516103805161036051610340516006580161093d565b610460526102e0610300525b6103005152602061030051036103005261014061030051101515610f9a57610f77565b610460516102e05261048060006003818352015b60643515611006576101406104805160038110610fca57600080fd5b60200201805160046104805160038110610fe357600080fd5b6020020135818183011015610ff757600080fd5b80820190509050815250611050565b610140610480516003811061101a57600080fd5b6020020180516004610480516003811061103357600080fd5b60200201358082101561104557600080fd5b808203905090508152505b5b8151600101808352811415610fae575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c051101561108d5761106b565b63d564a75f6104e0526105006101a080518252806020015182602001528060400151826040015250506105606101408051825280602001518260200152806040015182604001525050610280516105c0526105c0516105a05161058051610560516105405161052051610500516006580161093d565b610620526104a06104c0525b6104c0515260206104c051036104c0526101406104c0511015156111325761110f565b610620516104a0526005543b61114757600080fd5b600554301861115557600080fd5b60206106c060046318160ddd6106605261067c6005545afa61117657600080fd5b6000506106c0516106405260006106e052606435156111b4576104a0516102e051808210156111a457600080fd5b808203905090506106e0526111d5565b6102e0516104a051808210156111c957600080fd5b808203905090506106e0525b6106e0516106405180820282158284830414176111f157600080fd5b809050905090506102e051808061120757600080fd5b82049050905060005260206000f350005b634515cef36000511415611cb45762ffffff541561123557600080fd5b600162ffffff55341561124757600080fd5b6010541561125457600080fd5b610140600181526000816020015260008160400152506101a0600081526000816020015260008160400152506002546003808202821582848304141761129957600080fd5b80905090509050600880806112ad57600080fd5b82049050905061020052600354610220526101405161016051610180516101a0516101c0516101e051610200516102205161024051600658016100a9565b610280526102405261022052610200526101e0526101c0526101a05261018052610160526101405261028051610240526005543b61132857600080fd5b600554301861133657600080fd5b602061032060046318160ddd6102c0526102dc6005545afa61135757600080fd5b600050610320516102a0526103406101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561138f5761136d565b60065801610281565b6103c0526103e052610400526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156113cf576113ac565b6103c0805182528060200151826020015280604001518260400152505060006104205261044060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c02001548260400152505060006102a051111561150d576101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561145f5761143d565b63d564a75f6104c0526104e061034080518252806020015182602001528060400151826040015250506105406104408051825280602001518260200152806040015182604001525050610240516105a0526105a05161058051610560516105405161052051610500516104e0516006580161093d565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a051101515611504576114e1565b61060051610420525b610620610440805182528060200151826020015280604001518260400152505061068060006003818352015b6102a05115156115685760006004610680516003811061155857600080fd5b60200201351161156757600080fd5b5b610440610680516003811061157c57600080fd5b60200201516004610680516003811061159457600080fd5b60200201358181830110156115a857600080fd5b8082019050905061062061068051600381106115c357600080fd5b60200201525b8151600101808352811415611539575b50506101406106c0525b6106c0515160206106c051016106c0526106c06106c0511015611605576115e3565b63d564a75f6106e05261070061034080518252806020015182602001528060400151826040015250506107606106208051825280602001518260200152806040015182604001525050610240516107c0526107c0516107a05161078051610760516107405161072051610700516006580161093d565b610820526106a06106c0525b6106c0515260206106c051036106c0526101406106c0511015156116aa57611687565b610820516106a052610420516106a051116116c457600080fd5b6106a0516108405260006102a05111156119f35761086060006003818352015b6106a05161044061086051600381106116fc57600080fd5b6020020151808202821582848304141761171557600080fd5b8090509050905061042051808061172b57600080fd5b8204905090506108805260006108a052610620610860516003811061174f57600080fd5b60200201516108805111156117985761088051610620610860516003811061177657600080fd5b60200201518082101561178857600080fd5b808203905090506108a0526117ce565b61062061086051600381106117ac57600080fd5b602002015161088051808210156117c257600080fd5b808203905090506108a0525b610200516108a05180820282158284830414176117ea57600080fd5b809050905090506402540be400808061180257600080fd5b8204905090506101a0610860516003811061181c57600080fd5b6020020152610620610860516003811061183557600080fd5b60200201516101a0610860516003811061184e57600080fd5b602002015161022051808202821582848304141761186b57600080fd5b809050905090506402540be400808061188357600080fd5b8204905090508082101561189657600080fd5b8082039050905061086051600381106118ae57600080fd5b600160c052602060c020015561062061086051600381106118ce57600080fd5b6020020180516101a061086051600381106118e857600080fd5b6020020151808210156118fa57600080fd5b808203905090508152505b81516001018083528114156116e4575b50506101406108c0525b6108c0515160206108c051016108c0526108606108c05110156119415761191f565b63d564a75f6108e05261090061034080518252806020015182602001528060400151826040015250506109606106208051825280602001518260200152806040015182604001525050610240516109c0526109c0516109a05161098051610960516109405161092051610900516006580161093d565b610a20526108406108c0525b6108c0515260206108c051036108c0526101406108c0511015156119e6576119c3565b610a205161084052611a1b565b600160c052602060c02061062080518255806020015160018301558060400151600283015550505b6000610a40526102a0511515611a38576106a051610a4052611a8d565b6102a051610840516104205180821015611a5157600080fd5b808203905090508082028215828483041417611a6c57600080fd5b80905090509050610420518080611a8257600080fd5b820490509050610a40525b6308c379a0610a60526020610a80526014610aa0527f536c697070616765207363726577656420796f75000000000000000000000000610ac052610aa050606435610a40511015611adf576084610a7cfd5b610b0060006003818352015b60006004610b005160038110611b0057600080fd5b60200201351115611bce57610b005160038110611b1c57600080fd5b600060c052602060c02001543b611b3257600080fd5b610b005160038110611b4357600080fd5b600060c052602060c02001543018611b5a57600080fd5b6020610be060646323b872dd610b205233610b405230610b60526004610b005160038110611b8757600080fd5b6020020135610b8052610b3c6000610b005160038110611ba657600080fd5b600060c052602060c02001545af1611bbd57600080fd5b600050610be051611bcd57600080fd5b5b5b8151600101808352811415611aeb575b50506005543b611bee57600080fd5b6005543018611bfc57600080fd5b6000600060446340c10f19610c005233610c2052610a4051610c4052610c1c60006005545af1611c2b57600080fd5b600435610ca052602435610cc052604435610ce0526101a051610d00526101c051610d20526101e051610d40526106a051610d60526102a051610a4051818183011015611c7757600080fd5b80820190509050610d8052337f423f6495a08fc652425cf4ed0d1f9e37e571d9b9529b1c1c23cce780b2e7df0d610100610ca0a2600062ffffff55005b600015612115575b610200526101405261016052610180526101a0526101c0526101e0526000610140511215610160516101405114151660006101605112151660036101405112166003610160511216611d0d57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051600658016100a9565b6102605261022052610200526101e0526101c0526101a05261018052610160526101405261026051610220526101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015611d8c57611d6a565b633a8da8986102c0526102e06101a0805182528060200151826020015280604001518260400152505061022051610340526103405161032051610300516102e0516006580161064f565b6103a0526102806102a0525b6102a0515260206102a051036102a0526101406102a051101515611e0557611de2565b6103a05161028052610280516103c05260006103e0526102205160038082028215828483041417611e3557600080fd5b809050905090506104005260006104205261044060006003818352015b61014051610440511415611e6d576101805161042052611ea3565b61016051610440511815611e9d576101a06104405160038110611e8f57600080fd5b602002015161042052611ea2565b611f1f565b5b6103e0805161042051818183011015611ebb57600080fd5b808201905090508152506103c051610280518082028215828483041417611ee157600080fd5b809050905090506104205160038082028215828483041417611f0257600080fd5b809050905090508080611f1457600080fd5b8204905090506103c0525b8151600101808352811415611e52575b50506103c051610280518082028215828483041417611f4d57600080fd5b809050905090506104005160038082028215828483041417611f6e57600080fd5b809050905090508080611f8057600080fd5b8204905090506103c0526103e05161028051610400518080611fa157600080fd5b820490509050818183011015611fb657600080fd5b8082019050905061046052600061048052610280516104a0526104c0600060ff818352015b6104a051610480526104a0516104a0518082028215828483041417611fff57600080fd5b809050905090506103c05181818301101561201957600080fd5b8082019050905060026104a051808202821582848304141761203a57600080fd5b809050905090506104605181818301101561205457600080fd5b80820190509050610280518082101561206c57600080fd5b80820390509050808061207e57600080fd5b8204905090506104a052610480516104a05111156120c55760016104a05161048051808210156120ad57600080fd5b808203905090501115156120c057612101565b6120f0565b6001610480516104a051808210156120dc57600080fd5b808203905090501115156120ef57612101565b5b5b8151600101808352811415611fdb575b50506104a051600052600051610200515650005b635e0d443f60005114156124bd57341561212e57600080fd5b6060516004358060405190131561214457600080fd5b809190121561215257600080fd5b506060516024358060405190131561216957600080fd5b809190121561217757600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506102206101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051637aca288a6102a0526102c06101408051825280602001518260200152806040015182604001525050610300516102e0516102c05160065801610419565b61036052610380526103a052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080518252806020015182602001528060400151826040015250506102206004356003811061229257600080fd5b6020020151604435610140600435600381106122ad57600080fd5b602002015180820282158284830414176122c657600080fd5b80905090509050670de0b6b3a764000080806122e157600080fd5b8204905090508181830110156122f657600080fd5b808201905090506103c052610140610400525b6104005151602061040051016104005261040061040051101561232b57612309565b63554abe286104205260043561044052602435610460526103c051610480526104a061022080518252806020015182602001528060400151826040015250506104e0516104c0516104a05161048051610460516104405160065801611cbc565b610540526103e0610400525b61040051526020610400510361040052610140610400511015156123ba57612397565b610540516103e052610220602435600381106123d557600080fd5b60200201516103e051808210156123eb57600080fd5b8082039050905060018082101561240157600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761242557600080fd5b809050905090506101406024356003811061243f57600080fd5b6020020151808061244f57600080fd5b8204905090506105605260025461056051808202821582848304141761247457600080fd5b809050905090506402540be400808061248c57600080fd5b820490509050610580526105605161058051808210156124ab57600080fd5b8082039050905060005260206000f350005b6307211ef760005114156128455734156124d657600080fd5b606051600435806040519013156124ec57600080fd5b80919012156124fa57600080fd5b506060516024358060405190131561251157600080fd5b809190121561251f57600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506102206101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051637aca288a6102a0526102c06101408051825280602001518260200152806040015182604001525050610300516102e0516102c05160065801610419565b61036052610380526103a052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080518252806020015182602001528060400151826040015250506103c06402540be40081526402540be400816020015260018160400152506102206004356003811061265857600080fd5b60200201516044356103c06004356003811061267357600080fd5b6020020151808202821582848304141761268c57600080fd5b809050905090508181830110156126a257600080fd5b8082019050905061042052610140610460525b610460515160206104605101610460526104606104605110156126d7576126b5565b63554abe28610480526004356104a0526024356104c052610420516104e05261050061022080518252806020015182602001528060400151826040015250506105405161052051610500516104e0516104c0516104a05160065801611cbc565b6105a052610440610460525b610460515260206104605103610460526101406104605110151561276657612743565b6105a051610440526102206024356003811061278157600080fd5b6020020151610440518082101561279757600080fd5b808203905090506001808210156127ad57600080fd5b808203905090506103c0602435600381106127c757600080fd5b602002015180806127d757600080fd5b8204905090506105c0526002546105c05180820282158284830414176127fc57600080fd5b809050905090506402540be400808061281457600080fd5b8204905090506105e0526105c0516105e0518082101561283357600080fd5b8082039050905060005260206000f350005b600015612d31575b610200526101405261016052610180526101a0526101c0526101e0526010541561287657600080fd5b61022060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015250506102806101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156128da576128b8565b6368a4db61610300526103206101a0805182528060200151826020015280604001518260400152505061038061022080518252806020015182602001528060400151826040015250506103c0516103a0516103805161036051610340516103205160065801610530565b6104205261044052610460526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561297b57612958565b610420805182528060200151826020015280604001518260400152505061028061014051600381106129ac57600080fd5b6020020151610180516101a061014051600381106129c957600080fd5b602002015180820282158284830414176129e257600080fd5b80905090509050670de0b6b3a764000080806129fd57600080fd5b820490509050818183011015612a1257600080fd5b80820190509050610480526101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015612a4757612a25565b63554abe286104e05261014051610500526101605161052052610480516105405261056061028080518252806020015182602001528060400151826040015250506105a051610580516105605161054051610520516105005160065801611cbc565b610600526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515612ad857612ab5565b610600516104a0526102806101605160038110612af457600080fd5b60200201516104a05180821015612b0a57600080fd5b80820390509050600180821015612b2057600080fd5b8082039050905061062052610620516002548082028215828483041417612b4657600080fd5b809050905090506402540be4008080612b5e57600080fd5b82049050905061064052610640516003548082028215828483041417612b8357600080fd5b809050905090506402540be4008080612b9b57600080fd5b82049050905061066052610620516106405180821015612bba57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612bde57600080fd5b809050905090506101a06101605160038110612bf957600080fd5b60200201518080612c0957600080fd5b8204905090506106205261066051670de0b6b3a76400008082028215828483041417612c3457600080fd5b809050905090506101a06101605160038110612c4f57600080fd5b60200201518080612c5f57600080fd5b820490509050610660526102206101405160038110612c7d57600080fd5b602002015161018051818183011015612c9557600080fd5b808201905090506101405160038110612cad57600080fd5b600160c052602060c02001556102206101605160038110612ccd57600080fd5b60200201516106205180821015612ce357600080fd5b808203905090506106605180821015612cfb57600080fd5b808203905090506101605160038110612d1357600080fd5b600160c052602060c020015561062051600052600051610200515650005b633df0212460005114156130cd5762ffffff5415612d4e57600080fd5b600162ffffff553415612d6057600080fd5b60605160043580604051901315612d7657600080fd5b8091901215612d8457600080fd5b5060605160243580604051901315612d9b57600080fd5b8091901215612da957600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506101405161016051610180516101a0516101c0516101e051610200516102205163cf6eee7661026052600435610280526024356102a0526044356102c0526102e0610140805182528060200151826020015280604001518260400152505061032051610300516102e0516102c0516102a051610280516006580161284d565b6103805261022052610200526101e0526101c0526101a05261018052610160526101405261038051610220526308c379a06103a05260206103c052602e6103e0527f45786368616e676520726573756c74656420696e20666577657220636f696e73610400527f207468616e206578706563746564000000000000000000000000000000000000610420526103e050606435610220511015612f195760a46103bcfd5b6104606001815260008160200152600081604001525060043560038110612f3f57600080fd5b600060c052602060c02001543b612f5557600080fd5b60043560038110612f6557600080fd5b600060c052602060c02001543018612f7c57600080fd5b602061058060646323b872dd6104c052336104e0523061050052604435610520526104dc600060043560038110612fb257600080fd5b600060c052602060c02001545af1612fc957600080fd5b60005061058051612fd957600080fd5b60243560038110612fe957600080fd5b600060c052602060c02001543b612fff57600080fd5b6024356003811061300f57600080fd5b600060c052602060c0200154301861302657600080fd5b6020610640604463a9059cbb6105a052336105c052610220516105e0526105bc60006024356003811061305857600080fd5b600060c052602060c02001545af161306f57600080fd5b6000506106405161307f57600080fd5b60043561066052604435610680526024356106a052610220516106c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610660a2600062ffffff55005b63ecb586a5600051141561344c5762ffffff54156130ea57600080fd5b600162ffffff5534156130fc57600080fd5b6005543b61310957600080fd5b600554301861311757600080fd5b60206101c060046318160ddd6101605261017c6005545afa61313857600080fd5b6000506101c051610140526101e060008152600081602001526000816040015250610240600081526000816020015260008160400152506102a06001815260008160200152600081604001525061030060006003818352015b61030051600381106131a257600080fd5b600160c052602060c020015460043580820282158284830414176131c557600080fd5b809050905090506101405180806131db57600080fd5b820490509050610320526308c379a0610340526020610360526030610380527f5769746864726177616c20726573756c74656420696e20666577657220636f696103a0527f6e73207468616e206578706563746564000000000000000000000000000000006103c052610380506024610300516003811061325b57600080fd5b60200201356103205110156132715760a461035cfd5b610300516003811061328257600080fd5b600160c052602060c02001805461032051808210156132a057600080fd5b80820390509050815550610320516101e061030051600381106132c257600080fd5b602002015261030051600381106132d857600080fd5b600060c052602060c02001543b6132ee57600080fd5b61030051600381106132ff57600080fd5b600060c052602060c0200154301861331657600080fd5b60206104a0604463a9059cbb610400523361042052610320516104405261041c6000610300516003811061334957600080fd5b600060c052602060c02001545af161336057600080fd5b6000506104a05161337057600080fd5b5b8151600101808352811415613191575b50506005543b61339057600080fd5b600554301861339e57600080fd5b6000600060446379cc67906104c052336104e052600435610500526104dc60006005545af16133cc57600080fd5b6101e051610560526102005161058052610220516105a052610240516105c052610260516105e0526102805161060052610140516004358082101561341057600080fd5b8082039050905061062052337fa49d4cf02656aebf8c771f5a8585638a2a15ee6c97cf7205d4208ed7c1df252d60e0610560a2600062ffffff55005b639fdaea0c6000511415613e4c5762ffffff541561346957600080fd5b600162ffffff55341561347b57600080fd5b6010541561348857600080fd5b610140600181526000816020015260008160400152506005543b6134ab57600080fd5b60055430186134b957600080fd5b602061022060046318160ddd6101c0526101dc6005545afa6134da57600080fd5b600050610220516101a05260006101a051116134f557600080fd5b6002546003808202821582848304141761350e57600080fd5b809050905090506008808061352257600080fd5b82049050905061024052600354610260526102806101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156135605761353e565b60065801610281565b6103005261032052610340526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156135a05761357d565b6103008051825280602001518260200152806040015182604001525050610140610380525b610380515160206103805101610380526103806103805110156135e7576135c5565b600658016100a9565b6103a052610360610380525b610380515260206103805103610380526101406103805110151561361f576135fc565b6103a051610360526103c060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015250506104206103c080518252806020015182602001528060400151826040015250506101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156136a857613686565b63d564a75f6104c0526104e061028080518252806020015182602001528060400151826040015250506105406103c08051825280602001518260200152806040015182604001525050610360516105a0526105a05161058051610560516105405161052051610500516104e0516006580161093d565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561374d5761372a565b610600516104805261062060006003818352015b610420610620516003811061377557600080fd5b6020020180516004610620516003811061378e57600080fd5b6020020135808210156137a057600080fd5b808203905090508152505b8151600101808352811415613761575b5050610140610660525b610660515160206106605101610660526106606106605110156137e7576137c5565b63d564a75f610680526106a0610280805182528060200151826020015280604001518260400152505061070061042080518252806020015182602001528060400151826040015250506103605161076052610760516107405161072051610700516106e0516106c0516106a0516006580161093d565b6107c052610640610660525b610660515260206106605103610660526101406106605110151561388c57613869565b6107c051610640526107e06000815260008160200152600081604001525061084060006003818352015b610640516103c061084051600381106138ce57600080fd5b602002015180820282158284830414176138e757600080fd5b809050905090506104805180806138fd57600080fd5b82049050905061086052600061088052610420610840516003811061392157600080fd5b602002015161086051111561396a5761086051610420610840516003811061394857600080fd5b60200201518082101561395a57600080fd5b80820390509050610880526139a0565b610420610840516003811061397e57600080fd5b6020020151610860518082101561399457600080fd5b80820390509050610880525b610240516108805180820282158284830414176139bc57600080fd5b809050905090506402540be40080806139d457600080fd5b8204905090506107e061084051600381106139ee57600080fd5b60200201526104206108405160038110613a0757600080fd5b60200201516107e06108405160038110613a2057600080fd5b6020020151610260518082028215828483041417613a3d57600080fd5b809050905090506402540be4008080613a5557600080fd5b82049050905080821015613a6857600080fd5b808203905090506108405160038110613a8057600080fd5b600160c052602060c02001556104206108405160038110613aa057600080fd5b6020020180516107e06108405160038110613aba57600080fd5b602002015180821015613acc57600080fd5b808203905090508152505b81516001018083528114156138b6575b50506101406108c0525b6108c0515160206108c051016108c0526108c06108c0511015613b1357613af1565b63d564a75f6108e05261090061028080518252806020015182602001528060400151826040015250506109606104208051825280602001518260200152806040015182604001525050610360516109c0526109c0516109a05161098051610960516109405161092051610900516006580161093d565b610a20526108a06108c0525b6108c0515260206108c051036108c0526101406108c051101515613bb857613b95565b610a20516108a052610480516108a05180821015613bd557600080fd5b808203905090506101a0518082028215828483041417613bf457600080fd5b80905090509050610480518080613c0a57600080fd5b8204905090506001818183011015613c2157600080fd5b80820190509050610a40526308c379a0610a60526020610a80526014610aa0527f536c697070616765207363726577656420796f75000000000000000000000000610ac052610aa050606435610a40511115613c7e576084610a7cfd5b610b0060006003818352015b60006004610b005160038110613c9f57600080fd5b60200201351115613d6857610b005160038110613cbb57600080fd5b600060c052602060c02001543b613cd157600080fd5b610b005160038110613ce257600080fd5b600060c052602060c02001543018613cf957600080fd5b6020610bc0604463a9059cbb610b205233610b40526004610b005160038110613d2157600080fd5b6020020135610b6052610b3c6000610b005160038110613d4057600080fd5b600060c052602060c02001545af1613d5757600080fd5b600050610bc051613d6757600080fd5b5b5b8151600101808352811415613c8a575b50506005543b613d8857600080fd5b6005543018613d9657600080fd5b6000600060446379cc6790610be05233610c0052610a4051610c2052610bfc60006005545af1613dc557600080fd5b600435610c8052602435610ca052604435610cc0526107e051610ce05261080051610d005261082051610d205261064051610d40526101a051610a405180821015613e0f57600080fd5b80820390509050610d6052337f173599dbf9c6ca6f7c3b590df07ae98a45d74ff54065505141e7de6c46a624c2610100610c80a2600062ffffff55005b600015614175575b610200526101405261016052610180526101a0526101c0526101e05260036101605112600061016051121516613e8957600080fd5b6101e051610220526000610240526101405160038082028215828483041417613eb157600080fd5b80905090509050610260526000610280526102a060006003818352015b610160516102a0511815613efe576101806102a05160038110613ef057600080fd5b602002015161028052613f03565b613f7f565b610240805161028051818183011015613f1b57600080fd5b80820190509050815250610220516101e0518082028215828483041417613f4157600080fd5b809050905090506102805160038082028215828483041417613f6257600080fd5b809050905090508080613f7457600080fd5b820490509050610220525b8151600101808352811415613ece575b5050610220516101e0518082028215828483041417613fad57600080fd5b809050905090506102605160038082028215828483041417613fce57600080fd5b809050905090508080613fe057600080fd5b82049050905061022052610240516101e05161026051808061400157600080fd5b82049050905081818301101561401657600080fd5b808201905090506102c05260006102e0526101e05161030052610320600060ff818352015b610300516102e0526103005161030051808202821582848304141761405f57600080fd5b809050905090506102205181818301101561407957600080fd5b80820190509050600261030051808202821582848304141761409a57600080fd5b809050905090506102c0518181830110156140b457600080fd5b808201905090506101e051808210156140cc57600080fd5b8082039050905080806140de57600080fd5b820490509050610300526102e051610300511115614125576001610300516102e0518082101561410d57600080fd5b8082039050905011151561412057614161565b614150565b60016102e051610300518082101561413c57600080fd5b8082039050905011151561414f57614161565b5b5b815160010180835281141561403b575b505061030051600052600051610200515650005b6000156148be575b6101e0526101405261016052610180526101a0526101c0526101405161016051610180516101a0516101c0516101e05161020051600658016100a9565b61024052610200526101e0526101c0526101a0526101805261016052610140526102405161020052600254600380820282158284830414176141fb57600080fd5b809050905090506008808061420f57600080fd5b820490509050610260526102806402540be40081526402540be400816020015260018160400152506005543b61424457600080fd5b600554301861425257600080fd5b602061036060046318160ddd6103005261031c6005545afa61427357600080fd5b600050610360516102e0526103806101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156142ab57614289565b637aca288a61040052610420610180805182528060200151826020015280604001518260400152505061046051610440516104205160065801610419565b6104c0526104e052610500526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515614320576142fd565b6104c08051825280602001518260200152806040015182604001525050610140610540525b6105405151602061054051016105405261054061054051101561436757614345565b633a8da898610560526105806103808051825280602001518260200152806040015182604001525050610200516105e0526105e0516105c0516105a051610580516006580161064f565b61064052610520610540525b61054051526020610540510361054052610140610540511015156143e0576143bd565b6106405161052052610520516101405161052051808202821582848304141761440857600080fd5b809050905090506102e051808061441e57600080fd5b8204905090508082101561443157600080fd5b80820390509050610660526106806103808051825280602001518260200152806040015182604001525050610140610700525b6107005151602061070051016107005261070061070051101561448657614464565b63da97dfe161072052610200516107405261016051610760526107806103808051825280602001518260200152806040015182604001525050610660516107e0526107e0516107c0516107a05161078051610760516107405160065801613e54565b610840526106e0610700525b6107005152602061070051036107005261014061070051101515614517576144f4565b610840516106e052610380610160516003811061453357600080fd5b60200201516106e0518082101561454957600080fd5b80820390509050610280610160516003811061456457600080fd5b6020020151808061457457600080fd5b8204905090506108605261088060006003818352015b60006108a0526101605161088051141561460c5761038061088051600381106145b257600080fd5b60200201516106605180820282158284830414176145cf57600080fd5b809050905090506105205180806145e557600080fd5b8204905090506106e051808210156145fc57600080fd5b808203905090506108a05261468b565b610380610880516003811061462057600080fd5b6020020151610380610880516003811061463957600080fd5b602002015161066051808202821582848304141761465657600080fd5b8090509050905061052051808061466c57600080fd5b8204905090508082101561467f57600080fd5b808203905090506108a0525b610680610880516003811061469f57600080fd5b602002018051610260516108a05180820282158284830414176146c157600080fd5b809050905090506402540be40080806146d957600080fd5b820490509050808210156146ec57600080fd5b808203905090508152505b815160010180835281141561458a575b5050610680610160516003811061471d57600080fd5b60200201516101406108e0525b6108e0515160206108e051016108e0526108e06108e051101561474c5761472a565b63da97dfe161090052610200516109205261016051610940526109606106808051825280602001518260200152806040015182604001525050610660516109c0526109c0516109a0516109805161096051610940516109205160065801613e54565b610a20526108c06108e0525b6108e0515260206108e051036108e0526101406108e0511015156147dd576147ba565b610a2051808210156147ee57600080fd5b808203905090506108c0526108c05160018082101561480c57600080fd5b80820390509050610280610160516003811061482757600080fd5b6020020151808061483757600080fd5b8204905090506108c052610a408080806108c051815250506020810190508080610860516108c0518082101561486c57600080fd5b808203905090508152505060409050905060c05260c051610a80525b6000610a805111151561489a576148b6565b6020610a805103610a4001516020610a805103610a8052614888565b6101e0515650005b63cc2b27d760005114156149ec5734156148d757600080fd5b606051602435806040519013156148ed57600080fd5b80919012156148fb57600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506101405161016051610180516101a0516101c0516101e0516102005163f7d59a096102405260043561026052602435610280526102a061014080518252806020015182602001528060400151826040015250506102e0516102c0516102a05161028051610260516006580161417d565b6103405261036052610200526101e0526101c0526101a0526101805261016052610140526103405160005260206000f350005b631a4d01d26000511415614d685762ffffff5415614a0957600080fd5b600162ffffff553415614a1b57600080fd5b60605160243580604051901315614a3157600080fd5b8091901215614a3f57600080fd5b506000610140526000610160526101806101405161016051610180516101a0516101c05160065801610281565b6102005261022052610240526101c0526101a05261018052610160526101405261020080518252806020015182602001528060400151826040015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405163f7d59a09610280526004356102a0526024356102c0526102e0610180805182528060200151826020015280604001518260400152505061032051610300516102e0516102c0516102a0516006580161417d565b610380526103a0526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380805161014052602081015161016052506308c379a06103c05260206103e0526018610400527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006104205261040050604435610140511015614bb25760846103dcfd5b60243560038110614bc257600080fd5b600160c052602060c02001805461014051610160516003548082028215828483041417614bee57600080fd5b809050905090506402540be4008080614c0657600080fd5b820490509050818183011015614c1b57600080fd5b8082019050905080821015614c2f57600080fd5b808203905090508155506005543b614c4657600080fd5b6005543018614c5457600080fd5b6000600060446379cc67906104605233610480526004356104a05261047c60006005545af1614c8257600080fd5b60243560038110614c9257600080fd5b600060c052602060c02001543b614ca857600080fd5b60243560038110614cb857600080fd5b600060c052602060c02001543018614ccf57600080fd5b60206105a0604463a9059cbb610500523361052052610140516105405261051c600060243560038110614d0157600080fd5b600060c052602060c02001545af1614d1857600080fd5b6000506105a051614d2857600080fd5b6004356105c052610140516105e052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406105c0a2600062ffffff55005b633c157e646000511415614eda573415614d8157600080fd5b6004543314614d8f57600080fd5b60085462015180818183011015614da557600080fd5b80820190509050421015614db857600080fd5b4262015180818183011015614dcc57600080fd5b808201905090506024351015614de157600080fd5b61014051600658016100a9565b61018052610140526101805161014052620f42406004351060006004351116614e1657600080fd5b61014051600435600a8082028215828483041417614e3357600080fd5b80905090509050101561014051600435101661014051600a8082028215828483041417614e5f57600080fd5b8090509050905060043511156101405160043510151617614e7f57600080fd5b6101405160065560043560075542600855602435600955610140516101a0526004356101c052426101e052602435610200527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460806101a0a1005b63551a65886000511415614f6a573415614ef357600080fd5b6004543314614f0157600080fd5b61014051600658016100a9565b6101805261014052610180516101405261014051600655610140516007554260085542600955610140516101a052426101c0527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860406101a0a1005b635b5a14676000511415615033573415614f8357600080fd5b6004543314614f9157600080fd5b600a5415614f9e57600080fd5b64012a05f2006024351115614fb257600080fd5b64012a05f2006004351115614fc657600080fd5b426203f480818183011015614fda57600080fd5b808201905090506101405261014051600a55600435600c55602435600d556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156150ca57341561504c57600080fd5b600454331461505a57600080fd5b6000600a541142600a5411151661507057600080fd5b6000600a55600c5461014052600d546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb60005114156150f85734156150e357600080fd5b60045433146150f157600080fd5b6000600a55005b636b441a40600051141561519957341561511157600080fd5b600435602051811061512257600080fd5b50600454331461513157600080fd5b600b541561513e57600080fd5b426203f48081818301101561515257600080fd5b808201905090506101405261014051600b55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156152155734156151b257600080fd5b60045433146151c057600080fd5b6000600b5411600b54421015166151d657600080fd5b6000600b55600e546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193600051141561524357341561522e57600080fd5b600454331461523c57600080fd5b6000600b55005b6330c54085600051141561539757341561525c57600080fd5b600454331461526a57600080fd5b61014060006003818352015b610140516003811061528757600080fd5b600060c052602060c020015461016052610160513b6152a557600080fd5b6101605130186152b457600080fd5b602061022060246370a082316101a052306101c0526101bc610160515afa6152db57600080fd5b6000506102205161014051600381106152f357600080fd5b600160c052602060c02001548082101561530c57600080fd5b8082039050905061018052600061018051111561538257610160513b61533157600080fd5b61016051301861534057600080fd5b60206102e0604463a9059cbb610240523361026052610180516102805261025c6000610160515af161537157600080fd5b6000506102e05161538157600080fd5b5b5b8151600101808352811415615276575b5050005b63e369885360005114156153d35734156153b057600080fd5b60045433146153be57600080fd5b42600f54116153cc57600080fd5b6001601055005b633046f97260005114156154015734156153ec57600080fd5b60045433146153fa57600080fd5b6000601055005b6323746eb8600051141561546657341561541a57600080fd5b6060516004358060405190131561543057600080fd5b809190121561543e57600080fd5b506004356003811061544f57600080fd5b600060c052602060c020015460005260206000f350005b63065a80d860005114156154cb57341561547f57600080fd5b6060516004358060405190131561549557600080fd5b80919012156154a357600080fd5b50600435600381106154b457600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f4360005114156154f25734156154e457600080fd5b60025460005260206000f350005b63fee3f7f9600051141561551957341561550b57600080fd5b60035460005260206000f350005b638da5cb5b600051141561554057341561553257600080fd5b60045460005260206000f350005b635409491a600051141561556757341561555957600080fd5b60065460005260206000f350005b63b4b577ad600051141561558e57341561558057600080fd5b60075460005260206000f350005b632081066c60005114156155b55734156155a757600080fd5b60085460005260206000f350005b631405228860005114156155dc5734156155ce57600080fd5b60095460005260206000f350005b63405e28f860005114156156035734156155f557600080fd5b600a5460005260206000f350005b63e0a0b586600051141561562a57341561561c57600080fd5b600b5460005260206000f350005b6358680d0b600051141561565157341561564357600080fd5b600c5460005260206000f350005b63e3824462600051141561567857341561566a57600080fd5b600d5460005260206000f350005b631ec0cdc1600051141561569f57341561569157600080fd5b600e5460005260206000f350005b5b60006000fd5b6101e461588a036101e46000396101e461588a036000f3000000000000000000000000eb4c2781e4eba804ce9a9803c67d0893436bb27d0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6000000000000000000000000075b1bb99792c9e1041ba13afef80c91a1e70fb3000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d0900

Deployed Bytecode

0x600436101561000d576156a0565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610244575b61014052600954610160526007546101805261016051421015610231576006546101c0526008546101e0526101c05161018051111561018a576101c051610180516101c051808210156100fb57600080fd5b80820390509050426101e0518082101561011457600080fd5b80820390509050808202821582848304141761012f57600080fd5b80905090509050610160516101e0518082101561014b57600080fd5b80820390509050808061015d57600080fd5b82049050905081818301101561017257600080fd5b8082019050905060005260005161014051565061022c565b6101c0516101c05161018051808210156101a357600080fd5b80820390509050426101e051808210156101bc57600080fd5b8082039050905080820282158284830414176101d757600080fd5b80905090509050610160516101e051808210156101f357600080fd5b80820390509050808061020557600080fd5b8204905090508082101561021857600080fd5b808203905090506000526000516101405156505b610242565b610180516000526000516101405156505b005b63f446c1d0600051141561027957341561025d57600080fd5b600658016100a9565b610140526101405160005260206000f350005b600015610411575b610140526101606402540be40081526402540be400816020015260018160400152506101c06001815260008160200152600081604001525061022060006003818352015b670de0b6b3a7640000610240526101c061022051600381106102e657600080fd5b60200201511561038657610220516003811061030157600080fd5b600060c052602060c02001543b61031757600080fd5b610220516003811061032857600080fd5b600060c052602060c0200154301861033f57600080fd5b60206102c0600463bd6d894d6102605261027c610220516003811061036357600080fd5b600060c052602060c02001545afa61037a57600080fd5b6000506102c051610240525b610160610220516003811061039a57600080fd5b6020020180516102405180820282158284830414176103b857600080fd5b809050905090508152505b81516001018083528114156102c5575b505060606102e0525b60006102e0511115156103ee5761040a565b60206102e05103610160015160206102e051036102e0526103dc565b6101405156005b600015610528575b6101a0526101405261016052610180526101c0610140805182528060200151826020015280604001518260400152505061022060006003818352015b6101c0610220516003811061046957600080fd5b6020020151610220516003811061047f57600080fd5b600160c052602060c0200154808202821582848304141761049f57600080fd5b80905090509050670de0b6b3a764000080806104ba57600080fd5b8204905090506101c061022051600381106104d457600080fd5b60200201525b8151600101808352811415610455575b50506060610240525b60006102405111151561050557610521565b602061024051036101c0015160206102405103610240526104f3565b6101a05156005b600015610647575b610200526101405261016052610180526101a0526101c0526101e052610220610140805182528060200151826020015280604001518260400152505061028060006003818352015b610220610280516003811061058c57600080fd5b60200201516101a061028051600381106105a557600080fd5b602002015180820282158284830414176105be57600080fd5b80905090509050670de0b6b3a764000080806105d957600080fd5b82049050905061022061028051600381106105f357600080fd5b60200201525b8151600101808352811415610578575b505060606102a0525b60006102a05111151561062457610640565b60206102a05103610220015160206102a051036102a052610612565b6102005156005b600015610935575b6101c0526101405261016052610180526101a05260006101e05261022060006003818352015b602061022051026101400151610200526101e080516102005181818301101561069d57600080fd5b808201905090508152505b8151600101808352811415610675575b50506101e05115156106d35760006000526000516101c05156505b6000610260526101e051610280526101a051600380820282158284830414176106fb57600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006003818352015b602061032051026101400151610300526102e05161028051808202821582848304141761075257600080fd5b80905090509050610300516003808202821582848304141761077357600080fd5b80905090509050808061078557600080fd5b8204905090506102e0525b8151600101808352811415610726575b505061028051610260526102a0516101e05180820282158284830414176107c657600080fd5b809050905090506102e051600380820282158284830414176107e757600080fd5b809050905090508181830110156107fd57600080fd5b8082019050905061028051808202821582848304141761081c57600080fd5b809050905090506102a05160018082101561083657600080fd5b8082039050905061028051808202821582848304141761085557600080fd5b8090509050905060046102e051808202821582848304141761087657600080fd5b8090509050905081818301101561088c57600080fd5b80820190509050808061089e57600080fd5b82049050905061028052610260516102805111156108e55760016102805161026051808210156108cd57600080fd5b808203905090501115156108e057610921565b610910565b60016102605161028051808210156108fc57600080fd5b8082039050905011151561090f57610921565b5b5b8151600101808352811415610712575b5050610280516000526000516101c0515650005b600015610add575b610220526101405261016052610180526101a0526101c0526101e05261020052610140610580525b6105805151602061058051016105805261058061058051101561098757610965565b633a8da8986105a0526105c06101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156109bd5761099b565b6368a4db616104005261042061014080518252806020015182602001528060400151826040015250506104806101a080518252806020015182602001528060400151826040015250506104c0516104a0516104805161046051610440516104205160065801610530565b6105205261054052610560526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515610a5e57610a3b565b6105208051825280602001518260200152806040015182604001525050610200516106205261062051610600516105e0516105c0516006580161064f565b61068052610560610580525b6105805152602061058051036105805261014061058051101515610acb57610aa8565b61068051600052600051610220515650005b63bb7b8b806000511415610d9b573415610af657600080fd5b610140610660525b61066051516020610660510161066052610660610660511015610b2057610afe565b633a8da898610680526106a06101406104e0525b6104e0515160206104e051016104e0526104e06104e0511015610b5657610b34565b637aca288a61050052610520610140610460525b61046051516020610460510161046052610460610460511015610b8c57610b6a565b60065801610281565b610480526104a0526104c052610440610460525b6104605152602061046051036104605261014061046051101515610bcc57610ba9565b610480805182528060200151826020015280604001518260400152505061056051610540516105205160065801610419565b6105c0526105e052610600526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515610c3557610c12565b6105c08051825280602001518260200152806040015182604001525050610140610620525b61062051516020610620510161062052610620610620511015610c7c57610c5a565b600658016100a9565b61064052610600610620525b6106205152602061062051036106205261014061062051101515610cb457610c91565b6106405161070052610700516106e0516106c0516106a0516006580161064f565b61076052610640610660525b6106605152602061066051036106605261014061066051101515610d0457610ce1565b61076051610140526005543b610d1957600080fd5b6005543018610d2757600080fd5b602061080060046318160ddd6107a0526107bc6005545afa610d4857600080fd5b600050610800516107805261014051670de0b6b3a76400008082028215828483041417610d7457600080fd5b80905090509050610780518080610d8a57600080fd5b82049050905060005260206000f350005b633883e1196000511415611218573415610db457600080fd5b60643560028110610dc457600080fd5b5061014060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015250506101a06101405161016051610180516101a0516101c0516101e05160065801610281565b6102205261024052610260526101e0526101c0526101a05261018052610160526101405261022080518252806020015182602001528060400151826040015250506101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015610e8b57610e69565b600658016100a9565b6102c0526102806102a0525b6102a0515260206102a051036102a0526101406102a051101515610ec357610ea0565b6102c05161028052610140610300525b61030051516020610300510161030052610300610300511015610ef557610ed3565b63d564a75f610320526103406101a080518252806020015182602001528060400151826040015250506103a061014080518252806020015182602001528060400151826040015250506102805161040052610400516103e0516103c0516103a0516103805161036051610340516006580161093d565b610460526102e0610300525b6103005152602061030051036103005261014061030051101515610f9a57610f77565b610460516102e05261048060006003818352015b60643515611006576101406104805160038110610fca57600080fd5b60200201805160046104805160038110610fe357600080fd5b6020020135818183011015610ff757600080fd5b80820190509050815250611050565b610140610480516003811061101a57600080fd5b6020020180516004610480516003811061103357600080fd5b60200201358082101561104557600080fd5b808203905090508152505b5b8151600101808352811415610fae575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c051101561108d5761106b565b63d564a75f6104e0526105006101a080518252806020015182602001528060400151826040015250506105606101408051825280602001518260200152806040015182604001525050610280516105c0526105c0516105a05161058051610560516105405161052051610500516006580161093d565b610620526104a06104c0525b6104c0515260206104c051036104c0526101406104c0511015156111325761110f565b610620516104a0526005543b61114757600080fd5b600554301861115557600080fd5b60206106c060046318160ddd6106605261067c6005545afa61117657600080fd5b6000506106c0516106405260006106e052606435156111b4576104a0516102e051808210156111a457600080fd5b808203905090506106e0526111d5565b6102e0516104a051808210156111c957600080fd5b808203905090506106e0525b6106e0516106405180820282158284830414176111f157600080fd5b809050905090506102e051808061120757600080fd5b82049050905060005260206000f350005b634515cef36000511415611cb45762ffffff541561123557600080fd5b600162ffffff55341561124757600080fd5b6010541561125457600080fd5b610140600181526000816020015260008160400152506101a0600081526000816020015260008160400152506002546003808202821582848304141761129957600080fd5b80905090509050600880806112ad57600080fd5b82049050905061020052600354610220526101405161016051610180516101a0516101c0516101e051610200516102205161024051600658016100a9565b610280526102405261022052610200526101e0526101c0526101a05261018052610160526101405261028051610240526005543b61132857600080fd5b600554301861133657600080fd5b602061032060046318160ddd6102c0526102dc6005545afa61135757600080fd5b600050610320516102a0526103406101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561138f5761136d565b60065801610281565b6103c0526103e052610400526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156113cf576113ac565b6103c0805182528060200151826020015280604001518260400152505060006104205261044060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c02001548260400152505060006102a051111561150d576101406104a0525b6104a0515160206104a051016104a0526104a06104a051101561145f5761143d565b63d564a75f6104c0526104e061034080518252806020015182602001528060400151826040015250506105406104408051825280602001518260200152806040015182604001525050610240516105a0526105a05161058051610560516105405161052051610500516104e0516006580161093d565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a051101515611504576114e1565b61060051610420525b610620610440805182528060200151826020015280604001518260400152505061068060006003818352015b6102a05115156115685760006004610680516003811061155857600080fd5b60200201351161156757600080fd5b5b610440610680516003811061157c57600080fd5b60200201516004610680516003811061159457600080fd5b60200201358181830110156115a857600080fd5b8082019050905061062061068051600381106115c357600080fd5b60200201525b8151600101808352811415611539575b50506101406106c0525b6106c0515160206106c051016106c0526106c06106c0511015611605576115e3565b63d564a75f6106e05261070061034080518252806020015182602001528060400151826040015250506107606106208051825280602001518260200152806040015182604001525050610240516107c0526107c0516107a05161078051610760516107405161072051610700516006580161093d565b610820526106a06106c0525b6106c0515260206106c051036106c0526101406106c0511015156116aa57611687565b610820516106a052610420516106a051116116c457600080fd5b6106a0516108405260006102a05111156119f35761086060006003818352015b6106a05161044061086051600381106116fc57600080fd5b6020020151808202821582848304141761171557600080fd5b8090509050905061042051808061172b57600080fd5b8204905090506108805260006108a052610620610860516003811061174f57600080fd5b60200201516108805111156117985761088051610620610860516003811061177657600080fd5b60200201518082101561178857600080fd5b808203905090506108a0526117ce565b61062061086051600381106117ac57600080fd5b602002015161088051808210156117c257600080fd5b808203905090506108a0525b610200516108a05180820282158284830414176117ea57600080fd5b809050905090506402540be400808061180257600080fd5b8204905090506101a0610860516003811061181c57600080fd5b6020020152610620610860516003811061183557600080fd5b60200201516101a0610860516003811061184e57600080fd5b602002015161022051808202821582848304141761186b57600080fd5b809050905090506402540be400808061188357600080fd5b8204905090508082101561189657600080fd5b8082039050905061086051600381106118ae57600080fd5b600160c052602060c020015561062061086051600381106118ce57600080fd5b6020020180516101a061086051600381106118e857600080fd5b6020020151808210156118fa57600080fd5b808203905090508152505b81516001018083528114156116e4575b50506101406108c0525b6108c0515160206108c051016108c0526108606108c05110156119415761191f565b63d564a75f6108e05261090061034080518252806020015182602001528060400151826040015250506109606106208051825280602001518260200152806040015182604001525050610240516109c0526109c0516109a05161098051610960516109405161092051610900516006580161093d565b610a20526108406108c0525b6108c0515260206108c051036108c0526101406108c0511015156119e6576119c3565b610a205161084052611a1b565b600160c052602060c02061062080518255806020015160018301558060400151600283015550505b6000610a40526102a0511515611a38576106a051610a4052611a8d565b6102a051610840516104205180821015611a5157600080fd5b808203905090508082028215828483041417611a6c57600080fd5b80905090509050610420518080611a8257600080fd5b820490509050610a40525b6308c379a0610a60526020610a80526014610aa0527f536c697070616765207363726577656420796f75000000000000000000000000610ac052610aa050606435610a40511015611adf576084610a7cfd5b610b0060006003818352015b60006004610b005160038110611b0057600080fd5b60200201351115611bce57610b005160038110611b1c57600080fd5b600060c052602060c02001543b611b3257600080fd5b610b005160038110611b4357600080fd5b600060c052602060c02001543018611b5a57600080fd5b6020610be060646323b872dd610b205233610b405230610b60526004610b005160038110611b8757600080fd5b6020020135610b8052610b3c6000610b005160038110611ba657600080fd5b600060c052602060c02001545af1611bbd57600080fd5b600050610be051611bcd57600080fd5b5b5b8151600101808352811415611aeb575b50506005543b611bee57600080fd5b6005543018611bfc57600080fd5b6000600060446340c10f19610c005233610c2052610a4051610c4052610c1c60006005545af1611c2b57600080fd5b600435610ca052602435610cc052604435610ce0526101a051610d00526101c051610d20526101e051610d40526106a051610d60526102a051610a4051818183011015611c7757600080fd5b80820190509050610d8052337f423f6495a08fc652425cf4ed0d1f9e37e571d9b9529b1c1c23cce780b2e7df0d610100610ca0a2600062ffffff55005b600015612115575b610200526101405261016052610180526101a0526101c0526101e0526000610140511215610160516101405114151660006101605112151660036101405112166003610160511216611d0d57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051600658016100a9565b6102605261022052610200526101e0526101c0526101a05261018052610160526101405261026051610220526101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015611d8c57611d6a565b633a8da8986102c0526102e06101a0805182528060200151826020015280604001518260400152505061022051610340526103405161032051610300516102e0516006580161064f565b6103a0526102806102a0525b6102a0515260206102a051036102a0526101406102a051101515611e0557611de2565b6103a05161028052610280516103c05260006103e0526102205160038082028215828483041417611e3557600080fd5b809050905090506104005260006104205261044060006003818352015b61014051610440511415611e6d576101805161042052611ea3565b61016051610440511815611e9d576101a06104405160038110611e8f57600080fd5b602002015161042052611ea2565b611f1f565b5b6103e0805161042051818183011015611ebb57600080fd5b808201905090508152506103c051610280518082028215828483041417611ee157600080fd5b809050905090506104205160038082028215828483041417611f0257600080fd5b809050905090508080611f1457600080fd5b8204905090506103c0525b8151600101808352811415611e52575b50506103c051610280518082028215828483041417611f4d57600080fd5b809050905090506104005160038082028215828483041417611f6e57600080fd5b809050905090508080611f8057600080fd5b8204905090506103c0526103e05161028051610400518080611fa157600080fd5b820490509050818183011015611fb657600080fd5b8082019050905061046052600061048052610280516104a0526104c0600060ff818352015b6104a051610480526104a0516104a0518082028215828483041417611fff57600080fd5b809050905090506103c05181818301101561201957600080fd5b8082019050905060026104a051808202821582848304141761203a57600080fd5b809050905090506104605181818301101561205457600080fd5b80820190509050610280518082101561206c57600080fd5b80820390509050808061207e57600080fd5b8204905090506104a052610480516104a05111156120c55760016104a05161048051808210156120ad57600080fd5b808203905090501115156120c057612101565b6120f0565b6001610480516104a051808210156120dc57600080fd5b808203905090501115156120ef57612101565b5b5b8151600101808352811415611fdb575b50506104a051600052600051610200515650005b635e0d443f60005114156124bd57341561212e57600080fd5b6060516004358060405190131561214457600080fd5b809190121561215257600080fd5b506060516024358060405190131561216957600080fd5b809190121561217757600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506102206101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051637aca288a6102a0526102c06101408051825280602001518260200152806040015182604001525050610300516102e0516102c05160065801610419565b61036052610380526103a052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080518252806020015182602001528060400151826040015250506102206004356003811061229257600080fd5b6020020151604435610140600435600381106122ad57600080fd5b602002015180820282158284830414176122c657600080fd5b80905090509050670de0b6b3a764000080806122e157600080fd5b8204905090508181830110156122f657600080fd5b808201905090506103c052610140610400525b6104005151602061040051016104005261040061040051101561232b57612309565b63554abe286104205260043561044052602435610460526103c051610480526104a061022080518252806020015182602001528060400151826040015250506104e0516104c0516104a05161048051610460516104405160065801611cbc565b610540526103e0610400525b61040051526020610400510361040052610140610400511015156123ba57612397565b610540516103e052610220602435600381106123d557600080fd5b60200201516103e051808210156123eb57600080fd5b8082039050905060018082101561240157600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761242557600080fd5b809050905090506101406024356003811061243f57600080fd5b6020020151808061244f57600080fd5b8204905090506105605260025461056051808202821582848304141761247457600080fd5b809050905090506402540be400808061248c57600080fd5b820490509050610580526105605161058051808210156124ab57600080fd5b8082039050905060005260206000f350005b6307211ef760005114156128455734156124d657600080fd5b606051600435806040519013156124ec57600080fd5b80919012156124fa57600080fd5b506060516024358060405190131561251157600080fd5b809190121561251f57600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506102206101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051637aca288a6102a0526102c06101408051825280602001518260200152806040015182604001525050610300516102e0516102c05160065801610419565b61036052610380526103a052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080518252806020015182602001528060400151826040015250506103c06402540be40081526402540be400816020015260018160400152506102206004356003811061265857600080fd5b60200201516044356103c06004356003811061267357600080fd5b6020020151808202821582848304141761268c57600080fd5b809050905090508181830110156126a257600080fd5b8082019050905061042052610140610460525b610460515160206104605101610460526104606104605110156126d7576126b5565b63554abe28610480526004356104a0526024356104c052610420516104e05261050061022080518252806020015182602001528060400151826040015250506105405161052051610500516104e0516104c0516104a05160065801611cbc565b6105a052610440610460525b610460515260206104605103610460526101406104605110151561276657612743565b6105a051610440526102206024356003811061278157600080fd5b6020020151610440518082101561279757600080fd5b808203905090506001808210156127ad57600080fd5b808203905090506103c0602435600381106127c757600080fd5b602002015180806127d757600080fd5b8204905090506105c0526002546105c05180820282158284830414176127fc57600080fd5b809050905090506402540be400808061281457600080fd5b8204905090506105e0526105c0516105e0518082101561283357600080fd5b8082039050905060005260206000f350005b600015612d31575b610200526101405261016052610180526101a0526101c0526101e0526010541561287657600080fd5b61022060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015250506102806101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156128da576128b8565b6368a4db61610300526103206101a0805182528060200151826020015280604001518260400152505061038061022080518252806020015182602001528060400151826040015250506103c0516103a0516103805161036051610340516103205160065801610530565b6104205261044052610460526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561297b57612958565b610420805182528060200151826020015280604001518260400152505061028061014051600381106129ac57600080fd5b6020020151610180516101a061014051600381106129c957600080fd5b602002015180820282158284830414176129e257600080fd5b80905090509050670de0b6b3a764000080806129fd57600080fd5b820490509050818183011015612a1257600080fd5b80820190509050610480526101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015612a4757612a25565b63554abe286104e05261014051610500526101605161052052610480516105405261056061028080518252806020015182602001528060400151826040015250506105a051610580516105605161054051610520516105005160065801611cbc565b610600526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515612ad857612ab5565b610600516104a0526102806101605160038110612af457600080fd5b60200201516104a05180821015612b0a57600080fd5b80820390509050600180821015612b2057600080fd5b8082039050905061062052610620516002548082028215828483041417612b4657600080fd5b809050905090506402540be4008080612b5e57600080fd5b82049050905061064052610640516003548082028215828483041417612b8357600080fd5b809050905090506402540be4008080612b9b57600080fd5b82049050905061066052610620516106405180821015612bba57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612bde57600080fd5b809050905090506101a06101605160038110612bf957600080fd5b60200201518080612c0957600080fd5b8204905090506106205261066051670de0b6b3a76400008082028215828483041417612c3457600080fd5b809050905090506101a06101605160038110612c4f57600080fd5b60200201518080612c5f57600080fd5b820490509050610660526102206101405160038110612c7d57600080fd5b602002015161018051818183011015612c9557600080fd5b808201905090506101405160038110612cad57600080fd5b600160c052602060c02001556102206101605160038110612ccd57600080fd5b60200201516106205180821015612ce357600080fd5b808203905090506106605180821015612cfb57600080fd5b808203905090506101605160038110612d1357600080fd5b600160c052602060c020015561062051600052600051610200515650005b633df0212460005114156130cd5762ffffff5415612d4e57600080fd5b600162ffffff553415612d6057600080fd5b60605160043580604051901315612d7657600080fd5b8091901215612d8457600080fd5b5060605160243580604051901315612d9b57600080fd5b8091901215612da957600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506101405161016051610180516101a0516101c0516101e051610200516102205163cf6eee7661026052600435610280526024356102a0526044356102c0526102e0610140805182528060200151826020015280604001518260400152505061032051610300516102e0516102c0516102a051610280516006580161284d565b6103805261022052610200526101e0526101c0526101a05261018052610160526101405261038051610220526308c379a06103a05260206103c052602e6103e0527f45786368616e676520726573756c74656420696e20666577657220636f696e73610400527f207468616e206578706563746564000000000000000000000000000000000000610420526103e050606435610220511015612f195760a46103bcfd5b6104606001815260008160200152600081604001525060043560038110612f3f57600080fd5b600060c052602060c02001543b612f5557600080fd5b60043560038110612f6557600080fd5b600060c052602060c02001543018612f7c57600080fd5b602061058060646323b872dd6104c052336104e0523061050052604435610520526104dc600060043560038110612fb257600080fd5b600060c052602060c02001545af1612fc957600080fd5b60005061058051612fd957600080fd5b60243560038110612fe957600080fd5b600060c052602060c02001543b612fff57600080fd5b6024356003811061300f57600080fd5b600060c052602060c0200154301861302657600080fd5b6020610640604463a9059cbb6105a052336105c052610220516105e0526105bc60006024356003811061305857600080fd5b600060c052602060c02001545af161306f57600080fd5b6000506106405161307f57600080fd5b60043561066052604435610680526024356106a052610220516106c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610660a2600062ffffff55005b63ecb586a5600051141561344c5762ffffff54156130ea57600080fd5b600162ffffff5534156130fc57600080fd5b6005543b61310957600080fd5b600554301861311757600080fd5b60206101c060046318160ddd6101605261017c6005545afa61313857600080fd5b6000506101c051610140526101e060008152600081602001526000816040015250610240600081526000816020015260008160400152506102a06001815260008160200152600081604001525061030060006003818352015b61030051600381106131a257600080fd5b600160c052602060c020015460043580820282158284830414176131c557600080fd5b809050905090506101405180806131db57600080fd5b820490509050610320526308c379a0610340526020610360526030610380527f5769746864726177616c20726573756c74656420696e20666577657220636f696103a0527f6e73207468616e206578706563746564000000000000000000000000000000006103c052610380506024610300516003811061325b57600080fd5b60200201356103205110156132715760a461035cfd5b610300516003811061328257600080fd5b600160c052602060c02001805461032051808210156132a057600080fd5b80820390509050815550610320516101e061030051600381106132c257600080fd5b602002015261030051600381106132d857600080fd5b600060c052602060c02001543b6132ee57600080fd5b61030051600381106132ff57600080fd5b600060c052602060c0200154301861331657600080fd5b60206104a0604463a9059cbb610400523361042052610320516104405261041c6000610300516003811061334957600080fd5b600060c052602060c02001545af161336057600080fd5b6000506104a05161337057600080fd5b5b8151600101808352811415613191575b50506005543b61339057600080fd5b600554301861339e57600080fd5b6000600060446379cc67906104c052336104e052600435610500526104dc60006005545af16133cc57600080fd5b6101e051610560526102005161058052610220516105a052610240516105c052610260516105e0526102805161060052610140516004358082101561341057600080fd5b8082039050905061062052337fa49d4cf02656aebf8c771f5a8585638a2a15ee6c97cf7205d4208ed7c1df252d60e0610560a2600062ffffff55005b639fdaea0c6000511415613e4c5762ffffff541561346957600080fd5b600162ffffff55341561347b57600080fd5b6010541561348857600080fd5b610140600181526000816020015260008160400152506005543b6134ab57600080fd5b60055430186134b957600080fd5b602061022060046318160ddd6101c0526101dc6005545afa6134da57600080fd5b600050610220516101a05260006101a051116134f557600080fd5b6002546003808202821582848304141761350e57600080fd5b809050905090506008808061352257600080fd5b82049050905061024052600354610260526102806101406102e0525b6102e0515160206102e051016102e0526102e06102e05110156135605761353e565b60065801610281565b6103005261032052610340526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156135a05761357d565b6103008051825280602001518260200152806040015182604001525050610140610380525b610380515160206103805101610380526103806103805110156135e7576135c5565b600658016100a9565b6103a052610360610380525b610380515260206103805103610380526101406103805110151561361f576135fc565b6103a051610360526103c060018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015250506104206103c080518252806020015182602001528060400151826040015250506101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156136a857613686565b63d564a75f6104c0526104e061028080518252806020015182602001528060400151826040015250506105406103c08051825280602001518260200152806040015182604001525050610360516105a0526105a05161058051610560516105405161052051610500516104e0516006580161093d565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561374d5761372a565b610600516104805261062060006003818352015b610420610620516003811061377557600080fd5b6020020180516004610620516003811061378e57600080fd5b6020020135808210156137a057600080fd5b808203905090508152505b8151600101808352811415613761575b5050610140610660525b610660515160206106605101610660526106606106605110156137e7576137c5565b63d564a75f610680526106a0610280805182528060200151826020015280604001518260400152505061070061042080518252806020015182602001528060400151826040015250506103605161076052610760516107405161072051610700516106e0516106c0516106a0516006580161093d565b6107c052610640610660525b610660515260206106605103610660526101406106605110151561388c57613869565b6107c051610640526107e06000815260008160200152600081604001525061084060006003818352015b610640516103c061084051600381106138ce57600080fd5b602002015180820282158284830414176138e757600080fd5b809050905090506104805180806138fd57600080fd5b82049050905061086052600061088052610420610840516003811061392157600080fd5b602002015161086051111561396a5761086051610420610840516003811061394857600080fd5b60200201518082101561395a57600080fd5b80820390509050610880526139a0565b610420610840516003811061397e57600080fd5b6020020151610860518082101561399457600080fd5b80820390509050610880525b610240516108805180820282158284830414176139bc57600080fd5b809050905090506402540be40080806139d457600080fd5b8204905090506107e061084051600381106139ee57600080fd5b60200201526104206108405160038110613a0757600080fd5b60200201516107e06108405160038110613a2057600080fd5b6020020151610260518082028215828483041417613a3d57600080fd5b809050905090506402540be4008080613a5557600080fd5b82049050905080821015613a6857600080fd5b808203905090506108405160038110613a8057600080fd5b600160c052602060c02001556104206108405160038110613aa057600080fd5b6020020180516107e06108405160038110613aba57600080fd5b602002015180821015613acc57600080fd5b808203905090508152505b81516001018083528114156138b6575b50506101406108c0525b6108c0515160206108c051016108c0526108c06108c0511015613b1357613af1565b63d564a75f6108e05261090061028080518252806020015182602001528060400151826040015250506109606104208051825280602001518260200152806040015182604001525050610360516109c0526109c0516109a05161098051610960516109405161092051610900516006580161093d565b610a20526108a06108c0525b6108c0515260206108c051036108c0526101406108c051101515613bb857613b95565b610a20516108a052610480516108a05180821015613bd557600080fd5b808203905090506101a0518082028215828483041417613bf457600080fd5b80905090509050610480518080613c0a57600080fd5b8204905090506001818183011015613c2157600080fd5b80820190509050610a40526308c379a0610a60526020610a80526014610aa0527f536c697070616765207363726577656420796f75000000000000000000000000610ac052610aa050606435610a40511115613c7e576084610a7cfd5b610b0060006003818352015b60006004610b005160038110613c9f57600080fd5b60200201351115613d6857610b005160038110613cbb57600080fd5b600060c052602060c02001543b613cd157600080fd5b610b005160038110613ce257600080fd5b600060c052602060c02001543018613cf957600080fd5b6020610bc0604463a9059cbb610b205233610b40526004610b005160038110613d2157600080fd5b6020020135610b6052610b3c6000610b005160038110613d4057600080fd5b600060c052602060c02001545af1613d5757600080fd5b600050610bc051613d6757600080fd5b5b5b8151600101808352811415613c8a575b50506005543b613d8857600080fd5b6005543018613d9657600080fd5b6000600060446379cc6790610be05233610c0052610a4051610c2052610bfc60006005545af1613dc557600080fd5b600435610c8052602435610ca052604435610cc0526107e051610ce05261080051610d005261082051610d205261064051610d40526101a051610a405180821015613e0f57600080fd5b80820390509050610d6052337f173599dbf9c6ca6f7c3b590df07ae98a45d74ff54065505141e7de6c46a624c2610100610c80a2600062ffffff55005b600015614175575b610200526101405261016052610180526101a0526101c0526101e05260036101605112600061016051121516613e8957600080fd5b6101e051610220526000610240526101405160038082028215828483041417613eb157600080fd5b80905090509050610260526000610280526102a060006003818352015b610160516102a0511815613efe576101806102a05160038110613ef057600080fd5b602002015161028052613f03565b613f7f565b610240805161028051818183011015613f1b57600080fd5b80820190509050815250610220516101e0518082028215828483041417613f4157600080fd5b809050905090506102805160038082028215828483041417613f6257600080fd5b809050905090508080613f7457600080fd5b820490509050610220525b8151600101808352811415613ece575b5050610220516101e0518082028215828483041417613fad57600080fd5b809050905090506102605160038082028215828483041417613fce57600080fd5b809050905090508080613fe057600080fd5b82049050905061022052610240516101e05161026051808061400157600080fd5b82049050905081818301101561401657600080fd5b808201905090506102c05260006102e0526101e05161030052610320600060ff818352015b610300516102e0526103005161030051808202821582848304141761405f57600080fd5b809050905090506102205181818301101561407957600080fd5b80820190509050600261030051808202821582848304141761409a57600080fd5b809050905090506102c0518181830110156140b457600080fd5b808201905090506101e051808210156140cc57600080fd5b8082039050905080806140de57600080fd5b820490509050610300526102e051610300511115614125576001610300516102e0518082101561410d57600080fd5b8082039050905011151561412057614161565b614150565b60016102e051610300518082101561413c57600080fd5b8082039050905011151561414f57614161565b5b5b815160010180835281141561403b575b505061030051600052600051610200515650005b6000156148be575b6101e0526101405261016052610180526101a0526101c0526101405161016051610180516101a0516101c0516101e05161020051600658016100a9565b61024052610200526101e0526101c0526101a0526101805261016052610140526102405161020052600254600380820282158284830414176141fb57600080fd5b809050905090506008808061420f57600080fd5b820490509050610260526102806402540be40081526402540be400816020015260018160400152506005543b61424457600080fd5b600554301861425257600080fd5b602061036060046318160ddd6103005261031c6005545afa61427357600080fd5b600050610360516102e0526103806101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156142ab57614289565b637aca288a61040052610420610180805182528060200151826020015280604001518260400152505061046051610440516104205160065801610419565b6104c0526104e052610500526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515614320576142fd565b6104c08051825280602001518260200152806040015182604001525050610140610540525b6105405151602061054051016105405261054061054051101561436757614345565b633a8da898610560526105806103808051825280602001518260200152806040015182604001525050610200516105e0526105e0516105c0516105a051610580516006580161064f565b61064052610520610540525b61054051526020610540510361054052610140610540511015156143e0576143bd565b6106405161052052610520516101405161052051808202821582848304141761440857600080fd5b809050905090506102e051808061441e57600080fd5b8204905090508082101561443157600080fd5b80820390509050610660526106806103808051825280602001518260200152806040015182604001525050610140610700525b6107005151602061070051016107005261070061070051101561448657614464565b63da97dfe161072052610200516107405261016051610760526107806103808051825280602001518260200152806040015182604001525050610660516107e0526107e0516107c0516107a05161078051610760516107405160065801613e54565b610840526106e0610700525b6107005152602061070051036107005261014061070051101515614517576144f4565b610840516106e052610380610160516003811061453357600080fd5b60200201516106e0518082101561454957600080fd5b80820390509050610280610160516003811061456457600080fd5b6020020151808061457457600080fd5b8204905090506108605261088060006003818352015b60006108a0526101605161088051141561460c5761038061088051600381106145b257600080fd5b60200201516106605180820282158284830414176145cf57600080fd5b809050905090506105205180806145e557600080fd5b8204905090506106e051808210156145fc57600080fd5b808203905090506108a05261468b565b610380610880516003811061462057600080fd5b6020020151610380610880516003811061463957600080fd5b602002015161066051808202821582848304141761465657600080fd5b8090509050905061052051808061466c57600080fd5b8204905090508082101561467f57600080fd5b808203905090506108a0525b610680610880516003811061469f57600080fd5b602002018051610260516108a05180820282158284830414176146c157600080fd5b809050905090506402540be40080806146d957600080fd5b820490509050808210156146ec57600080fd5b808203905090508152505b815160010180835281141561458a575b5050610680610160516003811061471d57600080fd5b60200201516101406108e0525b6108e0515160206108e051016108e0526108e06108e051101561474c5761472a565b63da97dfe161090052610200516109205261016051610940526109606106808051825280602001518260200152806040015182604001525050610660516109c0526109c0516109a0516109805161096051610940516109205160065801613e54565b610a20526108c06108e0525b6108e0515260206108e051036108e0526101406108e0511015156147dd576147ba565b610a2051808210156147ee57600080fd5b808203905090506108c0526108c05160018082101561480c57600080fd5b80820390509050610280610160516003811061482757600080fd5b6020020151808061483757600080fd5b8204905090506108c052610a408080806108c051815250506020810190508080610860516108c0518082101561486c57600080fd5b808203905090508152505060409050905060c05260c051610a80525b6000610a805111151561489a576148b6565b6020610a805103610a4001516020610a805103610a8052614888565b6101e0515650005b63cc2b27d760005114156149ec5734156148d757600080fd5b606051602435806040519013156148ed57600080fd5b80919012156148fb57600080fd5b5061014061014051610160516101805160065801610281565b6101c0526101e052610200526101805261016052610140526101c080518252806020015182602001528060400151826040015250506101405161016051610180516101a0516101c0516101e0516102005163f7d59a096102405260043561026052602435610280526102a061014080518252806020015182602001528060400151826040015250506102e0516102c0516102a05161028051610260516006580161417d565b6103405261036052610200526101e0526101c0526101a0526101805261016052610140526103405160005260206000f350005b631a4d01d26000511415614d685762ffffff5415614a0957600080fd5b600162ffffff553415614a1b57600080fd5b60605160243580604051901315614a3157600080fd5b8091901215614a3f57600080fd5b506000610140526000610160526101806101405161016051610180516101a0516101c05160065801610281565b6102005261022052610240526101c0526101a05261018052610160526101405261020080518252806020015182602001528060400151826040015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405163f7d59a09610280526004356102a0526024356102c0526102e0610180805182528060200151826020015280604001518260400152505061032051610300516102e0516102c0516102a0516006580161417d565b610380526103a0526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380805161014052602081015161016052506308c379a06103c05260206103e0526018610400527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006104205261040050604435610140511015614bb25760846103dcfd5b60243560038110614bc257600080fd5b600160c052602060c02001805461014051610160516003548082028215828483041417614bee57600080fd5b809050905090506402540be4008080614c0657600080fd5b820490509050818183011015614c1b57600080fd5b8082019050905080821015614c2f57600080fd5b808203905090508155506005543b614c4657600080fd5b6005543018614c5457600080fd5b6000600060446379cc67906104605233610480526004356104a05261047c60006005545af1614c8257600080fd5b60243560038110614c9257600080fd5b600060c052602060c02001543b614ca857600080fd5b60243560038110614cb857600080fd5b600060c052602060c02001543018614ccf57600080fd5b60206105a0604463a9059cbb610500523361052052610140516105405261051c600060243560038110614d0157600080fd5b600060c052602060c02001545af1614d1857600080fd5b6000506105a051614d2857600080fd5b6004356105c052610140516105e052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406105c0a2600062ffffff55005b633c157e646000511415614eda573415614d8157600080fd5b6004543314614d8f57600080fd5b60085462015180818183011015614da557600080fd5b80820190509050421015614db857600080fd5b4262015180818183011015614dcc57600080fd5b808201905090506024351015614de157600080fd5b61014051600658016100a9565b61018052610140526101805161014052620f42406004351060006004351116614e1657600080fd5b61014051600435600a8082028215828483041417614e3357600080fd5b80905090509050101561014051600435101661014051600a8082028215828483041417614e5f57600080fd5b8090509050905060043511156101405160043510151617614e7f57600080fd5b6101405160065560043560075542600855602435600955610140516101a0526004356101c052426101e052602435610200527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460806101a0a1005b63551a65886000511415614f6a573415614ef357600080fd5b6004543314614f0157600080fd5b61014051600658016100a9565b6101805261014052610180516101405261014051600655610140516007554260085542600955610140516101a052426101c0527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860406101a0a1005b635b5a14676000511415615033573415614f8357600080fd5b6004543314614f9157600080fd5b600a5415614f9e57600080fd5b64012a05f2006024351115614fb257600080fd5b64012a05f2006004351115614fc657600080fd5b426203f480818183011015614fda57600080fd5b808201905090506101405261014051600a55600435600c55602435600d556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156150ca57341561504c57600080fd5b600454331461505a57600080fd5b6000600a541142600a5411151661507057600080fd5b6000600a55600c5461014052600d546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb60005114156150f85734156150e357600080fd5b60045433146150f157600080fd5b6000600a55005b636b441a40600051141561519957341561511157600080fd5b600435602051811061512257600080fd5b50600454331461513157600080fd5b600b541561513e57600080fd5b426203f48081818301101561515257600080fd5b808201905090506101405261014051600b55600435600e55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156152155734156151b257600080fd5b60045433146151c057600080fd5b6000600b5411600b54421015166151d657600080fd5b6000600b55600e546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193600051141561524357341561522e57600080fd5b600454331461523c57600080fd5b6000600b55005b6330c54085600051141561539757341561525c57600080fd5b600454331461526a57600080fd5b61014060006003818352015b610140516003811061528757600080fd5b600060c052602060c020015461016052610160513b6152a557600080fd5b6101605130186152b457600080fd5b602061022060246370a082316101a052306101c0526101bc610160515afa6152db57600080fd5b6000506102205161014051600381106152f357600080fd5b600160c052602060c02001548082101561530c57600080fd5b8082039050905061018052600061018051111561538257610160513b61533157600080fd5b61016051301861534057600080fd5b60206102e0604463a9059cbb610240523361026052610180516102805261025c6000610160515af161537157600080fd5b6000506102e05161538157600080fd5b5b5b8151600101808352811415615276575b5050005b63e369885360005114156153d35734156153b057600080fd5b60045433146153be57600080fd5b42600f54116153cc57600080fd5b6001601055005b633046f97260005114156154015734156153ec57600080fd5b60045433146153fa57600080fd5b6000601055005b6323746eb8600051141561546657341561541a57600080fd5b6060516004358060405190131561543057600080fd5b809190121561543e57600080fd5b506004356003811061544f57600080fd5b600060c052602060c020015460005260206000f350005b63065a80d860005114156154cb57341561547f57600080fd5b6060516004358060405190131561549557600080fd5b80919012156154a357600080fd5b50600435600381106154b457600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f4360005114156154f25734156154e457600080fd5b60025460005260206000f350005b63fee3f7f9600051141561551957341561550b57600080fd5b60035460005260206000f350005b638da5cb5b600051141561554057341561553257600080fd5b60045460005260206000f350005b635409491a600051141561556757341561555957600080fd5b60065460005260206000f350005b63b4b577ad600051141561558e57341561558057600080fd5b60075460005260206000f350005b632081066c60005114156155b55734156155a757600080fd5b60085460005260206000f350005b631405228860005114156155dc5734156155ce57600080fd5b60095460005260206000f350005b63405e28f860005114156156035734156155f557600080fd5b600a5460005260206000f350005b63e0a0b586600051141561562a57341561561c57600080fd5b600b5460005260206000f350005b6358680d0b600051141561565157341561564357600080fd5b600c5460005260206000f350005b63e3824462600051141561567857341561566a57600080fd5b600d5460005260206000f350005b631ec0cdc1600051141561569f57341561569157600080fd5b600e5460005260206000f350005b5b60006000fd

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

000000000000000000000000eb4c2781e4eba804ce9a9803c67d0893436bb27d0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6000000000000000000000000075b1bb99792c9e1041ba13afef80c91a1e70fb3000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000003d0900

-----Decoded View---------------
Arg [0] : _coins (address[3]): 0xEB4C2781e4ebA804CE9a9803C67d0893436bB27D,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6
Arg [1] : _pool_token (address): 0x075b1bb99792c9E1041bA13afEf80C91a1e70fB3
Arg [2] : _A (uint256): 100
Arg [3] : _fee (uint256): 4000000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000eb4c2781e4eba804ce9a9803c67d0893436bb27d
Arg [1] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [2] : 000000000000000000000000fe18be6b3bd88a2d2a7f928d00292e7a9963cfc6
Arg [3] : 000000000000000000000000075b1bb99792c9e1041ba13afef80c91a1e70fb3
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000000000000000000000000000000000000003d0900


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Curve.fi's sBTC swap address.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.