ETH Price: $3,025.25 (-2.23%)
Gas: 4 Gwei

Contract

0xA5407eAE9Ba41422680e2e00537571bcC53efBfD
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Value
Exchange_underly...198130082024-05-06 19:04:2330 hrs ago1715022263IN
Curve.fi: sUSD v2 Swap
0 ETH0.001177395.30822627
Exchange_underly...198129542024-05-06 18:53:3531 hrs ago1715021615IN
Curve.fi: sUSD v2 Swap
0 ETH0.001173675.18047304
Exchange_underly...198123302024-05-06 16:48:1133 hrs ago1715014091IN
Curve.fi: sUSD v2 Swap
0 ETH0.00144356.31798655
Exchange_underly...197835302024-05-02 16:08:115 days ago1714666091IN
Curve.fi: sUSD v2 Swap
0 ETH0.0046239419.35474505
Exchange197821502024-05-02 11:30:235 days ago1714649423IN
Curve.fi: sUSD v2 Swap
0 ETH0.001679657.48031778
Exchange_underly...197270192024-04-24 18:28:4713 days ago1713983327IN
Curve.fi: sUSD v2 Swap
0 ETH0.002652712.14385521
Exchange_underly...196756452024-04-17 13:59:2320 days ago1713362363IN
Curve.fi: sUSD v2 Swap
0 ETH0.0064565229.18334605
Exchange_underly...196305312024-04-11 6:15:3526 days ago1712816135IN
Curve.fi: sUSD v2 Swap
0 ETH0.00266211.68008462
Remove_liquidity196296612024-04-11 3:19:2326 days ago1712805563IN
Curve.fi: sUSD v2 Swap
0 ETH0.0033686812.34307888
Exchange_underly...196245712024-04-10 10:15:2327 days ago1712744123IN
Curve.fi: sUSD v2 Swap
0 ETH0.0044425820.27483189
Exchange_underly...196210072024-04-09 22:17:4728 days ago1712701067IN
Curve.fi: sUSD v2 Swap
0 ETH0.0039826418.17577797
Exchange195926652024-04-05 22:58:3532 days ago1712357915IN
Curve.fi: sUSD v2 Swap
0 ETH0.0028817412.3078229
Exchange195926472024-04-05 22:54:5932 days ago1712357699IN
Curve.fi: sUSD v2 Swap
0 ETH0.0033244514.54680538
Exchange195512182024-03-31 3:30:3537 days ago1711855835IN
Curve.fi: sUSD v2 Swap
0 ETH0.0021006717.02574353
Exchange194955832024-03-23 6:42:1145 days ago1711176131IN
Curve.fi: sUSD v2 Swap
0 ETH0.0033639515.49846747
Exchange_underly...194508412024-03-16 23:54:1152 days ago1710633251IN
Curve.fi: sUSD v2 Swap
0 ETH0.0064077727.12376539
Exchange194421352024-03-15 18:29:2353 days ago1710527363IN
Curve.fi: sUSD v2 Swap
0 ETH0.0075713934.2487226
Exchange194420672024-03-15 18:15:3553 days ago1710526535IN
Curve.fi: sUSD v2 Swap
0 ETH0.0090473841.83353339
Exchange194419692024-03-15 17:55:4753 days ago1710525347IN
Curve.fi: sUSD v2 Swap
0 ETH0.0080608237.27393825
Exchange194419072024-03-15 17:43:1153 days ago1710524591IN
Curve.fi: sUSD v2 Swap
0 ETH0.0085388139.48202621
Exchange194418432024-03-15 17:30:1153 days ago1710523811IN
Curve.fi: sUSD v2 Swap
0 ETH0.0077599632.8574034
Exchange193574452024-03-03 21:52:5965 days ago1709502779IN
Curve.fi: sUSD v2 Swap
0 ETH0.0119351152.75190691
Add_liquidity193483762024-03-02 15:27:5966 days ago1709393279IN
Curve.fi: sUSD v2 Swap
0 ETH0.0178825248.18062811
Exchange192852762024-02-22 19:37:5975 days ago1708630679IN
Curve.fi: sUSD v2 Swap
0 ETH0.0111902378.0198615
Exchange191173522024-01-30 5:51:5998 days ago1706593919IN
Curve.fi: sUSD v2 Swap
0 ETH0.0040179516.52929612
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


# 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: modifying
    def supplyRatePerBlock() -> uint256: constant
    def accrualBlockNumber() -> uint256: constant


from vyper.interfaces import ERC20


# Tether transfer-only ABI
contract USDT:
    def transfer(_to: address, _value: uint256): modifying
    def transferFrom(_from: address, _to: address, _value: uint256): modifying


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

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

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

# Flag "ERC20s" which don't return from transfer() and transferFrom()
TETHERED: constant(bool[N_COINS]) = [False, False, True, 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(1, uint256), convert(1000000000000, uint256), convert(1000000000000, 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

# Events
TokenExchange: event({buyer: indexed(address), sold_id: int128, tokens_sold: uint256, bought_id: int128, tokens_bought: uint256})
TokenExchangeUnderlying: 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})
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)})
CommitNewParameters: event({deadline: indexed(timestamp), A: uint256, fee: uint256, admin_fee: uint256})
NewParameters: event({A: uint256, fee: uint256, admin_fee: uint256})

coins: public(address[N_COINS])
underlying_coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
A: public(uint256)  # 2 x amplification coefficient
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

owner: public(address)
token: ERC20m

