ETH Price: $3,755.19 (+1.72%)
Gas: 5 Gwei

Token

 

Overview

Max Total Supply

0

Holders

0

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.5

Optimization Enabled:
N/A

Other Settings:
None license

Contract Source Code (Vyper language format)

# @version 0.2.5
"""
@title Curve USDK Metapool
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2020 - all rights reserved
@dev Utilizes 3Pool to allow swaps between USDK / DAI / USDC / USDT
"""

from vyper.interfaces import ERC20

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


interface Curve:
    def coins(i: uint256) -> address: view
    def get_virtual_price() -> uint256: view
    def calc_token_amount(amounts: uint256[BASE_N_COINS], deposit: bool) -> uint256: view
    def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256: view
    def fee() -> uint256: view
    def get_dy(i: int128, j: int128, dx: uint256) -> uint256: view
    def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256: view
    def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256): nonpayable
    def add_liquidity(amounts: uint256[BASE_N_COINS], min_mint_amount: uint256): nonpayable
    def remove_liquidity_one_coin(_token_amount: uint256, i: int128, min_amount: uint256): nonpayable


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

event TokenExchangeUnderlying:
    buyer: indexed(address)
    sold_id: int128
    tokens_sold: uint256
    bought_id: int128
    tokens_bought: uint256

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

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

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

event RemoveLiquidityImbalance:
    provider: indexed(address)
    token_amounts: uint256[N_COINS]
    fees: uint256[N_COINS]
    invariant: uint256
    token_supply: uint256

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

event NewAdmin:
    admin: indexed(address)

event CommitNewFee:
    deadline: indexed(uint256)
    fee: uint256
    admin_fee: uint256

event NewFee:
    fee: uint256
    admin_fee: uint256

event RampA:
    old_A: uint256
    new_A: uint256
    initial_time: uint256
    future_time: uint256

event StopRampA:
    A: uint256
    t: uint256


N_COINS: constant(int128) = 2
MAX_COIN: constant(int128) = N_COINS - 1

FEE_DENOMINATOR: constant(uint256) = 10 ** 10
PRECISION: constant(uint256) = 10 ** 18  # The precision to convert to
PRECISION_MUL: constant(uint256[N_COINS]) = [1, 1]
RATES: constant(uint256[N_COINS]) = [1000000000000000000, 1000000000000000000]

BASE_N_COINS: constant(int128) = 3
N_ALL_COINS: constant(int128) = N_COINS + BASE_N_COINS - 1
BASE_PRECISION_MUL: constant(uint256[BASE_N_COINS]) = [1, 1000000000000, 1000000000000]
BASE_RATES: constant(uint256[BASE_N_COINS]) = [1000000000000000000, 1000000000000000000000000000000, 1000000000000000000000000000000]

# An asset which may have a transfer fee (USDT)
FEE_ASSET: constant(address) = 0xdAC17F958D2ee523a2206206994597C13D831ec7

MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10 ** 6
MAX_A_CHANGE: constant(uint256) = 10

ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400

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

owner: public(address)
token: CurveToken

# Token corresponding to the pool is always the last one
BASE_POOL_COINS: constant(int128) = 3
BASE_CACHE_EXPIRES: constant(int128) = 10 * 60  # 10 min
base_pool: public(address)
base_virtual_price: public(uint256)
base_cache_updated: public(uint256)
base_coins: public(address[BASE_POOL_COINS])

A_PRECISION: constant(uint256) = 100
initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(uint256)
future_A_time: public(uint256)

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

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


@external
def __init__(
    _owner: address,
    _coins: address[N_COINS],
    _pool_token: address,
    _base_pool: address,
    _A: uint256,
    _fee: uint256,
    _admin_fee: uint256
):
    """
    @notice Contract constructor
    @param _owner Contract owner address
    @param _coins Addresses of ERC20 conracts of coins
    @param _pool_token Address of the token representing LP share
    @param _base_pool Address of the base pool (which will have a virtual price)
    @param _A Amplification coefficient multiplied by n * (n - 1)
    @param _fee Fee to charge for exchanges
    @param _admin_fee Admin fee
    """
    for i in range(N_COINS):
        assert _coins[i] != ZERO_ADDRESS
    self.coins = _coins
    self.initial_A = _A * A_PRECISION
    self.future_A = _A * A_PRECISION
    self.fee = _fee
    self.admin_fee = _admin_fee
    self.owner = _owner
    self.kill_deadline = block.timestamp + KILL_DEADLINE_DT
    self.token = CurveToken(_pool_token)

    self.base_pool = _base_pool
    self.base_virtual_price = Curve(_base_pool).get_virtual_price()
    self.base_cache_updated = block.timestamp
    for i in range(BASE_POOL_COINS):
        _base_coin: address = Curve(_base_pool).coins(convert(i, uint256))
        self.base_coins[i] = _base_coin

        # approve underlying coins for infinite transfers
        _response: Bytes[32] = raw_call(
            _base_coin,
            concat(
                method_id("approve(address,uint256)"),
                convert(_base_pool, bytes32),
                convert(MAX_UINT256, bytes32),
            ),
            max_outsize=32,
        )
        if len(_response) > 0:
            assert convert(_response, bool)


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

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

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


@view
@external
def A() -> uint256:
    return self._A() / A_PRECISION


@view
@external
def A_precise() -> uint256:
    return self._A()


@view
@internal
def _xp(vp_rate: uint256) -> uint256[N_COINS]:
    result: uint256[N_COINS] = RATES
    result[MAX_COIN] = vp_rate  # virtual price for the metacurrency
    for i in range(N_COINS):
        result[i] = result[i] * self.balances[i] / PRECISION
    return result


@pure
@internal
def _xp_mem(vp_rate: uint256, _balances: uint256[N_COINS]) -> uint256[N_COINS]:
    result: uint256[N_COINS] = RATES
    result[MAX_COIN] = vp_rate  # virtual price for the metacurrency
    for i in range(N_COINS):
        result[i] = result[i] * _balances[i] / PRECISION
    return result


@internal
def _vp_rate() -> uint256:
    if block.timestamp > self.base_cache_updated + BASE_CACHE_EXPIRES:
        vprice: uint256 = Curve(self.base_pool).get_virtual_price()
        self.base_virtual_price = vprice
        self.base_cache_updated = block.timestamp
        return vprice
    else:
        return self.base_virtual_price


@internal
@view
def _vp_rate_ro() -> uint256:
    if block.timestamp > self.base_cache_updated + BASE_CACHE_EXPIRES:
        return Curve(self.base_pool).get_virtual_price()
    else:
        return self.base_virtual_price


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

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


@view
@internal
def get_D_mem(vp_rate: uint256, _balances: uint256[N_COINS], amp: uint256) -> uint256:
    xp: uint256[N_COINS] = self._xp_mem(vp_rate, _balances)
    return self.get_D(xp, amp)


@view
@external
def get_virtual_price() -> uint256:
    """
    @notice The current virtual price of the pool LP token
    @dev Useful for calculating profits
    @return LP token virtual price normalized to 1e18
    """
    amp: uint256 = self._A()
    vp_rate: uint256 = self._vp_rate_ro()
    xp: uint256[N_COINS] = self._xp(vp_rate)
    D: uint256 = self.get_D(xp, amp)
    # 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


@view
@external
def calc_token_amount(amounts: uint256[N_COINS], is_deposit: bool) -> uint256:
    """
    @notice Calculate addition or reduction in token supply from a deposit or withdrawal
    @dev This calculation accounts for slippage, but not fees.
         Needed to prevent front-running, not for precise calculations!
    @param amounts Amount of each coin being deposited
    @param is_deposit set True for deposits, False for withdrawals
    @return Expected amount of LP tokens received
    """
    amp: uint256 = self._A()
    vp_rate: uint256 = self._vp_rate_ro()
    _balances: uint256[N_COINS] = self.balances
    D0: uint256 = self.get_D_mem(vp_rate, _balances, amp)
    for i in range(N_COINS):
        if is_deposit:
            _balances[i] += amounts[i]
        else:
            _balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(vp_rate, _balances, amp)
    token_amount: uint256 = self.token.totalSupply()
    diff: uint256 = 0
    if is_deposit:
        diff = D1 - D0
    else:
        diff = D0 - D1
    return diff * token_amount / D0


@external
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256) -> uint256:
    """
    @notice Deposit coins into the pool
    @param amounts List of amounts of coins to deposit
    @param min_mint_amount Minimum amount of LP tokens to mint from the deposit
    @return Amount of LP tokens received by depositing
    """
    assert not self.is_killed  # dev: is killed

    amp: uint256 = self._A()
    vp_rate: uint256 = self._vp_rate()
    token_supply: uint256 = self.token.totalSupply()
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee

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

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

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

    # We need to recalculate the invariant accounting for fees
    # to calculate fair user's share
    fees: uint256[N_COINS] = empty(uint256[N_COINS])
    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(vp_rate, new_balances, amp)
    else:
        self.balances = new_balances

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

    assert mint_amount >= min_mint_amount, "Slippage screwed you"

    # Take coins from the sender
    for i in range(N_COINS):
        if amounts[i] > 0:
            assert ERC20(self.coins[i]).transferFrom(msg.sender, self, amounts[i])  # dev: failed transfer

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

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

    return mint_amount


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

    assert i != j       # dev: same coin
    assert j >= 0       # dev: j below zero
    assert j < N_COINS  # dev: j above N_COINS

    # should be unreachable, but good for safety
    assert i >= 0
    assert i < N_COINS

    amp: uint256 = self._A()
    D: uint256 = self.get_D(xp_, amp)

    S_: uint256 = 0
    _x: uint256 = 0
    y_prev: uint256 = 0
    c: uint256 = D
    Ann: uint256 = amp * N_COINS

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


@view
@external
def get_dy(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in c-units
    rates: uint256[N_COINS] = RATES
    rates[MAX_COIN] = self._vp_rate_ro()
    xp: uint256[N_COINS] = self._xp(rates[MAX_COIN])

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


@view
@external
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
    # dx and dy in underlying units
    vp_rate: uint256 = self._vp_rate_ro()
    xp: uint256[N_COINS] = self._xp(vp_rate)
    precisions: uint256[N_COINS] = PRECISION_MUL
    _base_pool: address = self.base_pool

    # Use base_i or base_j if they are >= 0
    base_i: int128 = i - MAX_COIN
    base_j: int128 = j - MAX_COIN
    meta_i: int128 = MAX_COIN
    meta_j: int128 = MAX_COIN
    if base_i < 0:
        meta_i = i
    if base_j < 0:
        meta_j = j

    x: uint256 = 0
    if base_i < 0:
        x = xp[i] + dx * precisions[i]
    else:
        if base_j < 0:
            # i is from BasePool
            # At first, get the amount of pool tokens
            base_inputs: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS])
            base_inputs[base_i] = dx
            # Token amount transformed to underlying "dollars"
            x = Curve(_base_pool).calc_token_amount(base_inputs, True) * vp_rate / PRECISION
            # Accounting for deposit/withdraw fees approximately
            x -= x * Curve(_base_pool).fee() / (2 * FEE_DENOMINATOR)
            # Adding number of pool tokens
            x += xp[MAX_COIN]
        else:
            # If both are from the base pool
            return Curve(_base_pool).get_dy(base_i, base_j, dx)

    # This pool is involved only when in-pool assets are used
    y: uint256 = self.get_y(meta_i, meta_j, x, xp)
    dy: uint256 = xp[meta_j] - y - 1
    dy = (dy - self.fee * dy / FEE_DENOMINATOR)

    # If output is going via the metapool
    if base_j < 0:
        dy /= precisions[meta_j]
    else:
        # j is from BasePool
        # The fee is already accounted for
        dy = Curve(_base_pool).calc_withdraw_one_coin(dy * PRECISION / vp_rate, base_j)

    return dy


@external
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256:
    """
    @notice Perform an exchange between two coins
    @dev Index values can be found via the `coins` public getter method
    @param i Index value for the coin to send
    @param j Index valie of the coin to recieve
    @param dx Amount of `i` being exchanged
    @param min_dy Minimum amount of `j` to receive
    @return Actual amount of `j` received
    """
    assert not self.is_killed  # dev: is killed
    rates: uint256[N_COINS] = RATES
    rates[MAX_COIN] = self._vp_rate()

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

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

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

    # Convert all to real units
    dy = (dy - dy_fee) * PRECISION / rates[j]
    assert dy >= min_dy, "Too few coins in result"

    dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
    dy_admin_fee = dy_admin_fee * PRECISION / rates[j]

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

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

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

    return dy


@external
@nonreentrant('lock')
def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256:
    """
    @notice Perform an exchange between two underlying coins
    @dev Index values can be found via the `underlying_coins` public getter method
    @param i Index value for the underlying coin to send
    @param j Index valie of the underlying coin to recieve
    @param dx Amount of `i` being exchanged
    @param min_dy Minimum amount of `j` to receive
    @return Actual amount of `j` received
    """
    assert not self.is_killed  # dev: is killed
    rates: uint256[N_COINS] = RATES
    rates[MAX_COIN] = self._vp_rate()
    _base_pool: address = self.base_pool

    # Use base_i or base_j if they are >= 0
    base_i: int128 = i - MAX_COIN
    base_j: int128 = j - MAX_COIN
    meta_i: int128 = MAX_COIN
    meta_j: int128 = MAX_COIN
    if base_i < 0:
        meta_i = i
    if base_j < 0:
        meta_j = j
    dy: uint256 = 0

    # Addresses for input and output coins
    input_coin: address = ZERO_ADDRESS
    if base_i < 0:
        input_coin = self.coins[i]
    else:
        input_coin = self.base_coins[base_i]
    output_coin: address = ZERO_ADDRESS
    if base_j < 0:
        output_coin = self.coins[j]
    else:
        output_coin = self.base_coins[base_j]

    # Handle potential Tether fees
    dx_w_fee: uint256 = dx
    if input_coin == FEE_ASSET:
        dx_w_fee = ERC20(FEE_ASSET).balanceOf(self)
    # "safeTransferFrom" which works for ERC20s which return bool or not
    _response: Bytes[32] = raw_call(
        input_coin,
        concat(
            method_id("transferFrom(address,address,uint256)"),
            convert(msg.sender, bytes32),
            convert(self, bytes32),
            convert(dx, bytes32),
        ),
        max_outsize=32,
    )  # dev: failed transfer
    if len(_response) > 0:
        assert convert(_response, bool)  # dev: failed transfer
    # end "safeTransferFrom"
    # Handle potential Tether fees
    if input_coin == FEE_ASSET:
        dx_w_fee = ERC20(FEE_ASSET).balanceOf(self) - dx_w_fee

    if base_i < 0 or base_j < 0:
        old_balances: uint256[N_COINS] = self.balances
        xp: uint256[N_COINS] = self._xp_mem(rates[MAX_COIN], old_balances)

        x: uint256 = 0
        if base_i < 0:
            x = xp[i] + dx_w_fee * rates[i] / PRECISION
        else:
            # i is from BasePool
            # At first, get the amount of pool tokens
            base_inputs: uint256[BASE_N_COINS] = empty(uint256[BASE_N_COINS])
            base_inputs[base_i] = dx_w_fee
            coin_i: address = self.coins[MAX_COIN]
            # Deposit and measure delta
            x = ERC20(coin_i).balanceOf(self)
            Curve(_base_pool).add_liquidity(base_inputs, 0)
            # Need to convert pool token to "virtual" units using rates
            # dx is also different now
            dx_w_fee = ERC20(coin_i).balanceOf(self) - x
            x = dx_w_fee * rates[MAX_COIN] / PRECISION
            # Adding number of pool tokens
            x += xp[MAX_COIN]

        y: uint256 = self.get_y(meta_i, meta_j, x, xp)

        # Either a real coin or token
        dy = xp[meta_j] - y - 1  # -1 just in case there were some rounding errors
        dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR

        # Convert all to real units
        # Works for both pool coins and real coins
        dy = (dy - dy_fee) * PRECISION / rates[meta_j]

        dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
        dy_admin_fee = dy_admin_fee * PRECISION / rates[meta_j]

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

        # Withdraw from the base pool if needed
        if base_j >= 0:
            out_amount: uint256 = ERC20(output_coin).balanceOf(self)
            Curve(_base_pool).remove_liquidity_one_coin(dy, base_j, 0)
            dy = ERC20(output_coin).balanceOf(self) - out_amount

        assert dy >= min_dy, "Too few coins in result"

    else:
        # If both are from the base pool
        dy = ERC20(output_coin).balanceOf(self)
        Curve(_base_pool).exchange(base_i, base_j, dx_w_fee, min_dy)
        dy = ERC20(output_coin).balanceOf(self) - dy

    # "safeTransfer" which works for ERC20s which return bool or not
    _response = raw_call(
        output_coin,
        concat(
            method_id("transfer(address,uint256)"),
            convert(msg.sender, bytes32),
            convert(dy, bytes32),
        ),
        max_outsize=32,
    )  # dev: failed transfer
    if len(_response) > 0:
        assert convert(_response, bool)  # dev: failed transfer
    # end "safeTransfer"

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

    return dy


