ETH Price: $2,524.26 (+0.04%)

Contract

0xbCDa9E0658f4eECF56A0bd099e6DBc0C91f6A8c2
 
Transaction Hash
Method
Block
From
To
Approve206020162024-08-25 0:25:356 days ago1724545535IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000042250.91448031
Approve205711852024-08-20 16:59:5910 days ago1724173199IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000068592.82718375
Approve203001752024-07-13 21:09:2348 days ago1720904963IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000064321.39214092
Approve202992432024-07-13 18:02:2348 days ago1720893743IN
0xbCDa9E06...C91f6A8c2
0 ETH0.00006792.79903129
Approve202992202024-07-13 17:57:4748 days ago1720893467IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000114232.4720831
Approve201819732024-06-27 8:56:5964 days ago1719478619IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000144235.94518121
Approve201256222024-06-19 11:55:2372 days ago1718798123IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000228174.93662336
Approve201004572024-06-15 23:25:4776 days ago1718493947IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000130172.80046286
Approve198659102024-05-14 4:37:23108 days ago1715661443IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000112634.64269887
Approve198658802024-05-14 4:31:11108 days ago1715661071IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000109643.76676693
Approve198658672024-05-14 4:28:35108 days ago1715660915IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000158253.42469731
Approve197400592024-04-26 14:15:47126 days ago1714140947IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0005751412.35675111
Transfer197324232024-04-25 12:36:47127 days ago1714048607IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0006014511.76433248
Approve197245682024-04-24 10:13:11128 days ago1713953591IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000637513.79253067
Approve197236492024-04-24 7:08:11128 days ago1713942491IN
0xbCDa9E06...C91f6A8c2
0 ETH0.000458669.92581667
Approve197202602024-04-23 19:44:11129 days ago1713901451IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0008094117.51193582
Approve196299362024-04-11 4:14:59141 days ago1712808899IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0003470214.30362706
Transfer195558762024-03-31 19:15:11152 days ago1711912511IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0013252823.69759545
Approve195420632024-03-29 20:35:11154 days ago1711744511IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0014422131.21067296
Approve195350342024-03-28 20:55:35155 days ago1711659335IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0014478231.32406675
Approve194895762024-03-22 10:29:35161 days ago1711103375IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0011305624.46003158
Approve194794952024-03-21 0:30:59163 days ago1710981059IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0014386230.90835498
Approve194794822024-03-21 0:28:23163 days ago1710980903IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0013950529.97224088
Approve194794702024-03-21 0:25:59163 days ago1710980759IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0012894527.70343329
Approve194712132024-03-19 20:36:47164 days ago1710880607IN
0xbCDa9E06...C91f6A8c2
0 ETH0.0016513735.72780688
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SushiswapV2SingleSidedILProtection

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-11
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface Oracle {
    function getPriceUSD(address reserve) external view returns (uint);
}

interface ISushiswapV2Factory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface ISushiswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function sync() external;
}

library SushiswapV2Library {
    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'SushiswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'SushiswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint160(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
            )))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISushiswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'SushiswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SushiswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA * reserveB / reserveA;
    }
}