admin_actions_deadline: public(timestamp)
transfer_ownership_deadline: public(timestamp)
future_A: public(uint256)
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], _underlying_coins: address[N_COINS],
             _pool_token: address,
             _A: uint256, _fee: uint256):
    """
    _coins: Addresses of ERC20 conracts of coins (c-tokens) involved
    _underlying_coins: Addresses of plain coins (ERC20)
    _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
        assert _underlying_coins[i] != ZERO_ADDRESS
        self.balances[i] = 0
    self.coins = _coins
    self.underlying_coins = _underlying_coins
    self.A = _A
    self.fee = _fee
    self.admin_fee = 0
    self.owner = msg.sender
    self.kill_deadline = block.timestamp + kill_deadline_dt
    self.is_killed = False
    self.token = ERC20m(_pool_token)


@private
@constant
def _stored_rates() -> uint256[N_COINS]:
    # exchangeRateStored * (1 + supplyRatePerBlock * (getBlockNumber - accrualBlockNumber) / 1e18)
    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]).exchangeRateStored()
            supply_rate: uint256 = cERC20(self.coins[i]).supplyRatePerBlock()
            old_block: uint256 = cERC20(self.coins[i]).accrualBlockNumber()
            rate += rate * supply_rate * (block.number - old_block) / LENDING_PRECISION
        result[i] *= rate
    return result


@private
def _current_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] / 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]) -> uint256:
    S: uint256 = 0
    for _x in xp:
        S += _x
    if S == 0:
        return 0

    Dprev: uint256 = 0
    D: uint256 = S
    Ann: uint256 = self.A * N_COINS
    for _i in range(255):
        D_P: uint256 = D
        for _x in xp:
            D_P = D_P * D / (_x * N_COINS + 1)  # +1 is to prevent /0
        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]) -> uint256:
    return self.get_D(self._xp_mem(rates, _balances))


@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._stored_rates()))
    # 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._stored_rates()
    D0: uint256 = self.get_D_mem(rates, _balances)
    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)
    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

    tethered: bool[N_COINS] = TETHERED
    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

    token_supply: uint256 = self.token.totalSupply()
    rates: uint256[N_COINS] = self._current_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)
    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)
    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)
    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 tethered[i] and not use_lending[i]:
            USDT(self.coins[i]).transferFrom(msg.sender, self, amounts[i])
        else:
            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)

    D: uint256 = self.get_D(_xp)
    c: uint256 = D
    S_: uint256 = 0
    Ann: uint256 = self.A * 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._stored_rates()
    xp: uint256[N_COINS] = self._xp(rates)

    x: uint256 = xp[i] + (dx * rates[i] / PRECISION)
    y: uint256 = self.get_y(i, j, x, xp)
    dy: uint256 = (xp[j] - y) * 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._stored_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) / 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

    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
    dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR
    dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
    self.balances[i] = x * PRECISION / rates[i]
    self.balances[j] = (y + (dy_fee - dy_admin_fee)) * PRECISION / rates[j]

    _dy: uint256 = (dy - dy_fee) * PRECISION / rates[j]

    return _dy


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

    if tethered[i] and not use_lending[i]:
        USDT(self.coins[i]).transferFrom(msg.sender, self, dx)
    else:
        assert_modifiable(cERC20(self.coins[i]).transferFrom(msg.sender, self, dx))

    if tethered[j] and not use_lending[j]:
        USDT(self.coins[j]).transfer(msg.sender, dy)
    else:
        assert_modifiable(cERC20(self.coins[j]).transfer(msg.sender, dy))

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


@public
@nonreentrant('lock')
def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256):
    rates: uint256[N_COINS] = self._current_rates()
    precisions: uint256[N_COINS] = PRECISION_MUL
    rate_i: uint256 = rates[i] / precisions[i]
    rate_j: uint256 = rates[j] / precisions[j]
    dx_: uint256 = dx * PRECISION / rate_i

    dy_: uint256 = self._exchange(i, j, dx_, rates)
    dy: uint256 = dy_ * rate_j / PRECISION
    assert dy >= min_dy, "Exchange resulted in fewer coins than expected"
    use_lending: bool[N_COINS] = USE_LENDING
    tethered: bool[N_COINS] = TETHERED

    ok: uint256 = 0
    if tethered[i]:
        USDT(self.underlying_coins[i]).transferFrom(msg.sender, self, dx)
    else:
        assert_modifiable(ERC20(self.underlying_coins[i])\
            .transferFrom(msg.sender, self, dx))
    if use_lending[i]:
        ERC20(self.underlying_coins[i]).approve(self.coins[i], dx)
        ok = cERC20(self.coins[i]).mint(dx)
        if ok > 0:
            raise "Could not mint coin"
    if use_lending[j]:
        ok = cERC20(self.coins[j]).redeem(dy_)
        if ok > 0:
            raise "Could not redeem coin"
    if tethered[j]:
        USDT(self.underlying_coins[j]).transfer(msg.sender, dy)
    else:
        assert_modifiable(ERC20(self.underlying_coins[j])\
            .transfer(msg.sender, dy))

    log.TokenExchangeUnderlying(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
    tethered: bool[N_COINS] = TETHERED
    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
        if tethered[i] and not use_lending[i]:
            USDT(self.coins[i]).transfer(msg.sender, value)
        else:
            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
    tethered: bool[N_COINS] = TETHERED
    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._current_rates()

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(rates, old_balances)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(rates, new_balances)
    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)

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

    for i in range(N_COINS):
        if tethered[i] and not use_lending[i]:
            USDT(self.coins[i]).transfer(msg.sender, amounts[i])
        else:
            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)


### Admin functions ###
@public
def commit_new_parameters(amplification: uint256,
                          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
    assert amplification <= max_A

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

    log.CommitNewParameters(_deadline, amplification, new_fee, new_admin_fee)


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

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

    log.NewParameters(_A, _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
    _precisions: uint256[N_COINS] = PRECISION_MUL
    tethered: bool[N_COINS] = TETHERED
    use_lending: bool[N_COINS] = USE_LENDING

    for i in range(N_COINS):
        c: address = self.coins[i]
        value: uint256 = cERC20(c).balanceOf(self) - self.balances[i]
        if value > 0:
            if tethered[i] and not use_lending[i]:
                USDT(c).transfer(msg.sender, value)
            else:
                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":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","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[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[4]","name":"token_amounts","indexed":false},{"type":"uint256[4]","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":"CommitNewParameters","inputs":[{"type":"uint256","name":"deadline","indexed":true,"unit":"sec"},{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address[4]","name":"_coins"},{"type":"address[4]","name":"_underlying_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"}],"constant":false,"payable":false,"type":"constructor"},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":1570535},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"bool","name":"deposit"}],"constant":true,"payable":false,"type":"function","gas":6103471},{"name":"add_liquidity","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"constant":false,"payable":false,"type":"function","gas":9331701},{"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":3489637},{"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":3489467},{"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":7034253},{"name":"exchange_underlying","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":7050488},{"name":"remove_liquidity","outputs":[],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[4]","name":"min_amounts"}],"constant":false,"payable":false,"type":"function","gas":241191},{"name":"remove_liquidity_imbalance","outputs":[],"inputs":[{"type":"uint256[4]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"constant":false,"payable":false,"type":"function","gas":9330864},{"name":"commit_new_parameters","outputs":[],"inputs":[{"type":"uint256","name":"amplification"},{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"constant":false,"payable":false,"type":"function","gas":146045},{"name":"apply_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":133452},{"name":"revert_new_parameters","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21775},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"constant":false,"payable":false,"type":"function","gas":74452},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":60508},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21865},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":23448},{"name":"kill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":37818},{"name":"unkill_me","outputs":[],"inputs":[],"constant":false,"payable":false,"type":"function","gas":21955},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2130},{"name":"underlying_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2160},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"arg0"}],"constant":true,"payable":false,"type":"function","gas":2190},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2021},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2051},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2081},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2111},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2141},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","unit":"sec","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2171},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2201},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2231},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2261},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"constant":true,"payable":false,"type":"function","gas":2291}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526101606159916101403934156100a257600080fd5b602061599160c03960c05160205181106100bb57600080fd5b50602060206159910160c03960c05160205181106100d857600080fd5b50602060406159910160c03960c05160205181106100f557600080fd5b50602060606159910160c03960c051602051811061011257600080fd5b50602060806159910160c03960c051602051811061012f57600080fd5b50602060a06159910160c03960c051602051811061014c57600080fd5b50602060c06159910160c03960c051602051811061016957600080fd5b50602060e06159910160c03960c051602051811061018657600080fd5b5060206101006159910160c03960c05160205181106101a457600080fd5b506102a060006004818352015b60006101406102a051600481106101c757600080fd5b6020020151186101d657600080fd5b60006101c06102a051600481106101ec57600080fd5b6020020151186101fb57600080fd5b60006102a0516004811061020e57600080fd5b600260c052602060c02001555b81516001018083528114156101b1575b5050600060c052602060c020610140805182558060200151600183015580604001516002830155806060015160038301555050600160c052602060c0206101c0805182558060200151600183015580604001516002830155806060015160038301555050610260516003556102805160045560006005553360065542624f1a008181830110156102ba57600080fd5b80820190509050600e556000600f556102405160075561597956600436101561000d5761569e565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610400575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e0600081526000816020015260008160400152600081606001525061026060006004818352015b670de0b6b3a7640000610280526101e0610260516004811061011c57600080fd5b60200201511561037557610260516004811061013757600080fd5b600060c052602060c02001543b61014d57600080fd5b610260516004811061015e57600080fd5b600060c052602060c0200154301861017557600080fd5b6020610300600463182df0f56102a0526102bc610260516004811061019957600080fd5b600060c052602060c02001545afa6101b057600080fd5b600050610300516102805261026051600481106101cc57600080fd5b600060c052602060c02001543b6101e257600080fd5b61026051600481106101f357600080fd5b600060c052602060c0200154301861020a57600080fd5b60206103a0600463ae9d70b06103405261035c610260516004811061022e57600080fd5b600060c052602060c02001545afa61024557600080fd5b6000506103a05161032052610260516004811061026157600080fd5b600060c052602060c02001543b61027757600080fd5b610260516004811061028857600080fd5b600060c052602060c0200154301861029f57600080fd5b60206104406004636c540baf6103e0526103fc61026051600481106102c357600080fd5b600060c052602060c02001545afa6102da57600080fd5b600050610440516103c05261028080516102805161032051808202821582848304141761030657600080fd5b80905090509050436103c0518082101561031f57600080fd5b80820390509050808202821582848304141761033a57600080fd5b80905090509050670de0b6b3a7640000808061035557600080fd5b82049050905081818301101561036a57600080fd5b808201905090508152505b610160610260516004811061038957600080fd5b6020020180516102805180820282158284830414176103a757600080fd5b809050905090508152505b81516001018083528114156100fb575b50506080610460525b6000610460511115156103dd576103f9565b60206104605103610160015160206104605103610460526103cb565b6101405156005b6000156105a8575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e0600081526000816020015260008160400152600081606001525061026060006004818352015b670de0b6b3a7640000610280526101e0610260516004811061047b57600080fd5b60200201511561051d57610260516004811061049657600080fd5b600060c052602060c02001543b6104ac57600080fd5b61026051600481106104bd57600080fd5b600060c052602060c020015430186104d457600080fd5b6020610300600463bd6d894d6102a0526102bc600061026051600481106104fa57600080fd5b600060c052602060c02001545af161051157600080fd5b60005061030051610280525b610160610260516004811061053157600080fd5b60200201805161028051808202821582848304141761054f57600080fd5b809050905090508152505b815160010180835281141561045a575b50506080610320525b600061032051111515610585576105a1565b6020610320510361016001516020610320510361032052610573565b6101405156005b6000156106cd575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061060e57600080fd5b6020020151610260516004811061062457600080fd5b600260c052602060c0200154808202821582848304141761064457600080fd5b80905090509050670de0b6b3a7640000808061065f57600080fd5b8204905090506101e0610260516004811061067957600080fd5b60200201525b81516001018083528114156105fa575b50506080610280525b6000610280511115156106aa576106c6565b602061028051036101e001516020610280510361028052610698565b6101c05156005b6000156107fe575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e0516004811061074357600080fd5b60200201516101c06102e0516004811061075c57600080fd5b6020020151808202821582848304141761077557600080fd5b80905090509050670de0b6b3a7640000808061079057600080fd5b8204905090506102606102e051600481106107aa57600080fd5b60200201525b815160010180835281141561072f575b50506080610300525b6000610300511115156107db576107f7565b60206103005103610260015160206103005103610300526107c9565b6102405156005b600015610b03575b6101c0526101405261016052610180526101a05260006101e05261022060006004818352015b602061022051026101400151610200526101e080516102005181818301101561085457600080fd5b808201905090508152505b815160010180835281141561082c575b50506101e051151561088a5760006000526000516101c05156505b6000610260526101e05161028052600354600480820282158284830414176108b157600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006004818352015b602061032051026101400151610300526102e05161028051808202821582848304141761090857600080fd5b80905090509050610300516004808202821582848304141761092957600080fd5b80905090509050600181818301101561094157600080fd5b80820190509050808061095357600080fd5b8204905090506102e0525b81516001018083528114156108dc575b505061028051610260526102a0516101e051808202821582848304141761099457600080fd5b809050905090506102e051600480820282158284830414176109b557600080fd5b809050905090508181830110156109cb57600080fd5b808201905090506102805180820282158284830414176109ea57600080fd5b809050905090506102a051600180821015610a0457600080fd5b80820390509050610280518082028215828483041417610a2357600080fd5b8090509050905060056102e0518082028215828483041417610a4457600080fd5b80905090509050818183011015610a5a57600080fd5b808201905090508080610a6c57600080fd5b8204905090506102805261026051610280511115610ab3576001610280516102605180821015610a9b57600080fd5b80820390509050111515610aae57610aef565b610ade565b6001610260516102805180821015610aca57600080fd5b80820390509050111515610add57610aef565b5b5b81516001018083528114156108c8575b5050610280516000526000516101c0515650005b600015610cd1575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052610140610660525b61066051516020610660510161066052610660610660511015610b5957610b37565b6305eb8fa6610680526106a0610140610460525b61046051516020610460510161046052610460610460511015610b8f57610b6d565b6342d3b3c3610480526104a06101408051825280602001518260200152806040015182604001528060600151826060015250506105206101c080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a051600658016106d5565b6105e052610600526106205261064052610440610460525b6104605152602061046051036104605261014061046051101515610c5057610c2d565b6105e0805182528060200151826020015280604001518260400152806060015182606001525050610700516106e0516106c0516106a05160065801610806565b61076052610640610660525b6106605152602061066051036106605261014061066051101515610cbf57610c9c565b61076051600052600051610240515650005b63bb7b8b806000511415610f45573415610cea57600080fd5b6101406106e0525b6106e0515160206106e051016106e0526106e06106e0511015610d1457610cf2565b6305eb8fa661070052610720610140610560525b61056051516020610560510161056052610560610560511015610d4a57610d28565b631db7662b610580526105a06101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015610d8057610d5e565b600658016100a9565b6104e0526105005261052052610540526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515610dc457610da1565b6104e0805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a051600658016105b0565b61066052610680526106a0526106c052610540610560525b6105605152602061056051036105605261014061056051101515610e3f57610e1c565b6106608051825280602001518260200152806040015182604001528060600151826060015250506107805161076051610740516107205160065801610806565b6107e0526106c06106e0525b6106e0515260206106e051036106e0526101406106e051101515610eae57610e8b565b6107e051610140526007543b610ec357600080fd5b6007543018610ed157600080fd5b602061088060046318160ddd6108205261083c6007545afa610ef257600080fd5b600050610880516108005261014051670de0b6b3a76400008082028215828483041417610f1e57600080fd5b80905090509050610800518080610f3457600080fd5b82049050905060005260206000f350005b63cf701ff760005114156113a8573415610f5e57600080fd5b60843560028110610f6e57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e0516102005161022051600658016100a9565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b6103005151602061030051016103005261030061030051101561106557611043565b631f30ab74610320526103406101c08051825280602001518260200152806040015182604001528060600151826060015250506103c061014080518252806020015182602001528060400151826040015280606001518260600152505061042051610400516103e0516103c0516103a05161038051610360516103405160065801610b0b565b610480526102e0610300525b610300515260206103005103610300526101406103005110151561111a576110f7565b610480516102e0526104a060006004818352015b60843515611186576101406104a0516004811061114a57600080fd5b60200201805160046104a0516004811061116357600080fd5b602002013581818301101561117757600080fd5b808201905090508152506111d0565b6101406104a0516004811061119a57600080fd5b60200201805160046104a051600481106111b357600080fd5b6020020135808210156111c557600080fd5b808203905090508152505b5b815160010180835281141561112e575b50506101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561120d576111eb565b631f30ab74610500526105206101c08051825280602001518260200152806040015182604001528060600151826060015250506105a0610140805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a0516105805161056051610540516105205160065801610b0b565b610660526104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156112c25761129f565b610660516104c0526007543b6112d757600080fd5b60075430186112e557600080fd5b602061070060046318160ddd6106a0526106bc6007545afa61130657600080fd5b600050610700516106805260006107205260843515611344576104c0516102e0518082101561133457600080fd5b8082039050905061072052611365565b6102e0516104c0518082101561135957600080fd5b80820390509050610720525b6107205161068051808202821582848304141761138157600080fd5b809050905090506102e051808061139757600080fd5b82049050905060005260206000f350005b63029b2f346000511415611f545762ffffff54156113c557600080fd5b600162ffffff5534156113d757600080fd5b600f54156113e457600080fd5b61014060008152600081602001526001816040015260008160600152506101c0600081526000816020015260008160400152600081606001525061024060008152600081602001526000816040015260008160600152506004546004808202821582848304141761145457600080fd5b80905090509050600c808061146857600080fd5b8204905090506102c0526005546102e0526007543b61148657600080fd5b600754301861149457600080fd5b602061038060046318160ddd6103205261033c6007545afa6114b557600080fd5b60005061038051610300526103a0610140610420525b610420515160206104205101610420526104206104205110156114ed576114cb565b60065801610408565b6104405261046052610480526104a052610400610420525b61042051526020610420510361042052610140610420511015156115315761150e565b61044080518252806020015182602001528060400151826040015280606001518260600152505060006104c0526104e060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600061030051111561169b57610140610560525b610560515160206105605101610560526105606105605110156115dd576115bb565b631f30ab74610580526105a06103a08051825280602001518260200152806040015182604001528060600151826060015250506106206104e080518252806020015182602001528060400151826040015280606001518260600152505061068051610660516106405161062051610600516105e0516105c0516105a05160065801610b0b565b6106e052610540610560525b61056051526020610560510361056052610140610560511015156116925761166f565b6106e0516104c0525b6107006104e080518252806020015182602001528060400151826040015280606001518260600152505061078060006004818352015b610300511515611700576000600461078051600481106116f057600080fd5b6020020135116116ff57600080fd5b5b6104e0610780516004811061171457600080fd5b60200201516004610780516004811061172c57600080fd5b602002013581818301101561174057600080fd5b80820190509050610700610780516004811061175b57600080fd5b60200201525b81516001018083528114156116d1575b50506101406107c0525b6107c0515160206107c051016107c0526107c06107c051101561179d5761177b565b631f30ab746107e0526108006103a08051825280602001518260200152806040015182604001528060600151826060015250506108806107008051825280602001518260200152806040015182604001528060600151826060015250506108e0516108c0516108a051610880516108605161084051610820516108005160065801610b0b565b610940526107a06107c0525b6107c0515260206107c051036107c0526101406107c0511015156118525761182f565b610940516107a0526104c0516107a0511161186c57600080fd5b6107a051610960526000610300511115611bab5761098060006004818352015b6107a0516104e061098051600481106118a457600080fd5b602002015180820282158284830414176118bd57600080fd5b809050905090506104c05180806118d357600080fd5b8204905090506109a05260006109c05261070061098051600481106118f757600080fd5b60200201516109a0511115611940576109a051610700610980516004811061191e57600080fd5b60200201518082101561193057600080fd5b808203905090506109c052611976565b610700610980516004811061195457600080fd5b60200201516109a0518082101561196a57600080fd5b808203905090506109c0525b6102c0516109c051808202821582848304141761199257600080fd5b809050905090506402540be40080806119aa57600080fd5b82049050905061024061098051600481106119c457600080fd5b602002015261070061098051600481106119dd57600080fd5b602002015161024061098051600481106119f657600080fd5b60200201516102e0518082028215828483041417611a1357600080fd5b809050905090506402540be4008080611a2b57600080fd5b82049050905080821015611a3e57600080fd5b808203905090506109805160048110611a5657600080fd5b600260c052602060c02001556107006109805160048110611a7657600080fd5b6020020180516102406109805160048110611a9057600080fd5b602002015180821015611aa257600080fd5b808203905090508152505b815160010180835281141561188c575b50506101406109e0525b6109e0515160206109e051016109e0526109806109e0511015611ae957611ac7565b631f30ab74610a0052610a206103a0805182528060200151826020015280604001518260400152806060015182606001525050610aa0610700805182528060200151826020015280604001518260400152806060015182606001525050610b0051610ae051610ac051610aa051610a8051610a6051610a4051610a205160065801610b0b565b610b60526109606109e0525b6109e0515260206109e051036109e0526101406109e051101515611b9e57611b7b565b610b605161096052611bdd565b600260c052602060c0206107008051825580602001516001830155806040015160028301558060600151600383015550505b6000610b8052610300511515611bfa576107a051610b8052611c4f565b61030051610960516104c05180821015611c1357600080fd5b808203905090508082028215828483041417611c2e57600080fd5b809050905090506104c0518080611c4457600080fd5b820490509050610b80525b6308c379a0610ba0526020610bc0526014610be0527f536c697070616765207363726577656420796f75000000000000000000000000610c0052610be050608435610b80511015611ca1576084610bbcfd5b610c4060006004818352015b6101c0610c405160048110611cc157600080fd5b602002015115610140610c405160048110611cdb57600080fd5b60200201511615611d9c57610c405160048110611cf757600080fd5b600060c052602060c02001543b611d0d57600080fd5b610c405160048110611d1e57600080fd5b600060c052602060c02001543018611d3557600080fd5b6000600060646323b872dd610d405233610d605230610d80526004610c405160048110611d6157600080fd5b6020020135610da052610d5c6000610c405160048110611d8057600080fd5b600060c052602060c02001545af1611d9757600080fd5b611e5f565b610c405160048110611dad57600080fd5b600060c052602060c02001543b611dc357600080fd5b610c405160048110611dd457600080fd5b600060c052602060c02001543018611deb57600080fd5b6020610d2060646323b872dd610c605233610c805230610ca0526004610c405160048110611e1857600080fd5b6020020135610cc052610c7c6000610c405160048110611e3757600080fd5b600060c052602060c02001545af1611e4e57600080fd5b600050610d2051611e5e57600080fd5b5b5b8151600101808352811415611cad575b50506007543b611e7f57600080fd5b6007543018611e8d57600080fd5b6000600060446340c10f19610e005233610e2052610b8051610e4052610e1c60006007545af1611ebc57600080fd5b600435610ea052602435610ec052604435610ee052606435610f005261024051610f205261026051610f405261028051610f60526102a051610f80526107a051610fa05261030051610b8051818183011015611f1757600080fd5b80820190509050610fc052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610ea0a2600062ffffff55005b600015612358575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611fb157600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516305eb8fa6610280526102a06101a0805182528060200151826020015280604001518260400152806060015182606001525050610300516102e0516102c0516102a05160065801610806565b610360526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161024052610240516103805260006103a0526003546004808202821582848304141761207857600080fd5b809050905090506103c05260006103e05261040060006004818352015b610140516104005114156120b057610180516103e0526120e6565b610160516104005118156120e0576101a061040051600481106120d257600080fd5b60200201516103e0526120e5565b612162565b5b6103a080516103e0518181830110156120fe57600080fd5b808201905090508152506103805161024051808202821582848304141761212457600080fd5b809050905090506103e0516004808202821582848304141761214557600080fd5b80905090509050808061215757600080fd5b820490509050610380525b8151600101808352811415612095575b50506103805161024051808202821582848304141761219057600080fd5b809050905090506103c051600480820282158284830414176121b157600080fd5b8090509050905080806121c357600080fd5b820490509050610380526103a051610240516103c05180806121e457600080fd5b8204905090508181830110156121f957600080fd5b80820190509050610420526000610440526102405161046052610480600060ff818352015b61046051610440526104605161046051808202821582848304141761224257600080fd5b809050905090506103805181818301101561225c57600080fd5b80820190509050600261046051808202821582848304141761227d57600080fd5b809050905090506104205181818301101561229757600080fd5b8082019050905061024051808210156122af57600080fd5b8082039050905080806122c157600080fd5b82049050905061046052610440516104605111156123085760016104605161044051808210156122f057600080fd5b8082039050905011151561230357612344565b612333565b600161044051610460518082101561231f57600080fd5b8082039050905011151561233257612344565b5b5b815160010180835281141561221e575b505061046051600052600051610220515650005b635e0d443f600051141561272f57341561237157600080fd5b6060516004358060405190131561238757600080fd5b809190121561239557600080fd5b50606051602435806040519013156123ac57600080fd5b80919012156123ba57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561244b57612429565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016105b0565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156124d2576124af565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061250c57600080fd5b60200201516044356101406004356004811061252757600080fd5b6020020151808202821582848304141761254057600080fd5b80905090509050670de0b6b3a7640000808061255b57600080fd5b82049050905081818301101561257057600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156125a557612583565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611f5c565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156126425761261f565b61060051610480526102606024356004811061265d57600080fd5b6020020151610480518082101561267357600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761269757600080fd5b80905090509050610140602435600481106126b157600080fd5b602002015180806126c157600080fd5b820490509050610620526004546106205180820282158284830414176126e657600080fd5b809050905090506402540be40080806126fe57600080fd5b8204905090506106405261062051610640518082101561271d57600080fd5b8082039050905060005260206000f350005b6307211ef76000511415612aed57341561274857600080fd5b6060516004358060405190131561275e57600080fd5b809190121561276c57600080fd5b506060516024358060405190131561278357600080fd5b809190121561279157600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561282257612800565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016105b0565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156128a957612886565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506102606004356004811061290857600080fd5b60200201516044356104606004356004811061292357600080fd5b6020020151808202821582848304141761293c57600080fd5b8090509050905081818301101561295257600080fd5b808201905090506104e052610140610520525b6105205151602061052051016105205261052061052051101561298757612965565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611f5c565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612a2457612a01565b610680516105005261026060243560048110612a3f57600080fd5b60200201516105005180821015612a5557600080fd5b8082039050905061046060243560048110612a6f57600080fd5b60200201518080612a7f57600080fd5b8204905090506106a0526004546106a0518082028215828483041417612aa457600080fd5b809050905090506402540be4008080612abc57600080fd5b8204905090506106c0526106a0516106c05180821015612adb57600080fd5b8082039050905060005260206000f350005b600015612f92575b610220526101405261016052610180526101a0526101c0526101e05261020052600f5415612b2257600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612b4f57612b2d565b631db7662b6102e0526103006101a080518252806020015182602001528060400151826040015280606001518260600152505061036051610340516103205161030051600658016105b0565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612bd657612bb3565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612c1157600080fd5b6020020151610180516101a06101405160048110612c2e57600080fd5b60200201518082028215828483041417612c4757600080fd5b80905090509050670de0b6b3a76400008080612c6257600080fd5b820490509050818183011015612c7757600080fd5b8082019050905061044052610140610480525b61048051516020610480510161048052610480610480511015612cac57612c8a565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611f5c565b6105e052610460610480525b6104805152602061048051036104805261014061048051101515612d4b57612d28565b6105e051610460526102406101605160048110612d6757600080fd5b60200201516104605180821015612d7d57600080fd5b8082039050905061060052610600516004548082028215828483041417612da357600080fd5b809050905090506402540be4008080612dbb57600080fd5b82049050905061062052610620516005548082028215828483041417612de057600080fd5b809050905090506402540be4008080612df857600080fd5b8204905090506106405261044051670de0b6b3a76400008082028215828483041417612e2357600080fd5b809050905090506101a06101405160048110612e3e57600080fd5b60200201518080612e4e57600080fd5b8204905090506101405160048110612e6557600080fd5b600260c052602060c020015561046051610620516106405180821015612e8a57600080fd5b80820390509050818183011015612ea057600080fd5b80820190509050670de0b6b3a76400008082028215828483041417612ec457600080fd5b809050905090506101a06101605160048110612edf57600080fd5b60200201518080612eef57600080fd5b8204905090506101605160048110612f0657600080fd5b600260c052602060c0200155610600516106205180821015612f2757600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612f4b57600080fd5b809050905090506101a06101605160048110612f6657600080fd5b60200201518080612f7657600080fd5b8204905090506106605261066051600052600051610220515650005b633df02124600051141561352e5762ffffff5415612faf57600080fd5b600162ffffff553415612fc157600080fd5b60605160043580604051901315612fd757600080fd5b8091901215612fe557600080fd5b5060605160243580604051901315612ffc57600080fd5b809190121561300a57600080fd5b506101406101405161016051610180516101a05160065801610408565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612af5565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356102605110156131ae5760a461041cfd5b6104c060008152600081602001526001816040015260008160600152506105406000815260008160200152600081604001526000816060015250610540600435600481106131fb57600080fd5b6020020151156104c06004356004811061321457600080fd5b602002015116156132bd576004356004811061322f57600080fd5b600060c052602060c02001543b61324557600080fd5b6004356004811061325557600080fd5b600060c052602060c0200154301861326c57600080fd5b6000600060646323b872dd6106a052336106c052306106e052604435610700526106bc6000600435600481106132a157600080fd5b600060c052602060c02001545af16132b857600080fd5b613368565b600435600481106132cd57600080fd5b600060c052602060c02001543b6132e357600080fd5b600435600481106132f357600080fd5b600060c052602060c0200154301861330a57600080fd5b602061068060646323b872dd6105c052336105e0523061060052604435610620526105dc60006004356004811061334057600080fd5b600060c052602060c02001545af161335757600080fd5b6000506106805161336757600080fd5b5b6105406024356004811061337b57600080fd5b6020020151156104c06024356004811061339457600080fd5b6020020151161561343957602435600481106133af57600080fd5b600060c052602060c02001543b6133c557600080fd5b602435600481106133d557600080fd5b600060c052602060c020015430186133ec57600080fd5b60006000604463a9059cbb610820523361084052610260516108605261083c60006024356004811061341d57600080fd5b600060c052602060c02001545af161343457600080fd5b6134e0565b6024356004811061344957600080fd5b600060c052602060c02001543b61345f57600080fd5b6024356004811061346f57600080fd5b600060c052602060c0200154301861348657600080fd5b6020610800604463a9059cbb610760523361078052610260516107a05261077c6000602435600481106134b857600080fd5b600060c052602060c02001545af16134cf57600080fd5b600050610800516134df57600080fd5b5b6004356108c0526044356108e052602435610900526102605161092052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806108c0a2600062ffffff55005b63a6417ed66000511415613eac5762ffffff541561354b57600080fd5b600162ffffff55341561355d57600080fd5b6060516004358060405190131561357357600080fd5b809190121561358157600080fd5b506060516024358060405190131561359857600080fd5b80919012156135a657600080fd5b506101406101405161016051610180516101a05160065801610408565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101406004356004811061364257600080fd5b60200201516102606004356004811061365a57600080fd5b6020020151808061366a57600080fd5b8204905090506102e0526101406024356004811061368757600080fd5b60200201516102606024356004811061369f57600080fd5b602002015180806136af57600080fd5b82049050905061030052604435670de0b6b3a764000080820282158284830414176136d957600080fd5b809050905090506102e05180806136ef57600080fd5b82049050905061032052610140610360525b6103605151602061036051016103605261036061036051101561372357613701565b632ce785a3610380526004356103a0526024356103c052610320516103e052610400610140805182528060200151826020015280604001518260400152806060015182606001525050610460516104405161042051610400516103e0516103c0516103a05160065801612af5565b6104c052610340610360525b61036051526020610360510361036052610140610360511015156137c05761379d565b6104c05161034052610340516103005180820282158284830414176137e457600080fd5b80905090509050670de0b6b3a764000080806137ff57600080fd5b8204905090506104e0526308c379a061050052602061052052602e610540527f45786368616e676520726573756c74656420696e20666577657220636f696e73610560527f207468616e20657870656374656400000000000000000000000000000000000061058052610540506064356104e05110156138805760a461051cfd5b6105c06000815260008160200152600081604001526000816060015250610640600081526000816020015260018160400152600081606001525060006106c052610640600435600481106138d357600080fd5b60200201511561397b57600435600481106138ed57600080fd5b600160c052602060c02001543b61390357600080fd5b6004356004811061391357600080fd5b600160c052602060c0200154301861392a57600080fd5b6000600060646323b872dd6107c052336107e0523061080052604435610820526107dc60006004356004811061395f57600080fd5b600160c052602060c02001545af161397657600080fd5b613a26565b6004356004811061398b57600080fd5b600160c052602060c02001543b6139a157600080fd5b600435600481106139b157600080fd5b600160c052602060c020015430186139c857600080fd5b60206107a060646323b872dd6106e05233610700523061072052604435610740526106fc6000600435600481106139fe57600080fd5b600160c052602060c02001545af1613a1557600080fd5b6000506107a051613a2557600080fd5b5b6105c060043560048110613a3957600080fd5b602002015115613bee5760043560048110613a5357600080fd5b600160c052602060c02001543b613a6957600080fd5b60043560048110613a7957600080fd5b600160c052602060c02001543018613a9057600080fd5b6020610920604463095ea7b36108805260043560048110613ab057600080fd5b600060c052602060c02001546108a0526044356108c05261089c600060043560048110613adc57600080fd5b600160c052602060c02001545af1613af357600080fd5b6000506109205060043560048110613b0a57600080fd5b600060c052602060c02001543b613b2057600080fd5b60043560048110613b3057600080fd5b600060c052602060c02001543018613b4757600080fd5b60206109c0602463a0712d68610940526044356109605261095c600060043560048110613b7357600080fd5b600060c052602060c02001545af1613b8a57600080fd5b6000506109c0516106c05260006106c0511115613bed576308c379a06109e0526020610a00526013610a20527f436f756c64206e6f74206d696e7420636f696e00000000000000000000000000610a4052610a20506000613bec5760846109fcfd5b5b5b6105c060243560048110613c0157600080fd5b602002015115613d005760243560048110613c1b57600080fd5b600060c052602060c02001543b613c3157600080fd5b60243560048110613c4157600080fd5b600060c052602060c02001543018613c5857600080fd5b6020610b00602463db006a75610a805261034051610aa052610a9c600060243560048110613c8557600080fd5b600060c052602060c02001545af1613c9c57600080fd5b600050610b00516106c05260006106c0511115613cff576308c379a0610b20526020610b40526015610b60527f436f756c64206e6f742072656465656d20636f696e0000000000000000000000610b8052610b60506000613cfe576084610b3cfd5b5b5b61064060243560048110613d1357600080fd5b602002015115613db75760243560048110613d2d57600080fd5b600160c052602060c02001543b613d4357600080fd5b60243560048110613d5357600080fd5b600160c052602060c02001543018613d6a57600080fd5b60006000604463a9059cbb610c805233610ca0526104e051610cc052610c9c600060243560048110613d9b57600080fd5b600160c052602060c02001545af1613db257600080fd5b613e5e565b60243560048110613dc757600080fd5b600160c052602060c02001543b613ddd57600080fd5b60243560048110613ded57600080fd5b600160c052602060c02001543018613e0457600080fd5b6020610c60604463a9059cbb610bc05233610be0526104e051610c0052610bdc600060243560048110613e3657600080fd5b600160c052602060c02001545af1613e4d57600080fd5b600050610c6051613e5d57600080fd5b5b600435610d2052604435610d4052602435610d60526104e051610d8052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610d20a2600062ffffff55005b637d49d87560005114156143455762ffffff5415613ec957600080fd5b600162ffffff553415613edb57600080fd5b6007543b613ee857600080fd5b6007543018613ef657600080fd5b60206101c060046318160ddd6101605261017c6007545afa613f1757600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e0600081526000816020015260018160400152600081606001525061036060008152600081602001526000816040015260008160600152506103e060006004818352015b6103e05160048110613fb357600080fd5b600260c052602060c02001546004358082028215828483041417613fd657600080fd5b80905090509050610140518080613fec57600080fd5b820490509050610400526308c379a0610420526020610440526030610460527f5769746864726177616c20726573756c74656420696e20666577657220636f69610480527f6e73207468616e206578706563746564000000000000000000000000000000006104a0526104605060246103e0516004811061406c57600080fd5b60200201356104005110156140825760a461043cfd5b6103e0516004811061409357600080fd5b600260c052602060c02001805461040051808210156140b157600080fd5b80820390509050815550610400516101e06103e051600481106140d357600080fd5b60200201526103606103e051600481106140ec57600080fd5b6020020151156102e06103e0516004811061410657600080fd5b602002015116156141ae576103e0516004811061412257600080fd5b600060c052602060c02001543b61413857600080fd5b6103e0516004811061414957600080fd5b600060c052602060c0200154301861416057600080fd5b60006000604463a9059cbb6105a052336105c052610400516105e0526105bc60006103e0516004811061419257600080fd5b600060c052602060c02001545af16141a957600080fd5b614258565b6103e051600481106141bf57600080fd5b600060c052602060c02001543b6141d557600080fd5b6103e051600481106141e657600080fd5b600060c052602060c020015430186141fd57600080fd5b6020610580604463a9059cbb6104e052336105005261040051610520526104fc60006103e0516004811061423057600080fd5b600060c052602060c02001545af161424757600080fd5b6000506105805161425757600080fd5b5b5b8151600101808352811415613fa2575b50506007543b61427857600080fd5b600754301861428657600080fd5b6000600060446379cc67906106405233610660526004356106805261065c60006007545af16142b457600080fd5b6101e0516106e052610200516107005261022051610720526102405161074052610260516107605261028051610780526102a0516107a0526102c0516107c052610140516004358082101561430857600080fd5b808203905090506107e052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d6101206106e0a2600062ffffff55005b6318a7bd766000511415614e315762ffffff541561436257600080fd5b600162ffffff55341561437457600080fd5b600f541561438157600080fd5b61014060008152600081602001526001816040015260008160600152506101c060008152600081602001526000816040015260008160600152506007543b6143c857600080fd5b60075430186143d657600080fd5b60206102c060046318160ddd6102605261027c6007545afa6143f757600080fd5b6000506102c051610240526000610240511161441257600080fd5b6004546004808202821582848304141761442b57600080fd5b80905090509050600c808061443f57600080fd5b8204905090506102e052600554610300526103206101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561447d5761445b565b60065801610408565b6103c0526103e05261040052610420526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156144c15761449e565b6103c080518252806020015182602001528060400151826040015280606001518260600152505061044060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506104c0610440805182528060200151826020015280604001518260400152806060015182606001525050610140610560525b6105605151602061056051016105605261056061056051101561458557614563565b631f30ab74610580526105a061032080518252806020015182602001528060400151826040015280606001518260600152505061062061044080518252806020015182602001528060400151826040015280606001518260600152505061068051610660516106405161062051610600516105e0516105c0516105a05160065801610b0b565b6106e052610540610560525b610560515260206105605103610560526101406105605110151561463a57614617565b6106e0516105405261070060006004818352015b6104c0610700516004811061466257600080fd5b6020020180516004610700516004811061467b57600080fd5b60200201358082101561468d57600080fd5b808203905090508152505b815160010180835281141561464e575b5050610140610740525b610740515160206107405101610740526107406107405110156146d4576146b2565b631f30ab74610760526107806103208051825280602001518260200152806040015182604001528060600151826060015250506108006104c0805182528060200151826020015280604001518260400152806060015182606001525050610860516108405161082051610800516107e0516107c0516107a0516107805160065801610b0b565b6108c052610720610740525b610740515260206107405103610740526101406107405110151561478957614766565b6108c051610720526108e0600081526000816020015260008160400152600081606001525061096060006004818352015b6107205161044061096051600481106147d257600080fd5b602002015180820282158284830414176147eb57600080fd5b8090509050905061054051808061480157600080fd5b8204905090506109805260006109a0526104c0610960516004811061482557600080fd5b602002015161098051111561486e57610980516104c0610960516004811061484c57600080fd5b60200201518082101561485e57600080fd5b808203905090506109a0526148a4565b6104c0610960516004811061488257600080fd5b6020020151610980518082101561489857600080fd5b808203905090506109a0525b6102e0516109a05180820282158284830414176148c057600080fd5b809050905090506402540be40080806148d857600080fd5b8204905090506108e061096051600481106148f257600080fd5b60200201526104c0610960516004811061490b57600080fd5b60200201516108e0610960516004811061492457600080fd5b602002015161030051808202821582848304141761494157600080fd5b809050905090506402540be400808061495957600080fd5b8204905090508082101561496c57600080fd5b80820390509050610960516004811061498457600080fd5b600260c052602060c02001556104c061096051600481106149a457600080fd5b6020020180516108e061096051600481106149be57600080fd5b6020020151808210156149d057600080fd5b808203905090508152505b81516001018083528114156147ba575b50506101406109e0525b6109e0515160206109e051016109e0526109e06109e0511015614a17576149f5565b631f30ab74610a0052610a20610320805182528060200151826020015280604001518260400152806060015182606001525050610aa06104c0805182528060200151826020015280604001518260400152806060015182606001525050610b0051610ae051610ac051610aa051610a8051610a6051610a4051610a205160065801610b0b565b610b60526109c06109e0525b6109e0515260206109e051036109e0526101406109e051101515614acc57614aa9565b610b60516109c052610540516109c05180821015614ae957600080fd5b80820390509050610240518082028215828483041417614b0857600080fd5b80905090509050610540518080614b1e57600080fd5b820490509050610b80526000610b805111614b3857600080fd5b6308c379a0610ba0526020610bc0526014610be0527f536c697070616765207363726577656420796f75000000000000000000000000610c0052610be050608435610b80511115614b8a576084610bbcfd5b610c4060006004818352015b6101c0610c405160048110614baa57600080fd5b602002015115610140610c405160048110614bc457600080fd5b60200201511615614c8057610c405160048110614be057600080fd5b600060c052602060c02001543b614bf657600080fd5b610c405160048110614c0757600080fd5b600060c052602060c02001543018614c1e57600080fd5b60006000604463a9059cbb610d205233610d40526004610c405160048110614c4557600080fd5b6020020135610d6052610d3c6000610c405160048110614c6457600080fd5b600060c052602060c02001545af1614c7b57600080fd5b614d3e565b610c405160048110614c9157600080fd5b600060c052602060c02001543b614ca757600080fd5b610c405160048110614cb857600080fd5b600060c052602060c02001543018614ccf57600080fd5b6020610d00604463a9059cbb610c605233610c80526004610c405160048110614cf757600080fd5b6020020135610ca052610c7c6000610c405160048110614d1657600080fd5b600060c052602060c02001545af1614d2d57600080fd5b600050610d0051614d3d57600080fd5b5b5b8151600101808352811415614b96575b50506007543b614d5e57600080fd5b6007543018614d6c57600080fd5b6000600060446379cc6790610dc05233610de052610b8051610e0052610ddc60006007545af1614d9b57600080fd5b600435610e6052602435610e8052604435610ea052606435610ec0526108e051610ee05261090051610f005261092051610f205261094051610f405261072051610f605261024051610b805180821015614df457600080fd5b80820390509050610f8052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610e60a2600062ffffff55005b63ee11f5b66000511415614f19573415614e4a57600080fd5b6006543314614e5857600080fd5b60085415614e6557600080fd5b64012a05f2006044351115614e7957600080fd5b64012a05f2006024351115614e8d57600080fd5b620f42406004351115614e9f57600080fd5b426203f480818183011015614eb357600080fd5b808201905090506101405261014051600855600435600a55602435600b55604435600c5560043561016052602435610180526044356101a052610140517f6081daa3b61098baf24d9c69bcd53af932e0635c89c6fd0617534b9ba76a7f736060610160a2005b632a7dd7cd6000511415614fc6573415614f3257600080fd5b6006543314614f4057600080fd5b60006008541142600854111516614f5657600080fd5b6000600855600a5461014052600b5461016052600c5461018052610140516003556101605160045561018051600555610140516101a052610160516101c052610180516101e0527f752a27d1853eb7af3ee4ff764f2c4a51619386af721573dd3809e929c39db99e60606101a0a1005b63226840fb6000511415614ff4573415614fdf57600080fd5b6006543314614fed57600080fd5b6000600855005b636b441a40600051141561509557341561500d57600080fd5b600435602051811061501e57600080fd5b50600654331461502d57600080fd5b6009541561503a57600080fd5b426203f48081818301101561504e57600080fd5b808201905090506101405261014051600955600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156151115734156150ae57600080fd5b60065433146150bc57600080fd5b600060095411600954421015166150d257600080fd5b6000600955600d546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193600051141561513f57341561512a57600080fd5b600654331461513857600080fd5b6000600955005b6330c54085600051141561537e57341561515857600080fd5b600654331461516657600080fd5b6101406001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101c0600081526000816020015260018160400152600081606001525061024060008152600081602001526000816040015260008160600152506102c060006004818352015b6102c051600481106151e257600080fd5b600060c052602060c02001546102e0526102e0513b61520057600080fd5b6102e051301861520f57600080fd5b60206103a060246370a0823161032052306103405261033c6102e0515afa61523657600080fd5b6000506103a0516102c0516004811061524e57600080fd5b600260c052602060c02001548082101561526757600080fd5b80820390509050610300526000610300511115615369576102406102c0516004811061529257600080fd5b6020020151156101c06102c051600481106152ac57600080fd5b60200201511615615309576102e0513b6152c557600080fd5b6102e05130186152d457600080fd5b60006000604463a9059cbb61048052336104a052610300516104c05261049c60006102e0515af161530457600080fd5b615368565b6102e0513b61531757600080fd5b6102e051301861532657600080fd5b6020610460604463a9059cbb6103c052336103e05261030051610400526103dc60006102e0515af161535757600080fd5b6000506104605161536757600080fd5b5b5b5b81516001018083528114156151d1575b5050005b63e369885360005114156153ba57341561539757600080fd5b60065433146153a557600080fd5b42600e54116153b357600080fd5b6001600f55005b633046f97260005114156153e85734156153d357600080fd5b60065433146153e157600080fd5b6000600f55005b6323746eb8600051141561544d57341561540157600080fd5b6060516004358060405190131561541757600080fd5b809190121561542557600080fd5b506004356004811061543657600080fd5b600060c052602060c020015460005260206000f350005b63b739953e60005114156154b257341561546657600080fd5b6060516004358060405190131561547c57600080fd5b809190121561548a57600080fd5b506004356004811061549b57600080fd5b600160c052602060c020015460005260206000f350005b63065a80d860005114156155175734156154cb57600080fd5b606051600435806040519013156154e157600080fd5b80919012156154ef57600080fd5b506004356004811061550057600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d0600051141561553e57341561553057600080fd5b60035460005260206000f350005b63ddca3f43600051141561556557341561555757600080fd5b60045460005260206000f350005b63fee3f7f9600051141561558c57341561557e57600080fd5b60055460005260206000f350005b638da5cb5b60005114156155b35734156155a557600080fd5b60065460005260206000f350005b63405e28f860005114156155da5734156155cc57600080fd5b60085460005260206000f350005b63e0a0b58660005114156156015734156155f357600080fd5b60095460005260206000f350005b63b4b577ad600051141561562857341561561a57600080fd5b600a5460005260206000f350005b6358680d0b600051141561564f57341561564157600080fd5b600b5460005260206000f350005b63e3824462600051141561567657341561566857600080fd5b600c5460005260206000f350005b631ec0cdc1600051141561569d57341561568f57600080fd5b600d5460005260206000f350005b5b60006000fd5b6102d5615979036102d56000396102d5615979036000f30000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f510000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000c25a3a3b969415c80451098fa907ec722572917f000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000003d0900

Deployed Bytecode

0x600436101561000d5761569e565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052600015610400575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e0600081526000816020015260008160400152600081606001525061026060006004818352015b670de0b6b3a7640000610280526101e0610260516004811061011c57600080fd5b60200201511561037557610260516004811061013757600080fd5b600060c052602060c02001543b61014d57600080fd5b610260516004811061015e57600080fd5b600060c052602060c0200154301861017557600080fd5b6020610300600463182df0f56102a0526102bc610260516004811061019957600080fd5b600060c052602060c02001545afa6101b057600080fd5b600050610300516102805261026051600481106101cc57600080fd5b600060c052602060c02001543b6101e257600080fd5b61026051600481106101f357600080fd5b600060c052602060c0200154301861020a57600080fd5b60206103a0600463ae9d70b06103405261035c610260516004811061022e57600080fd5b600060c052602060c02001545afa61024557600080fd5b6000506103a05161032052610260516004811061026157600080fd5b600060c052602060c02001543b61027757600080fd5b610260516004811061028857600080fd5b600060c052602060c0200154301861029f57600080fd5b60206104406004636c540baf6103e0526103fc61026051600481106102c357600080fd5b600060c052602060c02001545afa6102da57600080fd5b600050610440516103c05261028080516102805161032051808202821582848304141761030657600080fd5b80905090509050436103c0518082101561031f57600080fd5b80820390509050808202821582848304141761033a57600080fd5b80905090509050670de0b6b3a7640000808061035557600080fd5b82049050905081818301101561036a57600080fd5b808201905090508152505b610160610260516004811061038957600080fd5b6020020180516102805180820282158284830414176103a757600080fd5b809050905090508152505b81516001018083528114156100fb575b50506080610460525b6000610460511115156103dd576103f9565b60206104605103610160015160206104605103610460526103cb565b6101405156005b6000156105a8575b610140526101606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101e0600081526000816020015260008160400152600081606001525061026060006004818352015b670de0b6b3a7640000610280526101e0610260516004811061047b57600080fd5b60200201511561051d57610260516004811061049657600080fd5b600060c052602060c02001543b6104ac57600080fd5b61026051600481106104bd57600080fd5b600060c052602060c020015430186104d457600080fd5b6020610300600463bd6d894d6102a0526102bc600061026051600481106104fa57600080fd5b600060c052602060c02001545af161051157600080fd5b60005061030051610280525b610160610260516004811061053157600080fd5b60200201805161028051808202821582848304141761054f57600080fd5b809050905090508152505b815160010180835281141561045a575b50506080610320525b600061032051111515610585576105a1565b6020610320510361016001516020610320510361032052610573565b6101405156005b6000156106cd575b6101c0526101405261016052610180526101a0526101e061014080518252806020015182602001528060400151826040015280606001518260600152505061026060006004818352015b6101e0610260516004811061060e57600080fd5b6020020151610260516004811061062457600080fd5b600260c052602060c0200154808202821582848304141761064457600080fd5b80905090509050670de0b6b3a7640000808061065f57600080fd5b8204905090506101e0610260516004811061067957600080fd5b60200201525b81516001018083528114156105fa575b50506080610280525b6000610280511115156106aa576106c6565b602061028051036101e001516020610280510361028052610698565b6101c05156005b6000156107fe575b610240526101405261016052610180526101a0526101c0526101e05261020052610220526102606101408051825280602001518260200152806040015182604001528060600151826060015250506102e060006004818352015b6102606102e0516004811061074357600080fd5b60200201516101c06102e0516004811061075c57600080fd5b6020020151808202821582848304141761077557600080fd5b80905090509050670de0b6b3a7640000808061079057600080fd5b8204905090506102606102e051600481106107aa57600080fd5b60200201525b815160010180835281141561072f575b50506080610300525b6000610300511115156107db576107f7565b60206103005103610260015160206103005103610300526107c9565b6102405156005b600015610b03575b6101c0526101405261016052610180526101a05260006101e05261022060006004818352015b602061022051026101400151610200526101e080516102005181818301101561085457600080fd5b808201905090508152505b815160010180835281141561082c575b50506101e051151561088a5760006000526000516101c05156505b6000610260526101e05161028052600354600480820282158284830414176108b157600080fd5b809050905090506102a0526102c0600060ff818352015b610280516102e05261032060006004818352015b602061032051026101400151610300526102e05161028051808202821582848304141761090857600080fd5b80905090509050610300516004808202821582848304141761092957600080fd5b80905090509050600181818301101561094157600080fd5b80820190509050808061095357600080fd5b8204905090506102e0525b81516001018083528114156108dc575b505061028051610260526102a0516101e051808202821582848304141761099457600080fd5b809050905090506102e051600480820282158284830414176109b557600080fd5b809050905090508181830110156109cb57600080fd5b808201905090506102805180820282158284830414176109ea57600080fd5b809050905090506102a051600180821015610a0457600080fd5b80820390509050610280518082028215828483041417610a2357600080fd5b8090509050905060056102e0518082028215828483041417610a4457600080fd5b80905090509050818183011015610a5a57600080fd5b808201905090508080610a6c57600080fd5b8204905090506102805261026051610280511115610ab3576001610280516102605180821015610a9b57600080fd5b80820390509050111515610aae57610aef565b610ade565b6001610260516102805180821015610aca57600080fd5b80820390509050111515610add57610aef565b5b5b81516001018083528114156108c8575b5050610280516000526000516101c0515650005b600015610cd1575b610240526101405261016052610180526101a0526101c0526101e0526102005261022052610140610660525b61066051516020610660510161066052610660610660511015610b5957610b37565b6305eb8fa6610680526106a0610140610460525b61046051516020610460510161046052610460610460511015610b8f57610b6d565b6342d3b3c3610480526104a06101408051825280602001518260200152806040015182604001528060600151826060015250506105206101c080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c0516104a051600658016106d5565b6105e052610600526106205261064052610440610460525b6104605152602061046051036104605261014061046051101515610c5057610c2d565b6105e0805182528060200151826020015280604001518260400152806060015182606001525050610700516106e0516106c0516106a05160065801610806565b61076052610640610660525b6106605152602061066051036106605261014061066051101515610cbf57610c9c565b61076051600052600051610240515650005b63bb7b8b806000511415610f45573415610cea57600080fd5b6101406106e0525b6106e0515160206106e051016106e0526106e06106e0511015610d1457610cf2565b6305eb8fa661070052610720610140610560525b61056051516020610560510161056052610560610560511015610d4a57610d28565b631db7662b610580526105a06101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015610d8057610d5e565b600658016100a9565b6104e0526105005261052052610540526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515610dc457610da1565b6104e0805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a051600658016105b0565b61066052610680526106a0526106c052610540610560525b6105605152602061056051036105605261014061056051101515610e3f57610e1c565b6106608051825280602001518260200152806040015182604001528060600151826060015250506107805161076051610740516107205160065801610806565b6107e0526106c06106e0525b6106e0515260206106e051036106e0526101406106e051101515610eae57610e8b565b6107e051610140526007543b610ec357600080fd5b6007543018610ed157600080fd5b602061088060046318160ddd6108205261083c6007545afa610ef257600080fd5b600050610880516108005261014051670de0b6b3a76400008082028215828483041417610f1e57600080fd5b80905090509050610800518080610f3457600080fd5b82049050905060005260206000f350005b63cf701ff760005114156113a8573415610f5e57600080fd5b60843560028110610f6e57600080fd5b5061014060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101c06101405161016051610180516101a0516101c0516101e0516102005161022051600658016100a9565b61026052610280526102a0526102c05261022052610200526101e0526101c0526101a052610180526101605261014052610260805182528060200151826020015280604001518260400152806060015182606001525050610140610300525b6103005151602061030051016103005261030061030051101561106557611043565b631f30ab74610320526103406101c08051825280602001518260200152806040015182604001528060600151826060015250506103c061014080518252806020015182602001528060400151826040015280606001518260600152505061042051610400516103e0516103c0516103a05161038051610360516103405160065801610b0b565b610480526102e0610300525b610300515260206103005103610300526101406103005110151561111a576110f7565b610480516102e0526104a060006004818352015b60843515611186576101406104a0516004811061114a57600080fd5b60200201805160046104a0516004811061116357600080fd5b602002013581818301101561117757600080fd5b808201905090508152506111d0565b6101406104a0516004811061119a57600080fd5b60200201805160046104a051600481106111b357600080fd5b6020020135808210156111c557600080fd5b808203905090508152505b5b815160010180835281141561112e575b50506101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561120d576111eb565b631f30ab74610500526105206101c08051825280602001518260200152806040015182604001528060600151826060015250506105a0610140805182528060200151826020015280604001518260400152806060015182606001525050610600516105e0516105c0516105a0516105805161056051610540516105205160065801610b0b565b610660526104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156112c25761129f565b610660516104c0526007543b6112d757600080fd5b60075430186112e557600080fd5b602061070060046318160ddd6106a0526106bc6007545afa61130657600080fd5b600050610700516106805260006107205260843515611344576104c0516102e0518082101561133457600080fd5b8082039050905061072052611365565b6102e0516104c0518082101561135957600080fd5b80820390509050610720525b6107205161068051808202821582848304141761138157600080fd5b809050905090506102e051808061139757600080fd5b82049050905060005260206000f350005b63029b2f346000511415611f545762ffffff54156113c557600080fd5b600162ffffff5534156113d757600080fd5b600f54156113e457600080fd5b61014060008152600081602001526001816040015260008160600152506101c0600081526000816020015260008160400152600081606001525061024060008152600081602001526000816040015260008160600152506004546004808202821582848304141761145457600080fd5b80905090509050600c808061146857600080fd5b8204905090506102c0526005546102e0526007543b61148657600080fd5b600754301861149457600080fd5b602061038060046318160ddd6103205261033c6007545afa6114b557600080fd5b60005061038051610300526103a0610140610420525b610420515160206104205101610420526104206104205110156114ed576114cb565b60065801610408565b6104405261046052610480526104a052610400610420525b61042051526020610420510361042052610140610420511015156115315761150e565b61044080518252806020015182602001528060400151826040015280606001518260600152505060006104c0526104e060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600061030051111561169b57610140610560525b610560515160206105605101610560526105606105605110156115dd576115bb565b631f30ab74610580526105a06103a08051825280602001518260200152806040015182604001528060600151826060015250506106206104e080518252806020015182602001528060400151826040015280606001518260600152505061068051610660516106405161062051610600516105e0516105c0516105a05160065801610b0b565b6106e052610540610560525b61056051526020610560510361056052610140610560511015156116925761166f565b6106e0516104c0525b6107006104e080518252806020015182602001528060400151826040015280606001518260600152505061078060006004818352015b610300511515611700576000600461078051600481106116f057600080fd5b6020020135116116ff57600080fd5b5b6104e0610780516004811061171457600080fd5b60200201516004610780516004811061172c57600080fd5b602002013581818301101561174057600080fd5b80820190509050610700610780516004811061175b57600080fd5b60200201525b81516001018083528114156116d1575b50506101406107c0525b6107c0515160206107c051016107c0526107c06107c051101561179d5761177b565b631f30ab746107e0526108006103a08051825280602001518260200152806040015182604001528060600151826060015250506108806107008051825280602001518260200152806040015182604001528060600151826060015250506108e0516108c0516108a051610880516108605161084051610820516108005160065801610b0b565b610940526107a06107c0525b6107c0515260206107c051036107c0526101406107c0511015156118525761182f565b610940516107a0526104c0516107a0511161186c57600080fd5b6107a051610960526000610300511115611bab5761098060006004818352015b6107a0516104e061098051600481106118a457600080fd5b602002015180820282158284830414176118bd57600080fd5b809050905090506104c05180806118d357600080fd5b8204905090506109a05260006109c05261070061098051600481106118f757600080fd5b60200201516109a0511115611940576109a051610700610980516004811061191e57600080fd5b60200201518082101561193057600080fd5b808203905090506109c052611976565b610700610980516004811061195457600080fd5b60200201516109a0518082101561196a57600080fd5b808203905090506109c0525b6102c0516109c051808202821582848304141761199257600080fd5b809050905090506402540be40080806119aa57600080fd5b82049050905061024061098051600481106119c457600080fd5b602002015261070061098051600481106119dd57600080fd5b602002015161024061098051600481106119f657600080fd5b60200201516102e0518082028215828483041417611a1357600080fd5b809050905090506402540be4008080611a2b57600080fd5b82049050905080821015611a3e57600080fd5b808203905090506109805160048110611a5657600080fd5b600260c052602060c02001556107006109805160048110611a7657600080fd5b6020020180516102406109805160048110611a9057600080fd5b602002015180821015611aa257600080fd5b808203905090508152505b815160010180835281141561188c575b50506101406109e0525b6109e0515160206109e051016109e0526109806109e0511015611ae957611ac7565b631f30ab74610a0052610a206103a0805182528060200151826020015280604001518260400152806060015182606001525050610aa0610700805182528060200151826020015280604001518260400152806060015182606001525050610b0051610ae051610ac051610aa051610a8051610a6051610a4051610a205160065801610b0b565b610b60526109606109e0525b6109e0515260206109e051036109e0526101406109e051101515611b9e57611b7b565b610b605161096052611bdd565b600260c052602060c0206107008051825580602001516001830155806040015160028301558060600151600383015550505b6000610b8052610300511515611bfa576107a051610b8052611c4f565b61030051610960516104c05180821015611c1357600080fd5b808203905090508082028215828483041417611c2e57600080fd5b809050905090506104c0518080611c4457600080fd5b820490509050610b80525b6308c379a0610ba0526020610bc0526014610be0527f536c697070616765207363726577656420796f75000000000000000000000000610c0052610be050608435610b80511015611ca1576084610bbcfd5b610c4060006004818352015b6101c0610c405160048110611cc157600080fd5b602002015115610140610c405160048110611cdb57600080fd5b60200201511615611d9c57610c405160048110611cf757600080fd5b600060c052602060c02001543b611d0d57600080fd5b610c405160048110611d1e57600080fd5b600060c052602060c02001543018611d3557600080fd5b6000600060646323b872dd610d405233610d605230610d80526004610c405160048110611d6157600080fd5b6020020135610da052610d5c6000610c405160048110611d8057600080fd5b600060c052602060c02001545af1611d9757600080fd5b611e5f565b610c405160048110611dad57600080fd5b600060c052602060c02001543b611dc357600080fd5b610c405160048110611dd457600080fd5b600060c052602060c02001543018611deb57600080fd5b6020610d2060646323b872dd610c605233610c805230610ca0526004610c405160048110611e1857600080fd5b6020020135610cc052610c7c6000610c405160048110611e3757600080fd5b600060c052602060c02001545af1611e4e57600080fd5b600050610d2051611e5e57600080fd5b5b5b8151600101808352811415611cad575b50506007543b611e7f57600080fd5b6007543018611e8d57600080fd5b6000600060446340c10f19610e005233610e2052610b8051610e4052610e1c60006007545af1611ebc57600080fd5b600435610ea052602435610ec052604435610ee052606435610f005261024051610f205261026051610f405261028051610f60526102a051610f80526107a051610fa05261030051610b8051818183011015611f1757600080fd5b80820190509050610fc052337f3f1915775e0c9a38a57a7bb7f1f9005f486fb904e1f84aa215364d567319a58d610140610ea0a2600062ffffff55005b600015612358575b610220526101405261016052610180526101a0526101c0526101e052610200526000610140511215610160516101405114151660006101605112151660046101405112166004610160511216611fb157600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610240516305eb8fa6610280526102a06101a0805182528060200151826020015280604001518260400152806060015182606001525050610300516102e0516102c0516102a05160065801610806565b610360526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103605161024052610240516103805260006103a0526003546004808202821582848304141761207857600080fd5b809050905090506103c05260006103e05261040060006004818352015b610140516104005114156120b057610180516103e0526120e6565b610160516104005118156120e0576101a061040051600481106120d257600080fd5b60200201516103e0526120e5565b612162565b5b6103a080516103e0518181830110156120fe57600080fd5b808201905090508152506103805161024051808202821582848304141761212457600080fd5b809050905090506103e0516004808202821582848304141761214557600080fd5b80905090509050808061215757600080fd5b820490509050610380525b8151600101808352811415612095575b50506103805161024051808202821582848304141761219057600080fd5b809050905090506103c051600480820282158284830414176121b157600080fd5b8090509050905080806121c357600080fd5b820490509050610380526103a051610240516103c05180806121e457600080fd5b8204905090508181830110156121f957600080fd5b80820190509050610420526000610440526102405161046052610480600060ff818352015b61046051610440526104605161046051808202821582848304141761224257600080fd5b809050905090506103805181818301101561225c57600080fd5b80820190509050600261046051808202821582848304141761227d57600080fd5b809050905090506104205181818301101561229757600080fd5b8082019050905061024051808210156122af57600080fd5b8082039050905080806122c157600080fd5b82049050905061046052610440516104605111156123085760016104605161044051808210156122f057600080fd5b8082039050905011151561230357612344565b612333565b600161044051610460518082101561231f57600080fd5b8082039050905011151561233257612344565b5b5b815160010180835281141561221e575b505061046051600052600051610220515650005b635e0d443f600051141561272f57341561237157600080fd5b6060516004358060405190131561238757600080fd5b809190121561239557600080fd5b50606051602435806040519013156123ac57600080fd5b80919012156123ba57600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561244b57612429565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016105b0565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156124d2576124af565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506102606004356004811061250c57600080fd5b60200201516044356101406004356004811061252757600080fd5b6020020151808202821582848304141761254057600080fd5b80905090509050670de0b6b3a7640000808061255b57600080fd5b82049050905081818301101561257057600080fd5b80820190509050610460526101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156125a557612583565b631e8c3fd36104c0526004356104e0526024356105005261046051610520526105406102608051825280602001518260200152806040015182604001528060600151826060015250506105a05161058051610560516105405161052051610500516104e05160065801611f5c565b610600526104806104a0525b6104a0515260206104a051036104a0526101406104a0511015156126425761261f565b61060051610480526102606024356004811061265d57600080fd5b6020020151610480518082101561267357600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761269757600080fd5b80905090509050610140602435600481106126b157600080fd5b602002015180806126c157600080fd5b820490509050610620526004546106205180820282158284830414176126e657600080fd5b809050905090506402540be40080806126fe57600080fd5b8204905090506106405261062051610640518082101561271d57600080fd5b8082039050905060005260206000f350005b6307211ef76000511415612aed57341561274857600080fd5b6060516004358060405190131561275e57600080fd5b809190121561276c57600080fd5b506060516024358060405190131561278357600080fd5b809190121561279157600080fd5b506101406101405161016051610180516101a051600658016100a9565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561282257612800565b631db7662b6103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051600658016105b0565b6103e0526104005261042052610440526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156128a957612886565b6103e08051825280602001518260200152806040015182604001528060600151826060015250506104606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506102606004356004811061290857600080fd5b60200201516044356104606004356004811061292357600080fd5b6020020151808202821582848304141761293c57600080fd5b8090509050905081818301101561295257600080fd5b808201905090506104e052610140610520525b6105205151602061052051016105205261052061052051101561298757612965565b631e8c3fd36105405260043561056052602435610580526104e0516105a0526105c061026080518252806020015182602001528060400151826040015280606001518260600152505061062051610600516105e0516105c0516105a051610580516105605160065801611f5c565b61068052610500610520525b6105205152602061052051036105205261014061052051101515612a2457612a01565b610680516105005261026060243560048110612a3f57600080fd5b60200201516105005180821015612a5557600080fd5b8082039050905061046060243560048110612a6f57600080fd5b60200201518080612a7f57600080fd5b8204905090506106a0526004546106a0518082028215828483041417612aa457600080fd5b809050905090506402540be4008080612abc57600080fd5b8204905090506106c0526106a0516106c05180821015612adb57600080fd5b8082039050905060005260206000f350005b600015612f92575b610220526101405261016052610180526101a0526101c0526101e05261020052600f5415612b2257600080fd5b6102406101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015612b4f57612b2d565b631db7662b6102e0526103006101a080518252806020015182602001528060400151826040015280606001518260600152505061036051610340516103205161030051600658016105b0565b6103c0526103e05261040052610420526102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515612bd657612bb3565b6103c08051825280602001518260200152806040015182604001528060600151826060015250506102406101405160048110612c1157600080fd5b6020020151610180516101a06101405160048110612c2e57600080fd5b60200201518082028215828483041417612c4757600080fd5b80905090509050670de0b6b3a76400008080612c6257600080fd5b820490509050818183011015612c7757600080fd5b8082019050905061044052610140610480525b61048051516020610480510161048052610480610480511015612cac57612c8a565b631e8c3fd36104a052610140516104c052610160516104e052610440516105005261052061024080518252806020015182602001528060400151826040015280606001518260600152505061058051610560516105405161052051610500516104e0516104c05160065801611f5c565b6105e052610460610480525b6104805152602061048051036104805261014061048051101515612d4b57612d28565b6105e051610460526102406101605160048110612d6757600080fd5b60200201516104605180821015612d7d57600080fd5b8082039050905061060052610600516004548082028215828483041417612da357600080fd5b809050905090506402540be4008080612dbb57600080fd5b82049050905061062052610620516005548082028215828483041417612de057600080fd5b809050905090506402540be4008080612df857600080fd5b8204905090506106405261044051670de0b6b3a76400008082028215828483041417612e2357600080fd5b809050905090506101a06101405160048110612e3e57600080fd5b60200201518080612e4e57600080fd5b8204905090506101405160048110612e6557600080fd5b600260c052602060c020015561046051610620516106405180821015612e8a57600080fd5b80820390509050818183011015612ea057600080fd5b80820190509050670de0b6b3a76400008082028215828483041417612ec457600080fd5b809050905090506101a06101605160048110612edf57600080fd5b60200201518080612eef57600080fd5b8204905090506101605160048110612f0657600080fd5b600260c052602060c0200155610600516106205180821015612f2757600080fd5b80820390509050670de0b6b3a76400008082028215828483041417612f4b57600080fd5b809050905090506101a06101605160048110612f6657600080fd5b60200201518080612f7657600080fd5b8204905090506106605261066051600052600051610220515650005b633df02124600051141561352e5762ffffff5415612faf57600080fd5b600162ffffff553415612fc157600080fd5b60605160043580604051901315612fd757600080fd5b8091901215612fe557600080fd5b5060605160243580604051901315612ffc57600080fd5b809190121561300a57600080fd5b506101406101405161016051610180516101a05160065801610408565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051632ce785a36102a0526004356102c0526024356102e0526044356103005261032061014080518252806020015182602001528060400151826040015280606001518260600152505061038051610360516103405161032051610300516102e0516102c05160065801612af5565b6103e052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103e051610260526308c379a061040052602061042052602e610440527f45786368616e676520726573756c74656420696e20666577657220636f696e73610460527f207468616e20657870656374656400000000000000000000000000000000000061048052610440506064356102605110156131ae5760a461041cfd5b6104c060008152600081602001526001816040015260008160600152506105406000815260008160200152600081604001526000816060015250610540600435600481106131fb57600080fd5b6020020151156104c06004356004811061321457600080fd5b602002015116156132bd576004356004811061322f57600080fd5b600060c052602060c02001543b61324557600080fd5b6004356004811061325557600080fd5b600060c052602060c0200154301861326c57600080fd5b6000600060646323b872dd6106a052336106c052306106e052604435610700526106bc6000600435600481106132a157600080fd5b600060c052602060c02001545af16132b857600080fd5b613368565b600435600481106132cd57600080fd5b600060c052602060c02001543b6132e357600080fd5b600435600481106132f357600080fd5b600060c052602060c0200154301861330a57600080fd5b602061068060646323b872dd6105c052336105e0523061060052604435610620526105dc60006004356004811061334057600080fd5b600060c052602060c02001545af161335757600080fd5b6000506106805161336757600080fd5b5b6105406024356004811061337b57600080fd5b6020020151156104c06024356004811061339457600080fd5b6020020151161561343957602435600481106133af57600080fd5b600060c052602060c02001543b6133c557600080fd5b602435600481106133d557600080fd5b600060c052602060c020015430186133ec57600080fd5b60006000604463a9059cbb610820523361084052610260516108605261083c60006024356004811061341d57600080fd5b600060c052602060c02001545af161343457600080fd5b6134e0565b6024356004811061344957600080fd5b600060c052602060c02001543b61345f57600080fd5b6024356004811061346f57600080fd5b600060c052602060c0200154301861348657600080fd5b6020610800604463a9059cbb610760523361078052610260516107a05261077c6000602435600481106134b857600080fd5b600060c052602060c02001545af16134cf57600080fd5b600050610800516134df57600080fd5b5b6004356108c0526044356108e052602435610900526102605161092052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd9714060806108c0a2600062ffffff55005b63a6417ed66000511415613eac5762ffffff541561354b57600080fd5b600162ffffff55341561355d57600080fd5b6060516004358060405190131561357357600080fd5b809190121561358157600080fd5b506060516024358060405190131561359857600080fd5b80919012156135a657600080fd5b506101406101405161016051610180516101a05160065801610408565b6101e0526102005261022052610240526101a0526101805261016052610140526101e08051825280602001518260200152806040015182604001528060600151826060015250506102606001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101406004356004811061364257600080fd5b60200201516102606004356004811061365a57600080fd5b6020020151808061366a57600080fd5b8204905090506102e0526101406024356004811061368757600080fd5b60200201516102606024356004811061369f57600080fd5b602002015180806136af57600080fd5b82049050905061030052604435670de0b6b3a764000080820282158284830414176136d957600080fd5b809050905090506102e05180806136ef57600080fd5b82049050905061032052610140610360525b6103605151602061036051016103605261036061036051101561372357613701565b632ce785a3610380526004356103a0526024356103c052610320516103e052610400610140805182528060200151826020015280604001518260400152806060015182606001525050610460516104405161042051610400516103e0516103c0516103a05160065801612af5565b6104c052610340610360525b61036051526020610360510361036052610140610360511015156137c05761379d565b6104c05161034052610340516103005180820282158284830414176137e457600080fd5b80905090509050670de0b6b3a764000080806137ff57600080fd5b8204905090506104e0526308c379a061050052602061052052602e610540527f45786368616e676520726573756c74656420696e20666577657220636f696e73610560527f207468616e20657870656374656400000000000000000000000000000000000061058052610540506064356104e05110156138805760a461051cfd5b6105c06000815260008160200152600081604001526000816060015250610640600081526000816020015260018160400152600081606001525060006106c052610640600435600481106138d357600080fd5b60200201511561397b57600435600481106138ed57600080fd5b600160c052602060c02001543b61390357600080fd5b6004356004811061391357600080fd5b600160c052602060c0200154301861392a57600080fd5b6000600060646323b872dd6107c052336107e0523061080052604435610820526107dc60006004356004811061395f57600080fd5b600160c052602060c02001545af161397657600080fd5b613a26565b6004356004811061398b57600080fd5b600160c052602060c02001543b6139a157600080fd5b600435600481106139b157600080fd5b600160c052602060c020015430186139c857600080fd5b60206107a060646323b872dd6106e05233610700523061072052604435610740526106fc6000600435600481106139fe57600080fd5b600160c052602060c02001545af1613a1557600080fd5b6000506107a051613a2557600080fd5b5b6105c060043560048110613a3957600080fd5b602002015115613bee5760043560048110613a5357600080fd5b600160c052602060c02001543b613a6957600080fd5b60043560048110613a7957600080fd5b600160c052602060c02001543018613a9057600080fd5b6020610920604463095ea7b36108805260043560048110613ab057600080fd5b600060c052602060c02001546108a0526044356108c05261089c600060043560048110613adc57600080fd5b600160c052602060c02001545af1613af357600080fd5b6000506109205060043560048110613b0a57600080fd5b600060c052602060c02001543b613b2057600080fd5b60043560048110613b3057600080fd5b600060c052602060c02001543018613b4757600080fd5b60206109c0602463a0712d68610940526044356109605261095c600060043560048110613b7357600080fd5b600060c052602060c02001545af1613b8a57600080fd5b6000506109c0516106c05260006106c0511115613bed576308c379a06109e0526020610a00526013610a20527f436f756c64206e6f74206d696e7420636f696e00000000000000000000000000610a4052610a20506000613bec5760846109fcfd5b5b5b6105c060243560048110613c0157600080fd5b602002015115613d005760243560048110613c1b57600080fd5b600060c052602060c02001543b613c3157600080fd5b60243560048110613c4157600080fd5b600060c052602060c02001543018613c5857600080fd5b6020610b00602463db006a75610a805261034051610aa052610a9c600060243560048110613c8557600080fd5b600060c052602060c02001545af1613c9c57600080fd5b600050610b00516106c05260006106c0511115613cff576308c379a0610b20526020610b40526015610b60527f436f756c64206e6f742072656465656d20636f696e0000000000000000000000610b8052610b60506000613cfe576084610b3cfd5b5b5b61064060243560048110613d1357600080fd5b602002015115613db75760243560048110613d2d57600080fd5b600160c052602060c02001543b613d4357600080fd5b60243560048110613d5357600080fd5b600160c052602060c02001543018613d6a57600080fd5b60006000604463a9059cbb610c805233610ca0526104e051610cc052610c9c600060243560048110613d9b57600080fd5b600160c052602060c02001545af1613db257600080fd5b613e5e565b60243560048110613dc757600080fd5b600160c052602060c02001543b613ddd57600080fd5b60243560048110613ded57600080fd5b600160c052602060c02001543018613e0457600080fd5b6020610c60604463a9059cbb610bc05233610be0526104e051610c0052610bdc600060243560048110613e3657600080fd5b600160c052602060c02001545af1613e4d57600080fd5b600050610c6051613e5d57600080fd5b5b600435610d2052604435610d4052602435610d60526104e051610d8052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080610d20a2600062ffffff55005b637d49d87560005114156143455762ffffff5415613ec957600080fd5b600162ffffff553415613edb57600080fd5b6007543b613ee857600080fd5b6007543018613ef657600080fd5b60206101c060046318160ddd6101605261017c6007545afa613f1757600080fd5b6000506101c051610140526101e0600081526000816020015260008160400152600081606001525061026060008152600081602001526000816040015260008160600152506102e0600081526000816020015260018160400152600081606001525061036060008152600081602001526000816040015260008160600152506103e060006004818352015b6103e05160048110613fb357600080fd5b600260c052602060c02001546004358082028215828483041417613fd657600080fd5b80905090509050610140518080613fec57600080fd5b820490509050610400526308c379a0610420526020610440526030610460527f5769746864726177616c20726573756c74656420696e20666577657220636f69610480527f6e73207468616e206578706563746564000000000000000000000000000000006104a0526104605060246103e0516004811061406c57600080fd5b60200201356104005110156140825760a461043cfd5b6103e0516004811061409357600080fd5b600260c052602060c02001805461040051808210156140b157600080fd5b80820390509050815550610400516101e06103e051600481106140d357600080fd5b60200201526103606103e051600481106140ec57600080fd5b6020020151156102e06103e0516004811061410657600080fd5b602002015116156141ae576103e0516004811061412257600080fd5b600060c052602060c02001543b61413857600080fd5b6103e0516004811061414957600080fd5b600060c052602060c0200154301861416057600080fd5b60006000604463a9059cbb6105a052336105c052610400516105e0526105bc60006103e0516004811061419257600080fd5b600060c052602060c02001545af16141a957600080fd5b614258565b6103e051600481106141bf57600080fd5b600060c052602060c02001543b6141d557600080fd5b6103e051600481106141e657600080fd5b600060c052602060c020015430186141fd57600080fd5b6020610580604463a9059cbb6104e052336105005261040051610520526104fc60006103e0516004811061423057600080fd5b600060c052602060c02001545af161424757600080fd5b6000506105805161425757600080fd5b5b5b8151600101808352811415613fa2575b50506007543b61427857600080fd5b600754301861428657600080fd5b6000600060446379cc67906106405233610660526004356106805261065c60006007545af16142b457600080fd5b6101e0516106e052610200516107005261022051610720526102405161074052610260516107605261028051610780526102a0516107a0526102c0516107c052610140516004358082101561430857600080fd5b808203905090506107e052337f9878ca375e106f2a43c3b599fc624568131c4c9a4ba66a14563715763be9d59d6101206106e0a2600062ffffff55005b6318a7bd766000511415614e315762ffffff541561436257600080fd5b600162ffffff55341561437457600080fd5b600f541561438157600080fd5b61014060008152600081602001526001816040015260008160600152506101c060008152600081602001526000816040015260008160600152506007543b6143c857600080fd5b60075430186143d657600080fd5b60206102c060046318160ddd6102605261027c6007545afa6143f757600080fd5b6000506102c051610240526000610240511161441257600080fd5b6004546004808202821582848304141761442b57600080fd5b80905090509050600c808061443f57600080fd5b8204905090506102e052600554610300526103206101406103a0525b6103a0515160206103a051016103a0526103a06103a051101561447d5761445b565b60065801610408565b6103c0526103e05261040052610420526103806103a0525b6103a0515260206103a051036103a0526101406103a0511015156144c15761449e565b6103c080518252806020015182602001528060400151826040015280606001518260600152505061044060028060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506104c0610440805182528060200151826020015280604001518260400152806060015182606001525050610140610560525b6105605151602061056051016105605261056061056051101561458557614563565b631f30ab74610580526105a061032080518252806020015182602001528060400151826040015280606001518260600152505061062061044080518252806020015182602001528060400151826040015280606001518260600152505061068051610660516106405161062051610600516105e0516105c0516105a05160065801610b0b565b6106e052610540610560525b610560515260206105605103610560526101406105605110151561463a57614617565b6106e0516105405261070060006004818352015b6104c0610700516004811061466257600080fd5b6020020180516004610700516004811061467b57600080fd5b60200201358082101561468d57600080fd5b808203905090508152505b815160010180835281141561464e575b5050610140610740525b610740515160206107405101610740526107406107405110156146d4576146b2565b631f30ab74610760526107806103208051825280602001518260200152806040015182604001528060600151826060015250506108006104c0805182528060200151826020015280604001518260400152806060015182606001525050610860516108405161082051610800516107e0516107c0516107a0516107805160065801610b0b565b6108c052610720610740525b610740515260206107405103610740526101406107405110151561478957614766565b6108c051610720526108e0600081526000816020015260008160400152600081606001525061096060006004818352015b6107205161044061096051600481106147d257600080fd5b602002015180820282158284830414176147eb57600080fd5b8090509050905061054051808061480157600080fd5b8204905090506109805260006109a0526104c0610960516004811061482557600080fd5b602002015161098051111561486e57610980516104c0610960516004811061484c57600080fd5b60200201518082101561485e57600080fd5b808203905090506109a0526148a4565b6104c0610960516004811061488257600080fd5b6020020151610980518082101561489857600080fd5b808203905090506109a0525b6102e0516109a05180820282158284830414176148c057600080fd5b809050905090506402540be40080806148d857600080fd5b8204905090506108e061096051600481106148f257600080fd5b60200201526104c0610960516004811061490b57600080fd5b60200201516108e0610960516004811061492457600080fd5b602002015161030051808202821582848304141761494157600080fd5b809050905090506402540be400808061495957600080fd5b8204905090508082101561496c57600080fd5b80820390509050610960516004811061498457600080fd5b600260c052602060c02001556104c061096051600481106149a457600080fd5b6020020180516108e061096051600481106149be57600080fd5b6020020151808210156149d057600080fd5b808203905090508152505b81516001018083528114156147ba575b50506101406109e0525b6109e0515160206109e051016109e0526109e06109e0511015614a17576149f5565b631f30ab74610a0052610a20610320805182528060200151826020015280604001518260400152806060015182606001525050610aa06104c0805182528060200151826020015280604001518260400152806060015182606001525050610b0051610ae051610ac051610aa051610a8051610a6051610a4051610a205160065801610b0b565b610b60526109c06109e0525b6109e0515260206109e051036109e0526101406109e051101515614acc57614aa9565b610b60516109c052610540516109c05180821015614ae957600080fd5b80820390509050610240518082028215828483041417614b0857600080fd5b80905090509050610540518080614b1e57600080fd5b820490509050610b80526000610b805111614b3857600080fd5b6308c379a0610ba0526020610bc0526014610be0527f536c697070616765207363726577656420796f75000000000000000000000000610c0052610be050608435610b80511115614b8a576084610bbcfd5b610c4060006004818352015b6101c0610c405160048110614baa57600080fd5b602002015115610140610c405160048110614bc457600080fd5b60200201511615614c8057610c405160048110614be057600080fd5b600060c052602060c02001543b614bf657600080fd5b610c405160048110614c0757600080fd5b600060c052602060c02001543018614c1e57600080fd5b60006000604463a9059cbb610d205233610d40526004610c405160048110614c4557600080fd5b6020020135610d6052610d3c6000610c405160048110614c6457600080fd5b600060c052602060c02001545af1614c7b57600080fd5b614d3e565b610c405160048110614c9157600080fd5b600060c052602060c02001543b614ca757600080fd5b610c405160048110614cb857600080fd5b600060c052602060c02001543018614ccf57600080fd5b6020610d00604463a9059cbb610c605233610c80526004610c405160048110614cf757600080fd5b6020020135610ca052610c7c6000610c405160048110614d1657600080fd5b600060c052602060c02001545af1614d2d57600080fd5b600050610d0051614d3d57600080fd5b5b5b8151600101808352811415614b96575b50506007543b614d5e57600080fd5b6007543018614d6c57600080fd5b6000600060446379cc6790610dc05233610de052610b8051610e0052610ddc60006007545af1614d9b57600080fd5b600435610e6052602435610e8052604435610ea052606435610ec0526108e051610ee05261090051610f005261092051610f205261094051610f405261072051610f605261024051610b805180821015614df457600080fd5b80820390509050610f8052337fb964b72f73f5ef5bf0fdc559b2fab9a7b12a39e47817a547f1f0aee47febd602610140610e60a2600062ffffff55005b63ee11f5b66000511415614f19573415614e4a57600080fd5b6006543314614e5857600080fd5b60085415614e6557600080fd5b64012a05f2006044351115614e7957600080fd5b64012a05f2006024351115614e8d57600080fd5b620f42406004351115614e9f57600080fd5b426203f480818183011015614eb357600080fd5b808201905090506101405261014051600855600435600a55602435600b55604435600c5560043561016052602435610180526044356101a052610140517f6081daa3b61098baf24d9c69bcd53af932e0635c89c6fd0617534b9ba76a7f736060610160a2005b632a7dd7cd6000511415614fc6573415614f3257600080fd5b6006543314614f4057600080fd5b60006008541142600854111516614f5657600080fd5b6000600855600a5461014052600b5461016052600c5461018052610140516003556101605160045561018051600555610140516101a052610160516101c052610180516101e0527f752a27d1853eb7af3ee4ff764f2c4a51619386af721573dd3809e929c39db99e60606101a0a1005b63226840fb6000511415614ff4573415614fdf57600080fd5b6006543314614fed57600080fd5b6000600855005b636b441a40600051141561509557341561500d57600080fd5b600435602051811061501e57600080fd5b50600654331461502d57600080fd5b6009541561503a57600080fd5b426203f48081818301101561504e57600080fd5b808201905090506101405261014051600955600435600d55600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156151115734156150ae57600080fd5b60065433146150bc57600080fd5b600060095411600954421015166150d257600080fd5b6000600955600d546101405261014051600655610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193600051141561513f57341561512a57600080fd5b600654331461513857600080fd5b6000600955005b6330c54085600051141561537e57341561515857600080fd5b600654331461516657600080fd5b6101406001815264e8d4a51000816020015264e8d4a51000816040015260018160600152506101c0600081526000816020015260018160400152600081606001525061024060008152600081602001526000816040015260008160600152506102c060006004818352015b6102c051600481106151e257600080fd5b600060c052602060c02001546102e0526102e0513b61520057600080fd5b6102e051301861520f57600080fd5b60206103a060246370a0823161032052306103405261033c6102e0515afa61523657600080fd5b6000506103a0516102c0516004811061524e57600080fd5b600260c052602060c02001548082101561526757600080fd5b80820390509050610300526000610300511115615369576102406102c0516004811061529257600080fd5b6020020151156101c06102c051600481106152ac57600080fd5b60200201511615615309576102e0513b6152c557600080fd5b6102e05130186152d457600080fd5b60006000604463a9059cbb61048052336104a052610300516104c05261049c60006102e0515af161530457600080fd5b615368565b6102e0513b61531757600080fd5b6102e051301861532657600080fd5b6020610460604463a9059cbb6103c052336103e05261030051610400526103dc60006102e0515af161535757600080fd5b6000506104605161536757600080fd5b5b5b5b81516001018083528114156151d1575b5050005b63e369885360005114156153ba57341561539757600080fd5b60065433146153a557600080fd5b42600e54116153b357600080fd5b6001600f55005b633046f97260005114156153e85734156153d357600080fd5b60065433146153e157600080fd5b6000600f55005b6323746eb8600051141561544d57341561540157600080fd5b6060516004358060405190131561541757600080fd5b809190121561542557600080fd5b506004356004811061543657600080fd5b600060c052602060c020015460005260206000f350005b63b739953e60005114156154b257341561546657600080fd5b6060516004358060405190131561547c57600080fd5b809190121561548a57600080fd5b506004356004811061549b57600080fd5b600160c052602060c020015460005260206000f350005b63065a80d860005114156155175734156154cb57600080fd5b606051600435806040519013156154e157600080fd5b80919012156154ef57600080fd5b506004356004811061550057600080fd5b600260c052602060c020015460005260206000f350005b63f446c1d0600051141561553e57341561553057600080fd5b60035460005260206000f350005b63ddca3f43600051141561556557341561555757600080fd5b60045460005260206000f350005b63fee3f7f9600051141561558c57341561557e57600080fd5b60055460005260206000f350005b638da5cb5b60005114156155b35734156155a557600080fd5b60065460005260206000f350005b63405e28f860005114156155da5734156155cc57600080fd5b60085460005260206000f350005b63e0a0b58660005114156156015734156155f357600080fd5b60095460005260206000f350005b63b4b577ad600051141561562857341561561a57600080fd5b600a5460005260206000f350005b6358680d0b600051141561564f57341561564157600080fd5b600b5460005260206000f350005b63e3824462600051141561567657341561566857600080fd5b600c5460005260206000f350005b631ec0cdc1600051141561569d57341561568f57600080fd5b600d5460005260206000f350005b5b60006000fd

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

0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f510000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51000000000000000000000000c25a3a3b969415c80451098fa907ec722572917f000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000003d0900

-----Decoded View---------------
Arg [0] : _coins (address[4]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7,0x57Ab1ec28D129707052df4dF418D58a2D46d5f51
Arg [1] : _underlying_coins (address[4]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7,0x57Ab1ec28D129707052df4dF418D58a2D46d5f51
Arg [2] : _pool_token (address): 0xC25a3A3b969415c80451098fa907EC722572917F
Arg [3] : _A (uint256): 70
Arg [4] : _fee (uint256): 4000000

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [2] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [3] : 00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51
Arg [4] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 00000000000000000000000057ab1ec28d129707052df4df418d58a2d46d5f51
Arg [8] : 000000000000000000000000c25a3a3b969415c80451098fa907ec722572917f
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [10] : 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 sUSD v2 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.