@external
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]) -> uint256[N_COINS]:
    """
    @notice Withdraw coins from the pool
    @dev Withdrawal amounts are based on current deposit ratios
    @param _amount Quantity of LP tokens to burn in the withdrawal
    @param min_amounts Minimum amounts of underlying coins to receive
    @return List of amounts of coins that were withdrawn
    """
    total_supply: uint256 = self.token.totalSupply()
    amounts: uint256[N_COINS] = empty(uint256[N_COINS])
    fees: uint256[N_COINS] = empty(uint256[N_COINS])  # Fees are unused but we've got them historically in event

    for i in range(N_COINS):
        value: uint256 = self.balances[i] * _amount / total_supply
        assert value >= min_amounts[i], "Too few coins in result"
        self.balances[i] -= value
        amounts[i] = value
        assert ERC20(self.coins[i]).transfer(msg.sender, value)

    self.token.burnFrom(msg.sender, _amount)  # dev: insufficient funds

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

    return amounts


@external
@nonreentrant('lock')
def remove_liquidity_imbalance(amounts: uint256[N_COINS], max_burn_amount: uint256) -> uint256:
    """
    @notice Withdraw coins from the pool in an imbalanced amount
    @param amounts List of amounts of underlying coins to withdraw
    @param max_burn_amount Maximum amount of LP token to burn in the withdrawal
    @return Actual amount of the LP token burned in the withdrawal
    """
    assert not self.is_killed  # dev: is killed

    amp: uint256 = self._A()
    vp_rate: uint256 = self._vp_rate()

    token_supply: uint256 = self.token.totalSupply()
    assert token_supply != 0  # dev: zero total supply
    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    _admin_fee: uint256 = self.admin_fee

    old_balances: uint256[N_COINS] = self.balances
    new_balances: uint256[N_COINS] = old_balances
    D0: uint256 = self.get_D_mem(vp_rate, old_balances, amp)
    for i in range(N_COINS):
        new_balances[i] -= amounts[i]
    D1: uint256 = self.get_D_mem(vp_rate, new_balances, amp)

    fees: uint256[N_COINS] = empty(uint256[N_COINS])
    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(vp_rate, new_balances, amp)

    token_amount: uint256 = (D0 - D2) * token_supply / D0
    assert token_amount != 0  # dev: zero tokens burned
    token_amount += 1  # In case of rounding errors - make it unfavorable for the "attacker"
    assert token_amount <= max_burn_amount, "Slippage screwed you"

    self.token.burnFrom(msg.sender, token_amount)  # dev: insufficient funds
    for i in range(N_COINS):
        if amounts[i] != 0:
            assert ERC20(self.coins[i]).transfer(msg.sender, amounts[i])

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

    return token_amount


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

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

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

    assert i >= 0  # dev: i below zero
    assert i < N_COINS  # dev: i above N_COINS

    S_: uint256 = 0
    _x: uint256 = 0
    y_prev: uint256 = 0

    c: uint256 = D
    Ann: uint256 = A_ * N_COINS

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


@view
@internal
def _calc_withdraw_one_coin(_token_amount: uint256, i: int128, vp_rate: uint256) -> (uint256, uint256, uint256):
    # First, need to calculate
    # * Get current D
    # * Solve Eqn against y_i for D - _token_amount
    amp: uint256 = self._A()
    xp: uint256[N_COINS] = self._xp(vp_rate)
    D0: uint256 = self.get_D(xp, amp)

    total_supply: uint256 = self.token.totalSupply()
    D1: uint256 = D0 - _token_amount * D0 / total_supply
    new_y: uint256 = self.get_y_D(amp, i, xp, D1)

    _fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
    rates: uint256[N_COINS] = RATES
    rates[MAX_COIN] = vp_rate

    xp_reduced: uint256[N_COINS] = xp
    dy_0: uint256 = (xp[i] - new_y) * PRECISION / rates[i]  # w/o fees

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

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

    return dy, dy_0 - dy, total_supply


@view
@external
def calc_withdraw_one_coin(_token_amount: uint256, i: int128) -> uint256:
    """
    @notice Calculate the amount received when withdrawing a single coin
    @param _token_amount Amount of LP tokens to burn in the withdrawal
    @param i Index value of the coin to withdraw
    @return Amount of coin received
    """
    vp_rate: uint256 = self._vp_rate_ro()
    return self._calc_withdraw_one_coin(_token_amount, i, vp_rate)[0]


@external
@nonreentrant('lock')
def remove_liquidity_one_coin(_token_amount: uint256, i: int128, _min_amount: uint256) -> uint256:
    """
    @notice Withdraw a single coin from the pool
    @param _token_amount Amount of LP tokens to burn in the withdrawal
    @param i Index value of the coin to withdraw
    @param _min_amount Minimum amount of coin to receive
    @return Amount of coin received
    """
    assert not self.is_killed  # dev: is killed

    vp_rate: uint256 = self._vp_rate()
    dy: uint256 = 0
    dy_fee: uint256 = 0
    total_supply: uint256 = 0
    dy, dy_fee, total_supply = self._calc_withdraw_one_coin(_token_amount, i, vp_rate)
    assert dy >= _min_amount, "Not enough coins removed"

    self.balances[i] -= (dy + dy_fee * self.admin_fee / FEE_DENOMINATOR)
    self.token.burnFrom(msg.sender, _token_amount)  # dev: insufficient funds
    assert ERC20(self.coins[i]).transfer(msg.sender, dy)

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

    return dy


### Admin functions ###
@external
def ramp_A(_future_A: uint256, _future_time: uint256):
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME
    assert _future_time >= block.timestamp + MIN_RAMP_TIME  # dev: insufficient time

    _initial_A: uint256 = self._A()
    _future_A_p: uint256 = _future_A * A_PRECISION

    assert _future_A > 0 and _future_A < MAX_A
    if _future_A_p < _initial_A:
        assert _future_A_p * MAX_A_CHANGE >= _initial_A
    else:
        assert _future_A_p <= _initial_A * MAX_A_CHANGE

    self.initial_A = _initial_A
    self.future_A = _future_A_p
    self.initial_A_time = block.timestamp
    self.future_A_time = _future_time

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


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

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

    log StopRampA(current_A, block.timestamp)


@external
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256):
    assert msg.sender == self.owner  # dev: only owner
    assert self.admin_actions_deadline == 0  # dev: active action
    assert new_fee <= MAX_FEE  # dev: fee exceeds maximum
    assert new_admin_fee <= MAX_ADMIN_FEE  # dev: admin fee exceeds maximum

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

    log CommitNewFee(_deadline, new_fee, new_admin_fee)


@external
def apply_new_fee():
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.admin_actions_deadline  # dev: insufficient time
    assert self.admin_actions_deadline != 0  # dev: no active action

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

    log NewFee(_fee, _admin_fee)


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

    self.admin_actions_deadline = 0


@external
def commit_transfer_ownership(_owner: address):
    assert msg.sender == self.owner  # dev: only owner
    assert self.transfer_ownership_deadline == 0  # dev: active transfer

    _deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
    self.transfer_ownership_deadline = _deadline
    self.future_owner = _owner

    log CommitNewAdmin(_deadline, _owner)


@external
def apply_transfer_ownership():
    assert msg.sender == self.owner  # dev: only owner
    assert block.timestamp >= self.transfer_ownership_deadline  # dev: insufficient time
    assert self.transfer_ownership_deadline != 0  # dev: no active transfer

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

    log NewAdmin(_owner)


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

    self.transfer_ownership_deadline = 0


@view
@external
def admin_balances(i: uint256) -> uint256:
    return ERC20(self.coins[i]).balanceOf(self) - self.balances[i]


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

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


@external
def donate_admin_fees():
    assert msg.sender == self.owner  # dev: only owner
    for i in range(N_COINS):
        self.balances[i] = ERC20(self.coins[i]).balanceOf(self)


@external
def kill_me():
    assert msg.sender == self.owner  # dev: only owner
    assert self.kill_deadline > block.timestamp  # dev: deadline has passed
    self.is_killed = True


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