contract SushiswapV2SingleSidedILProtection {
    using SafeERC20 for IERC20;

    /// @notice EIP-20 token name for this token
    string public constant name = "SushiswapV2 IL Protection";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "sil";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 8;

    /// @notice Total number of tokens in circulation
    uint public totalSupply = 0;

    mapping(address => mapping (address => uint)) internal allowances;
    mapping(address => uint) internal balances;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint chainId,address verifyingContract)");
    bytes32 public immutable DOMAINSEPARATOR;

    /// @notice The EIP-712 typehash for the permit struct used by the contract
    bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint value,uint nonce,uint deadline)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint amount);
    
    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint amount);

    // Oracle used for price debt data (external to the AMM balance to avoid internal manipulation)
    Oracle public constant LINK = Oracle(0x271bf4568fb737cc2e6277e9B1EE0034098cDA2a);
    ISushiswapV2Factory public constant FACTORY = ISushiswapV2Factory(0xC0AEe478e3658e2610c5F7A4A2E1777cE9e4f2Ac);
    address public constant WYFI = address(0x017E71e96f2Ae777C679740d2D8Dc15Ed4231981);
    address public immutable PAIR;
    
    uint public constant FEE = 500;
    
    
    // user => token => borrowed
    mapping (address => mapping(address => uint)) public borrowed;
    // user => token => lp
    mapping (address => mapping(address => uint)) public lp;
    
    address[] private _markets;
    mapping (address => bool) pairs;
    
    event Deposit(address indexed owner, address indexed lp, uint amountIn, uint minted);
    event Withdraw(address indexed owner, address indexed lp, uint burned, uint amountOut);
    
    constructor () {
        DOMAINSEPARATOR = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _getChainId(), address(this)));
        PAIR = FACTORY.createPair(address(this), WYFI);
    }
    
    function markets() external view returns (address[] memory) {
        return _markets;
    }
    
    function _mint(address dst, uint amount) internal {
        // mint the amount
        totalSupply += amount;
        // transfer the amount to the recipient
        balances[dst] += amount;
        emit Transfer(address(0), dst, amount);
    }
    
    function _burn(address dst, uint amount) internal {
        // burn the amount
        totalSupply -= amount;
        // transfer the amount from the recipient
        balances[dst] -= amount;
        emit Transfer(dst, address(0), amount);
    }
    
    function depositAll(IERC20 token, uint minLiquidity) external {
        _deposit(token, token.balanceOf(msg.sender), minLiquidity);
    }
    
    function deposit(IERC20 token, uint amount, uint minLiquidity) external {
        _deposit(token, amount, minLiquidity);
    }
    
    function _addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired) internal returns (address pair, uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        pair = FACTORY.getPair(tokenA, tokenB);
        if (pair == address(0)) {
            pair = FACTORY.createPair(tokenA, tokenB);
            pairs[pair] = true;
            _markets.push(tokenA);
        } else if (!pairs[pair]) {
            pairs[pair] = true;
            _markets.push(tokenA);
        }
        
        (uint reserveA, uint reserveB) = SushiswapV2Library.getReserves(address(FACTORY), tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SushiswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SushiswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    
    function pairFor(address token) public view returns (address) {
        return FACTORY.getPair(token, address(this));
    }
    
    function underlyingBalanceOf(address owner, address token) external view returns (uint) {
        address _pair = pairFor(token);
        uint _balance = IERC20(token).balanceOf(_pair);
        return _balance * lp[owner][token] / IERC20(_pair).totalSupply();
    }
    
    function getPriceOracle(address token) public view returns (uint) {
        return LINK.getPriceUSD(address(token));
    }
    
    function _deposit(IERC20 token, uint amount, uint minLiquidity) internal {
        uint _price = LINK.getPriceUSD(address(token));
        uint _value = _price * amount / uint(10)**token.decimals();
        require(_value > 0, "!value");
        
        (address _pair, uint amountA, uint amountB) = _addLiquidity(address(token), address(this), amount, _value);
        
        token.safeTransferFrom(msg.sender, _pair, amountA);
        
        _value = _price * amountA / uint(10)**token.decimals();
        require(amountB <= _value, "invalid oracle feed");
        
        _mint(_pair, amountB);
        borrowed[msg.sender][address(token)] += amountB;
        
        uint _liquidity = ISushiswapV2Pair(_pair).mint(address(this));
        require(_liquidity >= minLiquidity, "insufficient output liquidity");
        lp[msg.sender][address(token)] += _liquidity;
        
        emit Deposit(msg.sender, address(token), amountA, amountB);
    }
    
    function withdrawAll(IERC20 token, uint maxSettle) external {
        _withdraw(token, IERC20(address(this)).balanceOf(msg.sender), maxSettle);
    }
    
    function withdraw(IERC20 token, uint amount, uint maxSettle) external {
        _withdraw(token, amount, maxSettle);
    }
    
    function shortFall(IERC20 token, address owner, uint amount) public view returns (uint) {
        uint _lp = lp[owner][address(token)];
        uint _borrowed = borrowed[owner][address(token)];
        
        if (_lp < amount) {
            amount = _lp;
        }
        
        _borrowed = _borrowed * amount / _lp;
        address _pair = FACTORY.getPair(address(token), address(this));
        
        uint _returned = balances[_pair] * amount / IERC20(_pair).totalSupply();
        if (_returned < _borrowed) {
            return _borrowed - _returned;
        } else {
            return 0;
        }
    }
    
    function shortFallInToken(IERC20 token, address owner, uint amount) external view returns (uint) {
        uint _shortfall = shortFall(token, owner, amount);
        if (_shortfall > 0) {
            address _pair = FACTORY.getPair(address(token), address(this));
            (uint reserveA, uint reserveB,) = ISushiswapV2Pair(_pair).getReserves();
            (address token0,) = SushiswapV2Library.sortTokens(address(token), address(this));
            (reserveA, reserveB) = address(token) == token0 ? (reserveA, reserveB) : (reserveB, reserveA);
            return _getAmountIn(reserveA, reserveB, _shortfall);
        } else {
            return 0;
        }
        
    }
    
    function profit(IERC20 token, address owner, uint amount) external view returns (uint) {
        uint _lp = lp[owner][address(token)];
        uint _borrowed = borrowed[owner][address(token)];
        
        if (_lp < amount) {
            amount = _lp;
        }
        
        _borrowed = _borrowed * amount / _lp;
        address _pair = FACTORY.getPair(address(token), address(this));
        
        uint _returned = balances[_pair] * amount / IERC20(_pair).totalSupply();
        if (_returned > _borrowed) {
            return _returned - _borrowed;
        } else {
            return 0;
        }
    }
    
    function _getAmountIn(uint reserveA, uint reserveB, uint amountOut) internal pure returns (uint) {
        uint numerator = reserveA * amountOut * 1000;
        uint denominator = (reserveB - amountOut) * 997;
        return (numerator / denominator) + 1;
    }
    
    function _settle(IERC20 token, address token0, address pair, uint amountA, uint amountB, uint debt, uint maxSettle) internal returns (uint, uint) {
        if (balances[msg.sender]+amountB < debt) {
            uint _shortfall = debt - (balances[msg.sender]+amountB);
            
            (uint reserveA, uint reserveB,) = ISushiswapV2Pair(pair).getReserves();
            (reserveA, reserveB) = address(token) == token0 ? (reserveA, reserveB) : (reserveB, reserveA);
            
            uint amountIn = _getAmountIn(reserveA, reserveB, _shortfall);
            
            require(amountIn <= amountA && amountIn <= maxSettle, 'ADDITIONAL_SETTLEMENT_REQUIRED');
            token.safeTransfer(pair, amountIn);
            (uint amount0Out, uint amount1Out) = address(token) == token0 ? (uint(0), _shortfall) : (_shortfall, uint(0));
            ISushiswapV2Pair(pair).swap(amount0Out, amount1Out, address(this), new bytes(0));
            amountA -= amountIn;
            amountB += _shortfall;
        }
        return (amountA, amountB);
    }
    
    function _unwrap(address pair, IERC20 token, uint burned, uint debt, uint maxSettle) internal returns (uint, uint) {
        IERC20(pair).safeTransfer(pair, burned); // send liquidity to pair
        (uint amountA, uint amountB) = ISushiswapV2Pair(pair).burn(address(this));
        (address token0,) = SushiswapV2Library.sortTokens(address(token), address(this));
        (amountA, amountB) = address(token) == token0 ? (amountA, amountB) : (amountB, amountA);
        return _settle(token, token0, pair, amountA, amountB, debt, maxSettle);
    }
    
    function _withdraw(IERC20 token, uint amount, uint maxSettle) internal {
        uint _lp = lp[msg.sender][address(token)];
        uint _borrowed = borrowed[msg.sender][address(token)];
        
        if (_lp < amount) {
            amount = _lp;
        }
        
        // Calculate % of collateral to release
        _borrowed = _borrowed * amount / _lp;
        address _pair = FACTORY.getPair(address(token), address(this));
        
        (uint amountA, uint amountB) = _unwrap(_pair, token, amount, _borrowed, maxSettle);
        
        lp[msg.sender][address(token)] -= amount;
        borrowed[msg.sender][address(token)] -= _borrowed;
        
        token.safeTransfer(msg.sender, amountA);
        _transferTokens(address(this), msg.sender, amountB);
        _burn(msg.sender, _borrowed);
        
        emit Withdraw(msg.sender, address(token), amount, amountB);
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender, uint amount) external returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Triggers an approval from owner to spends
     * @param owner The address to approve from
     * @param spender The address to be approved
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @param deadline The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function permit(address owner, address spender, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", DOMAINSEPARATOR, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "permit: signature");
        require(signatory == owner, "permit: unauthorized");
        require(block.timestamp <= deadline, "permit: expired");

        allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint amount) external returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint amount) external returns (bool) {
        address spender = msg.sender;
        uint spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != type(uint).max) {
            uint newAllowance = spenderAllowance - amount;
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint amount) internal {
        balances[src] -= amount;
        balances[dst] += amount;
        
        emit Transfer(src, dst, amount);
                
        if ((pairs[src] && dst != address(this))||(pairs[dst] && src != address(this))) {
            _transferTokens(dst, PAIR, amount / FEE);
            ISushiswapV2Pair(PAIR).sync();
        }
    }

    function _getChainId() internal view returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minted","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"lp","type":"address"},{"indexed":false,"internalType":"uint256","name":"burned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAINSEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FACTORY","outputs":[{"internalType":"contract ISushiswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LINK","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAIR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WYFI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"borrowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getPriceOracle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"markets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"profit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"shortFall","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"shortFallInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"underlyingBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxSettle","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"maxSettle","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600080553480156200001557600080fd5b5060408051808201909152601981527f537573686973776170563220494c2050726f74656374696f6e000000000000006020909101527f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f357fd52701e93fa43bbb5f607847cc7d563c29d529898952566240f8a221f03decf36200009762000181565b30604051602001620000ad9493929190620001cf565b60408051601f198184030181529082905280516020909101206080526364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c65396906200011590309073017e71e96f2ae777c679740d2d8dc15ed423198190600401620001b5565b602060405180830381600087803b1580156200013057600080fd5b505af115801562000145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016b919062000185565b60601b6001600160601b03191660a052620001f3565b4690565b60006020828403121562000197578081fd5b81516001600160a01b0381168114620001ae578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60805160a05160601c612e506200023160003960008181610b41015281816116c401526116f60152600081816105680152610e3b0152612e506000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063bc3f811c116100a2578063d505accf11610071578063d505accf146103d3578063dd62ed3e146103e6578063f4e5138f146103f9578063fd67de801461040c576101f0565b8063bc3f811c14610392578063c57981b5146103a5578063cb1dd450146103ad578063cc6dbc27146103c0576101f0565b8063a9059cbb116100de578063a9059cbb14610351578063ace3a8a714610364578063b0a02abe1461036c578063b5c5f6721461037f576101f0565b806370a082311461031b578063718a37661461032e5780637ecebe001461033657806395d89b4114610349576101f0565b806323b872dd1161018757806330adf81f1161015657806330adf81f146102d6578063313ce567146102de5780633ac2a032146102f357806367e1083b14610308576101f0565b806323b872dd1461029557806323f61333146102a85780632b7746f1146102bb5780632dd31000146102ce576101f0565b80631778e29c116101c35780631778e29c1461026857806318160ddd1461027d5780631b6b6d231461028557806320606b701461028d576101f0565b806306fdde03146101f5578063095ea7b3146102135780630afa3da5146102335780630efe6a8b14610253575b600080fd5b6101fd61041f565b60405161020a91906128c7565b60405180910390f35b6102266102213660046125ad565b610458565b60405161020a9190612861565b610246610241366004612488565b6104c2565b60405161020a91906127a9565b61026661026136600461260c565b610556565b005b610270610566565b60405161020a919061286c565b61027061058a565b610246610590565b6102706105a8565b6102266102a33660046124f8565b6105cc565b6102706102b63660046125f8565b61069a565b6102706102c9366004612488565b610856565b6102466108e0565b6102706108f8565b6102e661091c565b60405161020a9190612c15565b6102fb610921565b60405161020a9190612814565b6102706103163660046124c0565b610983565b610270610329366004612488565b610ac5565b610246610ae0565b610270610344366004612488565b610af8565b6101fd610b0a565b61022661035f3660046125ad565b610b29565b610246610b3f565b61027061037a3660046124c0565b610b63565b61026661038d36600461260c565b610b80565b6102706103a03660046124c0565b610b8b565b610270610ba8565b6102706103bb3660046125f8565b610bae565b6102666103ce3660046125ad565b610d35565b6102666103e1366004612538565b610db8565b6102706103f43660046124c0565b610fc7565b6102666104073660046125ad565b610ff2565b61027061041a3660046125f8565b611078565b6040518060400160405280601981526020017f537573686973776170563220494c2050726f74656374696f6e0000000000000081525081565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104b190869061286c565b60405180910390a350600192915050565b60405163e6a4390560e01b815260009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a43905906104fe90859030906004016127bd565b60206040518083038186803b15801561051657600080fd5b505afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e91906124a4565b90505b919050565b61056183838361121c565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b03831660008181526001602090815260408083203380855292528220549192909190821480159061060657506000198114155b156106815760006106178583612d8e565b6001600160a01b03808916600081815260016020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061067790859061286c565b60405180910390a3505b61068c8686866115aa565b6001925050505b9392505050565b6001600160a01b038083166000818152600560209081526040808320948816808452948252808320549383526004825280832094835293905291822054838210156106e3578193505b816106ee8583612d6f565b6106f89190612c3b565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590610737908a9030906004016127bd565b60206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078791906124a4565b90506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc919061268e565b6001600160a01b038316600090815260026020526040902054610820908890612d6f565b61082a9190612c3b565b9050828110156108495761083e8184612d8e565b945050505050610693565b6000945050505050610693565b604051635708447d60e01b815260009073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906108909085906004016127a9565b60206040518083038186803b1580156108a857600080fd5b505afa1580156108bc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061268e565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600680548060200260200160405190810160405280929190818152602001828054801561097957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161095b575b5050505050905090565b60008061098f836104c2565b90506000836001600160a01b03166370a08231836040518263ffffffff1660e01b81526004016109bf91906127a9565b60206040518083038186803b1580156109d757600080fd5b505afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f919061268e565b9050816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a4a57600080fd5b505afa158015610a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a82919061268e565b6001600160a01b03808716600090815260056020908152604080832093891683529290522054610ab29083612d6f565b610abc9190612c3b565b95945050505050565b6001600160a01b031660009081526002602052604090205490565b73017e71e96f2ae777c679740d2d8dc15ed423198181565b60036020526000908152604090205481565b604051806040016040528060038152602001621cda5b60ea1b81525081565b6000610b363384846115aa565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600460209081526000928352604080842090915290825290205481565b61056183838361176c565b600560209081526000928352604080842090915290825290205481565b6101f481565b600080610bbc85858561069a565b90508015610d2b5760405163e6a4390560e01b815260009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590610c0090899030906004016127bd565b60206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5091906124a4565b9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610c8e57600080fd5b505afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190612640565b506001600160701b031691506001600160701b031691506000610ce9893061195d565b509050806001600160a01b0316896001600160a01b031614610d0c578183610d0f565b82825b9093509150610d1f8383876119e7565b95505050505050610693565b6000915050610693565b6040516370a0823160e01b8152610db490839030906370a0823190610d5e9033906004016127a9565b60206040518083038186803b158015610d7657600080fd5b505afa158015610d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dae919061268e565b8361176c565b5050565b6001600160a01b038716600090815260036020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610e0583612dd1565b9190505589604051602001610e1f96959493929190612875565b60405160208183030381529060405280519060200120905060007f000000000000000000000000000000000000000000000000000000000000000082604051602001610e6c929190612738565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610ea994939291906128a9565b6020604051602081039080840390855afa158015610ecb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f075760405162461bcd60e51b8152600401610efe90612af7565b60405180910390fd5b896001600160a01b0316816001600160a01b031614610f385760405162461bcd60e51b8152600401610efe90612a4b565b86421115610f585760405162461bcd60e51b8152600401610efe906129ed565b6001600160a01b03808b166000818152600160209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fb3908c9061286c565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610db482836001600160a01b03166370a08231336040518263ffffffff1660e01b815260040161102291906127a9565b60206040518083038186803b15801561103a57600080fd5b505afa15801561104e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611072919061268e565b8361121c565b6001600160a01b038083166000818152600560209081526040808320948816808452948252808320549383526004825280832094835293905291822054838210156110c1578193505b816110cc8583612d6f565b6110d69190612c3b565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611115908a9030906004016127bd565b60206040518083038186803b15801561112d57600080fd5b505afa158015611141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116591906124a4565b90506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a257600080fd5b505afa1580156111b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111da919061268e565b6001600160a01b0383166000908152600260205260409020546111fe908890612d6f565b6112089190612c3b565b9050828111156108495761083e8382612d8e565b604051635708447d60e01b815260009073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906112569087906004016127a9565b60206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a6919061268e565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b919061268e565b61132690600a612ca1565b6113308584612d6f565b61133a9190612c3b565b90506000811161135c5760405162461bcd60e51b8152600401610efe90612998565b600080600061136d88308987611a3b565b919450925090506113896001600160a01b038916338585611d0a565b876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c257600080fd5b505afa1580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa919061268e565b61140590600a612ca1565b61140f8387612d6f565b6114199190612c3b565b93508381111561143b5760405162461bcd60e51b8152600401610efe9061296b565b6114458382611d68565b3360009081526004602090815260408083206001600160a01b038c16845290915281208054839290611478908490612c23565b90915550506040516335313c2160e11b81526000906001600160a01b03851690636a627842906114ac9030906004016127a9565b602060405180830381600087803b1580156114c657600080fd5b505af11580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe919061268e565b9050868110156115205760405162461bcd60e51b8152600401610efe90612ba3565b3360009081526005602090815260408083206001600160a01b038d16845290915281208054839290611553908490612c23565b90915550506040516001600160a01b038a169033907fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7906115979087908790612bda565b60405180910390a3505050505050505050565b6001600160a01b038316600090815260026020526040812080548392906115d2908490612d8e565b90915550506001600160a01b038216600090815260026020526040812080548392906115ff908490612c23565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611649919061286c565b60405180910390a36001600160a01b03831660009081526007602052604090205460ff16801561168257506001600160a01b0382163014155b806116b957506001600160a01b03821660009081526007602052604090205460ff1680156116b957506001600160a01b0383163014155b15610561576116f4827f00000000000000000000000000000000000000000000000000000000000000006116ef6101f485612c3b565b6115aa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561174f57600080fd5b505af1158015611763573d6000803e3d6000fd5b50505050505050565b3360008181526005602090815260408083206001600160a01b0388168085529083528184205494845260048352818420908452909152902054838210156117b1578193505b816117bc8583612d6f565b6117c69190612c3b565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a439059061180590899030906004016127bd565b60206040518083038186803b15801561181d57600080fd5b505afa158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906124a4565b9050600080611867838989878a611df5565b3360009081526005602090815260408083206001600160a01b038e16845290915281208054939550919350899261189f908490612d8e565b90915550503360009081526004602090815260408083206001600160a01b038c168452909152812080548692906118d7908490612d8e565b909155506118f190506001600160a01b0389163384611ee7565b6118fc3033836115aa565b6119063385611f06565b876001600160a01b0316336001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567898460405161194b929190612bda565b60405180910390a35050505050505050565b600080826001600160a01b0316846001600160a01b031614156119925760405162461bcd60e51b8152600401610efe90612924565b826001600160a01b0316846001600160a01b0316106119b25782846119b5565b83835b90925090506001600160a01b0382166119e05760405162461bcd60e51b8152600401610efe90612a16565b9250929050565b6000806119f48386612d6f565b611a00906103e8612d6f565b90506000611a0e8486612d8e565b611a1a906103e5612d6f565b9050611a268183612c3b565b611a31906001612c23565b9695505050505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611a7b908a908a906004016127bd565b60206040518083038186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acb91906124a4565b92506001600160a01b038316611bd8576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611b14908a908a906004016127bd565b602060405180830381600087803b158015611b2e57600080fd5b505af1158015611b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6691906124a4565b6001600160a01b0381811660009081526007602052604081208054600160ff1990911681179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916918a169190911790559250611c64565b6001600160a01b03831660009081526007602052604090205460ff16611c64576001600160a01b0383811660009081526007602052604081208054600160ff1990911681179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169189169190911790555b600080611c8673c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611f87565b91509150816000148015611c98575080155b15611ca857869350859250611cfe565b6000611cb5888484612060565b9050868111611cc957879450925082611cfc565b6000611cd6888486612060565b905088811115611cf657634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b611d62846323b872dd60e01b858585604051602401611d2b939291906127d7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526120ca565b50505050565b80600080828254611d799190612c23565b90915550506001600160a01b03821660009081526002602052604081208054839290611da6908490612c23565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611de990859061286c565b60405180910390a35050565b600080611e0c6001600160a01b0388168887611ee7565b600080886001600160a01b03166389afcb44306040518263ffffffff1660e01b8152600401611e3b91906127a9565b6040805180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8c91906126a6565b915091506000611e9c893061195d565b509050806001600160a01b0316896001600160a01b031614611ebf578183611ec2565b82825b9093509150611ed689828c86868c8c6121ae565b945094505050509550959350505050565b6105618363a9059cbb60e01b8484604051602401611d2b9291906127fb565b80600080828254611f179190612d8e565b90915550506001600160a01b03821660009081526002602052604081208054839290611f44908490612d8e565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611de990859061286c565b6000806000611f96858561195d565b509050600080611fa78888886123ca565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611fdf57600080fd5b505afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612640565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461204e578082612051565b81815b90999098509650505050505050565b60008084116120815760405162461bcd60e51b8152600401610efe90612a79565b6000831180156120915750600082115b6120ad5760405162461bcd60e51b8152600401610efe906128da565b826120b88386612d6f565b6120c29190612c3b565b949350505050565b6120dc826001600160a01b031661243a565b6120f85760405162461bcd60e51b8152600401610efe90612b6c565b600080836001600160a01b031683604051612113919061271c565b6000604051808303816000865af19150503d8060008114612150576040519150601f19603f3d011682016040523d82523d6000602084013e612155565b606091505b5091509150816121775760405162461bcd60e51b8152600401610efe906129b8565b805115611d62578080602001905181019061219291906125d8565b611d625760405162461bcd60e51b8152600401610efe90612b22565b33600090815260026020526040812054819084906121cd908790612c23565b10156123bb57336000908152600260205260408120546121ee908790612c23565b6121f89086612d8e565b9050600080896001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561223657600080fd5b505afa15801561224a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226e9190612640565b506001600160701b031691506001600160701b031691508a6001600160a01b03168c6001600160a01b0316146122a55780826122a8565b81815b909250905060006122ba8383866119e7565b90508981111580156122cc5750868111155b6122e85760405162461bcd60e51b8152600401610efe90612ac0565b6122fc6001600160a01b038e168c83611ee7565b6000808d6001600160a01b03168f6001600160a01b03161461232057856000612324565b6000865b6040805160008152602081019182905263022c0d9f60e01b90915291935091506001600160a01b038e169063022c0d9f906123689085908590309060248101612be8565b600060405180830381600087803b15801561238257600080fd5b505af1158015612396573d6000803e3d6000fd5b50505050828c6123a69190612d8e565b9b506123b2868c612c23565b9a505050505050505b50939792965091945050505050565b60008060006123d9858561195d565b915091508582826040516020016123f19291906126f5565b60405160208183030381529060405280519060200120604051602001612418929190612753565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906120c25750141592915050565b80516001600160701b038116811461055157600080fd5b600060208284031215612499578081fd5b813561069381612e02565b6000602082840312156124b5578081fd5b815161069381612e02565b600080604083850312156124d2578081fd5b82356124dd81612e02565b915060208301356124ed81612e02565b809150509250929050565b60008060006060848603121561250c578081fd5b833561251781612e02565b9250602084013561252781612e02565b929592945050506040919091013590565b600080600080600080600060e0888a031215612552578283fd5b873561255d81612e02565b9650602088013561256d81612e02565b95506040880135945060608801359350608088013560ff81168114612590578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156125bf578182fd5b82356125ca81612e02565b946020939093013593505050565b6000602082840312156125e9578081fd5b81518015158114610693578182fd5b60008060006060848603121561250c578283fd5b600080600060608486031215612620578283fd5b833561262b81612e02565b95602085013595506040909401359392505050565b600080600060608486031215612654578283fd5b61265d84612471565b925061266b60208501612471565b9150604084015163ffffffff81168114612683578182fd5b809150509250925092565b60006020828403121561269f578081fd5b5051919050565b600080604083850312156126b8578182fd5b505080516020909101519092909150565b600081518084526126e1816020860160208601612da5565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b6000825161272e818460208701612da5565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156128555783516001600160a01b031683529284019291840191600101612830565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261069360208301846126c9565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252601390820152721a5b9d985b1a59081bdc9858db194819995959606a1b604082015260600190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601e908201527f4144444954494f4e414c5f534554544c454d454e545f52455155495245440000604082015260600190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b6020808252601d908201527f696e73756666696369656e74206f7574707574206c6971756964697479000000604082015260600190565b918252602082015260400190565b600085825284602083015260018060a01b038416604083015260806060830152611a3160808301846126c9565b60ff91909116815260200190565b60008219821115612c3657612c36612dec565b500190565b600082612c5657634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611612c6d5750612c98565b818704821115612c7f57612c7f612dec565b80861615612c8c57918102915b9490941c938002612c5e565b94509492505050565b60006106936000198484600082612cba57506001610693565b81612cc757506000610693565b8160018114612cdd5760028114612ce757612d14565b6001915050610693565b60ff841115612cf857612cf8612dec565b6001841b915084821115612d0e57612d0e612dec565b50610693565b5060208310610133831016604e8410600b8410161715612d47575081810a83811115612d4257612d42612dec565b610693565b612d548484846001612c5b565b808604821115612d6657612d66612dec565b02949350505050565b6000816000190483118215151615612d8957612d89612dec565b500290565b600082821015612da057612da0612dec565b500390565b60005b83811015612dc0578181015183820152602001612da8565b83811115611d625750506000910152565b6000600019821415612de557612de5612dec565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612e1757600080fd5b5056fea264697066735822122055cfce15b89a60aa321a8b3458a2b235d076e417760472a740db7f72462eb86c64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063bc3f811c116100a2578063d505accf11610071578063d505accf146103d3578063dd62ed3e146103e6578063f4e5138f146103f9578063fd67de801461040c576101f0565b8063bc3f811c14610392578063c57981b5146103a5578063cb1dd450146103ad578063cc6dbc27146103c0576101f0565b8063a9059cbb116100de578063a9059cbb14610351578063ace3a8a714610364578063b0a02abe1461036c578063b5c5f6721461037f576101f0565b806370a082311461031b578063718a37661461032e5780637ecebe001461033657806395d89b4114610349576101f0565b806323b872dd1161018757806330adf81f1161015657806330adf81f146102d6578063313ce567146102de5780633ac2a032146102f357806367e1083b14610308576101f0565b806323b872dd1461029557806323f61333146102a85780632b7746f1146102bb5780632dd31000146102ce576101f0565b80631778e29c116101c35780631778e29c1461026857806318160ddd1461027d5780631b6b6d231461028557806320606b701461028d576101f0565b806306fdde03146101f5578063095ea7b3146102135780630afa3da5146102335780630efe6a8b14610253575b600080fd5b6101fd61041f565b60405161020a91906128c7565b60405180910390f35b6102266102213660046125ad565b610458565b60405161020a9190612861565b610246610241366004612488565b6104c2565b60405161020a91906127a9565b61026661026136600461260c565b610556565b005b610270610566565b60405161020a919061286c565b61027061058a565b610246610590565b6102706105a8565b6102266102a33660046124f8565b6105cc565b6102706102b63660046125f8565b61069a565b6102706102c9366004612488565b610856565b6102466108e0565b6102706108f8565b6102e661091c565b60405161020a9190612c15565b6102fb610921565b60405161020a9190612814565b6102706103163660046124c0565b610983565b610270610329366004612488565b610ac5565b610246610ae0565b610270610344366004612488565b610af8565b6101fd610b0a565b61022661035f3660046125ad565b610b29565b610246610b3f565b61027061037a3660046124c0565b610b63565b61026661038d36600461260c565b610b80565b6102706103a03660046124c0565b610b8b565b610270610ba8565b6102706103bb3660046125f8565b610bae565b6102666103ce3660046125ad565b610d35565b6102666103e1366004612538565b610db8565b6102706103f43660046124c0565b610fc7565b6102666104073660046125ad565b610ff2565b61027061041a3660046125f8565b611078565b6040518060400160405280601981526020017f537573686973776170563220494c2050726f74656374696f6e0000000000000081525081565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104b190869061286c565b60405180910390a350600192915050565b60405163e6a4390560e01b815260009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a43905906104fe90859030906004016127bd565b60206040518083038186803b15801561051657600080fd5b505afa15801561052a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e91906124a4565b90505b919050565b61056183838361121c565b505050565b7f6b03be8c3fdb53fcf0ce81fc3577c7d3e0b96d20c0fdc739d5c6ec5a9a910ff681565b60005481565b73271bf4568fb737cc2e6277e9b1ee0034098cda2a81565b7f797cfab58fcb15f590eb8e4252d5c228ff88f94f907e119e80c4393a946e8f3581565b6001600160a01b03831660008181526001602090815260408083203380855292528220549192909190821480159061060657506000198114155b156106815760006106178583612d8e565b6001600160a01b03808916600081815260016020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061067790859061286c565b60405180910390a3505b61068c8686866115aa565b6001925050505b9392505050565b6001600160a01b038083166000818152600560209081526040808320948816808452948252808320549383526004825280832094835293905291822054838210156106e3578193505b816106ee8583612d6f565b6106f89190612c3b565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590610737908a9030906004016127bd565b60206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078791906124a4565b90506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107c457600080fd5b505afa1580156107d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fc919061268e565b6001600160a01b038316600090815260026020526040902054610820908890612d6f565b61082a9190612c3b565b9050828110156108495761083e8184612d8e565b945050505050610693565b6000945050505050610693565b604051635708447d60e01b815260009073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906108909085906004016127a9565b60206040518083038186803b1580156108a857600080fd5b505afa1580156108bc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054e919061268e565b73c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac81565b7f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e981565b600881565b6060600680548060200260200160405190810160405280929190818152602001828054801561097957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161095b575b5050505050905090565b60008061098f836104c2565b90506000836001600160a01b03166370a08231836040518263ffffffff1660e01b81526004016109bf91906127a9565b60206040518083038186803b1580156109d757600080fd5b505afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f919061268e565b9050816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a4a57600080fd5b505afa158015610a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a82919061268e565b6001600160a01b03808716600090815260056020908152604080832093891683529290522054610ab29083612d6f565b610abc9190612c3b565b95945050505050565b6001600160a01b031660009081526002602052604090205490565b73017e71e96f2ae777c679740d2d8dc15ed423198181565b60036020526000908152604090205481565b604051806040016040528060038152602001621cda5b60ea1b81525081565b6000610b363384846115aa565b50600192915050565b7f00000000000000000000000051f50ae3709292adccc33b922df73f79ef0e72ff81565b600460209081526000928352604080842090915290825290205481565b61056183838361176c565b600560209081526000928352604080842090915290825290205481565b6101f481565b600080610bbc85858561069a565b90508015610d2b5760405163e6a4390560e01b815260009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590610c0090899030906004016127bd565b60206040518083038186803b158015610c1857600080fd5b505afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5091906124a4565b9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610c8e57600080fd5b505afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190612640565b506001600160701b031691506001600160701b031691506000610ce9893061195d565b509050806001600160a01b0316896001600160a01b031614610d0c578183610d0f565b82825b9093509150610d1f8383876119e7565b95505050505050610693565b6000915050610693565b6040516370a0823160e01b8152610db490839030906370a0823190610d5e9033906004016127a9565b60206040518083038186803b158015610d7657600080fd5b505afa158015610d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dae919061268e565b8361176c565b5050565b6001600160a01b038716600090815260036020526040812080547f5fae9ec55a1e547936e0e74d606b44cd5f912f9adcd0bba561fea62d570259e9918a918a918a919086610e0583612dd1565b9190505589604051602001610e1f96959493929190612875565b60405160208183030381529060405280519060200120905060007f6b03be8c3fdb53fcf0ce81fc3577c7d3e0b96d20c0fdc739d5c6ec5a9a910ff682604051602001610e6c929190612738565b604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051610ea994939291906128a9565b6020604051602081039080840390855afa158015610ecb573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f075760405162461bcd60e51b8152600401610efe90612af7565b60405180910390fd5b896001600160a01b0316816001600160a01b031614610f385760405162461bcd60e51b8152600401610efe90612a4b565b86421115610f585760405162461bcd60e51b8152600401610efe906129ed565b6001600160a01b03808b166000818152600160209081526040808320948e1680845294909152908190208b9055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fb3908c9061286c565b60405180910390a350505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610db482836001600160a01b03166370a08231336040518263ffffffff1660e01b815260040161102291906127a9565b60206040518083038186803b15801561103a57600080fd5b505afa15801561104e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611072919061268e565b8361121c565b6001600160a01b038083166000818152600560209081526040808320948816808452948252808320549383526004825280832094835293905291822054838210156110c1578193505b816110cc8583612d6f565b6110d69190612c3b565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611115908a9030906004016127bd565b60206040518083038186803b15801561112d57600080fd5b505afa158015611141573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116591906124a4565b90506000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a257600080fd5b505afa1580156111b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111da919061268e565b6001600160a01b0383166000908152600260205260409020546111fe908890612d6f565b6112089190612c3b565b9050828111156108495761083e8382612d8e565b604051635708447d60e01b815260009073271bf4568fb737cc2e6277e9b1ee0034098cda2a90635708447d906112569087906004016127a9565b60206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a6919061268e565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b919061268e565b61132690600a612ca1565b6113308584612d6f565b61133a9190612c3b565b90506000811161135c5760405162461bcd60e51b8152600401610efe90612998565b600080600061136d88308987611a3b565b919450925090506113896001600160a01b038916338585611d0a565b876001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c257600080fd5b505afa1580156113d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113fa919061268e565b61140590600a612ca1565b61140f8387612d6f565b6114199190612c3b565b93508381111561143b5760405162461bcd60e51b8152600401610efe9061296b565b6114458382611d68565b3360009081526004602090815260408083206001600160a01b038c16845290915281208054839290611478908490612c23565b90915550506040516335313c2160e11b81526000906001600160a01b03851690636a627842906114ac9030906004016127a9565b602060405180830381600087803b1580156114c657600080fd5b505af11580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe919061268e565b9050868110156115205760405162461bcd60e51b8152600401610efe90612ba3565b3360009081526005602090815260408083206001600160a01b038d16845290915281208054839290611553908490612c23565b90915550506040516001600160a01b038a169033907fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7906115979087908790612bda565b60405180910390a3505050505050505050565b6001600160a01b038316600090815260026020526040812080548392906115d2908490612d8e565b90915550506001600160a01b038216600090815260026020526040812080548392906115ff908490612c23565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611649919061286c565b60405180910390a36001600160a01b03831660009081526007602052604090205460ff16801561168257506001600160a01b0382163014155b806116b957506001600160a01b03821660009081526007602052604090205460ff1680156116b957506001600160a01b0383163014155b15610561576116f4827f00000000000000000000000051f50ae3709292adccc33b922df73f79ef0e72ff6116ef6101f485612c3b565b6115aa565b7f00000000000000000000000051f50ae3709292adccc33b922df73f79ef0e72ff6001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561174f57600080fd5b505af1158015611763573d6000803e3d6000fd5b50505050505050565b3360008181526005602090815260408083206001600160a01b0388168085529083528184205494845260048352818420908452909152902054838210156117b1578193505b816117bc8583612d6f565b6117c69190612c3b565b60405163e6a4390560e01b815290915060009073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a439059061180590899030906004016127bd565b60206040518083038186803b15801561181d57600080fd5b505afa158015611831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185591906124a4565b9050600080611867838989878a611df5565b3360009081526005602090815260408083206001600160a01b038e16845290915281208054939550919350899261189f908490612d8e565b90915550503360009081526004602090815260408083206001600160a01b038c168452909152812080548692906118d7908490612d8e565b909155506118f190506001600160a01b0389163384611ee7565b6118fc3033836115aa565b6119063385611f06565b876001600160a01b0316336001600160a01b03167ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567898460405161194b929190612bda565b60405180910390a35050505050505050565b600080826001600160a01b0316846001600160a01b031614156119925760405162461bcd60e51b8152600401610efe90612924565b826001600160a01b0316846001600160a01b0316106119b25782846119b5565b83835b90925090506001600160a01b0382166119e05760405162461bcd60e51b8152600401610efe90612a16565b9250929050565b6000806119f48386612d6f565b611a00906103e8612d6f565b90506000611a0e8486612d8e565b611a1a906103e5612d6f565b9050611a268183612c3b565b611a31906001612c23565b9695505050505050565b60405163e6a4390560e01b81526000908190819073c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063e6a4390590611a7b908a908a906004016127bd565b60206040518083038186803b158015611a9357600080fd5b505afa158015611aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acb91906124a4565b92506001600160a01b038316611bd8576040516364e329cb60e11b815273c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac9063c9c6539690611b14908a908a906004016127bd565b602060405180830381600087803b158015611b2e57600080fd5b505af1158015611b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6691906124a4565b6001600160a01b0381811660009081526007602052604081208054600160ff1990911681179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916918a169190911790559250611c64565b6001600160a01b03831660009081526007602052604090205460ff16611c64576001600160a01b0383811660009081526007602052604081208054600160ff1990911681179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169189169190911790555b600080611c8673c0aee478e3658e2610c5f7a4a2e1777ce9e4f2ac8a8a611f87565b91509150816000148015611c98575080155b15611ca857869350859250611cfe565b6000611cb5888484612060565b9050868111611cc957879450925082611cfc565b6000611cd6888486612060565b905088811115611cf657634e487b7160e01b600052600160045260246000fd5b94508693505b505b50509450945094915050565b611d62846323b872dd60e01b858585604051602401611d2b939291906127d7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526120ca565b50505050565b80600080828254611d799190612c23565b90915550506001600160a01b03821660009081526002602052604081208054839290611da6908490612c23565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611de990859061286c565b60405180910390a35050565b600080611e0c6001600160a01b0388168887611ee7565b600080886001600160a01b03166389afcb44306040518263ffffffff1660e01b8152600401611e3b91906127a9565b6040805180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8c91906126a6565b915091506000611e9c893061195d565b509050806001600160a01b0316896001600160a01b031614611ebf578183611ec2565b82825b9093509150611ed689828c86868c8c6121ae565b945094505050509550959350505050565b6105618363a9059cbb60e01b8484604051602401611d2b9291906127fb565b80600080828254611f179190612d8e565b90915550506001600160a01b03821660009081526002602052604081208054839290611f44908490612d8e565b90915550506040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611de990859061286c565b6000806000611f96858561195d565b509050600080611fa78888886123ca565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611fdf57600080fd5b505afa158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190612640565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461204e578082612051565b81815b90999098509650505050505050565b60008084116120815760405162461bcd60e51b8152600401610efe90612a79565b6000831180156120915750600082115b6120ad5760405162461bcd60e51b8152600401610efe906128da565b826120b88386612d6f565b6120c29190612c3b565b949350505050565b6120dc826001600160a01b031661243a565b6120f85760405162461bcd60e51b8152600401610efe90612b6c565b600080836001600160a01b031683604051612113919061271c565b6000604051808303816000865af19150503d8060008114612150576040519150601f19603f3d011682016040523d82523d6000602084013e612155565b606091505b5091509150816121775760405162461bcd60e51b8152600401610efe906129b8565b805115611d62578080602001905181019061219291906125d8565b611d625760405162461bcd60e51b8152600401610efe90612b22565b33600090815260026020526040812054819084906121cd908790612c23565b10156123bb57336000908152600260205260408120546121ee908790612c23565b6121f89086612d8e565b9050600080896001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561223657600080fd5b505afa15801561224a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226e9190612640565b506001600160701b031691506001600160701b031691508a6001600160a01b03168c6001600160a01b0316146122a55780826122a8565b81815b909250905060006122ba8383866119e7565b90508981111580156122cc5750868111155b6122e85760405162461bcd60e51b8152600401610efe90612ac0565b6122fc6001600160a01b038e168c83611ee7565b6000808d6001600160a01b03168f6001600160a01b03161461232057856000612324565b6000865b6040805160008152602081019182905263022c0d9f60e01b90915291935091506001600160a01b038e169063022c0d9f906123689085908590309060248101612be8565b600060405180830381600087803b15801561238257600080fd5b505af1158015612396573d6000803e3d6000fd5b50505050828c6123a69190612d8e565b9b506123b2868c612c23565b9a505050505050505b50939792965091945050505050565b60008060006123d9858561195d565b915091508582826040516020016123f19291906126f5565b60405160208183030381529060405280519060200120604051602001612418929190612753565b60408051601f1981840301815291905280516020909101209695505050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906120c25750141592915050565b80516001600160701b038116811461055157600080fd5b600060208284031215612499578081fd5b813561069381612e02565b6000602082840312156124b5578081fd5b815161069381612e02565b600080604083850312156124d2578081fd5b82356124dd81612e02565b915060208301356124ed81612e02565b809150509250929050565b60008060006060848603121561250c578081fd5b833561251781612e02565b9250602084013561252781612e02565b929592945050506040919091013590565b600080600080600080600060e0888a031215612552578283fd5b873561255d81612e02565b9650602088013561256d81612e02565b95506040880135945060608801359350608088013560ff81168114612590578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156125bf578182fd5b82356125ca81612e02565b946020939093013593505050565b6000602082840312156125e9578081fd5b81518015158114610693578182fd5b60008060006060848603121561250c578283fd5b600080600060608486031215612620578283fd5b833561262b81612e02565b95602085013595506040909401359392505050565b600080600060608486031215612654578283fd5b61265d84612471565b925061266b60208501612471565b9150604084015163ffffffff81168114612683578182fd5b809150509250925092565b60006020828403121561269f578081fd5b5051919050565b600080604083850312156126b8578182fd5b505080516020909101519092909150565b600081518084526126e1816020860160208601612da5565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606093841b811682529190921b16601482015260280190565b6000825161272e818460208701612da5565b9190910192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160f81b0319815260609290921b6bffffffffffffffffffffffff1916600183015260158201527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156128555783516001600160a01b031683529284019291840191600101612830565b50909695505050505050565b901515815260200190565b90815260200190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261069360208301846126c9565b6020808252602a908201527f53757368697377617056324c6962726172793a20494e53554646494349454e546040820152695f4c495155494449545960b01b606082015260800190565b60208082526027908201527f53757368697377617056324c6962726172793a204944454e544943414c5f41446040820152664452455353455360c81b606082015260800190565b6020808252601390820152721a5b9d985b1a59081bdc9858db194819995959606a1b604082015260600190565b6020808252600690820152652176616c756560d01b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252600f908201526e1c195c9b5a5d0e88195e1c1a5c9959608a1b604082015260600190565b6020808252818101527f53757368697377617056324c6962726172793a205a45524f5f41444452455353604082015260600190565b6020808252601490820152731c195c9b5a5d0e881d5b985d5d1a1bdc9a5e995960621b604082015260600190565b60208082526027908201527f53757368697377617056324c6962726172793a20494e53554646494349454e5460408201526617d05353d5539560ca1b606082015260800190565b6020808252601e908201527f4144444954494f4e414c5f534554544c454d454e545f52455155495245440000604082015260600190565b6020808252601190820152707065726d69743a207369676e617475726560781b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b6020808252601d908201527f696e73756666696369656e74206f7574707574206c6971756964697479000000604082015260600190565b918252602082015260400190565b600085825284602083015260018060a01b038416604083015260806060830152611a3160808301846126c9565b60ff91909116815260200190565b60008219821115612c3657612c36612dec565b500190565b600082612c5657634e487b7160e01b81526012600452602481fd5b500490565b80825b6001808611612c6d5750612c98565b818704821115612c7f57612c7f612dec565b80861615612c8c57918102915b9490941c938002612c5e565b94509492505050565b60006106936000198484600082612cba57506001610693565b81612cc757506000610693565b8160018114612cdd5760028114612ce757612d14565b6001915050610693565b60ff841115612cf857612cf8612dec565b6001841b915084821115612d0e57612d0e612dec565b50610693565b5060208310610133831016604e8410600b8410161715612d47575081810a83811115612d4257612d42612dec565b610693565b612d548484846001612c5b565b808604821115612d6657612d66612dec565b02949350505050565b6000816000190483118215151615612d8957612d89612dec565b500290565b600082821015612da057612da0612dec565b500390565b60005b83811015612dc0578181015183820152602001612da8565b83811115611d625750506000910152565b6000600019821415612de557612de5612dec565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114612e1757600080fd5b5056fea264697066735822122055cfce15b89a60aa321a8b3458a2b235d076e417760472a740db7f72462eb86c64736f6c63430008000033

Deployed Bytecode Sourcemap

5140:16122:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5276:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17749:207;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10159:125::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8712:128::-;;;;;;:::i;:::-;;:::i;:::-;;5941:40;;;:::i;:::-;;;;;;;:::i;5592:27::-;;;:::i;6868:80::-;;;:::i;5815:119::-;;;:::i;20159:513::-;;;;;;:::i;:::-;;:::i;11999:634::-;;;;;;:::i;:::-;;:::i;10577:124::-;;;;;;:::i;:::-;;:::i;6955:109::-;;;:::i;6071:128::-;;;:::i;5494:34::-;;;:::i;:::-;;;;;;;:::i;7929:94::-;;;:::i;:::-;;;;;;;:::i;10296:269::-;;;;;;:::i;:::-;;:::i;19334:108::-;;;;;;:::i;:::-;;:::i;7071:82::-;;;:::i;6280:39::-;;;;;;:::i;:::-;;:::i;5394:37::-;;;:::i;19703:149::-;;;;;;:::i;:::-;;:::i;7160:29::-;;;:::i;7285:61::-;;;;;;:::i;:::-;;:::i;11863:124::-;;;;;;:::i;:::-;;:::i;7381:55::-;;;;;;:::i;:::-;;:::i;7202:30::-;;;:::i;12645:690::-;;;;;;:::i;:::-;;:::i;11700:151::-;;;;;;:::i;:::-;;:::i;18443:688::-;;;;;;:::i;:::-;;:::i;17138:136::-;;;;;;:::i;:::-;;:::i;8561:139::-;;;;;;:::i;:::-;;:::i;13347:633::-;;;;;;:::i;:::-;;:::i;5276:57::-;;;;;;;;;;;;;;;;;;;:::o;17749:207::-;17842:10;17814:4;17831:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;17831:31:0;;;;;;;;;;:40;;;17889:37;17814:4;;17831:31;;17889:37;;;;17865:6;;17889:37;:::i;:::-;;;;;;;;-1:-1:-1;17944:4:0;17749:207;;;;:::o;10159:125::-;10239:37;;-1:-1:-1;;;10239:37:0;;10212:7;;7021:42;;10239:15;;:37;;10255:5;;10270:4;;10239:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10232:44;;10159:125;;;;:::o;8712:128::-;8795:37;8804:5;8811:6;8819:12;8795:8;:37::i;:::-;8712:128;;;:::o;5941:40::-;;;:::o;5592:27::-;;;;:::o;6868:80::-;6905:42;6868:80;:::o;5815:119::-;5857:77;5815:119;:::o;20159:513::-;-1:-1:-1;;;;;20318:15:0;;20238:4;20318:15;;;:10;:15;;;;;;;;20273:10;20318:24;;;;;;;;20238:4;;20273:10;;20318:24;20359:14;;;;;:52;;;-1:-1:-1;;20377:16:0;:34;;20359:52;20355:242;;;20428:17;20448:25;20467:6;20448:16;:25;:::i;:::-;-1:-1:-1;;;;;20488:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;20549:36;20428:45;;-1:-1:-1;20488:24:0;;20549:36;;;;20428:45;;20549:36;:::i;:::-;;;;;;;;20355:242;;20609:33;20625:3;20630;20635:6;20609:15;:33::i;:::-;20660:4;20653:11;;;;20159:513;;;;;;:::o;11999:634::-;-1:-1:-1;;;;;12109:9:0;;;12081:4;12109:9;;;:2;:9;;;;;;;;:25;;;;;;;;;;;;;12162:15;;;:8;:15;;;;;:31;;;;;;;;;;12218:12;;;12214:57;;;12256:3;12247:12;;12214:57;12324:3;12303:18;12315:6;12303:9;:18;:::i;:::-;:24;;;;:::i;:::-;12354:46;;-1:-1:-1;;;12354:46:0;;12291:36;;-1:-1:-1;12338:13:0;;7021:42;;12354:15;;:46;;12378:5;;12394:4;;12354:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12338:62;;12421:14;12472:5;-1:-1:-1;;;;;12465:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12438:15:0;;;;;;:8;:15;;;;;;:24;;12456:6;;12438:24;:::i;:::-;:54;;;;:::i;:::-;12421:71;;12519:9;12507;:21;12503:123;;;12552:21;12564:9;12552;:21;:::i;:::-;12545:28;;;;;;;;12503:123;12613:1;12606:8;;;;;;;;10577:124;10661:32;;-1:-1:-1;;;10661:32:0;;10637:4;;6905:42;;10661:16;;:32;;10686:5;;10661:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6955:109::-;7021:42;6955:109;:::o;6071:128::-;6113:86;6071:128;:::o;5494:34::-;5527:1;5494:34;:::o;7929:94::-;7971:16;8007:8;8000:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8000:15:0;;;;;;;;;;;;;;;;;;;;;;;7929:94;:::o;10296:269::-;10378:4;10395:13;10411:14;10419:5;10411:7;:14::i;:::-;10395:30;;10436:13;10459:5;-1:-1:-1;;;;;10452:23:0;;10476:5;10452:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10436:46;;10537:5;-1:-1:-1;;;;;10530:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10511:9:0;;;;;;;:2;:9;;;;;;;;:16;;;;;;;;;;10500:27;;:8;:27;:::i;:::-;:57;;;;:::i;:::-;10493:64;10296:269;-1:-1:-1;;;;;10296:269:0:o;19334:108::-;-1:-1:-1;;;;;19417:17:0;19393:4;19417:17;;;:8;:17;;;;;;;19334:108::o;7071:82::-;7110:42;7071:82;:::o;6280:39::-;;;;;;;;;;;;;:::o;5394:37::-;;;;;;;;;;;;;;-1:-1:-1;;;5394:37:0;;;;:::o;19703:149::-;19765:4;19782:40;19798:10;19810:3;19815:6;19782:15;:40::i;:::-;-1:-1:-1;19840:4:0;19703:149;;;;:::o;7160:29::-;;;:::o;7285:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;11863:124::-;11944:35;11954:5;11961:6;11969:9;11944;:35::i;7381:55::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7202:30::-;7229:3;7202:30;:::o;12645:690::-;12736:4;12753:15;12771:31;12781:5;12788;12795:6;12771:9;:31::i;:::-;12753:49;-1:-1:-1;12817:14:0;;12813:505;;12864:46;;-1:-1:-1;;;12864:46:0;;12848:13;;7021:42;;12864:15;;:46;;12888:5;;12904:4;;12864:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12848:62;;12926:13;12941;12976:5;-1:-1:-1;;;;;12959:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12925:71;-1:-1:-1;;;;;12925:71:0;;;-1:-1:-1;;;;;12925:71:0;;;13012:14;13031:60;13069:5;13085:4;13031:29;:60::i;:::-;13011:80;;;13147:6;-1:-1:-1;;;;;13129:24:0;13137:5;-1:-1:-1;;;;;13129:24:0;;:70;;13180:8;13190;13129:70;;;13157:8;13167;13129:70;13106:93;;-1:-1:-1;13106:93:0;-1:-1:-1;13221:44:0;13106:93;;13254:10;13221:12;:44::i;:::-;13214:51;;;;;;;;;12813:505;13305:1;13298:8;;;;;11700:151;11788:43;;-1:-1:-1;;;11788:43:0;;11771:72;;11781:5;;11803:4;;11788:31;;:43;;11820:10;;11788:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11833:9;11771;:72::i;:::-;11700:151;;:::o;18443:688::-;-1:-1:-1;;;;;18653:13:0;;18570:18;18653:13;;;:6;:13;;;;;:15;;6113:86;;18629:5;;18636:7;;18645:6;;18653:15;18570:18;18653:15;;;:::i;:::-;;;;;18670:8;18601:78;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18591:89;;;;;;18570:110;;18691:14;18747:15;18764:10;18718:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18708:68;;;;;;18691:85;;18787:17;18807:26;18817:6;18825:1;18828;18831;18807:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18807:26:0;;-1:-1:-1;;18807:26:0;;;-1:-1:-1;;;;;;;18852:23:0;;18844:53;;;;-1:-1:-1;;;18844:53:0;;;;;;;:::i;:::-;;;;;;;;;18929:5;-1:-1:-1;;;;;18916:18:0;:9;-1:-1:-1;;;;;18916:18:0;;18908:51;;;;-1:-1:-1;;;18908:51:0;;;;;;;:::i;:::-;18997:8;18978:15;:27;;18970:55;;;;-1:-1:-1;;;18970:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19038:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;;:35;;;19091:32;;;;;19067:6;;19091:32;:::i;:::-;;;;;;;;18443:688;;;;;;;;;;:::o;17138:136::-;-1:-1:-1;;;;;17238:19:0;;;17214:4;17238:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;17138:136::o;8561:139::-;8634:58;8643:5;8650;-1:-1:-1;;;;;8650:15:0;;8666:10;8650:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8679:12;8634:8;:58::i;13347:633::-;-1:-1:-1;;;;;13456:9:0;;;13428:4;13456:9;;;:2;:9;;;;;;;;:25;;;;;;;;;;;;;13509:15;;;:8;:15;;;;;:31;;;;;;;;;;13565:12;;;13561:57;;;13603:3;13594:12;;13561:57;13671:3;13650:18;13662:6;13650:9;:18;:::i;:::-;:24;;;;:::i;:::-;13701:46;;-1:-1:-1;;;13701:46:0;;13638:36;;-1:-1:-1;13685:13:0;;7021:42;;13701:15;;:46;;13725:5;;13741:4;;13701:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13685:62;;13768:14;13819:5;-1:-1:-1;;;;;13812:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13785:15:0;;;;;;:8;:15;;;;;;:24;;13803:6;;13785:24;:::i;:::-;:54;;;;:::i;:::-;13768:71;;13866:9;13854;:21;13850:123;;;13899:21;13911:9;13899;:21;:::i;10713:975::-;10811:32;;-1:-1:-1;;;10811:32:0;;10797:11;;6905:42;;10811:16;;:32;;10836:5;;10811:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10797:46;;10854:11;10896:5;-1:-1:-1;;;;;10896:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10886:26;;10891:2;10886:26;:::i;:::-;10868:15;10877:6;10868;:15;:::i;:::-;:44;;;;:::i;:::-;10854:58;;10940:1;10931:6;:10;10923:29;;;;-1:-1:-1;;;10923:29:0;;;;;;;:::i;:::-;10974:13;10989:12;11003;11019:60;11041:5;11057:4;11064:6;11072;11019:13;:60::i;:::-;10973:106;;-1:-1:-1;10973:106:0;-1:-1:-1;10973:106:0;-1:-1:-1;11100:50:0;-1:-1:-1;;;;;11100:22:0;;11123:10;10973:106;;11100:22;:50::i;:::-;11209:5;-1:-1:-1;;;;;11209:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11199:26;;11204:2;11199:26;:::i;:::-;11180:16;11189:7;11180:6;:16;:::i;:::-;:45;;;;:::i;:::-;11171:54;;11255:6;11244:7;:17;;11236:49;;;;-1:-1:-1;;;11236:49:0;;;;;;;:::i;:::-;11306:21;11312:5;11319:7;11306:5;:21::i;:::-;11347:10;11338:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;11338:36:0;;;;;;;;;:47;;11378:7;;11338:20;:47;;11378:7;;11338:47;:::i;:::-;;;;-1:-1:-1;;11424:43:0;;-1:-1:-1;;;11424:43:0;;11406:15;;-1:-1:-1;;;;;11424:28:0;;;;;:43;;11461:4;;11424:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11406:61;;11500:12;11486:10;:26;;11478:68;;;;-1:-1:-1;;;11478:68:0;;;;;;;:::i;:::-;11560:10;11557:14;;;;:2;:14;;;;;;;;-1:-1:-1;;;;;11557:30:0;;;;;;;;;:44;;11591:10;;11557:14;:44;;11591:10;;11557:44;:::i;:::-;;;;-1:-1:-1;;11627:53:0;;-1:-1:-1;;;;;11627:53:0;;;11635:10;;11627:53;;;;11663:7;;11672;;11627:53;:::i;:::-;;;;;;;;10713:975;;;;;;;;;:::o;20680:420::-;-1:-1:-1;;;;;20764:13:0;;;;;;:8;:13;;;;;:23;;20781:6;;20764:13;:23;;20781:6;;20764:23;:::i;:::-;;;;-1:-1:-1;;;;;;;20798:13:0;;;;;;:8;:13;;;;;:23;;20815:6;;20798:13;:23;;20815:6;;20798:23;:::i;:::-;;;;;;;;20861:3;-1:-1:-1;;;;;20847:26:0;20856:3;-1:-1:-1;;;;;20847:26:0;;20866:6;20847:26;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20907:10:0;;;;;;:5;:10;;;;;;;;:34;;;;-1:-1:-1;;;;;;20921:20:0;;20936:4;20921:20;;20907:34;20906:74;;;-1:-1:-1;;;;;;20945:10:0;;;;;;:5;:10;;;;;;;;:34;;;;-1:-1:-1;;;;;;20959:20:0;;20974:4;20959:20;;20945:34;20902:191;;;20997:40;21013:3;21018:4;21024:12;7229:3;21024:6;:12;:::i;:::-;20997:15;:40::i;:::-;21069:4;-1:-1:-1;;;;;21052:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20680:420;;;:::o;15919:915::-;16015:10;16001:8;16012:14;;;:2;:14;;;;;;;;-1:-1:-1;;;;;16012:30:0;;;;;;;;;;;;16070:20;;;:8;:20;;;;;:36;;;;;;;;;16131:12;;;16127:57;;;16169:3;16160:12;;16127:57;16286:3;16265:18;16277:6;16265:9;:18;:::i;:::-;:24;;;;:::i;:::-;16316:46;;-1:-1:-1;;;16316:46:0;;16253:36;;-1:-1:-1;16300:13:0;;7021:42;;16316:15;;:46;;16340:5;;16356:4;;16316:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16300:62;;16384:12;16398;16414:51;16422:5;16429;16436:6;16444:9;16455;16414:7;:51::i;:::-;16489:10;16486:14;;;;:2;:14;;;;;;;;-1:-1:-1;;;;;16486:30:0;;;;;;;;;:40;;16383:82;;-1:-1:-1;16383:82:0;;-1:-1:-1;16520:6:0;;16486:40;;16520:6;;16486:40;:::i;:::-;;;;-1:-1:-1;;16546:10:0;16537:20;;;;:8;:20;;;;;;;;-1:-1:-1;;;;;16537:36:0;;;;;;;;;:49;;16577:9;;16537:20;:49;;16577:9;;16537:49;:::i;:::-;;;;-1:-1:-1;16607:39:0;;-1:-1:-1;;;;;;16607:18:0;;16626:10;16638:7;16607:18;:39::i;:::-;16657:51;16681:4;16688:10;16700:7;16657:15;:51::i;:::-;16719:28;16725:10;16737:9;16719:5;:28::i;:::-;16802:5;-1:-1:-1;;;;;16773:53:0;16782:10;-1:-1:-1;;;;;16773:53:0;;16810:6;16818:7;16773:53;;;;;;;:::i;:::-;;;;;;;;15919:915;;;;;;;;:::o;3315:353::-;3390:14;3406;3451:6;-1:-1:-1;;;;;3441:16:0;:6;-1:-1:-1;;;;;3441:16:0;;;3433:68;;;;-1:-1:-1;;;3433:68:0;;;;;;;:::i;:::-;3540:6;-1:-1:-1;;;;;3531:15:0;:6;-1:-1:-1;;;;;3531:15:0;;:53;;3569:6;3577;3531:53;;;3550:6;3558;3531:53;3512:72;;-1:-1:-1;3512:72:0;-1:-1:-1;;;;;;3603:20:0;;3595:65;;;;-1:-1:-1;;;3595:65:0;;;;;;;:::i;:::-;3315:353;;;;;:::o;13992:265::-;14083:4;;14117:20;14128:9;14117:8;:20;:::i;:::-;:27;;14140:4;14117:27;:::i;:::-;14100:44;-1:-1:-1;14155:16:0;14175:20;14186:9;14175:8;:20;:::i;:::-;14174:28;;14199:3;14174:28;:::i;:::-;14155:47;-1:-1:-1;14221:23:0;14155:47;14221:9;:23;:::i;:::-;14220:29;;14248:1;14220:29;:::i;:::-;14213:36;13992:265;-1:-1:-1;;;;;;13992:265:0:o;8852:1295::-;9079:31;;-1:-1:-1;;;9079:31:0;;8967:12;;;;;;7021:42;;9079:15;;:31;;9095:6;;9103;;9079:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9072:38;-1:-1:-1;;;;;;9125:18:0;;9121:266;;9167:34;;-1:-1:-1;;;9167:34:0;;7021:42;;9167:18;;:34;;9186:6;;9194;;9167:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9216:11:0;;;;;;;:5;:11;;;;;:18;;9230:4;-1:-1:-1;;9216:18:0;;;;;;;;9249:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;9249:21:0;;;;;;;;;;9216:11;-1:-1:-1;9121:266:0;;;-1:-1:-1;;;;;9293:11:0;;;;;;:5;:11;;;;;;;;9288:99;;-1:-1:-1;;;;;9321:11:0;;;;;;;:5;:11;;;;;:18;;9335:4;-1:-1:-1;;9321:18:0;;;;;;;;9354:8;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;9354:21:0;;;;;;;;;;9288:99;9408:13;9423;9440:64;7021:42;9489:6;9497;9440:30;:64::i;:::-;9407:97;;;;9519:8;9531:1;9519:13;:30;;;;-1:-1:-1;9536:13:0;;9519:30;9515:625;;;9588:14;;-1:-1:-1;9604:14:0;;-1:-1:-1;9515:625:0;;;9652:19;9674:60;9699:14;9715:8;9725;9674:24;:60::i;:::-;9652:82;;9771:14;9753;:32;9749:380;;9828:14;;-1:-1:-1;9844:14:0;-1:-1:-1;9844:14:0;9749:380;;;9900:19;9922:60;9947:14;9963:8;9973;9922:24;:60::i;:::-;9900:82;;10026:14;10008;:32;;10001:40;;-1:-1:-1;;;10001:40:0;;;;;;;;;10082:14;-1:-1:-1;10098:14:0;;-1:-1:-1;9749:380:0;9515:625;;8852:1295;;;;;;;;;;:::o;1277:201::-;1375:95;1394:5;1424:27;;;1453:4;1459:2;1463:5;1401:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1401:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;1401:68:0;-1:-1:-1;;;;;;1401:68:0;;;;;;;;;;1375:18;:95::i;:::-;1277:201;;;;:::o;8035:250::-;8139:6;8124:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8205:13:0;;;;;;:8;:13;;;;;:23;;8222:6;;8205:13;:23;;8222:6;;8205:23;:::i;:::-;;;;-1:-1:-1;;8244:33:0;;-1:-1:-1;;;;;8244:33:0;;;8261:1;;8244:33;;;;8270:6;;8244:33;:::i;:::-;;;;;;;;8035:250;;:::o;15354:553::-;15457:4;;15480:39;-1:-1:-1;;;;;15480:25:0;;15506:4;15512:6;15480:25;:39::i;:::-;15557:12;15571;15604:4;-1:-1:-1;;;;;15587:27:0;;15623:4;15587:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15556:73;;;;15641:14;15660:60;15698:5;15714:4;15660:29;:60::i;:::-;15640:80;;;15770:6;-1:-1:-1;;;;;15752:24:0;15760:5;-1:-1:-1;;;;;15752:24:0;;:66;;15801:7;15810;15752:66;;;15780:7;15789;15752:66;15731:87;;-1:-1:-1;15731:87:0;-1:-1:-1;15836:63:0;15844:5;15851:6;15859:4;15731:87;;15883:4;15889:9;15836:7;:63::i;:::-;15829:70;;;;;;;15354:553;;;;;;;;:::o;1096:173::-;1176:85;1195:5;1225:23;;;1250:2;1254:5;1202:58;;;;;;;;;:::i;8297:252::-;8401:6;8386:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8469:13:0;;;;;;:8;:13;;;;;:23;;8486:6;;8469:13;:23;;8486:6;;8469:23;:::i;:::-;;;;-1:-1:-1;;8508:33:0;;8530:1;;-1:-1:-1;;;;;8508:33:0;;;;;;;8534:6;;8508:33;:::i;4305:393::-;4398:13;4413;4440:14;4459:26;4470:6;4478;4459:10;:26::i;:::-;4439:46;;;4497:13;4512;4547:32;4555:7;4564:6;4572;4547:7;:32::i;:::-;-1:-1:-1;;;;;4530:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4496:98;-1:-1:-1;;;;;4496:98:0;;;-1:-1:-1;;;;;4496:98:0;;;4638:6;-1:-1:-1;;;;;4628:16:0;:6;-1:-1:-1;;;;;4628:16:0;;:62;;4671:8;4681;4628:62;;;4648:8;4658;4628:62;4605:85;;;;-1:-1:-1;4305:393:0;-1:-1:-1;;;;;;;4305:393:0:o;4811:322::-;4893:12;4936:1;4926:7;:11;4918:63;;;;-1:-1:-1;;;4918:63:0;;;;;;;:::i;:::-;5011:1;5000:8;:12;:28;;;;;5027:1;5016:8;:12;5000:28;4992:83;;;;-1:-1:-1;;;4992:83:0;;;;;;;:::i;:::-;5117:8;5096:18;5106:8;5096:7;:18;:::i;:::-;:29;;;;:::i;:::-;5086:39;4811:322;-1:-1:-1;;;;4811:322:0:o;1836:598::-;1924:27;1932:5;-1:-1:-1;;;;;1924:25:0;;:27::i;:::-;1916:71;;;;-1:-1:-1;;;1916:71:0;;;;;;;:::i;:::-;2061:12;2075:23;2110:5;-1:-1:-1;;;;;2102:19:0;2122:4;2102:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2060:67;;;;2146:7;2138:52;;;;-1:-1:-1;;;2138:52:0;;;;;;;:::i;:::-;2207:17;;:21;2203:224;;2349:10;2338:30;;;;;;;;;;;;:::i;:::-;2330:85;;;;-1:-1:-1;;;2330:85:0;;;;;;;:::i;14269:1073::-;14439:10;14403:4;14430:20;;;:8;:20;;;;;;14403:4;;14461;;14430:28;;14451:7;;14430:28;:::i;:::-;:35;14426:873;;;14517:10;14482:15;14508:20;;;:8;:20;;;;;;:28;;14529:7;;14508:28;:::i;:::-;14500:37;;:4;:37;:::i;:::-;14482:55;;14567:13;14582;14617:4;-1:-1:-1;;;;;14600:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14566:70;-1:-1:-1;;;;;14566:70:0;;;-1:-1:-1;;;;;14566:70:0;;;14692:6;-1:-1:-1;;;;;14674:24:0;14682:5;-1:-1:-1;;;;;14674:24:0;;:70;;14725:8;14735;14674:70;;;14702:8;14712;14674:70;14651:93;;-1:-1:-1;14651:93:0;-1:-1:-1;14773:13:0;14789:44;14651:93;;14822:10;14789:12;:44::i;:::-;14773:60;;14882:7;14870:8;:19;;:44;;;;;14905:9;14893:8;:21;;14870:44;14862:87;;;;-1:-1:-1;;;14862:87:0;;;;;;;:::i;:::-;14964:34;-1:-1:-1;;;;;14964:18:0;;14983:4;14989:8;14964:18;:34::i;:::-;15014:15;15031;15068:6;-1:-1:-1;;;;;15050:24:0;15058:5;-1:-1:-1;;;;;15050:24:0;;:72;;15102:10;15119:1;15050:72;;;15083:1;15087:10;15050:72;15204:12;;;15214:1;15204:12;;;;;;;;;-1:-1:-1;;;15137:80:0;;;15013:109;;-1:-1:-1;15013:109:0;-1:-1:-1;;;;;;15137:27:0;;;;;:80;;15013:109;;;;15197:4;;15137:80;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15243:8;15232:19;;;;;:::i;:::-;;-1:-1:-1;15266:21:0;15277:10;15266:21;;:::i;:::-;;;14426:873;;;;;;;-1:-1:-1;15317:7:0;;15326;;-1:-1:-1;14269:1073:0;;-1:-1:-1;;;;;14269:1073:0:o;3760:487::-;3849:12;3875:14;3891;3909:26;3920:6;3928;3909:10;:26::i;:::-;3874:61;;;;4045:7;4098:6;4106;4081:32;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4071:43;;;;;;3984:251;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3984:251:0;;;;;;;;;3974:262;;3984:251;3974:262;;;;;3760:487;-1:-1:-1;;;;;;3760:487:0:o;656:374::-;716:4;939:20;;782:66;979:15;;;;;:42;;-1:-1:-1;998:23:0;;;971:51;-1:-1:-1;;656:374:0:o;14:190:1:-;95:13;;-1:-1:-1;;;;;137:42:1;;127:53;;117:2;;194:1;191;184:12;209:259;;321:2;309:9;300:7;296:23;292:32;289:2;;;342:6;334;327:22;289:2;386:9;373:23;405:33;432:5;405:33;:::i;473:263::-;;596:2;584:9;575:7;571:23;567:32;564:2;;;617:6;609;602:22;564:2;654:9;648:16;673:33;700:5;673:33;:::i;741:402::-;;;870:2;858:9;849:7;845:23;841:32;838:2;;;891:6;883;876:22;838:2;935:9;922:23;954:33;981:5;954:33;:::i;:::-;1006:5;-1:-1:-1;1063:2:1;1048:18;;1035:32;1076:35;1035:32;1076:35;:::i;:::-;1130:7;1120:17;;;828:315;;;;;:::o;1148:470::-;;;;1294:2;1282:9;1273:7;1269:23;1265:32;1262:2;;;1315:6;1307;1300:22;1262:2;1359:9;1346:23;1378:33;1405:5;1378:33;:::i;:::-;1430:5;-1:-1:-1;1487:2:1;1472:18;;1459:32;1500:35;1459:32;1500:35;:::i;:::-;1252:366;;1554:7;;-1:-1:-1;;;1608:2:1;1593:18;;;;1580:32;;1252:366::o;1623:853::-;;;;;;;;1835:3;1823:9;1814:7;1810:23;1806:33;1803:2;;;1857:6;1849;1842:22;1803:2;1901:9;1888:23;1920:33;1947:5;1920:33;:::i;:::-;1972:5;-1:-1:-1;2029:2:1;2014:18;;2001:32;2042:35;2001:32;2042:35;:::i;:::-;2096:7;-1:-1:-1;2150:2:1;2135:18;;2122:32;;-1:-1:-1;2201:2:1;2186:18;;2173:32;;-1:-1:-1;2257:3:1;2242:19;;2229:33;2306:4;2293:18;;2281:31;;2271:2;;2331:6;2323;2316:22;2271:2;1793:683;;;;-1:-1:-1;1793:683:1;;;;2359:7;2413:3;2398:19;;2385:33;;-1:-1:-1;2465:3:1;2450:19;;;2437:33;;1793:683;-1:-1:-1;;1793:683:1:o;2481:327::-;;;2610:2;2598:9;2589:7;2585:23;2581:32;2578:2;;;2631:6;2623;2616:22;2578:2;2675:9;2662:23;2694:33;2721:5;2694:33;:::i;:::-;2746:5;2798:2;2783:18;;;;2770:32;;-1:-1:-1;;;2568:240:1:o;2813:297::-;;2933:2;2921:9;2912:7;2908:23;2904:32;2901:2;;;2954:6;2946;2939:22;2901:2;2991:9;2985:16;3044:5;3037:13;3030:21;3023:5;3020:32;3010:2;;3071:6;3063;3056:22;3115:483;;;;3274:2;3262:9;3253:7;3249:23;3245:32;3242:2;;;3295:6;3287;3280:22;3948:408;;;;4107:2;4095:9;4086:7;4082:23;4078:32;4075:2;;;4128:6;4120;4113:22;4075:2;4172:9;4159:23;4191:33;4218:5;4191:33;:::i;:::-;4243:5;4295:2;4280:18;;4267:32;;-1:-1:-1;4346:2:1;4331:18;;;4318:32;;4065:291;-1:-1:-1;;;4065:291:1:o;4361:474::-;;;;4517:2;4505:9;4496:7;4492:23;4488:32;4485:2;;;4538:6;4530;4523:22;4485:2;4566:42;4598:9;4566:42;:::i;:::-;4556:52;;4627:51;4674:2;4663:9;4659:18;4627:51;:::i;:::-;4617:61;;4721:2;4710:9;4706:18;4700:25;4765:10;4758:5;4754:22;4747:5;4744:33;4734:2;;4796:6;4788;4781:22;4734:2;4824:5;4814:15;;;4475:360;;;;;:::o;4840:194::-;;4963:2;4951:9;4942:7;4938:23;4934:32;4931:2;;;4984:6;4976;4969:22;4931:2;-1:-1:-1;5012:16:1;;4921:113;-1:-1:-1;4921:113:1:o;5039:255::-;;;5179:2;5167:9;5158:7;5154:23;5150:32;5147:2;;;5200:6;5192;5185:22;5147:2;-1:-1:-1;;5228:16:1;;5284:2;5269:18;;;5263:25;5228:16;;5263:25;;-1:-1:-1;5137:157:1:o;5299:259::-;;5380:5;5374:12;5407:6;5402:3;5395:19;5423:63;5479:6;5472:4;5467:3;5463:14;5456:4;5449:5;5445:16;5423:63;:::i;:::-;5540:2;5519:15;-1:-1:-1;;5515:29:1;5506:39;;;;5547:4;5502:50;;5350:208;-1:-1:-1;;5350:208:1:o;5563:333::-;-1:-1:-1;;5790:2:1;5786:15;;;5782:24;;5770:37;;5841:15;;;;5837:24;5832:2;5823:12;;5816:46;5887:2;5878:12;;5710:186::o;5901:274::-;;6068:6;6062:13;6084:53;6130:6;6125:3;6118:4;6110:6;6106:17;6084:53;:::i;:::-;6153:16;;;;;6038:137;-1:-1:-1;;6038:137:1:o;6180:392::-;-1:-1:-1;;;6438:27:1;;6490:1;6481:11;;6474:27;;;;6526:2;6517:12;;6510:28;6563:2;6554:12;;6428:144::o;6577:636::-;-1:-1:-1;;;;;;6936:26:1;;6999:2;6995:15;;;;-1:-1:-1;;6991:53:1;6987:1;6978:11;;6971:74;7070:2;7061:12;;7054:28;7112:66;7107:2;7098:12;;7091:88;7204:2;7195:12;;6926:287::o;7218:203::-;-1:-1:-1;;;;;7382:32:1;;;;7364:51;;7352:2;7337:18;;7319:102::o;7426:304::-;-1:-1:-1;;;;;7656:15:1;;;7638:34;;7708:15;;7703:2;7688:18;;7681:43;7588:2;7573:18;;7555:175::o;7735:375::-;-1:-1:-1;;;;;7993:15:1;;;7975:34;;8045:15;;;;8040:2;8025:18;;8018:43;8092:2;8077:18;;8070:34;;;;7925:2;7910:18;;7892:218::o;8115:274::-;-1:-1:-1;;;;;8307:32:1;;;;8289:51;;8371:2;8356:18;;8349:34;8277:2;8262:18;;8244:145::o;8394:661::-;8565:2;8617:21;;;8687:13;;8590:18;;;8709:22;;;8394:661;;8565:2;8788:15;;;;8762:2;8747:18;;;8394:661;8834:195;8848:6;8845:1;8842:13;8834:195;;;8913:13;;-1:-1:-1;;;;;8909:39:1;8897:52;;9004:15;;;;8969:12;;;;8945:1;8863:9;8834:195;;;-1:-1:-1;9046:3:1;;8545:510;-1:-1:-1;;;;;;8545:510:1:o;9060:187::-;9225:14;;9218:22;9200:41;;9188:2;9173:18;;9155:92::o;9252:177::-;9398:25;;;9386:2;9371:18;;9353:76::o;9434:591::-;9721:25;;;-1:-1:-1;;;;;9820:15:1;;;9815:2;9800:18;;9793:43;9872:15;;;;9867:2;9852:18;;9845:43;9919:2;9904:18;;9897:34;9962:3;9947:19;;9940:35;;;;9773:3;9991:19;;9984:35;9708:3;9693:19;;9675:350::o;10030:398::-;10257:25;;;10330:4;10318:17;;;;10313:2;10298:18;;10291:45;10367:2;10352:18;;10345:34;10410:2;10395:18;;10388:34;10244:3;10229:19;;10211:217::o;10890:221::-;;11039:2;11028:9;11021:21;11059:46;11101:2;11090:9;11086:18;11078:6;11059:46;:::i;11116:406::-;11318:2;11300:21;;;11357:2;11337:18;;;11330:30;11396:34;11391:2;11376:18;;11369:62;-1:-1:-1;;;11462:2:1;11447:18;;11440:40;11512:3;11497:19;;11290:232::o;11527:403::-;11729:2;11711:21;;;11768:2;11748:18;;;11741:30;11807:34;11802:2;11787:18;;11780:62;-1:-1:-1;;;11873:2:1;11858:18;;11851:37;11920:3;11905:19;;11701:229::o;11935:343::-;12137:2;12119:21;;;12176:2;12156:18;;;12149:30;-1:-1:-1;;;12210:2:1;12195:18;;12188:49;12269:2;12254:18;;12109:169::o;12283:329::-;12485:2;12467:21;;;12524:1;12504:18;;;12497:29;-1:-1:-1;;;12557:2:1;12542:18;;12535:36;12603:2;12588:18;;12457:155::o;12617:356::-;12819:2;12801:21;;;12838:18;;;12831:30;12897:34;12892:2;12877:18;;12870:62;12964:2;12949:18;;12791:182::o;12978:339::-;13180:2;13162:21;;;13219:2;13199:18;;;13192:30;-1:-1:-1;;;13253:2:1;13238:18;;13231:45;13308:2;13293:18;;13152:165::o;13322:356::-;13524:2;13506:21;;;13543:18;;;13536:30;13602:34;13597:2;13582:18;;13575:62;13669:2;13654:18;;13496:182::o;13683:344::-;13885:2;13867:21;;;13924:2;13904:18;;;13897:30;-1:-1:-1;;;13958:2:1;13943:18;;13936:50;14018:2;14003:18;;13857:170::o;14032:403::-;14234:2;14216:21;;;14273:2;14253:18;;;14246:30;14312:34;14307:2;14292:18;;14285:62;-1:-1:-1;;;14378:2:1;14363:18;;14356:37;14425:3;14410:19;;14206:229::o;14440:354::-;14642:2;14624:21;;;14681:2;14661:18;;;14654:30;14720:32;14715:2;14700:18;;14693:60;14785:2;14770:18;;14614:180::o;14799:341::-;15001:2;14983:21;;;15040:2;15020:18;;;15013:30;-1:-1:-1;;;15074:2:1;15059:18;;15052:47;15131:2;15116:18;;14973:167::o;15145:406::-;15347:2;15329:21;;;15386:2;15366:18;;;15359:30;15425:34;15420:2;15405:18;;15398:62;-1:-1:-1;;;15491:2:1;15476:18;;15469:40;15541:3;15526:19;;15319:232::o;15556:355::-;15758:2;15740:21;;;15797:2;15777:18;;;15770:30;15836:33;15831:2;15816:18;;15809:61;15902:2;15887:18;;15730:181::o;15916:353::-;16118:2;16100:21;;;16157:2;16137:18;;;16130:30;16196:31;16191:2;16176:18;;16169:59;16260:2;16245:18;;16090:179::o;16456:248::-;16630:25;;;16686:2;16671:18;;16664:34;16618:2;16603:18;;16585:119::o;16709:460::-;;16940:6;16929:9;16922:25;16983:6;16978:2;16967:9;16963:18;16956:34;17055:1;17051;17046:3;17042:11;17038:19;17030:6;17026:32;17021:2;17010:9;17006:18;16999:60;17095:3;17090:2;17079:9;17075:18;17068:31;17116:47;17158:3;17147:9;17143:19;17135:6;17116:47;:::i;17174:184::-;17346:4;17334:17;;;;17316:36;;17304:2;17289:18;;17271:87::o;17363:128::-;;17434:1;17430:6;17427:1;17424:13;17421:2;;;17440:18;;:::i;:::-;-1:-1:-1;17476:9:1;;17411:80::o;17496:217::-;;17562:1;17552:2;;-1:-1:-1;;;17587:31:1;;17641:4;17638:1;17631:15;17669:4;17594:1;17659:15;17552:2;-1:-1:-1;17698:9:1;;17542:171::o;17718:453::-;17814:6;17837:5;17851:314;17900:1;17937:2;17927:8;17924:16;17914:2;;17944:5;;;17914:2;17985:4;17980:3;17976:14;17970:4;17967:24;17964:2;;;17994:18;;:::i;:::-;18044:2;18034:8;18030:17;18027:2;;;18059:16;;;;18027:2;18138:17;;;;;18098:15;;17851:314;;;17795:376;;;;;;;:::o;18176:139::-;;18265:44;-1:-1:-1;;18292:8:1;18286:4;18320:922;18404:8;18394:2;;-1:-1:-1;18445:1:1;18459:5;;18394:2;18493:4;18483:2;;-1:-1:-1;18530:1:1;18544:5;;18483:2;18575:4;18593:1;18588:59;;;;18661:1;18656:183;;;;18568:271;;18588:59;18618:1;18609:10;;18632:5;;;18656:183;18693:3;18683:8;18680:17;18677:2;;;18700:18;;:::i;:::-;18756:1;18746:8;18742:16;18733:25;;18784:3;18777:5;18774:14;18771:2;;;18791:18;;:::i;:::-;18824:5;;;18568:271;;18923:2;18913:8;18910:16;18904:3;18898:4;18895:13;18891:36;18885:2;18875:8;18872:16;18867:2;18861:4;18858:12;18854:35;18851:77;18848:2;;;-1:-1:-1;18960:19:1;;;18995:14;;;18992:2;;;19012:18;;:::i;:::-;19045:5;;18848:2;19092:42;19130:3;19120:8;19114:4;19111:1;19092:42;:::i;:::-;19167:6;19162:3;19158:16;19149:7;19146:29;19143:2;;;19178:18;;:::i;:::-;19216:20;;18384:858;-1:-1:-1;;;;18384:858:1:o;19247:168::-;;19353:1;19349;19345:6;19341:14;19338:1;19335:21;19330:1;19323:9;19316:17;19312:45;19309:2;;;19360:18;;:::i;:::-;-1:-1:-1;19400:9:1;;19299:116::o;19420:125::-;;19488:1;19485;19482:8;19479:2;;;19493:18;;:::i;:::-;-1:-1:-1;19530:9:1;;19469:76::o;19550:258::-;19622:1;19632:113;19646:6;19643:1;19640:13;19632:113;;;19722:11;;;19716:18;19703:11;;;19696:39;19668:2;19661:10;19632:113;;;19763:6;19760:1;19757:13;19754:2;;;-1:-1:-1;;19798:1:1;19780:16;;19773:27;19603:205::o;19813:135::-;;-1:-1:-1;;19873:17:1;;19870:2;;;19893:18;;:::i;:::-;-1:-1:-1;19940:1:1;19929:13;;19860:88::o;19953:127::-;20014:10;20009:3;20005:20;20002:1;19995:31;20045:4;20042:1;20035:15;20069:4;20066:1;20059:15;20085:133;-1:-1:-1;;;;;20162:31:1;;20152:42;;20142:2;;20208:1;20205;20198:12;20142:2;20132:86;:::o

Swarm Source

ipfs://55cfce15b89a60aa321a8b3458a2b235d076e417760472a740db7f72462eb86c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Chain Token Portfolio % Price Amount Value
ETH45.68%$150,401.350.3805$57,224.9
ETH15.60%$2,064,573,628,410.140.000000009463$19,537.67
ETH14.28%$12,970,989.890.00137923$17,889.96
ETH8.92%$9,919,214.120.00112628$11,171.81
ETH7.72%$4,012,144.070.00240937$9,666.73
ETH3.54%$1,305,017.350.00339668$4,432.73
ETH1.40%$144,305.850.0121$1,752.37
ETH0.81%$240,354.110.00423506$1,017.91
ETH0.59%$49,917.770.0149$744.67
ETH0.37%$0.999438465$464.74
ETH0.35%$0.1104684,000$441.87
ETH0.35%$0.99931441.5899$441.29
ETH0.23%$282,691.250.00102463$289.65
BSC0.15%$0.99915189$188.84
Loading...
Loading
[ Download: CSV Export  ]

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