Contract Security Audit

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[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","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[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[2]","name":"token_amounts","indexed":false},{"type":"uint256[2]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false},{"type":"uint256","name":"future_time","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"_owner"},{"type":"address[2]","name":"_coins"},{"type":"address","name":"_pool_token"},{"type":"address","name":"_base_pool"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"uint256","name":"_admin_fee"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5205},{"name":"A_precise","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5167},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":992854},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"bool","name":"is_deposit"}],"stateMutability":"view","type":"function","gas":3939870},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"uint256","name":"min_mint_amount"}],"stateMutability":"nonpayable","type":"function","gas":6138492},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2390368},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2393485},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function","gas":2617568},{"name":"exchange_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function","gas":2632475},{"name":"remove_liquidity","outputs":[{"type":"uint256[2]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[2]","name":"min_amounts"}],"stateMutability":"nonpayable","type":"function","gas":163289},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[2]","name":"amounts"},{"type":"uint256","name":"max_burn_amount"}],"stateMutability":"nonpayable","type":"function","gas":6138317},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"}],"stateMutability":"view","type":"function","gas":4335},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"}],"stateMutability":"nonpayable","type":"function","gas":3827137},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","name":"_future_time"}],"stateMutability":"nonpayable","type":"function","gas":151906},{"name":"stop_ramp_A","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":148667},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"stateMutability":"nonpayable","type":"function","gas":110491},{"name":"apply_new_fee","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":97272},{"name":"revert_new_parameters","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":21925},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"stateMutability":"nonpayable","type":"function","gas":74663},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":60740},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22015},{"name":"admin_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"i"}],"stateMutability":"view","type":"function","gas":3511},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":9248},{"name":"donate_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":74995},{"name":"kill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38028},{"name":"unkill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22165},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2250},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2280},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2201},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2231},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2261},{"name":"base_pool","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2291},{"name":"base_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"base_cache_updated","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"base_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2490},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"initial_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471},{"name":"future_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2501},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2531},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2561},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2591},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2621},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2651}]

6f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605261010061601261014039602061601260c03960c05160a01c1561005957600080fd5b602060206160120160c03960c05160a01c1561007457600080fd5b602060406160120160c03960c05160a01c1561008f57600080fd5b602060606160120160c03960c05160a01c156100aa57600080fd5b602060806160120160c03960c05160a01c156100c557600080fd5b61024060006002818352015b600061016061024051600281106100e757600080fd5b6020020151186100f657600080fd5b5b81516001018083528114156100d1575b5050600060c052602060c020610160805182558060200151600183015550506101e0516064808202821582848304141761014057600080fd5b80905090509050600a556101e0516064808202821582848304141761016457600080fd5b80905090509050600b5561020051600255610220516003556101405160045542624f1a0081818301101561019757600080fd5b808201905090506014556101a0516005556101c05160065560206102c0600463bb7b8b806102605261027c6101c0515afa6101d157600080fd5b601f3d116101de57600080fd5b6000506102c051600755426008556102e060006003818352015b60206103a0602463c6610657610320526102e051600081121561021a57600080fd5b6103405261033c6101c0515afa61023057600080fd5b601f3d1161023d57600080fd5b6000506103a05161030052610300516102e0516003811061025d57600080fd5b600960c052602060c020015560006004610420527f095ea7b3000000000000000000000000000000000000000000000000000000006104405261042060048060208461048001018260208501600060045af15050805182019150506101c0516020826104800101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610480010152602081019050806104805261048090508051602001806105208284600060045af161031f57600080fd5b505060206105e0610520516105406000610300515af161033e57600080fd5b60203d8082111561034f5780610351565b815b905090506105c0526105c08051602001806103c08284600060045af161037657600080fd5b505060006103c05111156103c9576103c080602001516000825180602090131561039f57600080fd5b80919012156103ad57600080fd5b806020036101000a820490509050905015156103c857600080fd5b5b5b81516001018083528114156101f8575b5050615ffa56341561000a57600080fd5b600436101561001857615c13565b600035601c526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff800000000000000000000000000000006060526000156101f9575b61014052600d5461016052600b5461018052610160514210156101e657600a546101c052600c546101e0526101c05161018051111561013f576101c051610180516101c051808210156100b057600080fd5b80820390509050426101e051808210156100c957600080fd5b8082039050905080820282158284830414176100e457600080fd5b80905090509050610160516101e0518082101561010057600080fd5b80820390509050808061011257600080fd5b82049050905081818301101561012757600080fd5b808201905090506000526000516101405156506101e1565b6101c0516101c051610180518082101561015857600080fd5b80820390509050426101e0518082101561017157600080fd5b80820390509050808202821582848304141761018c57600080fd5b80905090509050610160516101e051808210156101a857600080fd5b8082039050905080806101ba57600080fd5b820490509050808210156101cd57600080fd5b808203905090506000526000516101405156505b6101f7565b610180516000526000516101405156505b005b63f446c1d0600051141561022c576006580161005e565b610140526101405160648082049050905060005260206000f350005b6376a2f0f06000511415610256576006580161005e565b610140526101405160005260206000f350005b600015610360575b6101605261014052610180670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101a0526101c060006002818352015b6101806101c051600281106102ab57600080fd5b60200201516101c051600281106102c157600080fd5b600160c052602060c020015480820282158284830414176102e157600080fd5b80905090509050670de0b6b3a7640000808204905090506101806101c0516002811061030c57600080fd5b60200201525b8151600101808352811415610297575b505060406101e0525b60006101e05111151561033d57610359565b60206101e05103610180015160206101e051036101e05261032b565b6101605156005b60001561046e575b6101a0526101405261016052610180526101c0670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101e05261020060006002818352015b6101c061020051600281106103bd57600080fd5b602002015161016061020051600281106103d657600080fd5b602002015180820282158284830414176103ef57600080fd5b80905090509050670de0b6b3a7640000808204905090506101c0610200516002811061041a57600080fd5b60200201525b81516001018083528114156103a9575b50506040610220525b60006102205111151561044b57610467565b602061022051036101c001516020610220510361022052610439565b6101a05156005b600015610508575b6101405260085461025881818301101561048f57600080fd5b808201905090504211156104f6576020610200600463bb7b8b806101a0526101bc6006545afa6104be57600080fd5b601f3d116104cb57600080fd5b6000506102005161018052610180516007554260085561018051600052600051610140515650610506565b6007546000526000516101405156505b005b60001561058f575b6101405260085461025881818301101561052957600080fd5b8082019050905042111561057d5760206101e0600463bb7b8b806101805261019c6006545afa61055857600080fd5b601f3d1161056557600080fd5b6000506101e05160005260005161014051565061058d565b6007546000526000516101405156505b005b600015610886575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c08051610200518181830110156105e257600080fd5b808201905090508152505b81516001018083528114156105ba575b50506101c05115156106185760006000526000516101a05156505b6101c05161026052610180516002808202821582848304141761063a57600080fd5b80905090509050610280526102a0600060ff818352015b610260516102c05261030060006002818352015b6020610300510261014001516102e0526102c05161026051808202821582848304141761069157600080fd5b809050905090506102e051600280820282158284830414176106b257600080fd5b8090509050905080806106c457600080fd5b8204905090506102c0525b8151600101808352811415610665575b5050610260516101e052610280516101c051808202821582848304141761070557600080fd5b809050905090506064808204905090506102c0516002808202821582848304141761072f57600080fd5b8090509050905081818301101561074557600080fd5b8082019050905061026051808202821582848304141761076457600080fd5b809050905090506102805160648082101561077e57600080fd5b8082039050905061026051808202821582848304141761079d57600080fd5b8090509050905060648082049050905060036102c05180820282158284830414176107c757600080fd5b809050905090508181830110156107dd57600080fd5b8082019050905080806107ef57600080fd5b820490509050610260526101e051610260511115610836576001610260516101e0518082101561081e57600080fd5b8082039050905011151561083157610872565b610861565b60016101e051610260518082101561084d57600080fd5b8082039050905011151561086057610872565b5b5b8151600101808352811415610651575b5050610260516000526000516101a0515650005b6000156109c9575b6101c0526101405261016052610180526101a0526101e06101405161016051610180516101a0516101c0516101e0516102005161014051610240526102606101608051825280602001518260200152505061028051610260516102405160065801610368565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e080518252806020015182602001525050610140610320525b6103205151602061032051016103205261032061032051101561095557610933565b6103406101e0805182528060200151826020015250506101a0516103805261038051610360516103405160065801610597565b6103e052610300610320525b61032051526020610320510361032052610140610320511015156109b757610994565b6103e0516000526000516101c0515650005b63bb7b8b806000511415610bb157610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610510565b6101e0526101a0526101805261016052610140526101e0516101a0526102006101405161016051610180516101a0516101c0516101e05161020051610220516101a05161026052610260516006580161025e565b6102c0526102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102c080518252806020015182602001525050610140610320525b61032051516020610320510161032052610320610320511015610ac657610aa4565b61034061020080518252806020015182602001525050610140516103805261038051610360516103405160065801610597565b6103e052610300610320525b6103205152602061032051036103205261014061032051101515610b2857610b05565b6103e05161030052602061048060046318160ddd6104205261043c6005545afa610b5157600080fd5b601f3d11610b5e57600080fd5b600050610480516104005261030051670de0b6b3a76400008082028215828483041417610b8a57600080fd5b80905090509050610400518080610ba057600080fd5b82049050905060005260206000f350005b63ed8e84f36000511415610f0a5760443560011c15610bcf57600080fd5b610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610510565b6101e0526101a0526101805261016052610140526101e0516101a05261020060018060c052602060c02054825260018160c052602060c0200154826020015250506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101a051610280526102a061020080518252806020015182602001525050610140516102e0526102e0516102c0516102a051610280516006580161088e565b610340526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340516102405261036060006002818352015b60443515610d3d576102006103605160028110610d0157600080fd5b60200201805160046103605160028110610d1a57600080fd5b6020020135818183011015610d2e57600080fd5b80820190509050815250610d87565b6102006103605160028110610d5157600080fd5b60200201805160046103605160028110610d6a57600080fd5b602002013580821015610d7c57600080fd5b808203905090508152505b5b8151600101808352811415610ce5575b50506101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015610dc457610da2565b6101a0516103c0526103e061020080518252806020015182602001525050610140516104205261042051610400516103e0516103c0516006580161088e565b610480526103806103a0525b6103a0515260206103a051036103a0526101406103a051101515610e3257610e0f565b6104805161038052602061052060046318160ddd6104c0526104dc6005545afa610e5b57600080fd5b601f3d11610e6857600080fd5b600050610520516104a05260006105405260443515610ea657610380516102405180821015610e9657600080fd5b8082039050905061054052610ec7565b610240516103805180821015610ebb57600080fd5b80820390509050610540525b610540516104a0518082028215828483041417610ee357600080fd5b80905090509050610240518080610ef957600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156117a65762ffffff5415610f2757600080fd5b600162ffffff5560135415610f3b57600080fd5b610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610476565b6101e0526101a0526101805261016052610140526101e0516101a052602061028060046318160ddd6102205261023c6005545afa610fae57600080fd5b601f3d11610fbb57600080fd5b600050610280516102005260025460028082028215828483041417610fdf57600080fd5b809050905090506004808204905090506102a0526003546102c05260006102e05261030060018060c052602060c02054825260018160c052602060c02001548260200152505060006102005111156110d257610140610340525b6103405151602061034051016103405261034061034051101561105b57611039565b6101a0516103605261038061030080518252806020015182602001525050610140516103c0526103c0516103a05161038051610360516006580161088e565b61042052610320610340525b61034051526020610340510361034052610140610340511015156110c9576110a6565b610420516102e0525b6104406103008051825280602001518260200152505061048060006002818352015b6102005115156111235760006004610480516002811061111357600080fd5b60200201351161112257600080fd5b5b610300610480516002811061113757600080fd5b60200201516004610480516002811061114f57600080fd5b602002013581818301101561116357600080fd5b80820190509050610440610480516002811061117e57600080fd5b60200201525b81516001018083528114156110f4575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c05110156111c05761119e565b6101a0516104e0526105006104408051825280602001518260200152505061014051610540526105405161052051610500516104e0516006580161088e565b6105a0526104a06104c0525b6104c0515260206104c051036104c0526101406104c05110151561122e5761120b565b6105a0516104a0526102e0516104a0511161124857600080fd5b6040366105c0376104a0516106005260006102005111156115335761062060006002818352015b6104a051610300610620516002811061128757600080fd5b602002015180820282158284830414176112a057600080fd5b809050905090506102e05180806112b657600080fd5b8204905090506106405260006106605261044061062051600281106112da57600080fd5b60200201516106405111156113235761064051610440610620516002811061130157600080fd5b60200201518082101561131357600080fd5b8082039050905061066052611359565b610440610620516002811061133757600080fd5b6020020151610640518082101561134d57600080fd5b80820390509050610660525b6102a05161066051808202821582848304141761137557600080fd5b809050905090506402540be400808204905090506105c0610620516002811061139d57600080fd5b602002015261044061062051600281106113b657600080fd5b60200201516105c061062051600281106113cf57600080fd5b60200201516102c05180820282158284830414176113ec57600080fd5b809050905090506402540be400808204905090508082101561140d57600080fd5b80820390509050610620516002811061142557600080fd5b600160c052602060c0200155610440610620516002811061144557600080fd5b6020020180516105c0610620516002811061145f57600080fd5b60200201518082101561147157600080fd5b808203905090508152505b815160010180835281141561126f575b5050610140610680525b610680515160206106805101610680526106206106805110156114b857611496565b6101a0516106a0526106c0610440805182528060200151826020015250506101405161070052610700516106e0516106c0516106a0516006580161088e565b61076052610600610680525b610680515260206106805103610680526101406106805110151561152657611503565b6107605161060052611551565b600160c052602060c020610440805182558060200151600183015550505b60006107805261020051151561156e576104a051610780526115c3565b61020051610600516102e0518082101561158757600080fd5b8082039050905080820282158284830414176115a257600080fd5b809050905090506102e05180806115b857600080fd5b820490509050610780525b6308c379a06107a05260206107c05260146107e0527f536c697070616765207363726577656420796f75000000000000000000000000610800526107e0506044356107805110156116155760646107bcfd5b61084060006002818352015b60006004610840516002811061163657600080fd5b602002013511156116c257602061092060646323b872dd610860523361088052306108a0526004610840516002811061166e57600080fd5b60200201356108c05261087c6000610840516002811061168d57600080fd5b600060c052602060c02001545af16116a457600080fd5b601f3d116116b157600080fd5b600050610920516116c157600080fd5b5b5b8151600101808352811415611621575b505060206109e060446340c10f19610940523361096052610780516109805261095c60006005545af161170557600080fd5b601f3d1161171257600080fd5b6000506109e050600435610a0052602435610a20526105c051610a40526105e051610a60526104a051610a8052610200516107805181818301101561175657600080fd5b80820190509050610aa052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610a00a261078051600052600062ffffff5560206000f350600062ffffff55005b600015611c2d575b6101e0526101405261016052610180526101a0526101c0526101605161014051186117d857600080fd5b60006101605112156117e957600080fd5b600261016051126117f957600080fd5b600061014051121561180a57600080fd5b6002610140511261181a57600080fd5b6101405161016051610180516101a0516101c0516101e051610200516006580161005e565b61024052610200526101e0526101c0526101a05261018052610160526101405261024051610200526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102a06101a080518252806020015182602001525050610200516102e0526102e0516102c0516102a05160065801610597565b61034052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340516102605260603661036037610260516103c052610200516002808202821582848304141761191f57600080fd5b809050905090506103e05261040060006002818352015b61014051610400511415611951576101805161038052611987565b61016051610400511815611981576101a0610400516002811061197357600080fd5b602002015161038052611986565b611a03565b5b61036080516103805181818301101561199f57600080fd5b808201905090508152506103c0516102605180820282158284830414176119c557600080fd5b8090509050905061038051600280820282158284830414176119e657600080fd5b8090509050905080806119f857600080fd5b8204905090506103c0525b8151600101808352811415611936575b50506103c051610260518082028215828483041417611a3157600080fd5b8090509050905060648082028215828483041417611a4e57600080fd5b809050905090506103e05160028082028215828483041417611a6f57600080fd5b809050905090508080611a8157600080fd5b8204905090506103c052610360516102605160648082028215828483041417611aa957600080fd5b809050905090506103e0518080611abf57600080fd5b820490509050818183011015611ad457600080fd5b80820190509050610420526102605161044052610460600060ff818352015b610440516103a05261044051610440518082028215828483041417611b1757600080fd5b809050905090506103c051818183011015611b3157600080fd5b808201905090506002610440518082028215828483041417611b5257600080fd5b8090509050905061042051818183011015611b6c57600080fd5b808201905090506102605180821015611b8457600080fd5b808203905090508080611b9657600080fd5b820490509050610440526103a051610440511115611bdd576001610440516103a05180821015611bc557600080fd5b80820390509050111515611bd857611c19565b611c08565b60016103a0516104405180821015611bf457600080fd5b80820390509050111515611c0757611c19565b5b5b8151600101808352811415611af3575b5050610440516000526000516101e0515650005b635e0d443f6000511415611f3d5760605160043580604051901315611c5157600080fd5b8091901215611c5f57600080fd5b5060605160243580604051901315611c7657600080fd5b8091901215611c8457600080fd5b50610140670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101605160065801610510565b6101a05261016052610140526101a051610160526101c06101405161016051610180516101a0516101c0516101e0516101605161022052610220516006580161025e565b610280526102a0526101e0526101c0526101a052610180526101605261014052610280805182528060200151826020015250506101c060043560028110611d3d57600080fd5b602002015160443561014060043560028110611d5857600080fd5b60200201518082028215828483041417611d7157600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611d9757600080fd5b808201905090506102c052610140610300525b61030051516020610300510161030052610300610300511015611dcc57611daa565b60043561032052602435610340526102c051610360526103806101c0805182528060200151826020015250506103a05161038051610360516103405161032051600658016117ae565b610400526102e0610300525b6103005152602061030051036103005261014061030051101515611e4457611e21565b610400516102e0526101c060243560028110611e5f57600080fd5b60200201516102e05180821015611e7557600080fd5b80820390509050600180821015611e8b57600080fd5b8082039050905061042052600254610420518082028215828483041417611eb157600080fd5b809050905090506402540be4008082049050905061044052610420516104405180821015611ede57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611f0257600080fd5b8090509050905061014060243560028110611f1c57600080fd5b60200201518080611f2c57600080fd5b82049050905060005260206000f350005b6307211ef7600051141561250b5760605160043580604051901315611f6157600080fd5b8091901215611f6f57600080fd5b5060605160243580604051901315611f8657600080fd5b8091901215611f9457600080fd5b506101405160065801610510565b610180526101405261018051610140526101a06101405161016051610180516101a0516101c0516101405161020052610200516006580161025e565b61026052610280526101c0526101a052610180526101605261014052610260805182528060200151826020015250506102a06001815260018160200152506006546102e05260043560016060518183038060405190131561203e57600080fd5b809190121561204c57600080fd5b905090506103005260243560016060518183038060405190131561206f57600080fd5b809190121561207d57600080fd5b905090506103205260016103405260016103605260006103005112156120a557600435610340525b60006103205112156120b957602435610360525b6000610380526000610300511215612138576101a0600435600281106120de57600080fd5b60200201516044356102a0600435600281106120f957600080fd5b6020020151808202821582848304141761211257600080fd5b8090509050905081818301101561212857600080fd5b80820190509050610380526122f3565b600061032051121561229b5760603661048037604435610480610300516003811061216257600080fd5b602002015260206105c06084633883e1196104e05261050061048080518252806020015182602001528060400151826040015250506001610560526104fc6102e0515afa6121af57600080fd5b601f3d116121bc57600080fd5b6000506105c0516101405180820282158284830414176121db57600080fd5b80905090509050670de0b6b3a764000080820490509050610380526103808051610380516020610640600463ddca3f436105e0526105fc6102e0515afa61222157600080fd5b601f3d1161222e57600080fd5b60005061064051808202821582848304141761224957600080fd5b809050905090506404a817c800808204905090508082101561226a57600080fd5b8082039050905081525061038080516101c05181818301101561228c57600080fd5b808201905090508152506122f2565b60206104606064635e0d443f6103a052610300516103c052610320516103e052604435610400526103bc6102e0515afa6122d457600080fd5b601f3d116122e157600080fd5b6000506104605160005260206000f3505b5b610140610680525b6106805151602061068051016106805261068061068051101561231d576122fb565b610340516106a052610360516106c052610380516106e0526107006101a08051825280602001518260200152505061072051610700516106e0516106c0516106a051600658016117ae565b61078052610660610680525b610680515260206106805103610680526101406106805110151561239757612374565b61078051610660526101a061036051600281106123b357600080fd5b602002015161066051808210156123c957600080fd5b808203905090506001808210156123df57600080fd5b808203905090506107a0526107a0516002546107a051808202821582848304141761240957600080fd5b809050905090506402540be400808204905090508082101561242a57600080fd5b808203905090506107a0526000610320511215612478576107a080516102a0610360516002811061245a57600080fd5b6020020151808061246a57600080fd5b8204905090508152506124fc565b6020610860604463cc2b27d76107c0526107a051670de0b6b3a764000080820282158284830414176124a957600080fd5b809050905090506101405180806124bf57600080fd5b8204905090506107e05261032051610800526107dc6102e0515afa6124e357600080fd5b601f3d116124f057600080fd5b600050610860516107a0525b6107a05160005260206000f350005b633df021246000511415612b475762ffffff541561252857600080fd5b600162ffffff556060516004358060405190131561254557600080fd5b809190121561255357600080fd5b506060516024358060405190131561256a57600080fd5b809190121561257857600080fd5b506013541561258657600080fd5b610140670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101605160065801610476565b6101a05261016052610140526101a051610160526101c060018060c052602060c02054825260018160c052602060c0200154826020015250506102006101405161016051610180516101a0516101c0516101e051610200516102205161016051610260526102806101c0805182528060200151826020015250506102a051610280516102605160065801610368565b610300526103205261022052610200526101e0526101c0526101a052610180526101605261014052610300805182528060200151826020015250506102006004356002811061269157600080fd5b6020020151604435610140600435600281106126ac57600080fd5b602002015180820282158284830414176126c557600080fd5b80905090509050670de0b6b3a7640000808204905090508181830110156126eb57600080fd5b8082019050905061034052610140610380525b61038051516020610380510161038052610380610380511015612720576126fe565b6004356103a0526024356103c052610340516103e0526104006102008051825280602001518260200152505061042051610400516103e0516103c0516103a051600658016117ae565b61048052610360610380525b610380515260206103805103610380526101406103805110151561279857612775565b6104805161036052610200602435600281106127b357600080fd5b602002015161036051808210156127c957600080fd5b808203905090506001808210156127df57600080fd5b808203905090506104a0526104a051600254808202821582848304141761280557600080fd5b809050905090506402540be400808204905090506104c0526104a0516104c0518082101561283257600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761285657600080fd5b809050905090506101406024356002811061287057600080fd5b6020020151808061288057600080fd5b8204905090506104a0526308c379a06104e0526020610500526017610520527f546f6f2066657720636f696e7320696e20726573756c7400000000000000000061054052610520506064356104a05110156128dc5760646104fcfd5b6104c05160035480820282158284830414176128f757600080fd5b809050905090506402540be400808204905090506105805261058051670de0b6b3a7640000808202821582848304141761293057600080fd5b809050905090506101406024356002811061294a57600080fd5b6020020151808061295a57600080fd5b820490509050610580526101c06004356002811061297757600080fd5b602002015160443581818301101561298e57600080fd5b80820190509050600435600281106129a557600080fd5b600160c052602060c02001556101c0602435600281106129c457600080fd5b60200201516104a051808210156129da57600080fd5b8082039050905061058051808210156129f257600080fd5b8082039050905060243560028110612a0957600080fd5b600160c052602060c0200155602061066060646323b872dd6105a052336105c052306105e052604435610600526105bc600060043560028110612a4b57600080fd5b600060c052602060c02001545af1612a6257600080fd5b601f3d11612a6f57600080fd5b60005061066051612a7f57600080fd5b6020610720604463a9059cbb61068052336106a0526104a0516106c05261069c600060243560028110612ab157600080fd5b600060c052602060c02001545af1612ac857600080fd5b601f3d11612ad557600080fd5b60005061072051612ae557600080fd5b6004356107405260443561076052602435610780526104a0516107a052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610740a26104a051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed6600051141561393d5762ffffff5415612b6457600080fd5b600162ffffff5560605160043580604051901315612b8157600080fd5b8091901215612b8f57600080fd5b5060605160243580604051901315612ba657600080fd5b8091901215612bb457600080fd5b5060135415612bc257600080fd5b610140670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101605160065801610476565b6101a05261016052610140526101a051610160526006546101c052600435600160605181830380604051901315612c2657600080fd5b8091901215612c3457600080fd5b905090506101e052602435600160605181830380604051901315612c5757600080fd5b8091901215612c6557600080fd5b905090506102005260016102205260016102405260006101e0511215612c8d57600435610220525b6000610200511215612ca157602435610240525b6040366102603760006101e0511215612cd95760043560028110612cc457600080fd5b600060c052602060c020015461028052612cfb565b6101e05160038110612cea57600080fd5b600960c052602060c0200154610280525b60006102a0526000610200511215612d325760243560028110612d1d57600080fd5b600060c052602060c02001546102a052612d54565b6102005160038110612d4357600080fd5b600960c052602060c02001546102a0525b6044356102c05273dac17f958d2ee523a2206206994597c13d831ec7610280511415612dcb57602061036060246370a082316102e05230610300526102fc73dac17f958d2ee523a2206206994597c13d831ec75afa612db257600080fd5b601f3d11612dbf57600080fd5b600050610360516102c0525b600060046103e0527f23b872dd00000000000000000000000000000000000000000000000000000000610400526103e060048060208461044001018260208501600060045af15050805182019150503360208261044001015260208101905030602082610440010152602081019050604435602082610440010152602081019050806104405261044090508051602001806105008284600060045af1612e7057600080fd5b505060206105e0610500516105206000610280515af1612e8f57600080fd5b60203d80821115612ea05780612ea2565b815b905090506105c0526105c08051602001806103808284600060045af1612ec757600080fd5b50506000610380511115612f1a57610380806020015160008251806020901315612ef057600080fd5b8091901215612efe57600080fd5b806020036101000a82049050905090501515612f1957600080fd5b5b73dac17f958d2ee523a2206206994597c13d831ec7610280511415612fa25760206106a060246370a0823161062052306106405261063c73dac17f958d2ee523a2206206994597c13d831ec75afa612f7157600080fd5b601f3d11612f7e57600080fd5b6000506106a0516102c05180821015612f9657600080fd5b808203905090506102c0525b60006101e0511215612fb5576001612fbd565b600061020051125b5b156136b4576108e060018060c052602060c02054825260018160c052602060c020015482602001525050610920610140610960525b6109605151602061096051016109605261096061096051101561301557612ff3565b61016051610980526109a06108e0805182528060200151826020015250506109c0516109a0516109805160065801610368565b610a2052610a4052610940610960525b610960515260206109605103610960526101406109605110151561307b57613058565b610a20805182528060200151826020015250506000610a605260006101e051121561311e57610920600435600281106130b357600080fd5b60200201516102c051610140600435600281106130cf57600080fd5b602002015180820282158284830414176130e857600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561310e57600080fd5b80820190509050610a605261329b565b606036610a80376102c051610a806101e0516003811061313d57600080fd5b60200201526001600060c052602060c0200154610ae0526020610b8060246370a08231610b005230610b2052610b1c610ae0515afa61317b57600080fd5b601f3d1161318857600080fd5b600050610b8051610a60526101c0513b6131a157600080fd5b600060006084634515cef3610ba052610bc0610a8080518252806020015182602001528060400151826040015250506000610c2052610bbc60006101c0515af16131ea57600080fd5b6020610d0060246370a08231610c805230610ca052610c9c610ae0515afa61321157600080fd5b601f3d1161321e57600080fd5b600050610d0051610a60518082101561323657600080fd5b808203905090506102c0526102c05161016051808202821582848304141761325d57600080fd5b80905090509050670de0b6b3a764000080820490509050610a6052610a6080516109405181818301101561329057600080fd5b808201905090508152505b610140610d40525b610d4051516020610d405101610d4052610d40610d405110156132c5576132a3565b61022051610d605261024051610d8052610a6051610da052610dc061092080518252806020015182602001525050610de051610dc051610da051610d8051610d6051600658016117ae565b610e4052610d20610d40525b610d4051526020610d405103610d4052610140610d405110151561333f5761331c565b610e4051610d2052610920610240516002811061335b57600080fd5b6020020151610d20518082101561337157600080fd5b8082039050905060018082101561338757600080fd5b80820390509050610260526102605160025480820282158284830414176133ad57600080fd5b809050905090506402540be40080820490509050610e605261026051610e6051808210156133da57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176133fe57600080fd5b80905090509050610140610240516002811061341957600080fd5b6020020151808061342957600080fd5b82049050905061026052610e6051600354808202821582848304141761344e57600080fd5b809050905090506402540be40080820490509050610e8052610e8051670de0b6b3a7640000808202821582848304141761348757600080fd5b8090509050905061014061024051600281106134a257600080fd5b602002015180806134b257600080fd5b820490509050610e80526108e061022051600281106134d057600080fd5b60200201516102c0518181830110156134e857600080fd5b80820190509050610220516002811061350057600080fd5b600160c052602060c02001556108e0610240516002811061352057600080fd5b6020020151610260518082101561353657600080fd5b80820390509050610e80518082101561354e57600080fd5b80820390509050610240516002811061356657600080fd5b600160c052602060c020015560006102005112151561365d576020610f4060246370a08231610ec05230610ee052610edc6102a0515afa6135a657600080fd5b601f3d116135b357600080fd5b600050610f4051610ea0526101c0513b6135cc57600080fd5b600060006064631a4d01d2610f605261026051610f805261020051610fa0526000610fc052610f7c60006101c0515af161360557600080fd5b60206110a060246370a0823161102052306110405261103c6102a0515afa61362c57600080fd5b601f3d1161363957600080fd5b6000506110a051610ea0518082101561365157600080fd5b80820390509050610260525b6308c379a06110c05260206110e0526017611100527f546f6f2066657720636f696e7320696e20726573756c7400000000000000000061112052611100506064356102605110156136af5760646110dcfd5b61379b565b602061074060246370a082316106c052306106e0526106dc6102a0515afa6136db57600080fd5b601f3d116136e857600080fd5b60005061074051610260526101c0513b61370157600080fd5b600060006084633df02124610760526101e05161078052610200516107a0526102c0516107c0526064356107e05261077c60006101c0515af161374357600080fd5b60206108c060246370a0823161084052306108605261085c6102a0515afa61376a57600080fd5b601f3d1161377757600080fd5b6000506108c051610260518082101561378f57600080fd5b80820390509050610260525b60006004611160527fa9059cbb00000000000000000000000000000000000000000000000000000000611180526111606004806020846111c001018260208501600060045af1505080518201915050336020826111c0010152602081019050610260516020826111c0010152602081019050806111c0526111c090508051602001806112608284600060045af161383157600080fd5b505060206113206112605161128060006102a0515af161385057600080fd5b60203d808211156138615780613863565b815b90509050611300526113008051602001806103808284600060045af161388857600080fd5b505060006103805111156138db576103808060200151600082518060209013156138b157600080fd5b80919012156138bf57600080fd5b806020036101000a820490509050905015156138da57600080fd5b5b60043561136052604435611380526024356113a052610260516113c052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080611360a261026051600052600062ffffff5560206000f350600062ffffff55005b635b36389c6000511415613bf85762ffffff541561395a57600080fd5b600162ffffff5560206101c060046318160ddd6101605261017c6005545afa61398257600080fd5b601f3d1161398f57600080fd5b6000506101c051610140526080366101e03761026060006002818352015b61026051600281106139be57600080fd5b600160c052602060c020015460043580820282158284830414176139e157600080fd5b809050905090506101405180806139f757600080fd5b820490509050610280526308c379a06102a05260206102c05260176102e0527f546f6f2066657720636f696e7320696e20726573756c74000000000000000000610300526102e05060246102605160028110613a5257600080fd5b6020020135610280511015613a685760646102bcfd5b6102605160028110613a7957600080fd5b600160c052602060c0200180546102805180821015613a9757600080fd5b80820390509050815550610280516101e06102605160028110613ab957600080fd5b602002015260206103e0604463a9059cbb610340523361036052610280516103805261035c60006102605160028110613af157600080fd5b600060c052602060c02001545af1613b0857600080fd5b601f3d11613b1557600080fd5b6000506103e051613b2557600080fd5b5b81516001018083528114156139ad575b505060206104a060446379cc67906104005233610420526004356104405261041c60006005545af1613b6757600080fd5b601f3d11613b7457600080fd5b6000506104a0506101e0516104c052610200516104e052610220516105005261024051610520526101405160043580821015613baf57600080fd5b8082039050905061054052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06104c0a2600062ffffff5560406101e0f3600062ffffff55005b63e3103273600051141561440d5762ffffff5415613c1557600080fd5b600162ffffff5560135415613c2957600080fd5b610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610476565b6101e0526101a0526101805261016052610140526101e0516101a052602061028060046318160ddd6102205261023c6005545afa613c9c57600080fd5b601f3d11613ca957600080fd5b600050610280516102005260006102005118613cc457600080fd5b60025460028082028215828483041417613cdd57600080fd5b809050905090506004808204905090506102a0526003546102c0526102e060018060c052602060c02054825260018160c052602060c0200154826020015250506103206102e080518252806020015182602001525050610140610380525b61038051516020610380510161038052610380610380511015613d5d57613d3b565b6101a0516103a0526103c06102e0805182528060200151826020015250506101405161040052610400516103e0516103c0516103a0516006580161088e565b61046052610360610380525b6103805152602061038051036103805261014061038051101515613dcb57613da8565b610460516103605261048060006002818352015b6103206104805160028110613df357600080fd5b60200201805160046104805160028110613e0c57600080fd5b602002013580821015613e1e57600080fd5b808203905090508152505b8151600101808352811415613ddf575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015613e6557613e43565b6101a0516104e0526105006103208051825280602001518260200152505061014051610540526105405161052051610500516104e0516006580161088e565b6105a0526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515613ed357613eb0565b6105a0516104a0526040366105c03761060060006002818352015b6104a0516102e06106005160028110613f0657600080fd5b60200201518082028215828483041417613f1f57600080fd5b80905090509050610360518080613f3557600080fd5b820490509050610620526000610640526103206106005160028110613f5957600080fd5b6020020151610620511115613fa257610620516103206106005160028110613f8057600080fd5b602002015180821015613f9257600080fd5b8082039050905061064052613fd8565b6103206106005160028110613fb657600080fd5b60200201516106205180821015613fcc57600080fd5b80820390509050610640525b6102a051610640518082028215828483041417613ff457600080fd5b809050905090506402540be400808204905090506105c0610600516002811061401c57600080fd5b6020020152610320610600516002811061403557600080fd5b60200201516105c0610600516002811061404e57600080fd5b60200201516102c051808202821582848304141761406b57600080fd5b809050905090506402540be400808204905090508082101561408c57600080fd5b8082039050905061060051600281106140a457600080fd5b600160c052602060c020015561032061060051600281106140c457600080fd5b6020020180516105c061060051600281106140de57600080fd5b6020020151808210156140f057600080fd5b808203905090508152505b8151600101808352811415613eee575b5050610140610680525b6106805151602061068051016106805261068061068051101561413757614115565b6101a0516106a0526106c0610320805182528060200151826020015250506101405161070052610700516106e0516106c0516106a0516006580161088e565b61076052610660610680525b61068051526020610680510361068052610140610680511015156141a557614182565b61076051610660526103605161066051808210156141c257600080fd5b808203905090506102005180820282158284830414176141e157600080fd5b809050905090506103605180806141f757600080fd5b820490509050610780526000610780511861421157600080fd5b6107808051600181818301101561422757600080fd5b808201905090508152506308c379a06107a05260206107c05260146107e0527f536c697070616765207363726577656420796f75000000000000000000000000610800526107e0506044356107805111156142835760646107bcfd5b60206108e060446379cc6790610840523361086052610780516108805261085c60006005545af16142b357600080fd5b601f3d116142c057600080fd5b6000506108e05061090060006002818352015b6000600461090051600281106142e857600080fd5b6020020135181561436f5760206109c0604463a9059cbb6109205233610940526004610900516002811061431b57600080fd5b60200201356109605261093c6000610900516002811061433a57600080fd5b600060c052602060c02001545af161435157600080fd5b601f3d1161435e57600080fd5b6000506109c05161436e57600080fd5b5b5b81516001018083528114156142d3575b50506004356109e052602435610a00526105c051610a20526105e051610a40526104a051610a60526102005161078051808210156143bd57600080fd5b80820390509050610a8052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c06109e0a261078051600052600062ffffff5560206000f350600062ffffff55005b600015614769575b6101e0526101405261016052610180526101a0526101c052600061016051121561443e57600080fd5b6002610160511261444e57600080fd5b606036610200376101c05161026052610140516002808202821582848304141761447757600080fd5b80905090509050610280526102a060006002818352015b610160516102a05118156144be576101806102a051600281106144b057600080fd5b6020020151610220526144c3565b61453f565b6102008051610220518181830110156144db57600080fd5b80820190509050815250610260516101c051808202821582848304141761450157600080fd5b80905090509050610220516002808202821582848304141761452257600080fd5b80905090509050808061453457600080fd5b820490509050610260525b815160010180835281141561448e575b5050610260516101c051808202821582848304141761456d57600080fd5b809050905090506064808202821582848304141761458a57600080fd5b8090509050905061028051600280820282158284830414176145ab57600080fd5b8090509050905080806145bd57600080fd5b82049050905061026052610200516101c051606480820282158284830414176145e557600080fd5b809050905090506102805180806145fb57600080fd5b82049050905081818301101561461057600080fd5b808201905090506102c0526101c0516102e052610300600060ff818352015b6102e051610240526102e0516102e051808202821582848304141761465357600080fd5b809050905090506102605181818301101561466d57600080fd5b8082019050905060026102e051808202821582848304141761468e57600080fd5b809050905090506102c0518181830110156146a857600080fd5b808201905090506101c051808210156146c057600080fd5b8082039050905080806146d257600080fd5b8204905090506102e052610240516102e05111156147195760016102e051610240518082101561470157600080fd5b8082039050905011151561471457614755565b614744565b6001610240516102e0518082101561473057600080fd5b8082039050905011151561474357614755565b5b5b815160010180835281141561462f575b50506102e0516000526000516101e0515650005b600015614e44575b6101a0526101405261016052610180526101405161016051610180516101a0516101c0516006580161005e565b610200526101c0526101a052610180526101605261014052610200516101c0526102206101405161016051610180516101a0516101c0516101e0516102005161022051610240516101805161028052610280516006580161025e565b6102e052610300526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102e080518252806020015182602001525050610140610340525b6103405151602061034051016103405261034061034051101561486357614841565b610360610220805182528060200151826020015250506101c0516103a0526103a051610380516103605160065801610597565b61040052610320610340525b61034051526020610340510361034052610140610340511015156148c5576148a2565b610400516103205260206104a060046318160ddd6104405261045c6005545afa6148ee57600080fd5b601f3d116148fb57600080fd5b6000506104a05161042052610320516101405161032051808202821582848304141761492657600080fd5b8090509050905061042051808061493c57600080fd5b8204905090508082101561494f57600080fd5b808203905090506104c052610140610500525b6105005151602061050051016105005261050061050051101561498457614962565b6101c051610520526101605161054052610560610220805182528060200151826020015250506104c0516105a0526105a0516105805161056051610540516105205160065801614415565b610600526104e0610500525b61050051526020610500510361050052610140610500511015156149fe576149db565b610600516104e05260025460028082028215828483041417614a1f57600080fd5b8090509050905060048082049050905061062052610640670de0b6b3a76400008152670de0b6b3a76400008160200152506101805161066052610680610220805182528060200151826020015250506102206101605160028110614a8257600080fd5b60200201516104e05180821015614a9857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614abc57600080fd5b809050905090506106406101605160028110614ad757600080fd5b60200201518080614ae757600080fd5b8204905090506106c0526106e060006002818352015b600061070052610160516106e0511415614b7f576102206106e05160028110614b2557600080fd5b60200201516104c0518082028215828483041417614b4257600080fd5b80905090509050610320518080614b5857600080fd5b8204905090506104e05180821015614b6f57600080fd5b8082039050905061070052614bfe565b6102206106e05160028110614b9357600080fd5b60200201516102206106e05160028110614bac57600080fd5b60200201516104c0518082028215828483041417614bc957600080fd5b80905090509050610320518080614bdf57600080fd5b82049050905080821015614bf257600080fd5b80820390509050610700525b6106806106e05160028110614c1257600080fd5b60200201805161062051610700518082028215828483041417614c3457600080fd5b809050905090506402540be4008082049050905080821015614c5557600080fd5b808203905090508152505b8151600101808352811415614afd575b50506106806101605160028110614c8657600080fd5b6020020151610140610740525b61074051516020610740510161074052610740610740511015614cb557614c93565b6101c0516107605261016051610780526107a0610680805182528060200151826020015250506104c0516107e0526107e0516107c0516107a051610780516107605160065801614415565b61084052610720610740525b6107405152602061074051036107405261014061074051101515614d2f57614d0c565b6108405180821015614d4057600080fd5b808203905090506107205261072051600180821015614d5e57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614d8257600080fd5b809050905090506106406101605160028110614d9d57600080fd5b60200201518080614dad57600080fd5b82049050905061072052610860808080610720518152505060208101905080806106c0516107205180821015614de257600080fd5b80820390509050815250506020810190508080610420518152505060609050905060c05260c0516108c0525b60006108c051111515614e2057614e3c565b60206108c05103610860015160206108c051036108c052614e0e565b6101a0515650005b63cc2b27d76000511415614f225760605160243580604051901315614e6857600080fd5b8091901215614e7657600080fd5b506101405160065801610510565b610180526101405261018051610140526101405161016051610180516004356101c0526024356101e0526101405161020052610200516101e0516101c05160065801614771565b61026052610280526102a05261018052610160526101405261026080808080516102c0525050602081019050808080516102e05250506020810190508080805161030052505050506102c05160005260206000f350005b631a4d01d2600051141561523a5762ffffff5415614f3f57600080fd5b600162ffffff5560605160243580604051901315614f5c57600080fd5b8091901215614f6a57600080fd5b5060135415614f7857600080fd5b6101405160065801610476565b610180526101405261018051610140526060366101a0376101405161016051610180516101a0516101c0516101e0516004356102205260243561024052610140516102605261026051610240516102205160065801614771565b6102c0526102e052610300526101e0526101c0526101a0526101805261016052610140526102c080808080516103205250506020810190508080805161034052505060208101905080808051610360525050505061032080516101a05280602001516101c05280604001516101e052506308c379a06103805260206103a05260186103c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006103e0526103c0506044356101a05110156150a157606461039cfd5b602435600281106150b157600080fd5b600160c052602060c0200180546101a0516101c05160035480820282158284830414176150dd57600080fd5b809050905090506402540be4008082049050905081818301101561510057600080fd5b808201905090508082101561511457600080fd5b8082039050905081555060206104c060446379cc67906104205233610440526004356104605261043c60006005545af161514d57600080fd5b601f3d1161515a57600080fd5b6000506104c0506020610580604463a9059cbb6104e05233610500526101a051610520526104fc60006024356002811061519357600080fd5b600060c052602060c02001545af16151aa57600080fd5b601f3d116151b757600080fd5b600050610580516151c757600080fd5b6004356105a0526101a0516105c0526101e051600435808210156151ea57600080fd5b808203905090506105e052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606105a0a26101a051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156153de57600454331461525657600080fd5b600c546201518081818301101561526c57600080fd5b8082019050905042101561527f57600080fd5b426201518081818301101561529357600080fd5b8082019050905060243510156152a857600080fd5b610140516006580161005e565b61018052610140526101805161014052600435606480820282158284830414176152de57600080fd5b809050905090506101a0526000600435111561530157620f424060043510615304565b60005b61530d57600080fd5b610140516101a051101561535057610140516101a051600a808202821582848304141761533957600080fd5b80905090509050101561534b57600080fd5b615381565b61014051600a808202821582848304141761536a57600080fd5b809050905090506101a051111561538057600080fd5b5b61014051600a556101a051600b5542600c55602435600d55610140516101c0526101a0516101e0524261020052602435610220527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460806101c0a1005b63551a658860005114156154635760045433146153fa57600080fd5b610140516006580161005e565b6101805261014052610180516101405261014051600a5561014051600b5542600c5542600d55610140516101a052426101c0527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860406101a0a1005b635b5a1467600051141561552157600454331461547f57600080fd5b600e541561548c57600080fd5b64012a05f20060043511156154a057600080fd5b6402540be40060243511156154b457600080fd5b426203f4808181830110156154c857600080fd5b808201905090506101405261014051600e556004356010556024356011556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156155b557600454331461553d57600080fd5b600e5442101561554c57600080fd5b6000600e541861555b57600080fd5b6000600e55601054610140526011546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb60005114156155d85760045433146155d157600080fd5b6000600e55005b636b441a40600051141561566c5760043560a01c156155f657600080fd5b600454331461560457600080fd5b600f541561561157600080fd5b426203f48081818301101561562557600080fd5b808201905090506101405261014051600f55600435601255600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156156e557600454331461568857600080fd5b600f5442101561569757600080fd5b6000600f54186156a657600080fd5b6000600f556012546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193600051141561570857600454331461570157600080fd5b6000600f55005b63e2e7d26460005114156157a45760206101c060246370a0823161014052306101605261015c6004356002811061573e57600080fd5b600060c052602060c02001545afa61575557600080fd5b601f3d1161576257600080fd5b6000506101c0516004356002811061577957600080fd5b600160c052602060c02001548082101561579257600080fd5b8082039050905060005260206000f350005b6330c5408560005114156158cd5760045433146157c057600080fd5b61014060006002818352015b61014051600281106157dd57600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa61581457600080fd5b601f3d1161582157600080fd5b60005061022051610140516002811061583957600080fd5b600160c052602060c02001548082101561585257600080fd5b808203905090506101805260006101805111156158b85760206102e0604463a9059cbb610240523361026052610180516102805261025c6000610160515af161589a57600080fd5b601f3d116158a757600080fd5b6000506102e0516158b757600080fd5b5b5b81516001018083528114156157cc575b5050005b63524c3901600051141561597b5760045433146158e957600080fd5b61014060006002818352015b60206101e060246370a0823161016052306101805261017c610140516002811061591e57600080fd5b600060c052602060c02001545afa61593557600080fd5b601f3d1161594257600080fd5b6000506101e051610140516002811061595a57600080fd5b600160c052602060c02001555b81516001018083528114156158f5575b5050005b63e369885360005114156159ac57600454331461599757600080fd5b42601454116159a557600080fd5b6001601355005b633046f97260005114156159cf5760045433146159c857600080fd5b6000601355005b63c66106576000511415615a0457600435600281106159ed57600080fd5b600060c052602060c020015460005260206000f350005b634903b0d16000511415615a395760043560028110615a2257600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f436000511415615a555760025460005260206000f350005b63fee3f7f96000511415615a715760035460005260206000f350005b638da5cb5b6000511415615a8d5760045460005260206000f350005b635d6362bb6000511415615aa95760065460005260206000f350005b6395ccc02f6000511415615ac55760075460005260206000f350005b638296f84f6000511415615ae15760085460005260206000f350005b6387cb4f576000511415615b165760043560038110615aff57600080fd5b600960c052602060c020015460005260206000f350005b635409491a6000511415615b3257600a5460005260206000f350005b63b4b577ad6000511415615b4e57600b5460005260206000f350005b632081066c6000511415615b6a57600c5460005260206000f350005b63140522886000511415615b8657600d5460005260206000f350005b63405e28f86000511415615ba257600e5460005260206000f350005b63e0a0b5866000511415615bbe57600f5460005260206000f350005b6358680d0b6000511415615bda5760105460005260206000f350005b63e38244626000511415615bf65760115460005260206000f350005b631ec0cdc16000511415615c125760125460005260206000f350005b5b60006000fd5b6103e1615ffa036103e16000396103e1615ffa036000f30000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a0000000000000000000000001c48f86ae57291f7686349f12601910bd8d470bb0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e49000000000000000000000000097e2768e8e73511ca874545dc5ff8067eb19b787000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c700000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x341561000a57600080fd5b600436101561001857615c13565b600035601c526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff800000000000000000000000000000006060526000156101f9575b61014052600d5461016052600b5461018052610160514210156101e657600a546101c052600c546101e0526101c05161018051111561013f576101c051610180516101c051808210156100b057600080fd5b80820390509050426101e051808210156100c957600080fd5b8082039050905080820282158284830414176100e457600080fd5b80905090509050610160516101e0518082101561010057600080fd5b80820390509050808061011257600080fd5b82049050905081818301101561012757600080fd5b808201905090506000526000516101405156506101e1565b6101c0516101c051610180518082101561015857600080fd5b80820390509050426101e0518082101561017157600080fd5b80820390509050808202821582848304141761018c57600080fd5b80905090509050610160516101e051808210156101a857600080fd5b8082039050905080806101ba57600080fd5b820490509050808210156101cd57600080fd5b808203905090506000526000516101405156505b6101f7565b610180516000526000516101405156505b005b63f446c1d0600051141561022c576006580161005e565b610140526101405160648082049050905060005260206000f350005b6376a2f0f06000511415610256576006580161005e565b610140526101405160005260206000f350005b600015610360575b6101605261014052610180670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101a0526101c060006002818352015b6101806101c051600281106102ab57600080fd5b60200201516101c051600281106102c157600080fd5b600160c052602060c020015480820282158284830414176102e157600080fd5b80905090509050670de0b6b3a7640000808204905090506101806101c0516002811061030c57600080fd5b60200201525b8151600101808352811415610297575b505060406101e0525b60006101e05111151561033d57610359565b60206101e05103610180015160206101e051036101e05261032b565b6101605156005b60001561046e575b6101a0526101405261016052610180526101c0670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101e05261020060006002818352015b6101c061020051600281106103bd57600080fd5b602002015161016061020051600281106103d657600080fd5b602002015180820282158284830414176103ef57600080fd5b80905090509050670de0b6b3a7640000808204905090506101c0610200516002811061041a57600080fd5b60200201525b81516001018083528114156103a9575b50506040610220525b60006102205111151561044b57610467565b602061022051036101c001516020610220510361022052610439565b6101a05156005b600015610508575b6101405260085461025881818301101561048f57600080fd5b808201905090504211156104f6576020610200600463bb7b8b806101a0526101bc6006545afa6104be57600080fd5b601f3d116104cb57600080fd5b6000506102005161018052610180516007554260085561018051600052600051610140515650610506565b6007546000526000516101405156505b005b60001561058f575b6101405260085461025881818301101561052957600080fd5b8082019050905042111561057d5760206101e0600463bb7b8b806101805261019c6006545afa61055857600080fd5b601f3d1161056557600080fd5b6000506101e05160005260005161014051565061058d565b6007546000526000516101405156505b005b600015610886575b6101a0526101405261016052610180526040366101c03761022060006002818352015b602061022051026101400151610200526101c08051610200518181830110156105e257600080fd5b808201905090508152505b81516001018083528114156105ba575b50506101c05115156106185760006000526000516101a05156505b6101c05161026052610180516002808202821582848304141761063a57600080fd5b80905090509050610280526102a0600060ff818352015b610260516102c05261030060006002818352015b6020610300510261014001516102e0526102c05161026051808202821582848304141761069157600080fd5b809050905090506102e051600280820282158284830414176106b257600080fd5b8090509050905080806106c457600080fd5b8204905090506102c0525b8151600101808352811415610665575b5050610260516101e052610280516101c051808202821582848304141761070557600080fd5b809050905090506064808204905090506102c0516002808202821582848304141761072f57600080fd5b8090509050905081818301101561074557600080fd5b8082019050905061026051808202821582848304141761076457600080fd5b809050905090506102805160648082101561077e57600080fd5b8082039050905061026051808202821582848304141761079d57600080fd5b8090509050905060648082049050905060036102c05180820282158284830414176107c757600080fd5b809050905090508181830110156107dd57600080fd5b8082019050905080806107ef57600080fd5b820490509050610260526101e051610260511115610836576001610260516101e0518082101561081e57600080fd5b8082039050905011151561083157610872565b610861565b60016101e051610260518082101561084d57600080fd5b8082039050905011151561086057610872565b5b5b8151600101808352811415610651575b5050610260516000526000516101a0515650005b6000156109c9575b6101c0526101405261016052610180526101a0526101e06101405161016051610180516101a0516101c0516101e0516102005161014051610240526102606101608051825280602001518260200152505061028051610260516102405160065801610368565b6102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102e080518252806020015182602001525050610140610320525b6103205151602061032051016103205261032061032051101561095557610933565b6103406101e0805182528060200151826020015250506101a0516103805261038051610360516103405160065801610597565b6103e052610300610320525b61032051526020610320510361032052610140610320511015156109b757610994565b6103e0516000526000516101c0515650005b63bb7b8b806000511415610bb157610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610510565b6101e0526101a0526101805261016052610140526101e0516101a0526102006101405161016051610180516101a0516101c0516101e05161020051610220516101a05161026052610260516006580161025e565b6102c0526102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102c080518252806020015182602001525050610140610320525b61032051516020610320510161032052610320610320511015610ac657610aa4565b61034061020080518252806020015182602001525050610140516103805261038051610360516103405160065801610597565b6103e052610300610320525b6103205152602061032051036103205261014061032051101515610b2857610b05565b6103e05161030052602061048060046318160ddd6104205261043c6005545afa610b5157600080fd5b601f3d11610b5e57600080fd5b600050610480516104005261030051670de0b6b3a76400008082028215828483041417610b8a57600080fd5b80905090509050610400518080610ba057600080fd5b82049050905060005260206000f350005b63ed8e84f36000511415610f0a5760443560011c15610bcf57600080fd5b610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610510565b6101e0526101a0526101805261016052610140526101e0516101a05261020060018060c052602060c02054825260018160c052602060c0200154826020015250506101405161016051610180516101a0516101c0516101e0516102005161022051610240516101a051610280526102a061020080518252806020015182602001525050610140516102e0526102e0516102c0516102a051610280516006580161088e565b610340526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340516102405261036060006002818352015b60443515610d3d576102006103605160028110610d0157600080fd5b60200201805160046103605160028110610d1a57600080fd5b6020020135818183011015610d2e57600080fd5b80820190509050815250610d87565b6102006103605160028110610d5157600080fd5b60200201805160046103605160028110610d6a57600080fd5b602002013580821015610d7c57600080fd5b808203905090508152505b5b8151600101808352811415610ce5575b50506101406103a0525b6103a0515160206103a051016103a0526103a06103a0511015610dc457610da2565b6101a0516103c0526103e061020080518252806020015182602001525050610140516104205261042051610400516103e0516103c0516006580161088e565b610480526103806103a0525b6103a0515260206103a051036103a0526101406103a051101515610e3257610e0f565b6104805161038052602061052060046318160ddd6104c0526104dc6005545afa610e5b57600080fd5b601f3d11610e6857600080fd5b600050610520516104a05260006105405260443515610ea657610380516102405180821015610e9657600080fd5b8082039050905061054052610ec7565b610240516103805180821015610ebb57600080fd5b80820390509050610540525b610540516104a0518082028215828483041417610ee357600080fd5b80905090509050610240518080610ef957600080fd5b82049050905060005260206000f350005b630b4c7e4d60005114156117a65762ffffff5415610f2757600080fd5b600162ffffff5560135415610f3b57600080fd5b610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610476565b6101e0526101a0526101805261016052610140526101e0516101a052602061028060046318160ddd6102205261023c6005545afa610fae57600080fd5b601f3d11610fbb57600080fd5b600050610280516102005260025460028082028215828483041417610fdf57600080fd5b809050905090506004808204905090506102a0526003546102c05260006102e05261030060018060c052602060c02054825260018160c052602060c02001548260200152505060006102005111156110d257610140610340525b6103405151602061034051016103405261034061034051101561105b57611039565b6101a0516103605261038061030080518252806020015182602001525050610140516103c0526103c0516103a05161038051610360516006580161088e565b61042052610320610340525b61034051526020610340510361034052610140610340511015156110c9576110a6565b610420516102e0525b6104406103008051825280602001518260200152505061048060006002818352015b6102005115156111235760006004610480516002811061111357600080fd5b60200201351161112257600080fd5b5b610300610480516002811061113757600080fd5b60200201516004610480516002811061114f57600080fd5b602002013581818301101561116357600080fd5b80820190509050610440610480516002811061117e57600080fd5b60200201525b81516001018083528114156110f4575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c05110156111c05761119e565b6101a0516104e0526105006104408051825280602001518260200152505061014051610540526105405161052051610500516104e0516006580161088e565b6105a0526104a06104c0525b6104c0515260206104c051036104c0526101406104c05110151561122e5761120b565b6105a0516104a0526102e0516104a0511161124857600080fd5b6040366105c0376104a0516106005260006102005111156115335761062060006002818352015b6104a051610300610620516002811061128757600080fd5b602002015180820282158284830414176112a057600080fd5b809050905090506102e05180806112b657600080fd5b8204905090506106405260006106605261044061062051600281106112da57600080fd5b60200201516106405111156113235761064051610440610620516002811061130157600080fd5b60200201518082101561131357600080fd5b8082039050905061066052611359565b610440610620516002811061133757600080fd5b6020020151610640518082101561134d57600080fd5b80820390509050610660525b6102a05161066051808202821582848304141761137557600080fd5b809050905090506402540be400808204905090506105c0610620516002811061139d57600080fd5b602002015261044061062051600281106113b657600080fd5b60200201516105c061062051600281106113cf57600080fd5b60200201516102c05180820282158284830414176113ec57600080fd5b809050905090506402540be400808204905090508082101561140d57600080fd5b80820390509050610620516002811061142557600080fd5b600160c052602060c0200155610440610620516002811061144557600080fd5b6020020180516105c0610620516002811061145f57600080fd5b60200201518082101561147157600080fd5b808203905090508152505b815160010180835281141561126f575b5050610140610680525b610680515160206106805101610680526106206106805110156114b857611496565b6101a0516106a0526106c0610440805182528060200151826020015250506101405161070052610700516106e0516106c0516106a0516006580161088e565b61076052610600610680525b610680515260206106805103610680526101406106805110151561152657611503565b6107605161060052611551565b600160c052602060c020610440805182558060200151600183015550505b60006107805261020051151561156e576104a051610780526115c3565b61020051610600516102e0518082101561158757600080fd5b8082039050905080820282158284830414176115a257600080fd5b809050905090506102e05180806115b857600080fd5b820490509050610780525b6308c379a06107a05260206107c05260146107e0527f536c697070616765207363726577656420796f75000000000000000000000000610800526107e0506044356107805110156116155760646107bcfd5b61084060006002818352015b60006004610840516002811061163657600080fd5b602002013511156116c257602061092060646323b872dd610860523361088052306108a0526004610840516002811061166e57600080fd5b60200201356108c05261087c6000610840516002811061168d57600080fd5b600060c052602060c02001545af16116a457600080fd5b601f3d116116b157600080fd5b600050610920516116c157600080fd5b5b5b8151600101808352811415611621575b505060206109e060446340c10f19610940523361096052610780516109805261095c60006005545af161170557600080fd5b601f3d1161171257600080fd5b6000506109e050600435610a0052602435610a20526105c051610a40526105e051610a60526104a051610a8052610200516107805181818301101561175657600080fd5b80820190509050610aa052337f26f55a85081d24974e85c6c00045d0f0453991e95873f52bff0d21af4079a76860c0610a00a261078051600052600062ffffff5560206000f350600062ffffff55005b600015611c2d575b6101e0526101405261016052610180526101a0526101c0526101605161014051186117d857600080fd5b60006101605112156117e957600080fd5b600261016051126117f957600080fd5b600061014051121561180a57600080fd5b6002610140511261181a57600080fd5b6101405161016051610180516101a0516101c0516101e051610200516006580161005e565b61024052610200526101e0526101c0526101a05261018052610160526101405261024051610200526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516102a06101a080518252806020015182602001525050610200516102e0526102e0516102c0516102a05160065801610597565b61034052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340516102605260603661036037610260516103c052610200516002808202821582848304141761191f57600080fd5b809050905090506103e05261040060006002818352015b61014051610400511415611951576101805161038052611987565b61016051610400511815611981576101a0610400516002811061197357600080fd5b602002015161038052611986565b611a03565b5b61036080516103805181818301101561199f57600080fd5b808201905090508152506103c0516102605180820282158284830414176119c557600080fd5b8090509050905061038051600280820282158284830414176119e657600080fd5b8090509050905080806119f857600080fd5b8204905090506103c0525b8151600101808352811415611936575b50506103c051610260518082028215828483041417611a3157600080fd5b8090509050905060648082028215828483041417611a4e57600080fd5b809050905090506103e05160028082028215828483041417611a6f57600080fd5b809050905090508080611a8157600080fd5b8204905090506103c052610360516102605160648082028215828483041417611aa957600080fd5b809050905090506103e0518080611abf57600080fd5b820490509050818183011015611ad457600080fd5b80820190509050610420526102605161044052610460600060ff818352015b610440516103a05261044051610440518082028215828483041417611b1757600080fd5b809050905090506103c051818183011015611b3157600080fd5b808201905090506002610440518082028215828483041417611b5257600080fd5b8090509050905061042051818183011015611b6c57600080fd5b808201905090506102605180821015611b8457600080fd5b808203905090508080611b9657600080fd5b820490509050610440526103a051610440511115611bdd576001610440516103a05180821015611bc557600080fd5b80820390509050111515611bd857611c19565b611c08565b60016103a0516104405180821015611bf457600080fd5b80820390509050111515611c0757611c19565b5b5b8151600101808352811415611af3575b5050610440516000526000516101e0515650005b635e0d443f6000511415611f3d5760605160043580604051901315611c5157600080fd5b8091901215611c5f57600080fd5b5060605160243580604051901315611c7657600080fd5b8091901215611c8457600080fd5b50610140670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101605160065801610510565b6101a05261016052610140526101a051610160526101c06101405161016051610180516101a0516101c0516101e0516101605161022052610220516006580161025e565b610280526102a0526101e0526101c0526101a052610180526101605261014052610280805182528060200151826020015250506101c060043560028110611d3d57600080fd5b602002015160443561014060043560028110611d5857600080fd5b60200201518082028215828483041417611d7157600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611d9757600080fd5b808201905090506102c052610140610300525b61030051516020610300510161030052610300610300511015611dcc57611daa565b60043561032052602435610340526102c051610360526103806101c0805182528060200151826020015250506103a05161038051610360516103405161032051600658016117ae565b610400526102e0610300525b6103005152602061030051036103005261014061030051101515611e4457611e21565b610400516102e0526101c060243560028110611e5f57600080fd5b60200201516102e05180821015611e7557600080fd5b80820390509050600180821015611e8b57600080fd5b8082039050905061042052600254610420518082028215828483041417611eb157600080fd5b809050905090506402540be4008082049050905061044052610420516104405180821015611ede57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417611f0257600080fd5b8090509050905061014060243560028110611f1c57600080fd5b60200201518080611f2c57600080fd5b82049050905060005260206000f350005b6307211ef7600051141561250b5760605160043580604051901315611f6157600080fd5b8091901215611f6f57600080fd5b5060605160243580604051901315611f8657600080fd5b8091901215611f9457600080fd5b506101405160065801610510565b610180526101405261018051610140526101a06101405161016051610180516101a0516101c0516101405161020052610200516006580161025e565b61026052610280526101c0526101a052610180526101605261014052610260805182528060200151826020015250506102a06001815260018160200152506006546102e05260043560016060518183038060405190131561203e57600080fd5b809190121561204c57600080fd5b905090506103005260243560016060518183038060405190131561206f57600080fd5b809190121561207d57600080fd5b905090506103205260016103405260016103605260006103005112156120a557600435610340525b60006103205112156120b957602435610360525b6000610380526000610300511215612138576101a0600435600281106120de57600080fd5b60200201516044356102a0600435600281106120f957600080fd5b6020020151808202821582848304141761211257600080fd5b8090509050905081818301101561212857600080fd5b80820190509050610380526122f3565b600061032051121561229b5760603661048037604435610480610300516003811061216257600080fd5b602002015260206105c06084633883e1196104e05261050061048080518252806020015182602001528060400151826040015250506001610560526104fc6102e0515afa6121af57600080fd5b601f3d116121bc57600080fd5b6000506105c0516101405180820282158284830414176121db57600080fd5b80905090509050670de0b6b3a764000080820490509050610380526103808051610380516020610640600463ddca3f436105e0526105fc6102e0515afa61222157600080fd5b601f3d1161222e57600080fd5b60005061064051808202821582848304141761224957600080fd5b809050905090506404a817c800808204905090508082101561226a57600080fd5b8082039050905081525061038080516101c05181818301101561228c57600080fd5b808201905090508152506122f2565b60206104606064635e0d443f6103a052610300516103c052610320516103e052604435610400526103bc6102e0515afa6122d457600080fd5b601f3d116122e157600080fd5b6000506104605160005260206000f3505b5b610140610680525b6106805151602061068051016106805261068061068051101561231d576122fb565b610340516106a052610360516106c052610380516106e0526107006101a08051825280602001518260200152505061072051610700516106e0516106c0516106a051600658016117ae565b61078052610660610680525b610680515260206106805103610680526101406106805110151561239757612374565b61078051610660526101a061036051600281106123b357600080fd5b602002015161066051808210156123c957600080fd5b808203905090506001808210156123df57600080fd5b808203905090506107a0526107a0516002546107a051808202821582848304141761240957600080fd5b809050905090506402540be400808204905090508082101561242a57600080fd5b808203905090506107a0526000610320511215612478576107a080516102a0610360516002811061245a57600080fd5b6020020151808061246a57600080fd5b8204905090508152506124fc565b6020610860604463cc2b27d76107c0526107a051670de0b6b3a764000080820282158284830414176124a957600080fd5b809050905090506101405180806124bf57600080fd5b8204905090506107e05261032051610800526107dc6102e0515afa6124e357600080fd5b601f3d116124f057600080fd5b600050610860516107a0525b6107a05160005260206000f350005b633df021246000511415612b475762ffffff541561252857600080fd5b600162ffffff556060516004358060405190131561254557600080fd5b809190121561255357600080fd5b506060516024358060405190131561256a57600080fd5b809190121561257857600080fd5b506013541561258657600080fd5b610140670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101605160065801610476565b6101a05261016052610140526101a051610160526101c060018060c052602060c02054825260018160c052602060c0200154826020015250506102006101405161016051610180516101a0516101c0516101e051610200516102205161016051610260526102806101c0805182528060200151826020015250506102a051610280516102605160065801610368565b610300526103205261022052610200526101e0526101c0526101a052610180526101605261014052610300805182528060200151826020015250506102006004356002811061269157600080fd5b6020020151604435610140600435600281106126ac57600080fd5b602002015180820282158284830414176126c557600080fd5b80905090509050670de0b6b3a7640000808204905090508181830110156126eb57600080fd5b8082019050905061034052610140610380525b61038051516020610380510161038052610380610380511015612720576126fe565b6004356103a0526024356103c052610340516103e0526104006102008051825280602001518260200152505061042051610400516103e0516103c0516103a051600658016117ae565b61048052610360610380525b610380515260206103805103610380526101406103805110151561279857612775565b6104805161036052610200602435600281106127b357600080fd5b602002015161036051808210156127c957600080fd5b808203905090506001808210156127df57600080fd5b808203905090506104a0526104a051600254808202821582848304141761280557600080fd5b809050905090506402540be400808204905090506104c0526104a0516104c0518082101561283257600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761285657600080fd5b809050905090506101406024356002811061287057600080fd5b6020020151808061288057600080fd5b8204905090506104a0526308c379a06104e0526020610500526017610520527f546f6f2066657720636f696e7320696e20726573756c7400000000000000000061054052610520506064356104a05110156128dc5760646104fcfd5b6104c05160035480820282158284830414176128f757600080fd5b809050905090506402540be400808204905090506105805261058051670de0b6b3a7640000808202821582848304141761293057600080fd5b809050905090506101406024356002811061294a57600080fd5b6020020151808061295a57600080fd5b820490509050610580526101c06004356002811061297757600080fd5b602002015160443581818301101561298e57600080fd5b80820190509050600435600281106129a557600080fd5b600160c052602060c02001556101c0602435600281106129c457600080fd5b60200201516104a051808210156129da57600080fd5b8082039050905061058051808210156129f257600080fd5b8082039050905060243560028110612a0957600080fd5b600160c052602060c0200155602061066060646323b872dd6105a052336105c052306105e052604435610600526105bc600060043560028110612a4b57600080fd5b600060c052602060c02001545af1612a6257600080fd5b601f3d11612a6f57600080fd5b60005061066051612a7f57600080fd5b6020610720604463a9059cbb61068052336106a0526104a0516106c05261069c600060243560028110612ab157600080fd5b600060c052602060c02001545af1612ac857600080fd5b601f3d11612ad557600080fd5b60005061072051612ae557600080fd5b6004356107405260443561076052602435610780526104a0516107a052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610740a26104a051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed6600051141561393d5762ffffff5415612b6457600080fd5b600162ffffff5560605160043580604051901315612b8157600080fd5b8091901215612b8f57600080fd5b5060605160243580604051901315612ba657600080fd5b8091901215612bb457600080fd5b5060135415612bc257600080fd5b610140670de0b6b3a76400008152670de0b6b3a7640000816020015250610140516101605160065801610476565b6101a05261016052610140526101a051610160526006546101c052600435600160605181830380604051901315612c2657600080fd5b8091901215612c3457600080fd5b905090506101e052602435600160605181830380604051901315612c5757600080fd5b8091901215612c6557600080fd5b905090506102005260016102205260016102405260006101e0511215612c8d57600435610220525b6000610200511215612ca157602435610240525b6040366102603760006101e0511215612cd95760043560028110612cc457600080fd5b600060c052602060c020015461028052612cfb565b6101e05160038110612cea57600080fd5b600960c052602060c0200154610280525b60006102a0526000610200511215612d325760243560028110612d1d57600080fd5b600060c052602060c02001546102a052612d54565b6102005160038110612d4357600080fd5b600960c052602060c02001546102a0525b6044356102c05273dac17f958d2ee523a2206206994597c13d831ec7610280511415612dcb57602061036060246370a082316102e05230610300526102fc73dac17f958d2ee523a2206206994597c13d831ec75afa612db257600080fd5b601f3d11612dbf57600080fd5b600050610360516102c0525b600060046103e0527f23b872dd00000000000000000000000000000000000000000000000000000000610400526103e060048060208461044001018260208501600060045af15050805182019150503360208261044001015260208101905030602082610440010152602081019050604435602082610440010152602081019050806104405261044090508051602001806105008284600060045af1612e7057600080fd5b505060206105e0610500516105206000610280515af1612e8f57600080fd5b60203d80821115612ea05780612ea2565b815b905090506105c0526105c08051602001806103808284600060045af1612ec757600080fd5b50506000610380511115612f1a57610380806020015160008251806020901315612ef057600080fd5b8091901215612efe57600080fd5b806020036101000a82049050905090501515612f1957600080fd5b5b73dac17f958d2ee523a2206206994597c13d831ec7610280511415612fa25760206106a060246370a0823161062052306106405261063c73dac17f958d2ee523a2206206994597c13d831ec75afa612f7157600080fd5b601f3d11612f7e57600080fd5b6000506106a0516102c05180821015612f9657600080fd5b808203905090506102c0525b60006101e0511215612fb5576001612fbd565b600061020051125b5b156136b4576108e060018060c052602060c02054825260018160c052602060c020015482602001525050610920610140610960525b6109605151602061096051016109605261096061096051101561301557612ff3565b61016051610980526109a06108e0805182528060200151826020015250506109c0516109a0516109805160065801610368565b610a2052610a4052610940610960525b610960515260206109605103610960526101406109605110151561307b57613058565b610a20805182528060200151826020015250506000610a605260006101e051121561311e57610920600435600281106130b357600080fd5b60200201516102c051610140600435600281106130cf57600080fd5b602002015180820282158284830414176130e857600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561310e57600080fd5b80820190509050610a605261329b565b606036610a80376102c051610a806101e0516003811061313d57600080fd5b60200201526001600060c052602060c0200154610ae0526020610b8060246370a08231610b005230610b2052610b1c610ae0515afa61317b57600080fd5b601f3d1161318857600080fd5b600050610b8051610a60526101c0513b6131a157600080fd5b600060006084634515cef3610ba052610bc0610a8080518252806020015182602001528060400151826040015250506000610c2052610bbc60006101c0515af16131ea57600080fd5b6020610d0060246370a08231610c805230610ca052610c9c610ae0515afa61321157600080fd5b601f3d1161321e57600080fd5b600050610d0051610a60518082101561323657600080fd5b808203905090506102c0526102c05161016051808202821582848304141761325d57600080fd5b80905090509050670de0b6b3a764000080820490509050610a6052610a6080516109405181818301101561329057600080fd5b808201905090508152505b610140610d40525b610d4051516020610d405101610d4052610d40610d405110156132c5576132a3565b61022051610d605261024051610d8052610a6051610da052610dc061092080518252806020015182602001525050610de051610dc051610da051610d8051610d6051600658016117ae565b610e4052610d20610d40525b610d4051526020610d405103610d4052610140610d405110151561333f5761331c565b610e4051610d2052610920610240516002811061335b57600080fd5b6020020151610d20518082101561337157600080fd5b8082039050905060018082101561338757600080fd5b80820390509050610260526102605160025480820282158284830414176133ad57600080fd5b809050905090506402540be40080820490509050610e605261026051610e6051808210156133da57600080fd5b80820390509050670de0b6b3a764000080820282158284830414176133fe57600080fd5b80905090509050610140610240516002811061341957600080fd5b6020020151808061342957600080fd5b82049050905061026052610e6051600354808202821582848304141761344e57600080fd5b809050905090506402540be40080820490509050610e8052610e8051670de0b6b3a7640000808202821582848304141761348757600080fd5b8090509050905061014061024051600281106134a257600080fd5b602002015180806134b257600080fd5b820490509050610e80526108e061022051600281106134d057600080fd5b60200201516102c0518181830110156134e857600080fd5b80820190509050610220516002811061350057600080fd5b600160c052602060c02001556108e0610240516002811061352057600080fd5b6020020151610260518082101561353657600080fd5b80820390509050610e80518082101561354e57600080fd5b80820390509050610240516002811061356657600080fd5b600160c052602060c020015560006102005112151561365d576020610f4060246370a08231610ec05230610ee052610edc6102a0515afa6135a657600080fd5b601f3d116135b357600080fd5b600050610f4051610ea0526101c0513b6135cc57600080fd5b600060006064631a4d01d2610f605261026051610f805261020051610fa0526000610fc052610f7c60006101c0515af161360557600080fd5b60206110a060246370a0823161102052306110405261103c6102a0515afa61362c57600080fd5b601f3d1161363957600080fd5b6000506110a051610ea0518082101561365157600080fd5b80820390509050610260525b6308c379a06110c05260206110e0526017611100527f546f6f2066657720636f696e7320696e20726573756c7400000000000000000061112052611100506064356102605110156136af5760646110dcfd5b61379b565b602061074060246370a082316106c052306106e0526106dc6102a0515afa6136db57600080fd5b601f3d116136e857600080fd5b60005061074051610260526101c0513b61370157600080fd5b600060006084633df02124610760526101e05161078052610200516107a0526102c0516107c0526064356107e05261077c60006101c0515af161374357600080fd5b60206108c060246370a0823161084052306108605261085c6102a0515afa61376a57600080fd5b601f3d1161377757600080fd5b6000506108c051610260518082101561378f57600080fd5b80820390509050610260525b60006004611160527fa9059cbb00000000000000000000000000000000000000000000000000000000611180526111606004806020846111c001018260208501600060045af1505080518201915050336020826111c0010152602081019050610260516020826111c0010152602081019050806111c0526111c090508051602001806112608284600060045af161383157600080fd5b505060206113206112605161128060006102a0515af161385057600080fd5b60203d808211156138615780613863565b815b90509050611300526113008051602001806103808284600060045af161388857600080fd5b505060006103805111156138db576103808060200151600082518060209013156138b157600080fd5b80919012156138bf57600080fd5b806020036101000a820490509050905015156138da57600080fd5b5b60043561136052604435611380526024356113a052610260516113c052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b6080611360a261026051600052600062ffffff5560206000f350600062ffffff55005b635b36389c6000511415613bf85762ffffff541561395a57600080fd5b600162ffffff5560206101c060046318160ddd6101605261017c6005545afa61398257600080fd5b601f3d1161398f57600080fd5b6000506101c051610140526080366101e03761026060006002818352015b61026051600281106139be57600080fd5b600160c052602060c020015460043580820282158284830414176139e157600080fd5b809050905090506101405180806139f757600080fd5b820490509050610280526308c379a06102a05260206102c05260176102e0527f546f6f2066657720636f696e7320696e20726573756c74000000000000000000610300526102e05060246102605160028110613a5257600080fd5b6020020135610280511015613a685760646102bcfd5b6102605160028110613a7957600080fd5b600160c052602060c0200180546102805180821015613a9757600080fd5b80820390509050815550610280516101e06102605160028110613ab957600080fd5b602002015260206103e0604463a9059cbb610340523361036052610280516103805261035c60006102605160028110613af157600080fd5b600060c052602060c02001545af1613b0857600080fd5b601f3d11613b1557600080fd5b6000506103e051613b2557600080fd5b5b81516001018083528114156139ad575b505060206104a060446379cc67906104005233610420526004356104405261041c60006005545af1613b6757600080fd5b601f3d11613b7457600080fd5b6000506104a0506101e0516104c052610200516104e052610220516105005261024051610520526101405160043580821015613baf57600080fd5b8082039050905061054052337f7c363854ccf79623411f8995b362bce5eddff18c927edc6f5dbbb5e05819a82c60a06104c0a2600062ffffff5560406101e0f3600062ffffff55005b63e3103273600051141561440d5762ffffff5415613c1557600080fd5b600162ffffff5560135415613c2957600080fd5b610140516006580161005e565b610180526101405261018051610140526101405161016051610180516101a05160065801610476565b6101e0526101a0526101805261016052610140526101e0516101a052602061028060046318160ddd6102205261023c6005545afa613c9c57600080fd5b601f3d11613ca957600080fd5b600050610280516102005260006102005118613cc457600080fd5b60025460028082028215828483041417613cdd57600080fd5b809050905090506004808204905090506102a0526003546102c0526102e060018060c052602060c02054825260018160c052602060c0200154826020015250506103206102e080518252806020015182602001525050610140610380525b61038051516020610380510161038052610380610380511015613d5d57613d3b565b6101a0516103a0526103c06102e0805182528060200151826020015250506101405161040052610400516103e0516103c0516103a0516006580161088e565b61046052610360610380525b6103805152602061038051036103805261014061038051101515613dcb57613da8565b610460516103605261048060006002818352015b6103206104805160028110613df357600080fd5b60200201805160046104805160028110613e0c57600080fd5b602002013580821015613e1e57600080fd5b808203905090508152505b8151600101808352811415613ddf575b50506101406104c0525b6104c0515160206104c051016104c0526104c06104c0511015613e6557613e43565b6101a0516104e0526105006103208051825280602001518260200152505061014051610540526105405161052051610500516104e0516006580161088e565b6105a0526104a06104c0525b6104c0515260206104c051036104c0526101406104c051101515613ed357613eb0565b6105a0516104a0526040366105c03761060060006002818352015b6104a0516102e06106005160028110613f0657600080fd5b60200201518082028215828483041417613f1f57600080fd5b80905090509050610360518080613f3557600080fd5b820490509050610620526000610640526103206106005160028110613f5957600080fd5b6020020151610620511115613fa257610620516103206106005160028110613f8057600080fd5b602002015180821015613f9257600080fd5b8082039050905061064052613fd8565b6103206106005160028110613fb657600080fd5b60200201516106205180821015613fcc57600080fd5b80820390509050610640525b6102a051610640518082028215828483041417613ff457600080fd5b809050905090506402540be400808204905090506105c0610600516002811061401c57600080fd5b6020020152610320610600516002811061403557600080fd5b60200201516105c0610600516002811061404e57600080fd5b60200201516102c051808202821582848304141761406b57600080fd5b809050905090506402540be400808204905090508082101561408c57600080fd5b8082039050905061060051600281106140a457600080fd5b600160c052602060c020015561032061060051600281106140c457600080fd5b6020020180516105c061060051600281106140de57600080fd5b6020020151808210156140f057600080fd5b808203905090508152505b8151600101808352811415613eee575b5050610140610680525b6106805151602061068051016106805261068061068051101561413757614115565b6101a0516106a0526106c0610320805182528060200151826020015250506101405161070052610700516106e0516106c0516106a0516006580161088e565b61076052610660610680525b61068051526020610680510361068052610140610680511015156141a557614182565b61076051610660526103605161066051808210156141c257600080fd5b808203905090506102005180820282158284830414176141e157600080fd5b809050905090506103605180806141f757600080fd5b820490509050610780526000610780511861421157600080fd5b6107808051600181818301101561422757600080fd5b808201905090508152506308c379a06107a05260206107c05260146107e0527f536c697070616765207363726577656420796f75000000000000000000000000610800526107e0506044356107805111156142835760646107bcfd5b60206108e060446379cc6790610840523361086052610780516108805261085c60006005545af16142b357600080fd5b601f3d116142c057600080fd5b6000506108e05061090060006002818352015b6000600461090051600281106142e857600080fd5b6020020135181561436f5760206109c0604463a9059cbb6109205233610940526004610900516002811061431b57600080fd5b60200201356109605261093c6000610900516002811061433a57600080fd5b600060c052602060c02001545af161435157600080fd5b601f3d1161435e57600080fd5b6000506109c05161436e57600080fd5b5b5b81516001018083528114156142d3575b50506004356109e052602435610a00526105c051610a20526105e051610a40526104a051610a60526102005161078051808210156143bd57600080fd5b80820390509050610a8052337f2b5508378d7e19e0d5fa338419034731416c4f5b219a10379956f764317fd47e60c06109e0a261078051600052600062ffffff5560206000f350600062ffffff55005b600015614769575b6101e0526101405261016052610180526101a0526101c052600061016051121561443e57600080fd5b6002610160511261444e57600080fd5b606036610200376101c05161026052610140516002808202821582848304141761447757600080fd5b80905090509050610280526102a060006002818352015b610160516102a05118156144be576101806102a051600281106144b057600080fd5b6020020151610220526144c3565b61453f565b6102008051610220518181830110156144db57600080fd5b80820190509050815250610260516101c051808202821582848304141761450157600080fd5b80905090509050610220516002808202821582848304141761452257600080fd5b80905090509050808061453457600080fd5b820490509050610260525b815160010180835281141561448e575b5050610260516101c051808202821582848304141761456d57600080fd5b809050905090506064808202821582848304141761458a57600080fd5b8090509050905061028051600280820282158284830414176145ab57600080fd5b8090509050905080806145bd57600080fd5b82049050905061026052610200516101c051606480820282158284830414176145e557600080fd5b809050905090506102805180806145fb57600080fd5b82049050905081818301101561461057600080fd5b808201905090506102c0526101c0516102e052610300600060ff818352015b6102e051610240526102e0516102e051808202821582848304141761465357600080fd5b809050905090506102605181818301101561466d57600080fd5b8082019050905060026102e051808202821582848304141761468e57600080fd5b809050905090506102c0518181830110156146a857600080fd5b808201905090506101c051808210156146c057600080fd5b8082039050905080806146d257600080fd5b8204905090506102e052610240516102e05111156147195760016102e051610240518082101561470157600080fd5b8082039050905011151561471457614755565b614744565b6001610240516102e0518082101561473057600080fd5b8082039050905011151561474357614755565b5b5b815160010180835281141561462f575b50506102e0516000526000516101e0515650005b600015614e44575b6101a0526101405261016052610180526101405161016051610180516101a0516101c0516006580161005e565b610200526101c0526101a052610180526101605261014052610200516101c0526102206101405161016051610180516101a0516101c0516101e0516102005161022051610240516101805161028052610280516006580161025e565b6102e052610300526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102e080518252806020015182602001525050610140610340525b6103405151602061034051016103405261034061034051101561486357614841565b610360610220805182528060200151826020015250506101c0516103a0526103a051610380516103605160065801610597565b61040052610320610340525b61034051526020610340510361034052610140610340511015156148c5576148a2565b610400516103205260206104a060046318160ddd6104405261045c6005545afa6148ee57600080fd5b601f3d116148fb57600080fd5b6000506104a05161042052610320516101405161032051808202821582848304141761492657600080fd5b8090509050905061042051808061493c57600080fd5b8204905090508082101561494f57600080fd5b808203905090506104c052610140610500525b6105005151602061050051016105005261050061050051101561498457614962565b6101c051610520526101605161054052610560610220805182528060200151826020015250506104c0516105a0526105a0516105805161056051610540516105205160065801614415565b610600526104e0610500525b61050051526020610500510361050052610140610500511015156149fe576149db565b610600516104e05260025460028082028215828483041417614a1f57600080fd5b8090509050905060048082049050905061062052610640670de0b6b3a76400008152670de0b6b3a76400008160200152506101805161066052610680610220805182528060200151826020015250506102206101605160028110614a8257600080fd5b60200201516104e05180821015614a9857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614abc57600080fd5b809050905090506106406101605160028110614ad757600080fd5b60200201518080614ae757600080fd5b8204905090506106c0526106e060006002818352015b600061070052610160516106e0511415614b7f576102206106e05160028110614b2557600080fd5b60200201516104c0518082028215828483041417614b4257600080fd5b80905090509050610320518080614b5857600080fd5b8204905090506104e05180821015614b6f57600080fd5b8082039050905061070052614bfe565b6102206106e05160028110614b9357600080fd5b60200201516102206106e05160028110614bac57600080fd5b60200201516104c0518082028215828483041417614bc957600080fd5b80905090509050610320518080614bdf57600080fd5b82049050905080821015614bf257600080fd5b80820390509050610700525b6106806106e05160028110614c1257600080fd5b60200201805161062051610700518082028215828483041417614c3457600080fd5b809050905090506402540be4008082049050905080821015614c5557600080fd5b808203905090508152505b8151600101808352811415614afd575b50506106806101605160028110614c8657600080fd5b6020020151610140610740525b61074051516020610740510161074052610740610740511015614cb557614c93565b6101c0516107605261016051610780526107a0610680805182528060200151826020015250506104c0516107e0526107e0516107c0516107a051610780516107605160065801614415565b61084052610720610740525b6107405152602061074051036107405261014061074051101515614d2f57614d0c565b6108405180821015614d4057600080fd5b808203905090506107205261072051600180821015614d5e57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614d8257600080fd5b809050905090506106406101605160028110614d9d57600080fd5b60200201518080614dad57600080fd5b82049050905061072052610860808080610720518152505060208101905080806106c0516107205180821015614de257600080fd5b80820390509050815250506020810190508080610420518152505060609050905060c05260c0516108c0525b60006108c051111515614e2057614e3c565b60206108c05103610860015160206108c051036108c052614e0e565b6101a0515650005b63cc2b27d76000511415614f225760605160243580604051901315614e6857600080fd5b8091901215614e7657600080fd5b506101405160065801610510565b610180526101405261018051610140526101405161016051610180516004356101c0526024356101e0526101405161020052610200516101e0516101c05160065801614771565b61026052610280526102a05261018052610160526101405261026080808080516102c0525050602081019050808080516102e05250506020810190508080805161030052505050506102c05160005260206000f350005b631a4d01d2600051141561523a5762ffffff5415614f3f57600080fd5b600162ffffff5560605160243580604051901315614f5c57600080fd5b8091901215614f6a57600080fd5b5060135415614f7857600080fd5b6101405160065801610476565b610180526101405261018051610140526060366101a0376101405161016051610180516101a0516101c0516101e0516004356102205260243561024052610140516102605261026051610240516102205160065801614771565b6102c0526102e052610300526101e0526101c0526101a0526101805261016052610140526102c080808080516103205250506020810190508080805161034052505060208101905080808051610360525050505061032080516101a05280602001516101c05280604001516101e052506308c379a06103805260206103a05260186103c0527f4e6f7420656e6f75676820636f696e732072656d6f76656400000000000000006103e0526103c0506044356101a05110156150a157606461039cfd5b602435600281106150b157600080fd5b600160c052602060c0200180546101a0516101c05160035480820282158284830414176150dd57600080fd5b809050905090506402540be4008082049050905081818301101561510057600080fd5b808201905090508082101561511457600080fd5b8082039050905081555060206104c060446379cc67906104205233610440526004356104605261043c60006005545af161514d57600080fd5b601f3d1161515a57600080fd5b6000506104c0506020610580604463a9059cbb6104e05233610500526101a051610520526104fc60006024356002811061519357600080fd5b600060c052602060c02001545af16151aa57600080fd5b601f3d116151b757600080fd5b600050610580516151c757600080fd5b6004356105a0526101a0516105c0526101e051600435808210156151ea57600080fd5b808203905090506105e052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606105a0a26101a051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156153de57600454331461525657600080fd5b600c546201518081818301101561526c57600080fd5b8082019050905042101561527f57600080fd5b426201518081818301101561529357600080fd5b8082019050905060243510156152a857600080fd5b610140516006580161005e565b61018052610140526101805161014052600435606480820282158284830414176152de57600080fd5b809050905090506101a0526000600435111561530157620f424060043510615304565b60005b61530d57600080fd5b610140516101a051101561535057610140516101a051600a808202821582848304141761533957600080fd5b80905090509050101561534b57600080fd5b615381565b61014051600a808202821582848304141761536a57600080fd5b809050905090506101a051111561538057600080fd5b5b61014051600a556101a051600b5542600c55602435600d55610140516101c0526101a0516101e0524261020052602435610220527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c25460806101c0a1005b63551a658860005114156154635760045433146153fa57600080fd5b610140516006580161005e565b6101805261014052610180516101405261014051600a5561014051600b5542600c5542600d55610140516101a052426101c0527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc20193860406101a0a1005b635b5a1467600051141561552157600454331461547f57600080fd5b600e541561548c57600080fd5b64012a05f20060043511156154a057600080fd5b6402540be40060243511156154b457600080fd5b426203f4808181830110156154c857600080fd5b808201905090506101405261014051600e556004356010556024356011556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe9760005114156155b557600454331461553d57600080fd5b600e5442101561554c57600080fd5b6000600e541861555b57600080fd5b6000600e55601054610140526011546101605261014051600255610160516003556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb60005114156155d85760045433146155d157600080fd5b6000600e55005b636b441a40600051141561566c5760043560a01c156155f657600080fd5b600454331461560457600080fd5b600f541561561157600080fd5b426203f48081818301101561562557600080fd5b808201905090506101405261014051600f55600435601255600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae60005114156156e557600454331461568857600080fd5b600f5442101561569757600080fd5b6000600f54186156a657600080fd5b6000600f556012546101405261014051600455610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf193600051141561570857600454331461570157600080fd5b6000600f55005b63e2e7d26460005114156157a45760206101c060246370a0823161014052306101605261015c6004356002811061573e57600080fd5b600060c052602060c02001545afa61575557600080fd5b601f3d1161576257600080fd5b6000506101c0516004356002811061577957600080fd5b600160c052602060c02001548082101561579257600080fd5b8082039050905060005260206000f350005b6330c5408560005114156158cd5760045433146157c057600080fd5b61014060006002818352015b61014051600281106157dd57600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa61581457600080fd5b601f3d1161582157600080fd5b60005061022051610140516002811061583957600080fd5b600160c052602060c02001548082101561585257600080fd5b808203905090506101805260006101805111156158b85760206102e0604463a9059cbb610240523361026052610180516102805261025c6000610160515af161589a57600080fd5b601f3d116158a757600080fd5b6000506102e0516158b757600080fd5b5b5b81516001018083528114156157cc575b5050005b63524c3901600051141561597b5760045433146158e957600080fd5b61014060006002818352015b60206101e060246370a0823161016052306101805261017c610140516002811061591e57600080fd5b600060c052602060c02001545afa61593557600080fd5b601f3d1161594257600080fd5b6000506101e051610140516002811061595a57600080fd5b600160c052602060c02001555b81516001018083528114156158f5575b5050005b63e369885360005114156159ac57600454331461599757600080fd5b42601454116159a557600080fd5b6001601355005b633046f97260005114156159cf5760045433146159c857600080fd5b6000601355005b63c66106576000511415615a0457600435600281106159ed57600080fd5b600060c052602060c020015460005260206000f350005b634903b0d16000511415615a395760043560028110615a2257600080fd5b600160c052602060c020015460005260206000f350005b63ddca3f436000511415615a555760025460005260206000f350005b63fee3f7f96000511415615a715760035460005260206000f350005b638da5cb5b6000511415615a8d5760045460005260206000f350005b635d6362bb6000511415615aa95760065460005260206000f350005b6395ccc02f6000511415615ac55760075460005260206000f350005b638296f84f6000511415615ae15760085460005260206000f350005b6387cb4f576000511415615b165760043560038110615aff57600080fd5b600960c052602060c020015460005260206000f350005b635409491a6000511415615b3257600a5460005260206000f350005b63b4b577ad6000511415615b4e57600b5460005260206000f350005b632081066c6000511415615b6a57600c5460005260206000f350005b63140522886000511415615b8657600d5460005260206000f350005b63405e28f86000511415615ba257600e5460005260206000f350005b63e0a0b5866000511415615bbe57600f5460005260206000f350005b6358680d0b6000511415615bda5760105460005260206000f350005b63e38244626000511415615bf65760115460005260206000f350005b631ec0cdc16000511415615c125760125460005260206000f350005b5b60006000fd

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

0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a0000000000000000000000001c48f86ae57291f7686349f12601910bd8d470bb0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e49000000000000000000000000097e2768e8e73511ca874545dc5ff8067eb19b787000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c700000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0x7EeAC6CDdbd1D0B8aF061742D41877D7F707289a
Arg [1] : _coins (address[2]): 0x1c48f86ae57291F7686349F12601910BD8D470bb,0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490
Arg [2] : _pool_token (address): 0x97E2768e8E73511cA874545DC5Ff8067eB19B787
Arg [3] : _base_pool (address): 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7
Arg [4] : _A (uint256): 200
Arg [5] : _fee (uint256): 4000000
Arg [6] : _admin_fee (uint256): 0

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a
Arg [1] : 0000000000000000000000001c48f86ae57291f7686349f12601910bd8d470bb
Arg [2] : 0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e490
Arg [3] : 00000000000000000000000097e2768e8e73511ca874545dc5ff8067eb19b787
Arg [4] : 000000000000000000000000bebc44782c7db0a1a60cb6fe97d0b483032ff1c7
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.