ETH Price: $2,668.42 (+1.95%)
Gas: 0.12 GWei
 

Overview

ETH Balance

Scroll LogoScroll LogoScroll Logo0.000000822852541639 ETH

ETH Value

Less Than $0.01 (@ $2,668.42/ETH)

Token Holdings

Transaction Hash
Method
Block
From
To
0x451bcd6f92173c0550b92afd715129a81a1849a98d567463eeffcc80234f6260 -(pending)2025-02-09 9:41:511 hrs ago1739094111IN
SyncSwap: Router v2
0.0057783507 ETH(Pending)(Pending)
0x6b35ee91cec42dc150178230010fede678547d4fd150f1e6ac695d7c36201d62 -(pending)2025-02-09 6:50:343 hrs ago1739083834IN
SyncSwap: Router v2
0.0055001964 ETH(Pending)(Pending)
0x8643d072e7349ea9f7e6cb624c8239b2407a3e55b07a27d83bde2e8e65df3a80 -(pending)2025-02-09 6:50:343 hrs ago1739083834IN
SyncSwap: Router v2
0.0055001964 ETH(Pending)(Pending)
0x38d32fd4510b80d4f26114a0bdd2299f2180be1cfd97b2bfd2f6c2054898bbac -(pending)2025-02-09 3:59:386 hrs ago1739073578IN
SyncSwap: Router v2
0.0014917511 ETH(Pending)(Pending)
0x7b4691ae41d66c8364fd0727c7a702de97dcc7c39462f2956e7f7bf78e96c4de -(pending)2025-02-09 3:57:206 hrs ago1739073440IN
SyncSwap: Router v2
0.0015643764 ETH(Pending)(Pending)
0x82c5a49e12f6661ba5572704d7383fb859e81af9d4a12b5c7a0382fb90c62971 -(pending)2025-02-09 3:57:206 hrs ago1739073440IN
SyncSwap: Router v2
0 ETH(Pending)(Pending)
0x6d72cef7df61726d7ca0d31324de56c85b6866fb42deb21bdedb3ca1c66a1889 -(pending)2025-02-09 2:26:348 hrs ago1739067994IN
SyncSwap: Router v2
0 ETH(Pending)(Pending)
0x16fa03d2d5f32f788458712be540ed908b1e13b596794acb63ed56ef1dd45116 -(pending)2025-02-08 5:27:5729 hrs ago1738992477IN
SyncSwap: Router v2
0 ETH(Pending)(Pending)
0x57c1f36abf600cbca92cb742967256a40bcb6b98a93e0e63fd9da8487595c3aa -(pending)2025-02-07 15:10:5343 hrs ago1738941053IN
SyncSwap: Router v2
0.00085 ETH(Pending)(Pending)
0x8528368c1093f86d4d837ab714d553d5eb8cf41e3278ae3f6ce2bb671ec7b9e1 -(pending)2025-02-07 15:10:5343 hrs ago1738941053IN
SyncSwap: Router v2
0.00085 ETH(Pending)(Pending)
0xc3818478c8c740a8527095f35a9a33b9f88801037b84b89ad3f0614adb86204e -(pending)2025-02-07 15:10:5343 hrs ago1738941053IN
SyncSwap: Router v2
0.00085 ETH(Pending)(Pending)
0x6884fa6b9e88081bbf534c0f94c47586be4b407f4bf9266ae9da8228ab7a95a9 -(pending)2025-02-07 13:22:0145 hrs ago1738934521IN
SyncSwap: Router v2
0 ETH(Pending)(Pending)
0x468188461b0e353153064cf9d8d3971745c1666797c8b349317f56cbca901545 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0032 ETH(Pending)(Pending)
0x1f45483e59f41a10fe341e2d1b9f5a6015f73e5134c3187e89748e73a31b8c4e -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0032 ETH(Pending)(Pending)
0x7bdebea16ca99f42dc97583d943c851bc784c06fd268ff7d9fb1032f295cb2df -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0 ETH(Pending)(Pending)
0x6ab63a797e0ab1d55edfcb96b61f5f2b391689f635cd4733e563341130d773c6 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0 ETH(Pending)(Pending)
0xcdb4c4702331714ce0f5a629d2b8fe722a701542a9895223637c3e32f7514678 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0051009749 ETH(Pending)(Pending)
0x62e9e77e7febf6b30950c3bd58425a9029bc71580ae50b779b6ca9e78ced6afe -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0051009749 ETH(Pending)(Pending)
0x3221a0b818f7fe934631466ece21c7cb6ec866247b8c77dbfe6d15c4cbe4bb99 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0050120943 ETH(Pending)(Pending)
0x058eb4c85eb60286b6d32b221447eb7d223412f10239ea74caa0c512578bff9e -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0050201544 ETH(Pending)(Pending)
0xedecfeec156142a792aea7b7f98e42d670c2b8aff39293756b13e0aaa728e074 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0050201544 ETH(Pending)(Pending)
0x713735b1e1604b5eeae8cada83a5ca6398e082f897a6c93c46bb616f5453d314 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0021377 ETH(Pending)(Pending)
0xf6858b38d3424a7c0f787625ca88cb858ba074a1a0003ccf10be15ec9d6de14b -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0041377061 ETH(Pending)(Pending)
0xd7738b914022b466f02d7c8300695eb6038601664c109d070ef31ef3965b89d7 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.00240385 ETH(Pending)(Pending)
0xac20eea008ed16ff44884fe1c72559ee23e13401e126f39df2c1f31ece724a05 -(pending)2025-02-06 21:23:262 days ago1738877006IN
SyncSwap: Router v2
0.0043241542 ETH(Pending)(Pending)
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
133061682025-02-09 10:02:3539 mins ago1739095355
SyncSwap: Router v2
0.005 ETH
133058952025-02-09 9:48:2053 mins ago1739094500
SyncSwap: Router v2
0.003 ETH
133058172025-02-09 9:44:2157 mins ago1739094261
SyncSwap: Router v2
0.00091704 ETH
133054202025-02-09 9:21:041 hr ago1739092864
SyncSwap: Router v2
0.00562959 ETH
133051902025-02-09 9:08:211 hr ago1739092101
SyncSwap: Router v2
0.017 ETH
133043372025-02-09 8:19:492 hrs ago1739089189
SyncSwap: Router v2
0.51382354 ETH
133043172025-02-09 8:18:412 hrs ago1739089121
SyncSwap: Router v2
0.56363599 ETH
133031512025-02-09 7:02:043 hrs ago1739084524
SyncSwap: Router v2
0.004 ETH
133031412025-02-09 7:01:283 hrs ago1739084488
SyncSwap: Router v2
0.075 ETH
133028592025-02-09 6:43:193 hrs ago1739083399
SyncSwap: Router v2
0.048 ETH
133020382025-02-09 5:45:324 hrs ago1739079932
SyncSwap: Router v2
0.004 ETH
133004152025-02-09 3:42:406 hrs ago1739072560
SyncSwap: Router v2
0.00008792 ETH
133004152025-02-09 3:42:406 hrs ago1739072560
SyncSwap: Router v2
0.00008792 ETH
133003672025-02-09 3:39:307 hrs ago1739072370
SyncSwap: Router v2
0.003 ETH
133001022025-02-09 3:19:447 hrs ago1739071184
SyncSwap: Router v2
0.004 ETH
132998042025-02-09 2:56:487 hrs ago1739069808
SyncSwap: Router v2
0.00258445 ETH
132994492025-02-09 2:27:308 hrs ago1739068050
SyncSwap: Router v2
0.01 ETH
132976882025-02-09 0:17:4410 hrs ago1739060264
SyncSwap: Router v2
0.01570948 ETH
132973152025-02-08 23:43:0010 hrs ago1739058180
SyncSwap: Router v2
0.15184986 ETH
132967352025-02-08 22:54:3911 hrs ago1739055279
SyncSwap: Router v2
0.0039 ETH
132965812025-02-08 22:40:2312 hrs ago1739054423
SyncSwap: Router v2
0.00369343 ETH
132963722025-02-08 22:22:4512 hrs ago1739053365
SyncSwap: Router v2
0.2 ETH
132960682025-02-08 21:57:1812 hrs ago1739051838
SyncSwap: Router v2
0.00017122 ETH
132960682025-02-08 21:57:1812 hrs ago1739051838
SyncSwap: Router v2
0.00007475 ETH
132960672025-02-08 21:57:1512 hrs ago1739051835
SyncSwap: Router v2
0.00013871 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SyncSwapRouterV2

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 2000000 runs

Other Settings:
shanghai EvmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at scrollscan.com on 2024-05-19
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
//      ___                         ___           ___           ___           ___           ___                   
//     /  /\          __           /  /\         /  /\         /  /\         /  /\         /  /\          ___     
//    /  /::\        |  |\        /  /::|       /  /::\       /  /::\       /  /:/_       /  /::\        /  /\    
//   /__/:/\:\       |  |:|      /  /:|:|      /  /:/\:\     /__/:/\:\     /  /:/ /\     /  /:/\:\      /  /::\   
//  _\_ \:\ \:\      |  |:|     /  /:/|:|__   /  /:/  \:\   _\_ \:\ \:\   /  /:/ /:/_   /  /::\ \:\    /  /:/\:\  
// /__/\ \:\ \:\     |__|:|__  /__/:/ |:| /\ /__/:/ \  \:\ /__/\ \:\ \:\ /__/:/ /:/ /\ /__/:/\:\_\:\  /  /::\ \:\ 
// \  \:\ \:\_\/     /  /::::\ \__\/  |:|/:/ \  \:\  \__\/ \  \:\ \:\_\/ \  \:\/:/ /:/ \__\/  \:\/:/ /__/:/\:\_\:\
//  \  \:\_\:\      /  /:/~~~~     |  |:/:/   \  \:\        \  \:\_\:\    \  \::/ /:/       \__\::/  \__\/  \:\/:/
//   \  \:\/:/     /__/:/          |__|::/     \  \:\        \  \:\/:/     \  \:\/:/        /  /:/        \  \::/ 
//    \  \::/      \__\/           /__/:/       \  \:\        \  \::/       \  \::/        /__/:/          \__\/  
//     \__\/                       \__\/         \__\/         \__\/         \__\/         \__\/                  
//
// Welcome to the SyncSwap V2 Router!
//

pragma solidity ^0.8.0;

interface IRouter {
    struct SwapStep {
        address pool;
        bytes data;
        address callback;
        bytes callbackData;
        bool useVault;
    }

    struct SwapPath {
        SwapStep[] steps;
        address tokenIn;
        uint amountIn;
    }

    struct SplitPermitParams {
        address token;
        uint approveAmount;
        uint deadline;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct ArrayPermitParams {
        uint approveAmount;
        uint deadline;
        bytes signature;
    }
}

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

interface IStaking {
    function stake(uint amount, address to) external;
    function stake(address token, uint amount, address to) external;
}

interface IPoolFactory {
    function master() external view returns (address);

    function getDeployData() external view returns (bytes memory);

    function createPool(bytes calldata data) external returns (address pool);
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(msg.sender);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract Rescuable is Ownable {
    /// @dev Rescues ERC20 tokens.
    function rescueERC20(address token, address to, uint256 amount) external onlyOwner {
        require(to != address(0) && to != token, "Invalid to");

        uint balance = IERC20(token).balanceOf(address(this));

        if (amount == 0) {
            TransferHelper.safeTransfer(token, to, balance);
        } else {
            require(amount <= balance, "Exceeds balance");
            TransferHelper.safeTransfer(token, to, amount);
        }
    }

    /// @dev Rescues Ether.
    function rescueETH(address payable to, uint256 amount) external onlyOwner {
        if (amount == 0) {
            amount = address(this).balance;
        }
        TransferHelper.safeTransferETH(to, amount);
    }
}

/// @dev The ETH transfer has failed.
error ETHTransferFailed();

/// @dev The ERC20 `transferFrom` has failed.
error TransferFromFailed();

/// @dev The ERC20 `transfer` has failed.
error TransferFailed();

/// @dev The ERC20 `approve` has failed.
error ApproveFailed();

/// @dev Helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true / false.
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("approve(address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ApproveFailed();
        }
    }

    function safeTransfer(
        address token,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("transfer(address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert TransferFailed();
        }
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert TransferFromFailed();
        }
    }

    function safeTransferETH(address to, uint value) internal {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, ) = to.call{value: value}("");

        if (!success) {
            revert ETHTransferFailed();
        }
    }
}

interface IERC20Base {
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);
    function transfer(address to, uint amount) external returns (bool);
    function transferFrom(address from, address to, uint amount) external returns (bool);
    
    event Approval(address indexed owner, address indexed spender, uint amount);
    event Transfer(address indexed from, address indexed to, uint amount);
}

interface IERC20 is IERC20Base {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

interface IERC20Permit is IERC20 {
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address owner) external view returns (uint);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

interface IERC20Permit2 is IERC20Permit {
    function permit2(address owner, address spender, uint amount, uint deadline, bytes calldata signature) external;
}

/// @title Interface for permit
/// @notice Interface used by DAI/CHAI for permit
interface IERC20PermitAllowed {
    /// @notice Approve the spender to spend some tokens via the holder signature
    /// @dev This is the permit interface used by DAI and CHAI
    /// @param holder The address of the token holder, the token owner
    /// @param spender The address of the token spender
    /// @param nonce The holder's nonce, increases at each call to permit
    /// @param expiry The timestamp at which the permit is no longer valid
    /// @param allowed Boolean that sets approval amount, true for type(uint256).max and false for 0
    /// @param v Must produce valid secp256k1 signature from the holder along with `r` and `s`
    /// @param r Must produce valid secp256k1 signature from the holder along with `v` and `s`
    /// @param s Must produce valid secp256k1 signature from the holder along with `r` and `v`
    function permit(
        address holder,
        address spender,
        uint256 nonce,
        uint256 expiry,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

abstract contract SelfPermit {
    function selfPermit(
        address token,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    function selfPermitIfNecessary(
        address token,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) {
            selfPermit(token, value, deadline, v, r, s);
        }
    }

    function selfPermitAllowed(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20PermitAllowed(token).permit(msg.sender, address(this), nonce, expiry, true, v, r, s);
    }

    function selfPermitAllowedIfNecessary(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < type(uint256).max) {
            selfPermitAllowed(token, nonce, expiry, v, r, s);
        }
    }

    function selfPermit2(
        address token,
        uint value,
        uint deadline,
        bytes calldata signature
    ) public payable {
        IERC20Permit2(token).permit2(msg.sender, address(this), value, deadline, signature);
    }

    function selfPermit2IfNecessary(
        address token,
        uint value,
        uint deadline,
        bytes calldata signature
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) {
            selfPermit2(token, value, deadline, signature);
        }
    }
}

/// @notice Helper utility that enables calling multiple local methods in a single call.
/// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol)
/// License-Identifier: GPL-2.0-or-later
abstract contract Multicall {
    function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) {
        results = new bytes[](data.length);
        
        for (uint i; i < data.length;) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;

            // cannot realistically overflow on human timescales
            unchecked {
                ++i;
            }
        }
    }
}

interface IPool {
    struct TokenAmount {
        address token;
        uint amount;
    }

    /// @dev Returns the address of pool master.
    function master() external view returns (address);

    /// @dev Returns the vault.
    function vault() external view returns (address);

    /// @dev Returns the pool type.
    function poolType() external view returns (uint16);

    /// @dev Returns the assets of the pool.
    function getAssets() external view returns (address[] memory assets);

    /// @dev Returns the swap fee of the pool.
    function getSwapFee(address sender, address tokenIn, address tokenOut, bytes calldata data) external view returns (uint24 swapFee);

    /// @dev Returns the protocol fee of the pool.
    function getProtocolFee() external view returns (uint24 protocolFee);

    /// @dev Mints liquidity.
    function mint(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (uint liquidity);

    /// @dev Burns liquidity.
    function burn(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount[] memory tokenAmounts);

    /// @dev Burns liquidity with single output token.
    function burnSingle(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount memory tokenAmount);

    /// @dev Swaps between tokens.
    function swap(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount memory tokenAmount);
}

interface IBasePool is IPool, IERC20Permit2 {
    function token0() external view returns (address);
    function token1() external view returns (address);

    function reserve0() external view returns (uint);
    function reserve1() external view returns (uint);
    function invariantLast() external view returns (uint);

    function getReserves() external view returns (uint, uint);
    function getAmountOut(address tokenIn, uint amountIn, address sender) external view returns (uint amountOut);
    function getAmountIn(address tokenOut, uint amountOut, address sender) external view returns (uint amountIn);

    event Mint(
        address indexed sender,
        uint amount0,
        uint amount1,
        uint liquidity,
        address indexed to
    );

    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        uint liquidity,
        address indexed to
    );

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );

    event Sync(
        uint reserve0,
        uint reserve1
    );
}

interface IVault {
    function wETH() external view returns (address);

    function reserves(address token) external view returns (uint reserve);

    function balanceOf(address token, address owner) external view returns (uint balance);

    function deposit(address token, address to) external payable returns (uint amount);

    function depositETH(address to) external payable returns (uint amount);

    function transferAndDeposit(address token, address to, uint amount) external payable returns (uint);

    function transfer(address token, address to, uint amount) external;

    function withdraw(address token, address to, uint amount) external;

    function withdrawAlternative(address token, address to, uint amount, uint8 mode) external;

    function withdrawETH(address to, uint amount) external;
}

error NotEnoughLiquidityMinted();
error TooLittleReceived();
error Expired();

/// @notice The router is a universal interface for users to access
/// functions across different protocol parts in one place.
///
/// It handles the allowances and transfers of tokens, and
/// allows chained swaps/operations across multiple pools, with
/// additional features like slippage protection and permit support.
///
contract SyncSwapRouterV2 is IRouter, SelfPermit, Multicall, Rescuable {

    struct TokenInput {
        address token;
        uint amount;
        bool useVault;
    }

    address public immutable vault;
    address public immutable wETH;
    address private constant NATIVE_ETH = address(0);

    mapping(address => mapping(address => bool)) public isPoolEntered;
    mapping(address => address[]) public enteredPools;

    modifier ensure(uint deadline) {
        // solhint-disable-next-line not-rely-on-time
        if (block.timestamp > deadline) {
            revert Expired();
        }
        _;
    }

    constructor(address _vault, address _wETH) {
        vault = _vault;
        wETH = _wETH;
    }

    function enteredPoolsLength(address account) external view returns (uint) {
        return enteredPools[account].length;
    }

    function _transferFromSender(address token, address to, uint amount, bool useVault) private {
        if (useVault) {
            if (token == NATIVE_ETH) {
                // Deposit ETH to the vault.
                IVault(vault).deposit{value: amount}(token, to);
            } else {
                // Transfer tokens to the vault.
                TransferHelper.safeTransferFrom(token, msg.sender, vault, amount);

                // Notify the vault to deposit.
                IVault(vault).deposit(token, to);
            }
        } else {
            if (token == NATIVE_ETH) {
                // Wrap native ETH to wETH.
                IWETH(wETH).deposit{value: amount}();

                // Send wETH to the pool.
                IWETH(wETH).transfer(to, amount);
            } else {
                // Transfer tokens to the pool.
                TransferHelper.safeTransferFrom(token, msg.sender, to, amount);
            }
        }
    }

    function _transferAndAddLiquidity(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData
    ) private returns (uint liquidity) {
        // Send all input tokens to the pool.
        uint n = inputs.length;

        TokenInput memory input;

        for (uint i; i < n; ) {
            input = inputs[i];

            _transferFromSender(input.token, pool, input.amount, input.useVault);

            unchecked {
                ++i;
            }
        }

        liquidity = IPool(pool).mint(data, msg.sender, callback, callbackData);

        if (liquidity < minLiquidity) {
            revert NotEnoughLiquidityMinted();
        }
    }

    function _markPoolEntered(address pool) private {
        if (!isPoolEntered[pool][msg.sender]) {
            isPoolEntered[pool][msg.sender] = true;
            enteredPools[msg.sender].push(pool);
        }
    }

    function addLiquidity(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        address staking
    ) public payable returns (uint liquidity) {
        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );

        if (staking != address(0)) {
            (,address stakingTo) = abi.decode(data, (address, address));
            if (stakingTo != address(0)) {
                IStaking(staking).stake(liquidity, stakingTo);
            }
        }
    }

    function addLiquidity2(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        address staking
    ) external payable returns (uint liquidity) {
        liquidity = addLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData,
            staking
        );

        _markPoolEntered(pool);
    }

    function addLiquidityWithPermit(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        SplitPermitParams[] memory permits,
        address staking
    ) public payable returns (uint liquidity) {
        // Approve all tokens via permit.
        uint n = permits.length;

        SplitPermitParams memory params;

        for (uint i; i < n; ) {
            params = permits[i];

            IERC20Permit(params.token).permit(
                msg.sender,
                address(this),
                params.approveAmount,
                params.deadline,
                params.v,
                params.r,
                params.s
            );

            unchecked {
                ++i;
            }
        }

        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );

        if (staking != address(0)) {
            (,address stakingTo) = abi.decode(data, (address, address));
            if (stakingTo != address(0)) {
                IStaking(staking).stake(liquidity, stakingTo);
            }
        }
    }

    function addLiquidityWithPermit2(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        SplitPermitParams[] memory permits,
        address staking
    ) public payable returns (uint liquidity) {
        liquidity = addLiquidityWithPermit(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData,
            permits,
            staking
        );

        _markPoolEntered(pool);
    }

    // Burn Liquidity
    function _transferAndBurnLiquidity(
        address pool,
        uint liquidity,
        bytes memory data,
        uint[] memory minAmounts,
        address callback,
        bytes calldata callbackData
    ) private returns (IPool.TokenAmount[] memory amounts) {
        IBasePool(pool).transferFrom(msg.sender, pool, liquidity);

        amounts = IPool(pool).burn(data, msg.sender, callback, callbackData);

        uint n = amounts.length;

        for (uint i; i < n; ) {
            IPool.TokenAmount memory tokenAmount = amounts[i];

            if (tokenAmount.amount < minAmounts[i]) {
                revert TooLittleReceived();
            }

            unchecked {
                ++i;
            }
        }
    }

    function burnLiquidity(
        address pool,
        uint liquidity,
        bytes calldata data,
        uint[] calldata minAmounts,
        address callback,
        bytes calldata callbackData
    ) external returns (IPool.TokenAmount[] memory amounts) {
        amounts = _transferAndBurnLiquidity(
            pool,
            liquidity,
            data,
            minAmounts,
            callback,
            callbackData
        );
    }

    function burnLiquidityWithPermit(
        address pool,
        uint liquidity,
        bytes calldata data,
        uint[] calldata minAmounts,
        address callback,
        bytes calldata callbackData,
        ArrayPermitParams memory permit
    ) external returns (IPool.TokenAmount[] memory amounts) {
        // Approve liquidity via permit.
        IBasePool(pool).permit2(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.signature
        );

        amounts = _transferAndBurnLiquidity(
            pool,
            liquidity,
            data,
            minAmounts,
            callback,
            callbackData
        );
    }

    // Burn Liquidity Single
    function _transferAndBurnLiquiditySingle(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData
    ) private returns (IPool.TokenAmount memory amountOut) {
        IBasePool(pool).transferFrom(msg.sender, pool, liquidity);

        amountOut = IPool(pool).burnSingle(data, msg.sender, callback, callbackData);

        if (amountOut.amount < minAmount) {
            revert TooLittleReceived();
        }
    }

    function burnLiquiditySingle(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData
    ) external returns (IPool.TokenAmount memory amountOut) {
        amountOut = _transferAndBurnLiquiditySingle(
            pool,
            liquidity,
            data,
            minAmount,
            callback,
            callbackData
        );
    }

    function burnLiquiditySingleWithPermit(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData,
        ArrayPermitParams calldata permit
    ) external returns (IPool.TokenAmount memory amountOut) {
        // Approve liquidity via permit.
        IBasePool(pool).permit2(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.signature
        );

        amountOut = _transferAndBurnLiquiditySingle(
            pool,
            liquidity,
            data,
            minAmount,
            callback,
            callbackData
        );
    }

    // Swap
    function _swap(
        SwapPath[] memory paths,
        uint amountOutMin
    ) private returns (IPool.TokenAmount memory amountOut) {
        uint pathsLength = paths.length;

        SwapPath memory path;
        SwapStep memory step;
        IPool.TokenAmount memory tokenAmount;

        for (uint i; i < pathsLength; ) {
            path = paths[i];

            // Prefund the first step.
            step = path.steps[0];
            _transferFromSender(path.tokenIn, step.pool, path.amountIn, step.useVault);

            // Cache steps length.
            uint stepsLength = path.steps.length;

            uint j;
            while (true) {
                if (j == stepsLength - 1) {
                    // Accumulate output amount at the last step.
                    tokenAmount = IBasePool(step.pool).swap(
                        step.data, msg.sender, step.callback, step.callbackData
                    );

                    amountOut.token = tokenAmount.token;
                    amountOut.amount += tokenAmount.amount;

                    break;
                } else {
                    // Swap and send tokens to the next step.
                    tokenAmount = IBasePool(step.pool).swap(
                        step.data, msg.sender, step.callback, step.callbackData
                    );

                    bool _useVault = step.useVault;

                    // Cache the next step.
                    unchecked {
                        ++j;
                    }
                    step = path.steps[j];

                    if (!_useVault && step.useVault) {
                        uint amount = IERC20(tokenAmount.token).balanceOf(address(this));

                        // Transfer tokens to the vault.
                        TransferHelper.safeTransfer(tokenAmount.token, vault, amount);

                        // Notify the vault to deposit.
                        IVault(vault).deposit(tokenAmount.token, step.pool);
                    }
                }
            }

            unchecked {
                ++i;
            }
        }

        if (amountOut.amount < amountOutMin) {
            revert TooLittleReceived();
        }
    }

    function swap(
        SwapPath[] memory paths,
        uint amountOutMin,
        uint deadline
    ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) {
        amountOut = _swap(
            paths,
            amountOutMin
        );
    }

    function swapWithPermit(
        SwapPath[] memory paths,
        uint amountOutMin,
        uint deadline,
        SplitPermitParams calldata permit
    ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) {
        // Approve input tokens via permit.
        IERC20Permit(permit.token).permit(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.v,
            permit.r,
            permit.s
        );

        amountOut = _swap(
            paths,
            amountOutMin
        );
    }

    /// @notice Wrapper function to allow pool deployment to be batched.
    function createPool(address _factory, bytes calldata data) external payable returns (address) {
        return IPoolFactory(_factory).createPool(data);
    }

    function _stake(address target, address token, uint amount) private {
        TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount);

        if (IERC20(token).allowance(address(this), target) < amount) {
            /// @dev This can approve arbitrary contract, the router is not intended to store any funds.
            TransferHelper.safeApprove(token, target, type(uint).max);
        }
    }

    /// @dev Universal function to stake tokens to a target contract.
    function stake(address target, address token, uint amount, address to) external {
        _stake(target, token, amount);
        IStaking(target).stake(amount, to);
    }

    function stakeWithToken(address target, address token, uint amount, address to) external {
        _stake(target, token, amount);
        IStaking(target).stake(token, amount, to);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApproveFailed","type":"error"},{"inputs":[],"name":"ETHTransferFailed","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[],"name":"NotEnoughLiquidityMinted","type":"error"},{"inputs":[],"name":"TooLittleReceived","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"TransferFromFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidity2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","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"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct SyncSwapRouterV2.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","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"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"},{"internalType":"address","name":"staking","type":"address"}],"name":"addLiquidityWithPermit2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquidity","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquiditySingle","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquiditySingleWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquidityWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"enteredPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enteredPoolsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isPoolEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","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":"selfPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2IfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowedIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","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":"selfPermitIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"stakeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swap","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"internalType":"bool","name":"useVault","type":"bool"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","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"}],"internalType":"struct IRouter.SplitPermitParams","name":"permit","type":"tuple"}],"name":"swapWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801561000f575f80fd5b506040516140a13803806140a183398101604081905261002e916100b8565b6100373361004e565b6001600160a01b039182166080521660a0526100e9565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100b3575f80fd5b919050565b5f80604083850312156100c9575f80fd5b6100d28361009d565b91506100e06020840161009d565b90509250929050565b60805160a051613f6661013b5f395f81816104cb015281816126d8015261279c01525f81816105620152818161219c0152818161220201528181612565015281816125df01526126510152613f665ff3fe6080604052600436106101c5575f3560e01c8063a4a78f0c116100f2578063eb1432f011610092578063f44e537a11610062578063f44e537a1461051f578063fb6890881461053e578063fbfa77cf14610551578063fc31d54a14610584575f80fd5b8063eb1432f0146104a7578063f2428621146104ba578063f2fde38b146104ed578063f3995c671461050c575f80fd5b8063b2118a8d116100cd578063b2118a8d14610421578063b956b3fb14610440578063c2e3140a14610481578063d7570e4514610494575f80fd5b8063a4a78f0c146103cf578063ac9650d8146103e2578063ad271fa314610402575f80fd5b80636291027c116101685780637b2151e5116101385780637b2151e5146103615780637d10c9d6146103745780638da5cb5b146103935780639dd41df2146103bc575f80fd5b80636291027c14610308578063688ee44c146103275780636cc781cd1461033a578063715018a61461034d575f80fd5b806339be5126116101a357806339be51261461025f5780634659a494146102805780634f25b8581461029357806353c43f15146102dc575f80fd5b8063099a04e5146101c95780632b4abadb146101ea578063353766c614610233575b5f80fd5b3480156101d4575f80fd5b506101e86101e3366004612aad565b610597565b005b3480156101f5575f80fd5b50610209610204366004612aad565b6105b7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023e575f80fd5b5061025261024d366004612d48565b6105f8565b60405161022a9190612e29565b61027261026d366004612fc6565b610710565b60405190815260200161022a565b6101e861028e3660046130ba565b61092b565b34801561029e575f80fd5b506102cc6102ad366004613110565b600160209081525f928352604080842090915290825290205460ff1681565b604051901515815260200161022a565b3480156102e7575f80fd5b506102fb6102f6366004613147565b6109e1565b60405161022a91906131de565b348015610313575f80fd5b506101e861032236600461320d565b610a0d565b6101e861033536600461325d565b610aa2565b6101e861034836600461325d565b610b50565b348015610358575f80fd5b506101e8610be0565b6102fb61036f36600461351b565b610bf3565b34801561037f575f80fd5b506102fb61038e3660046135b6565b610d44565b34801561039e575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610209565b6102096103ca366004613671565b610df1565b6101e86103dd3660046130ba565b610e8f565b6103f56103f03660046136c2565b610f5f565b60405161022a919061376c565b34801561040d575f80fd5b5061025261041c3660046137ec565b6110c9565b34801561042c575f80fd5b506101e861043b3660046138b0565b61114e565b34801561044b575f80fd5b5061027261045a3660046138ee565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b6101e861048f3660046130ba565b61132f565b6102fb6104a2366004613910565b6113d7565b6102726104b536600461395a565b611438565b3480156104c5575f80fd5b506102097f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f8575f80fd5b506101e86105073660046138ee565b611456565b6101e861051a3660046130ba565b61150d565b34801561052a575f80fd5b506101e861053936600461320d565b61158a565b61027261054c366004612fc6565b6115f8565b34801561055c575f80fd5b506102097f000000000000000000000000000000000000000000000000000000000000000081565b61027261059236600461395a565b611617565b61059f611706565b805f036105a95750475b6105b382826117a2565b5050565b6002602052815f5260405f2081815481106105d0575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b8051602082015160408084015190517f2c0198cc00000000000000000000000000000000000000000000000000000000815260609373ffffffffffffffffffffffffffffffffffffffff8f1693632c0198cc9361065f933393309390929091600401613a2c565b5f604051808303815f87803b158015610676575f80fd5b505af1158015610688573d5f803e3d5ffd5b505050506107018b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284375f920191909152508c92508b91508a905061183d565b9b9a5050505050505050505050565b81516040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081018290529091905f5b828110156108385785818151811061076157610761613a70565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e4015f604051808303815f87803b158015610817575f80fd5b505af1158015610829573d5f803e3d5ffd5b50505050806001019050610747565b5061084a8e8e8e8e8e8e8e8e8e611a2e565b925073ffffffffffffffffffffffffffffffffffffffff84161561091a575f6108758b8d018d613110565b91505073ffffffffffffffffffffffffffffffffffffffff811615610918576040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8281166024830152861690637acb7757906044015f604051808303815f87803b158015610901575f80fd5b505af1158015610913573d5f803e3d5ffd5b505050505b505b50509b9a5050505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b5f604051808303815f87803b1580156109c3575f80fd5b505af11580156109d5573d5f803e3d5ffd5b50505050505050505050565b604080518082019091525f8082526020820152610a02878787878787611b86565b979650505050505050565b610a18848484611d0a565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152851690637acb7757906044015b5f604051808303815f87803b158015610a86575f80fd5b505af1158015610a98573d5f803e3d5ffd5b5050505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152849073ffffffffffffffffffffffffffffffffffffffff87169063dd62ed3e90604401602060405180830381865afa158015610b12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b369190613a9d565b1015610b4957610b498585858585610b50565b5050505050565b6040517f2c0198cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632c0198cc90610bac90339030908990899089908990600401613afb565b5f604051808303815f87803b158015610bc3575f80fd5b505af1158015610bd5573d5f803e3d5ffd5b505050505050505050565b610be8611706565b610bf15f611dde565b565b604080518082019091525f80825260208201528280421115610c41576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c4e60208401846138ee565b73ffffffffffffffffffffffffffffffffffffffff1663d505accf333060208701356040880135610c8560808a0160608b01613b40565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152608086013560a482015260a086013560c482015260e4015f604051808303815f87803b158015610d1a575f80fd5b505af1158015610d2c573d5f803e3d5ffd5b50505050610d3a8686611e52565b9695505050505050565b604080518082019091525f808252602082015273ffffffffffffffffffffffffffffffffffffffff8816632c0198cc333085356020870135610d896040890189613b59565b6040518763ffffffff1660e01b8152600401610daa96959493929190613afb565b5f604051808303815f87803b158015610dc1575f80fd5b505af1158015610dd3573d5f803e3d5ffd5b50505050610de5888888888888611b86565b98975050505050505050565b6040517f13b8683f0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff8516906313b8683f90610e479086908690600401613bba565b6020604051808303815f875af1158015610e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e879190613bcd565b949350505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613a9d565b1015610f5757610f5786868686868661092b565b505050505050565b60608167ffffffffffffffff811115610f7a57610f7a612b6d565b604051908082528060200260200182016040528015610fad57816020015b6060815260200190600190039081610f985790505b5090505f5b828110156110c2575f8030868685818110610fcf57610fcf613a70565b9050602002810190610fe19190613b59565b604051610fef929190613be8565b5f60405180830381855af49150503d805f8114611027576040519150601f19603f3d011682016040523d82523d5f602084013e61102c565b606091505b50915091508161109a57604481511015611044575f80fd5b6004810190508080602001905181019061105e9190613bf7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110919190613c60565b60405180910390fd5b808484815181106110ad576110ad613a70565b60209081029190910101525050600101610fb2565b5092915050565b60606111408a8a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284375f920191909152508b92508a915089905061183d565b9a9950505050505050505050565b611156611706565b73ffffffffffffffffffffffffffffffffffffffff8216158015906111a757508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f496e76616c696420746f000000000000000000000000000000000000000000006044820152606401611091565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611277573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129b9190613a9d565b9050815f036112b4576112af8484836122f3565b611329565b8082111561131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f457863656564732062616c616e636500000000000000000000000000000000006044820152606401611091565b6113298484846122f3565b50505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa15801561139f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c39190613a9d565b1015610f5757610f5786868686868661150d565b604080518082019091525f80825260208201528180421115611425576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142f8585611e52565b95945050505050565b5f61144b8b8b8b8b8b8b8b8b8b8b611617565b90506111408b61242c565b61145e611706565b73ffffffffffffffffffffffffffffffffffffffff8116611501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611091565b61150a81611dde565b50565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e4016109ac565b611595848484611d0a565b6040517f294091cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052828116604483015285169063294091cd90606401610a6f565b5f61160c8c8c8c8c8c8c8c8c8c8c8c610710565b90506107018c61242c565b5f6116298b8b8b8b8b8b8b8b8b611a2e565b905073ffffffffffffffffffffffffffffffffffffffff821615611140575f611654888a018a613110565b91505073ffffffffffffffffffffffffffffffffffffffff8116156116f7576040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152841690637acb7757906044015f604051808303815f87803b1580156116e0575f80fd5b505af11580156116f2573d5f803e3d5ffd5b505050505b509a9950505050505050505050565b336117255f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611091565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146117f8576040519150601f19603f3d011682016040523d82523d5f602084013e6117fd565b606091505b5050905080611838576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff881660248201819052604482018890526060916323b872dd906064016020604051808303815f875af11580156118b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118da9190613c72565b506040517ff66eab5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063f66eab5b906119359089903390899089908990600401613c8d565b5f604051808303815f875af1158015611950573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119959190810190613d2f565b80519091505f5b81811015611a21575f8382815181106119b7576119b7613a70565b602002602001015190508782815181106119d3576119d3613a70565b602002602001015181602001511015611a18576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060010161199c565b5050979650505050505050565b604080516060810182525f8082526020820181905291810182905288905f5b82811015611a9e578b8b82818110611a6757611a67613a70565b905060600201803603810190611a7d9190613dc0565b9150611a96825f01518e846020015185604001516124f7565b600101611a4d565b506040517f03e7286a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906303e7286a90611afb908c908c9033908c908c908c90600401613e09565b6020604051808303815f875af1158015611b17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3b9190613a9d565b925086831015611b77576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509998505050505050505050565b6040805180820182525f808252602082015290517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff88166024820181905260448201889052906323b872dd906064016020604051808303815f875af1158015611c0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c329190613c72565b506040517f27b0bcea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906327b0bcea90611c8b908890339088908890600401613e60565b60408051808303815f875af1158015611ca6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cca9190613ea8565b90508381602001511015610d3a576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1682333084612812565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015282919084169063dd62ed3e90604401602060405180830381865afa158015611d89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dad9190613a9d565b10156118385761183882847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612953565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091525f80825260208201528251604080516060808201835281525f6020820181905291810191909152611ee06040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff168152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081526020015f151581525090565b604080518082019091525f80825260208201525f5b848110156122aa57878181518110611f0f57611f0f613a70565b60200260200101519350835f01515f81518110611f2e57611f2e613a70565b60200260200101519250611f538460200151845f0151866040015186608001516124f7565b8351515f5b611f63600183613eef565b810361203357845f015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611fb79493929190613e60565b60408051808303815f875af1158015611fd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff69190613ea8565b805173ffffffffffffffffffffffffffffffffffffffff168952602080820151908a018051929650909161202b908390613f02565b9052506122a0565b845f015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016120819493929190613e60565b60408051808303815f875af115801561209c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c09190613ea8565b6080860151875180519296506001909301929091839081106120e4576120e4613a70565b60200260200101519550801580156120fd575085608001515b1561229a5784516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561216d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121919190613a9d565b90506121c1865f01517f0000000000000000000000000000000000000000000000000000000000000000836122f3565b855187516040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263f9609f08926122579260040173ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b6020604051808303815f875af1158015612273573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122979190613a9d565b50505b50611f58565b5050600101611ef5565b5085856020015110156122e9576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916123899190613f15565b5f604051808303815f865af19150503d805f81146123c2576040519150601f19603f3d011682016040523d82523d5f602084013e6123c7565b606091505b50915091508115806123f557508051158015906123f55750808060200190518101906123f39190613c72565b155b15610b49576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff1661150a5773ffffffffffffffffffffffffffffffffffffffff165f818152600160208181526040808420338552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841790556002825283208054928301815583529091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b80156126bb5773ffffffffffffffffffffffffffffffffffffffff84166125d8576040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063f9609f0890849060440160206040518083038185885af11580156125ad573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906125d29190613a9d565b50611329565b61260484337f000000000000000000000000000000000000000000000000000000000000000085612812565b6040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063f9609f08906044016020604051808303815f875af1158015612697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190613a9d565b73ffffffffffffffffffffffffffffffffffffffff841661280a577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b15801561273c575f80fd5b505af115801561274e573d5f803e3d5ffd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af11580156127e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190613c72565b611329843385855b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f928392908816916128b09190613f15565b5f604051808303815f865af19150503d805f81146128e9576040519150601f19603f3d011682016040523d82523d5f602084013e6128ee565b606091505b509150915081158061291c575080511580159061291c57508080602001905181019061291a9190613c72565b155b15610f57576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905291515f928392908716916129e99190613f15565b5f604051808303815f865af19150503d805f8114612a22576040519150601f19603f3d011682016040523d82523d5f602084013e612a27565b606091505b5091509150811580612a555750805115801590612a55575080806020019051810190612a539190613c72565b155b15610b49576040517f3e3f8f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461150a575f80fd5b5f8060408385031215612abe575f80fd5b8235612ac981612a8c565b946020939093013593505050565b8035612ae281612a8c565b919050565b5f8083601f840112612af7575f80fd5b50813567ffffffffffffffff811115612b0e575f80fd5b602083019150836020828501011115612b25575f80fd5b9250929050565b5f8083601f840112612b3c575f80fd5b50813567ffffffffffffffff811115612b53575f80fd5b6020830191508360208260051b8501011115612b25575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612bbd57612bbd612b6d565b60405290565b60405160c0810167ffffffffffffffff81118282101715612bbd57612bbd612b6d565b60405160a0810167ffffffffffffffff81118282101715612bbd57612bbd612b6d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612c5057612c50612b6d565b604052919050565b5f67ffffffffffffffff821115612c7157612c71612b6d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612cac575f80fd5b8135612cbf612cba82612c58565b612c09565b818152846020838601011115612cd3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215612cff575f80fd5b612d07612b9a565b90508135815260208201356020820152604082013567ffffffffffffffff811115612d30575f80fd5b612d3c84828501612c9d565b60408301525092915050565b5f805f805f805f805f8060e08b8d031215612d61575f80fd5b612d6a8b612ad7565b995060208b0135985060408b013567ffffffffffffffff80821115612d8d575f80fd5b612d998e838f01612ae7565b909a50985060608d0135915080821115612db1575f80fd5b612dbd8e838f01612b2c565b9098509650869150612dd160808e01612ad7565b955060a08d0135915080821115612de6575f80fd5b612df28e838f01612ae7565b909550935060c08d0135915080821115612e0a575f80fd5b50612e178d828e01612cef565b9150509295989b9194979a5092959850565b602080825282518282018190525f919060409081850190868401855b82811015612e8857612e78848351805173ffffffffffffffffffffffffffffffffffffffff168252602090810151910152565b9284019290850190600101612e45565b5091979650505050505050565b5f8083601f840112612ea5575f80fd5b50813567ffffffffffffffff811115612ebc575f80fd5b602083019150836020606083028501011115612b25575f80fd5b5f67ffffffffffffffff821115612eef57612eef612b6d565b5060051b60200190565b803560ff81168114612ae2575f80fd5b5f82601f830112612f18575f80fd5b81356020612f28612cba83612ed6565b82815260c09283028501820192828201919087851115612f46575f80fd5b8387015b85811015612fb95781818a031215612f60575f80fd5b612f68612bc3565b8135612f7381612a8c565b81528186013586820152604080830135908201526060612f94818401612ef9565b908201526080828101359082015260a080830135908201528452928401928101612f4a565b5090979650505050505050565b5f805f805f805f805f805f6101008c8e031215612fe1575f80fd5b612fea8c612ad7565b9a5067ffffffffffffffff8060208e01351115613005575f80fd5b6130158e60208f01358f01612e95565b909b50995060408d013581101561302a575f80fd5b61303a8e60408f01358f01612ae7565b909950975060608d0135965061305260808e01612ad7565b95508060a08e01351115613064575f80fd5b6130748e60a08f01358f01612ae7565b909550935060c08d0135811015613089575f80fd5b5061309a8d60c08e01358e01612f09565b91506130a860e08d01612ad7565b90509295989b509295989b9093969950565b5f805f805f8060c087890312156130cf575f80fd5b86356130da81612a8c565b955060208701359450604087013593506130f660608801612ef9565b92506080870135915060a087013590509295509295509295565b5f8060408385031215613121575f80fd5b823561312c81612a8c565b9150602083013561313c81612a8c565b809150509250929050565b5f805f805f8060c0878903121561315c575f80fd5b863561316781612a8c565b955060208701359450604087013567ffffffffffffffff8082111561318a575f80fd5b6131968a838b01612c9d565b955060608901359450608089013591506131af82612a8c565b90925060a088013590808211156131c4575f80fd5b506131d189828a01612c9d565b9150509295509295509295565b815173ffffffffffffffffffffffffffffffffffffffff16815260208083015190820152604081015b92915050565b5f805f8060808587031215613220575f80fd5b843561322b81612a8c565b9350602085013561323b81612a8c565b925060408501359150606085013561325281612a8c565b939692955090935050565b5f805f805f60808688031215613271575f80fd5b853561327c81612a8c565b94506020860135935060408601359250606086013567ffffffffffffffff8111156132a5575f80fd5b6132b188828901612ae7565b969995985093965092949392505050565b801515811461150a575f80fd5b8035612ae2816132c2565b5f82601f8301126132e9575f80fd5b6132f6612cba8335612ed6565b82358082526020808301929160051b850101851015613313575f80fd5b602084015b6020853560051b8601018110156135125767ffffffffffffffff808235111561333f575f80fd5b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0833588018903011215613373575f80fd5b61337b612b9a565b816020843589010135111561338e575f80fd5b82358701602081013501603f810189136133a6575f80fd5b6133b6612cba6020830135612ed6565b602082810135808352908201919060051b83016040018b10156133d7575f80fd5b604083015b6040602085013560051b8501018110156134d55785813511156133fd575f80fd5b8035840160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0828f03011215613432575f80fd5b61343a612be6565b6134476040830135612a8c565b60408201358152876060830135111561345e575f80fd5b6134718e60406060850135850101612c9d565b60208201526134836080830135612a8c565b608082013560408201528760a0830135111561349d575f80fd5b6134b08e604060a0850135850101612c9d565b60608201526134c160c083016132cf565b6080820152845250602092830192016133dc565b508352506134ea905083358801604001612ad7565b6020820152606083358801013560408201528085525050602083019250602081019050613318565b50949350505050565b5f805f80848603610120811215613530575f80fd5b853567ffffffffffffffff811115613546575f80fd5b613552888289016132da565b955050602086013593506040860135925060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa082011215613592575f80fd5b509295919450926060019150565b5f606082840312156135b0575f80fd5b50919050565b5f805f805f805f60e0888a0312156135cc575f80fd5b87356135d781612a8c565b965060208801359550604088013567ffffffffffffffff808211156135fa575f80fd5b6136068b838c01612c9d565b965060608a0135955060808a0135915061361f82612a8c565b90935060a08901359080821115613634575f80fd5b6136408b838c01612c9d565b935060c08a0135915080821115613655575f80fd5b506136628a828b016135a0565b91505092959891949750929550565b5f805f60408486031215613683575f80fd5b833561368e81612a8c565b9250602084013567ffffffffffffffff8111156136a9575f80fd5b6136b586828701612ae7565b9497909650939450505050565b5f80602083850312156136d3575f80fd5b823567ffffffffffffffff8111156136e9575f80fd5b6136f585828601612b2c565b90969095509350505050565b5f5b8381101561371b578181015183820152602001613703565b50505f910152565b5f815180845261373a816020860160208601613701565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156137df577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526137cd858351613723565b94509285019290850190600101613793565b5092979650505050505050565b5f805f805f805f805f60c08a8c031215613804575f80fd5b893561380f81612a8c565b985060208a0135975060408a013567ffffffffffffffff80821115613832575f80fd5b61383e8d838e01612ae7565b909950975060608c0135915080821115613856575f80fd5b6138628d838e01612b2c565b909750955060808c0135915061387782612a8c565b90935060a08b0135908082111561388c575f80fd5b506138998c828d01612ae7565b915080935050809150509295985092959850929598565b5f805f606084860312156138c2575f80fd5b83356138cd81612a8c565b925060208401356138dd81612a8c565b929592945050506040919091013590565b5f602082840312156138fe575f80fd5b813561390981612a8c565b9392505050565b5f805f60608486031215613922575f80fd5b833567ffffffffffffffff811115613938575f80fd5b613944868287016132da565b9660208601359650604090950135949350505050565b5f805f805f805f805f8060e08b8d031215613973575f80fd5b8a3561397e81612a8c565b995060208b013567ffffffffffffffff8082111561399a575f80fd5b6139a68e838f01612e95565b909b50995060408d01359150808211156139be575f80fd5b6139ca8e838f01612ae7565b909950975060608d0135965060808d013591506139e682612a8c565b90945060a08c013590808211156139fb575f80fd5b50613a088d828e01612ae7565b9094509250613a1b905060c08c01612ad7565b90509295989b9194979a5092959850565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152610a0260a0830184613723565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215613aad575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a06080830152610de560a083018486613ab4565b5f60208284031215613b50575f80fd5b61390982612ef9565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b8c575f80fd5b83018035915067ffffffffffffffff821115613ba6575f80fd5b602001915036819003821315612b25575f80fd5b602081525f610e87602083018486613ab4565b5f60208284031215613bdd575f80fd5b815161390981612a8c565b818382375f9101908152919050565b5f60208284031215613c07575f80fd5b815167ffffffffffffffff811115613c1d575f80fd5b8201601f81018413613c2d575f80fd5b8051613c3b612cba82612c58565b818152856020838501011115613c4f575f80fd5b61142f826020830160208601613701565b602081525f6139096020830184613723565b5f60208284031215613c82575f80fd5b8151613909816132c2565b608081525f613c9f6080830188613723565b73ffffffffffffffffffffffffffffffffffffffff8781166020850152861660408401528281036060840152610de5818587613ab4565b5f60408284031215613ce6575f80fd5b6040516040810181811067ffffffffffffffff82111715613d0957613d09612b6d565b80604052508091508251613d1c81612a8c565b8152602092830151920191909152919050565b5f6020808385031215613d40575f80fd5b825167ffffffffffffffff811115613d56575f80fd5b8301601f81018513613d66575f80fd5b8051613d74612cba82612ed6565b8082825260208201915060208360061b850101925087831115613d95575f80fd5b6020840193505b82841015610a0257613dae8885613cd6565b82528482019150604084019350613d9c565b5f60608284031215613dd0575f80fd5b613dd8612b9a565b8235613de381612a8c565b8152602083810135908201526040830135613dfd816132c2565b60408201529392505050565b608081525f613e1c60808301888a613ab4565b73ffffffffffffffffffffffffffffffffffffffff8781166020850152861660408401528281036060840152613e53818587613ab4565b9998505050505050505050565b608081525f613e726080830187613723565b73ffffffffffffffffffffffffffffffffffffffff8681166020850152851660408401528281036060840152610a028185613723565b5f60408284031215613eb8575f80fd5b6139098383613cd6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561320757613207613ec2565b8082018082111561320757613207613ec2565b5f8251613f26818460208701613701565b919091019291505056fea2646970667358221220e7e228b0257ec786322a8338c89336fcf2b285e97fddf24624ec476bb6daccd064736f6c634300081900330000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b0000000000000000000000005300000000000000000000000000000000000004

Deployed Bytecode

0x6080604052600436106101c5575f3560e01c8063a4a78f0c116100f2578063eb1432f011610092578063f44e537a11610062578063f44e537a1461051f578063fb6890881461053e578063fbfa77cf14610551578063fc31d54a14610584575f80fd5b8063eb1432f0146104a7578063f2428621146104ba578063f2fde38b146104ed578063f3995c671461050c575f80fd5b8063b2118a8d116100cd578063b2118a8d14610421578063b956b3fb14610440578063c2e3140a14610481578063d7570e4514610494575f80fd5b8063a4a78f0c146103cf578063ac9650d8146103e2578063ad271fa314610402575f80fd5b80636291027c116101685780637b2151e5116101385780637b2151e5146103615780637d10c9d6146103745780638da5cb5b146103935780639dd41df2146103bc575f80fd5b80636291027c14610308578063688ee44c146103275780636cc781cd1461033a578063715018a61461034d575f80fd5b806339be5126116101a357806339be51261461025f5780634659a494146102805780634f25b8581461029357806353c43f15146102dc575f80fd5b8063099a04e5146101c95780632b4abadb146101ea578063353766c614610233575b5f80fd5b3480156101d4575f80fd5b506101e86101e3366004612aad565b610597565b005b3480156101f5575f80fd5b50610209610204366004612aad565b6105b7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561023e575f80fd5b5061025261024d366004612d48565b6105f8565b60405161022a9190612e29565b61027261026d366004612fc6565b610710565b60405190815260200161022a565b6101e861028e3660046130ba565b61092b565b34801561029e575f80fd5b506102cc6102ad366004613110565b600160209081525f928352604080842090915290825290205460ff1681565b604051901515815260200161022a565b3480156102e7575f80fd5b506102fb6102f6366004613147565b6109e1565b60405161022a91906131de565b348015610313575f80fd5b506101e861032236600461320d565b610a0d565b6101e861033536600461325d565b610aa2565b6101e861034836600461325d565b610b50565b348015610358575f80fd5b506101e8610be0565b6102fb61036f36600461351b565b610bf3565b34801561037f575f80fd5b506102fb61038e3660046135b6565b610d44565b34801561039e575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610209565b6102096103ca366004613671565b610df1565b6101e86103dd3660046130ba565b610e8f565b6103f56103f03660046136c2565b610f5f565b60405161022a919061376c565b34801561040d575f80fd5b5061025261041c3660046137ec565b6110c9565b34801561042c575f80fd5b506101e861043b3660046138b0565b61114e565b34801561044b575f80fd5b5061027261045a3660046138ee565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b6101e861048f3660046130ba565b61132f565b6102fb6104a2366004613910565b6113d7565b6102726104b536600461395a565b611438565b3480156104c5575f80fd5b506102097f000000000000000000000000530000000000000000000000000000000000000481565b3480156104f8575f80fd5b506101e86105073660046138ee565b611456565b6101e861051a3660046130ba565b61150d565b34801561052a575f80fd5b506101e861053936600461320d565b61158a565b61027261054c366004612fc6565b6115f8565b34801561055c575f80fd5b506102097f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b81565b61027261059236600461395a565b611617565b61059f611706565b805f036105a95750475b6105b382826117a2565b5050565b6002602052815f5260405f2081815481106105d0575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b8051602082015160408084015190517f2c0198cc00000000000000000000000000000000000000000000000000000000815260609373ffffffffffffffffffffffffffffffffffffffff8f1693632c0198cc9361065f933393309390929091600401613a2c565b5f604051808303815f87803b158015610676575f80fd5b505af1158015610688573d5f803e3d5ffd5b505050506107018b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284375f920191909152508c92508b91508a905061183d565b9b9a5050505050505050505050565b81516040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081018290529091905f5b828110156108385785818151811061076157610761613a70565b6020908102919091018101518051918101516040808301516060840151608085015160a086015193517fd505accf0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810195909552606485019290925260ff16608484015260a483015260c482015290935073ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e4015f604051808303815f87803b158015610817575f80fd5b505af1158015610829573d5f803e3d5ffd5b50505050806001019050610747565b5061084a8e8e8e8e8e8e8e8e8e611a2e565b925073ffffffffffffffffffffffffffffffffffffffff84161561091a575f6108758b8d018d613110565b91505073ffffffffffffffffffffffffffffffffffffffff811615610918576040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8281166024830152861690637acb7757906044015f604051808303815f87803b158015610901575f80fd5b505af1158015610913573d5f803e3d5ffd5b505050505b505b50509b9a5050505050505050505050565b6040517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e4810182905273ffffffffffffffffffffffffffffffffffffffff871690638fcbaf0c90610104015b5f604051808303815f87803b1580156109c3575f80fd5b505af11580156109d5573d5f803e3d5ffd5b50505050505050505050565b604080518082019091525f8082526020820152610a02878787878787611b86565b979650505050505050565b610a18848484611d0a565b6040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152851690637acb7757906044015b5f604051808303815f87803b158015610a86575f80fd5b505af1158015610a98573d5f803e3d5ffd5b5050505050505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152849073ffffffffffffffffffffffffffffffffffffffff87169063dd62ed3e90604401602060405180830381865afa158015610b12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b369190613a9d565b1015610b4957610b498585858585610b50565b5050505050565b6040517f2c0198cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690632c0198cc90610bac90339030908990899089908990600401613afb565b5f604051808303815f87803b158015610bc3575f80fd5b505af1158015610bd5573d5f803e3d5ffd5b505050505050505050565b610be8611706565b610bf15f611dde565b565b604080518082019091525f80825260208201528280421115610c41576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c4e60208401846138ee565b73ffffffffffffffffffffffffffffffffffffffff1663d505accf333060208701356040880135610c8560808a0160608b01613b40565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff95861660048201529490931660248501526044840191909152606483015260ff166084820152608086013560a482015260a086013560c482015260e4015f604051808303815f87803b158015610d1a575f80fd5b505af1158015610d2c573d5f803e3d5ffd5b50505050610d3a8686611e52565b9695505050505050565b604080518082019091525f808252602082015273ffffffffffffffffffffffffffffffffffffffff8816632c0198cc333085356020870135610d896040890189613b59565b6040518763ffffffff1660e01b8152600401610daa96959493929190613afb565b5f604051808303815f87803b158015610dc1575f80fd5b505af1158015610dd3573d5f803e3d5ffd5b50505050610de5888888888888611b86565b98975050505050505050565b6040517f13b8683f0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff8516906313b8683f90610e479086908690600401613bba565b6020604051808303815f875af1158015610e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e879190613bcd565b949350505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613a9d565b1015610f5757610f5786868686868661092b565b505050505050565b60608167ffffffffffffffff811115610f7a57610f7a612b6d565b604051908082528060200260200182016040528015610fad57816020015b6060815260200190600190039081610f985790505b5090505f5b828110156110c2575f8030868685818110610fcf57610fcf613a70565b9050602002810190610fe19190613b59565b604051610fef929190613be8565b5f60405180830381855af49150503d805f8114611027576040519150601f19603f3d011682016040523d82523d5f602084013e61102c565b606091505b50915091508161109a57604481511015611044575f80fd5b6004810190508080602001905181019061105e9190613bf7565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110919190613c60565b60405180910390fd5b808484815181106110ad576110ad613a70565b60209081029190910101525050600101610fb2565b5092915050565b60606111408a8a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284375f920191909152508b92508a915089905061183d565b9a9950505050505050505050565b611156611706565b73ffffffffffffffffffffffffffffffffffffffff8216158015906111a757508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f496e76616c696420746f000000000000000000000000000000000000000000006044820152606401611091565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611277573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129b9190613a9d565b9050815f036112b4576112af8484836122f3565b611329565b8082111561131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f457863656564732062616c616e636500000000000000000000000000000000006044820152606401611091565b6113298484846122f3565b50505050565b6040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152859073ffffffffffffffffffffffffffffffffffffffff88169063dd62ed3e90604401602060405180830381865afa15801561139f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113c39190613a9d565b1015610f5757610f5786868686868661150d565b604080518082019091525f80825260208201528180421115611425576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142f8585611e52565b95945050505050565b5f61144b8b8b8b8b8b8b8b8b8b8b611617565b90506111408b61242c565b61145e611706565b73ffffffffffffffffffffffffffffffffffffffff8116611501576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611091565b61150a81611dde565b50565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c4810182905273ffffffffffffffffffffffffffffffffffffffff87169063d505accf9060e4016109ac565b611595848484611d0a565b6040517f294091cd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052828116604483015285169063294091cd90606401610a6f565b5f61160c8c8c8c8c8c8c8c8c8c8c8c610710565b90506107018c61242c565b5f6116298b8b8b8b8b8b8b8b8b611a2e565b905073ffffffffffffffffffffffffffffffffffffffff821615611140575f611654888a018a613110565b91505073ffffffffffffffffffffffffffffffffffffffff8116156116f7576040517f7acb77570000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8281166024830152841690637acb7757906044015f604051808303815f87803b1580156116e0575f80fd5b505af11580156116f2573d5f803e3d5ffd5b505050505b509a9950505050505050505050565b336117255f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610bf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611091565b5f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146117f8576040519150601f19603f3d011682016040523d82523d5f602084013e6117fd565b606091505b5050905080611838576040517fb12d13eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff881660248201819052604482018890526060916323b872dd906064016020604051808303815f875af11580156118b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118da9190613c72565b506040517ff66eab5b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89169063f66eab5b906119359089903390899089908990600401613c8d565b5f604051808303815f875af1158015611950573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119959190810190613d2f565b80519091505f5b81811015611a21575f8382815181106119b7576119b7613a70565b602002602001015190508782815181106119d3576119d3613a70565b602002602001015181602001511015611a18576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060010161199c565b5050979650505050505050565b604080516060810182525f8082526020820181905291810182905288905f5b82811015611a9e578b8b82818110611a6757611a67613a70565b905060600201803603810190611a7d9190613dc0565b9150611a96825f01518e846020015185604001516124f7565b600101611a4d565b506040517f03e7286a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906303e7286a90611afb908c908c9033908c908c908c90600401613e09565b6020604051808303815f875af1158015611b17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3b9190613a9d565b925086831015611b77576040517f249942be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50509998505050505050505050565b6040805180820182525f808252602082015290517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff88166024820181905260448201889052906323b872dd906064016020604051808303815f875af1158015611c0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c329190613c72565b506040517f27b0bcea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906327b0bcea90611c8b908890339088908890600401613e60565b60408051808303815f875af1158015611ca6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cca9190613ea8565b90508381602001511015610d3a576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1682333084612812565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015282919084169063dd62ed3e90604401602060405180830381865afa158015611d89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dad9190613a9d565b10156118385761183882847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612953565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091525f80825260208201528251604080516060808201835281525f6020820181905291810191909152611ee06040518060a001604052805f73ffffffffffffffffffffffffffffffffffffffff168152602001606081526020015f73ffffffffffffffffffffffffffffffffffffffff168152602001606081526020015f151581525090565b604080518082019091525f80825260208201525f5b848110156122aa57878181518110611f0f57611f0f613a70565b60200260200101519350835f01515f81518110611f2e57611f2e613a70565b60200260200101519250611f538460200151845f0151866040015186608001516124f7565b8351515f5b611f63600183613eef565b810361203357845f015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b8152600401611fb79493929190613e60565b60408051808303815f875af1158015611fd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff69190613ea8565b805173ffffffffffffffffffffffffffffffffffffffff168952602080820151908a018051929650909161202b908390613f02565b9052506122a0565b845f015173ffffffffffffffffffffffffffffffffffffffff16637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016120819493929190613e60565b60408051808303815f875af115801561209c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120c09190613ea8565b6080860151875180519296506001909301929091839081106120e4576120e4613a70565b60200260200101519550801580156120fd575085608001515b1561229a5784516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561216d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121919190613a9d565b90506121c1865f01517f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b836122f3565b855187516040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169263f9609f08926122579260040173ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b6020604051808303815f875af1158015612273573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122979190613a9d565b50505b50611f58565b5050600101611ef5565b5085856020015110156122e9576040517fc9f52c7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505092915050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916123899190613f15565b5f604051808303815f865af19150503d805f81146123c2576040519150601f19603f3d011682016040523d82523d5f602084013e6123c7565b606091505b50915091508115806123f557508051158015906123f55750808060200190518101906123f39190613c72565b155b15610b49576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff1661150a5773ffffffffffffffffffffffffffffffffffffffff165f818152600160208181526040808420338552825280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016841790556002825283208054928301815583529091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b80156126bb5773ffffffffffffffffffffffffffffffffffffffff84166125d8576040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301527f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169063f9609f0890849060440160206040518083038185885af11580156125ad573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906125d29190613a9d565b50611329565b61260484337f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b85612812565b6040517ff9609f0800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301527f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169063f9609f08906044016020604051808303815f875af1158015612697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190613a9d565b73ffffffffffffffffffffffffffffffffffffffff841661280a577f000000000000000000000000530000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b15801561273c575f80fd5b505af115801561274e573d5f803e3d5ffd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018790527f000000000000000000000000530000000000000000000000000000000000000416935063a9059cbb925060440190506020604051808303815f875af11580156127e6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190613c72565b611329843385855b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f928392908816916128b09190613f15565b5f604051808303815f865af19150503d805f81146128e9576040519150601f19603f3d011682016040523d82523d5f602084013e6128ee565b606091505b509150915081158061291c575080511580159061291c57508080602001905181019061291a9190613c72565b155b15610f57576040517f7939f42400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b30000000000000000000000000000000000000000000000000000000017905291515f928392908716916129e99190613f15565b5f604051808303815f865af19150503d805f8114612a22576040519150601f19603f3d011682016040523d82523d5f602084013e612a27565b606091505b5091509150811580612a555750805115801590612a55575080806020019051810190612a539190613c72565b155b15610b49576040517f3e3f8f7300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461150a575f80fd5b5f8060408385031215612abe575f80fd5b8235612ac981612a8c565b946020939093013593505050565b8035612ae281612a8c565b919050565b5f8083601f840112612af7575f80fd5b50813567ffffffffffffffff811115612b0e575f80fd5b602083019150836020828501011115612b25575f80fd5b9250929050565b5f8083601f840112612b3c575f80fd5b50813567ffffffffffffffff811115612b53575f80fd5b6020830191508360208260051b8501011115612b25575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715612bbd57612bbd612b6d565b60405290565b60405160c0810167ffffffffffffffff81118282101715612bbd57612bbd612b6d565b60405160a0810167ffffffffffffffff81118282101715612bbd57612bbd612b6d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612c5057612c50612b6d565b604052919050565b5f67ffffffffffffffff821115612c7157612c71612b6d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612cac575f80fd5b8135612cbf612cba82612c58565b612c09565b818152846020838601011115612cd3575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215612cff575f80fd5b612d07612b9a565b90508135815260208201356020820152604082013567ffffffffffffffff811115612d30575f80fd5b612d3c84828501612c9d565b60408301525092915050565b5f805f805f805f805f8060e08b8d031215612d61575f80fd5b612d6a8b612ad7565b995060208b0135985060408b013567ffffffffffffffff80821115612d8d575f80fd5b612d998e838f01612ae7565b909a50985060608d0135915080821115612db1575f80fd5b612dbd8e838f01612b2c565b9098509650869150612dd160808e01612ad7565b955060a08d0135915080821115612de6575f80fd5b612df28e838f01612ae7565b909550935060c08d0135915080821115612e0a575f80fd5b50612e178d828e01612cef565b9150509295989b9194979a5092959850565b602080825282518282018190525f919060409081850190868401855b82811015612e8857612e78848351805173ffffffffffffffffffffffffffffffffffffffff168252602090810151910152565b9284019290850190600101612e45565b5091979650505050505050565b5f8083601f840112612ea5575f80fd5b50813567ffffffffffffffff811115612ebc575f80fd5b602083019150836020606083028501011115612b25575f80fd5b5f67ffffffffffffffff821115612eef57612eef612b6d565b5060051b60200190565b803560ff81168114612ae2575f80fd5b5f82601f830112612f18575f80fd5b81356020612f28612cba83612ed6565b82815260c09283028501820192828201919087851115612f46575f80fd5b8387015b85811015612fb95781818a031215612f60575f80fd5b612f68612bc3565b8135612f7381612a8c565b81528186013586820152604080830135908201526060612f94818401612ef9565b908201526080828101359082015260a080830135908201528452928401928101612f4a565b5090979650505050505050565b5f805f805f805f805f805f6101008c8e031215612fe1575f80fd5b612fea8c612ad7565b9a5067ffffffffffffffff8060208e01351115613005575f80fd5b6130158e60208f01358f01612e95565b909b50995060408d013581101561302a575f80fd5b61303a8e60408f01358f01612ae7565b909950975060608d0135965061305260808e01612ad7565b95508060a08e01351115613064575f80fd5b6130748e60a08f01358f01612ae7565b909550935060c08d0135811015613089575f80fd5b5061309a8d60c08e01358e01612f09565b91506130a860e08d01612ad7565b90509295989b509295989b9093969950565b5f805f805f8060c087890312156130cf575f80fd5b86356130da81612a8c565b955060208701359450604087013593506130f660608801612ef9565b92506080870135915060a087013590509295509295509295565b5f8060408385031215613121575f80fd5b823561312c81612a8c565b9150602083013561313c81612a8c565b809150509250929050565b5f805f805f8060c0878903121561315c575f80fd5b863561316781612a8c565b955060208701359450604087013567ffffffffffffffff8082111561318a575f80fd5b6131968a838b01612c9d565b955060608901359450608089013591506131af82612a8c565b90925060a088013590808211156131c4575f80fd5b506131d189828a01612c9d565b9150509295509295509295565b815173ffffffffffffffffffffffffffffffffffffffff16815260208083015190820152604081015b92915050565b5f805f8060808587031215613220575f80fd5b843561322b81612a8c565b9350602085013561323b81612a8c565b925060408501359150606085013561325281612a8c565b939692955090935050565b5f805f805f60808688031215613271575f80fd5b853561327c81612a8c565b94506020860135935060408601359250606086013567ffffffffffffffff8111156132a5575f80fd5b6132b188828901612ae7565b969995985093965092949392505050565b801515811461150a575f80fd5b8035612ae2816132c2565b5f82601f8301126132e9575f80fd5b6132f6612cba8335612ed6565b82358082526020808301929160051b850101851015613313575f80fd5b602084015b6020853560051b8601018110156135125767ffffffffffffffff808235111561333f575f80fd5b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0833588018903011215613373575f80fd5b61337b612b9a565b816020843589010135111561338e575f80fd5b82358701602081013501603f810189136133a6575f80fd5b6133b6612cba6020830135612ed6565b602082810135808352908201919060051b83016040018b10156133d7575f80fd5b604083015b6040602085013560051b8501018110156134d55785813511156133fd575f80fd5b8035840160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0828f03011215613432575f80fd5b61343a612be6565b6134476040830135612a8c565b60408201358152876060830135111561345e575f80fd5b6134718e60406060850135850101612c9d565b60208201526134836080830135612a8c565b608082013560408201528760a0830135111561349d575f80fd5b6134b08e604060a0850135850101612c9d565b60608201526134c160c083016132cf565b6080820152845250602092830192016133dc565b508352506134ea905083358801604001612ad7565b6020820152606083358801013560408201528085525050602083019250602081019050613318565b50949350505050565b5f805f80848603610120811215613530575f80fd5b853567ffffffffffffffff811115613546575f80fd5b613552888289016132da565b955050602086013593506040860135925060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa082011215613592575f80fd5b509295919450926060019150565b5f606082840312156135b0575f80fd5b50919050565b5f805f805f805f60e0888a0312156135cc575f80fd5b87356135d781612a8c565b965060208801359550604088013567ffffffffffffffff808211156135fa575f80fd5b6136068b838c01612c9d565b965060608a0135955060808a0135915061361f82612a8c565b90935060a08901359080821115613634575f80fd5b6136408b838c01612c9d565b935060c08a0135915080821115613655575f80fd5b506136628a828b016135a0565b91505092959891949750929550565b5f805f60408486031215613683575f80fd5b833561368e81612a8c565b9250602084013567ffffffffffffffff8111156136a9575f80fd5b6136b586828701612ae7565b9497909650939450505050565b5f80602083850312156136d3575f80fd5b823567ffffffffffffffff8111156136e9575f80fd5b6136f585828601612b2c565b90969095509350505050565b5f5b8381101561371b578181015183820152602001613703565b50505f910152565b5f815180845261373a816020860160208601613701565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f60208083016020845280855180835260408601915060408160051b8701019250602087015f5b828110156137df577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526137cd858351613723565b94509285019290850190600101613793565b5092979650505050505050565b5f805f805f805f805f60c08a8c031215613804575f80fd5b893561380f81612a8c565b985060208a0135975060408a013567ffffffffffffffff80821115613832575f80fd5b61383e8d838e01612ae7565b909950975060608c0135915080821115613856575f80fd5b6138628d838e01612b2c565b909750955060808c0135915061387782612a8c565b90935060a08b0135908082111561388c575f80fd5b506138998c828d01612ae7565b915080935050809150509295985092959850929598565b5f805f606084860312156138c2575f80fd5b83356138cd81612a8c565b925060208401356138dd81612a8c565b929592945050506040919091013590565b5f602082840312156138fe575f80fd5b813561390981612a8c565b9392505050565b5f805f60608486031215613922575f80fd5b833567ffffffffffffffff811115613938575f80fd5b613944868287016132da565b9660208601359650604090950135949350505050565b5f805f805f805f805f8060e08b8d031215613973575f80fd5b8a3561397e81612a8c565b995060208b013567ffffffffffffffff8082111561399a575f80fd5b6139a68e838f01612e95565b909b50995060408d01359150808211156139be575f80fd5b6139ca8e838f01612ae7565b909950975060608d0135965060808d013591506139e682612a8c565b90945060a08c013590808211156139fb575f80fd5b50613a088d828e01612ae7565b9094509250613a1b905060c08c01612ad7565b90509295989b9194979a5092959850565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152610a0260a0830184613723565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215613aad575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a06080830152610de560a083018486613ab4565b5f60208284031215613b50575f80fd5b61390982612ef9565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b8c575f80fd5b83018035915067ffffffffffffffff821115613ba6575f80fd5b602001915036819003821315612b25575f80fd5b602081525f610e87602083018486613ab4565b5f60208284031215613bdd575f80fd5b815161390981612a8c565b818382375f9101908152919050565b5f60208284031215613c07575f80fd5b815167ffffffffffffffff811115613c1d575f80fd5b8201601f81018413613c2d575f80fd5b8051613c3b612cba82612c58565b818152856020838501011115613c4f575f80fd5b61142f826020830160208601613701565b602081525f6139096020830184613723565b5f60208284031215613c82575f80fd5b8151613909816132c2565b608081525f613c9f6080830188613723565b73ffffffffffffffffffffffffffffffffffffffff8781166020850152861660408401528281036060840152610de5818587613ab4565b5f60408284031215613ce6575f80fd5b6040516040810181811067ffffffffffffffff82111715613d0957613d09612b6d565b80604052508091508251613d1c81612a8c565b8152602092830151920191909152919050565b5f6020808385031215613d40575f80fd5b825167ffffffffffffffff811115613d56575f80fd5b8301601f81018513613d66575f80fd5b8051613d74612cba82612ed6565b8082825260208201915060208360061b850101925087831115613d95575f80fd5b6020840193505b82841015610a0257613dae8885613cd6565b82528482019150604084019350613d9c565b5f60608284031215613dd0575f80fd5b613dd8612b9a565b8235613de381612a8c565b8152602083810135908201526040830135613dfd816132c2565b60408201529392505050565b608081525f613e1c60808301888a613ab4565b73ffffffffffffffffffffffffffffffffffffffff8781166020850152861660408401528281036060840152613e53818587613ab4565b9998505050505050505050565b608081525f613e726080830187613723565b73ffffffffffffffffffffffffffffffffffffffff8681166020850152851660408401528281036060840152610a028185613723565b5f60408284031215613eb8575f80fd5b6139098383613cd6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561320757613207613ec2565b8082018082111561320757613207613ec2565b5f8251613f26818460208701613701565b919091019291505056fea2646970667358221220e7e228b0257ec786322a8338c89336fcf2b285e97fddf24624ec476bb6daccd064736f6c63430008190033

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

0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b0000000000000000000000005300000000000000000000000000000000000004

-----Decoded View---------------
Arg [0] : _vault (address): 0x7160570BB153Edd0Ea1775EC2b2Ac9b65F1aB61B
Arg [1] : _wETH (address): 0x5300000000000000000000000000000000000004

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b
Arg [1] : 0000000000000000000000005300000000000000000000000000000000000004


Deployed Bytecode Sourcemap

17866:14290:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5744:219;;;;;;;;;;-1:-1:-1;5744:219:0;;;;;:::i;:::-;;:::i;:::-;;18252:49;;;;;;;;;;-1:-1:-1;18252:49:0;;;;;:::i;:::-;;:::i;:::-;;;1168:42:1;1156:55;;;1138:74;;1126:2;1111:18;18252:49:0;;;;;;;;25271:756;;;;;;;;;;-1:-1:-1;25271:756:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22048:1332::-;;;;;;:::i;:::-;;:::i;:::-;;;10806:25:1;;;10794:2;10779:18;22048:1332:0;10660:177:1;11290:289:0;;;;;;:::i;:::-;;:::i;18180:65::-;;;;;;;;;;-1:-1:-1;18180:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12021:14:1;;12014:22;11996:41;;11984:2;11969:18;18180:65:0;11856:187:1;26602:463:0;;;;;;;;;;-1:-1:-1;26602:463:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31783:173::-;;;;;;;;;;-1:-1:-1;31783:173:0;;;;;:::i;:::-;;:::i;12214:315::-;;;;;;:::i;:::-;;:::i;11957:249::-;;;;;;:::i;:::-;;:::i;4344:103::-;;;;;;;;;;;;;:::i;30409:623::-;;;;;;:::i;:::-;;:::i;27073:755::-;;;;;;;;;;-1:-1:-1;27073:755:0;;;;;:::i;:::-;;:::i;3705:87::-;;;;;;;;;;-1:-1:-1;3751:7:0;3778:6;;;3705:87;;31114:159;;;;;;:::i;:::-;;:::i;11587:362::-;;;;;;:::i;:::-;;:::i;12819:789::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24797:466::-;;;;;;;;;;-1:-1:-1;24797:466:0;;;;;:::i;:::-;;:::i;5243:464::-;;;;;;;;;;-1:-1:-1;5243:464:0;;;;;:::i;:::-;;:::i;18616:128::-;;;;;;;;;;-1:-1:-1;18616:128:0;;;;;:::i;:::-;18708:21;;18684:4;18708:21;;;:12;:21;;;;;:28;;18616:128;10948:334;;;;;;:::i;:::-;;:::i;30121:280::-;;;;;;:::i;:::-;;:::i;21510:530::-;;;;;;:::i;:::-;;:::i;18087:29::-;;;;;;;;;;;;;;;4602:201;;;;;;;;;;-1:-1:-1;4602:201:0;;;;;:::i;:::-;;:::i;10673:267::-;;;;;;:::i;:::-;;:::i;31964:189::-;;;;;;;;;;-1:-1:-1;31964:189:0;;;;;:::i;:::-;;:::i;23388:615::-;;;;;;:::i;:::-;;:::i;18050:30::-;;;;;;;;;;;;;;;20772:730;;;;;;:::i;:::-;;:::i;5744:219::-;3591:13;:11;:13::i;:::-;5833:6:::1;5843:1;5833:11:::0;5829:74:::1;;-1:-1:-1::0;5870:21:0::1;5829:74;5913:42;5944:2;5948:6;5913:30;:42::i;:::-;5744:219:::0;;:::o;18252:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18252:49:0;;-1:-1:-1;18252:49:0:o;25271:756::-;25731:20;;25766:15;;;;25796:16;;;;;25640:183;;;;;25551:34;;25640:23;;;;;;:183;;25678:10;;25711:4;;25731:20;;25766:15;;25640:183;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25846:173;25886:4;25905:9;25929:4;;25846:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25846:173:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25948:10:0;;-1:-1:-1;25948:10:0;;;;25846:173;;;25948:10;;25846:173;25948:10;25846:173;;;;;;;;;-1:-1:-1;25973:8:0;;-1:-1:-1;25996:12:0;;-1:-1:-1;25996:12:0;;-1:-1:-1;25846:25:0;:173::i;:::-;25836:183;25271:756;-1:-1:-1;;;;;;;;;;;25271:756:0:o;22048:1332::-;22446:14;;-1:-1:-1;;;;;;;;22367:14:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22367:14:0;;22446;22522:6;22517:412;22534:1;22530;:5;22517:412;;;22563:7;22571:1;22563:10;;;;;;;;:::i;:::-;;;;;;;;;;;;22603:12;;22703:20;;;;22742:15;;;;;22776:8;;;;22803;;;;22830;;;;22590:263;;;;;22642:10;22590:263;;;27976:34:1;22679:4:0;28026:18:1;;;28019:43;28078:18;;;28071:34;;;;28121:18;;;28114:34;;;;28197:4;28185:17;28164:19;;;28157:46;28219:19;;;28212:35;28263:19;;;28256:35;22563:10:0;;-1:-1:-1;22590:33:0;;;;;;;27887:19:1;;22590:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22899:3;;;;;22517:412;;;;22953:171;22992:4;23011:6;;23032:4;;23051:12;23078:8;23101:12;;22953:24;:171::i;:::-;22941:183;-1:-1:-1;23141:21:0;;;;23137:236;;23181:17;23202:36;;;;23213:4;23202:36;:::i;:::-;23179:59;-1:-1:-1;;23257:23:0;;;;23253:109;;23301:45;;;;;;;;28901:25:1;;;23301:23:0;28962:55:1;;;28942:18;;;28935:83;23301:23:0;;;;;28874:18:1;;23301:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23253:109;23164:209;23137:236;22383:997;;22048:1332;;;;;;;;;;;;;:::o;11290:289::-;11481:90;;;;;11515:10;11481:90;;;29423:34:1;11535:4:0;29473:18:1;;;29466:43;29525:18;;;29518:34;;;29568:18;;;29561:34;;;11557:4:0;29611:19:1;;;29604:51;29704:4;29692:17;;29671:19;;;29664:46;29726:19;;;29719:35;;;29770:19;;;29763:35;;;11481:33:0;;;;;;29334:19:1;;11481:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11290:289;;;;;;:::o;26602:463::-;-1:-1:-1;;;;;;;;;;;;;;;;;26879:178:0;26925:4;26944:9;26968:4;26987:9;27011:8;27034:12;26879:31;:178::i;:::-;26867:190;26602:463;-1:-1:-1;;;;;;;26602:463:0:o;31783:173::-;31874:29;31881:6;31889:5;31896:6;31874;:29::i;:::-;31914:34;;;;;;;;28901:25:1;;;31914:22:0;28962:55:1;;;28942:18;;;28935:83;31914:22:0;;;;;28874:18:1;;31914:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31783:173;;;;:::o;12214:315::-;12389:50;;;;;12413:10;12389:50;;;30044:34:1;12433:4:0;30094:18:1;;;30087:43;12442:5:0;;12389:23;;;;;;29956:18:1;;12389:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;12385:137;;;12464:46;12476:5;12483;12490:8;12500:9;;12464:11;:46::i;:::-;12214:315;;;;;:::o;11957:249::-;12115:83;;;;;:28;;;;;;:83;;12144:10;;12164:4;;12171:5;;12178:8;;12188:9;;;;12115:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11957:249;;;;;:::o;4344:103::-;3591:13;:11;:13::i;:::-;4409:30:::1;4436:1;4409:18;:30::i;:::-;4344:103::o:0;30409:623::-;-1:-1:-1;;;;;;;;;;;;;;;;;30594:8:0;18429;18411:15;:26;18407:75;;;18461:9;;;;;;;;;;;;;;18407:75;30718:12:::1;;::::0;::::1;:6:::0;:12:::1;:::i;:::-;30705:33;;;30753:10;30786:4;30806:20;::::0;::::1;;30841:15;::::0;::::1;;30871:8;::::0;;;::::1;::::0;::::1;;:::i;:::-;30705:231;::::0;;::::1;::::0;;;;;;27925:42:1;27994:15;;;30705:231:0::1;::::0;::::1;27976:34:1::0;28046:15;;;;28026:18;;;28019:43;28078:18;;;28071:34;;;;28121:18;;;28114:34;28197:4;28185:17;28164:19;;;28157:46;30894:8:0::1;::::0;::::1;;28219:19:1::0;;;28212:35;30917:8:0::1;::::0;::::1;;28263:19:1::0;;;28256:35;27887:19;;30705:231:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30961:63;30981:5;31001:12;30961:5;:63::i;:::-;30949:75:::0;30409:623;-1:-1:-1;;;;;;30409:623:0:o;27073:755::-;-1:-1:-1;;;;;;;;;;;;;;;;;27434:23:0;;;;27472:10;27505:4;27525:20;;27560:15;;;;27590:16;;;;27525:6;27590:16;:::i;:::-;27434:183;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27642:178;27688:4;27707:9;27731:4;27750:9;27774:8;27797:12;27642:31;:178::i;:::-;27630:190;27073:755;-1:-1:-1;;;;;;;;27073:755:0:o;31114:159::-;31226:39;;;;;31199:7;;31226:33;;;;;;:39;;31260:4;;;;31226:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31219:46;31114:159;-1:-1:-1;;;;31114:159:0:o;11587:362::-;11795:50;;;;;11819:10;11795:50;;;30044:34:1;11839:4:0;30094:18:1;;;30087:43;11848:17:0;;11795:23;;;;;;29956:18:1;;11795:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:70;11791:151;;;11882:48;11900:5;11907;11914:6;11922:1;11925;11928;11882:17;:48::i;:::-;11587:362;;;;;;:::o;12819:789::-;12885:22;12942:4;12930:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12920:34;;12980:6;12975:626;12988:15;;;12975:626;;;13022:12;;13067:4;13086;;13091:1;13086:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;13059:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13021:73;;;;13116:7;13111:313;;13245:2;13229:6;:13;:18;13225:32;;;13249:8;;;13225:32;13330:4;13322:6;13318:17;13308:27;;13390:6;13379:28;;;;;;;;;;;;:::i;:::-;13372:36;;;;;;;;;;;:::i;:::-;;;;;;;;13111:313;13453:6;13440:7;13448:1;13440:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;-1:-1:-1;;13571:3:0;;12975:626;;;;12819:789;;;;:::o;24797:466::-;25025:34;25082:173;25122:4;25141:9;25165:4;;25082:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25082:173:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25184:10:0;;-1:-1:-1;25184:10:0;;;;25082:173;;;25184:10;;25082:173;25184:10;25082:173;;;;;;;;;-1:-1:-1;25209:8:0;;-1:-1:-1;25232:12:0;;-1:-1:-1;25232:12:0;;-1:-1:-1;25082:25:0;:173::i;:::-;25072:183;24797:466;-1:-1:-1;;;;;;;;;;24797:466:0:o;5243:464::-;3591:13;:11;:13::i;:::-;5345:16:::1;::::0;::::1;::::0;;::::1;::::0;:31:::1;;;5371:5;5365:11;;:2;:11;;;;5345:31;5337:54;;;::::0;::::1;::::0;;33915:2:1;5337:54:0::1;::::0;::::1;33897:21:1::0;33954:2;33934:18;;;33927:30;33993:12;33973:18;;;33966:40;34023:18;;5337:54:0::1;33713:334:1::0;5337:54:0::1;5419:38;::::0;;;;5451:4:::1;5419:38;::::0;::::1;1138:74:1::0;5404:12:0::1;::::0;5419:23:::1;::::0;::::1;::::0;::::1;::::0;1111:18:1;;5419:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5404:53;;5474:6;5484:1;5474:11:::0;5470:230:::1;;5502:47;5530:5;5537:2;5541:7;5502:27;:47::i;:::-;5470:230;;;5600:7;5590:6;:17;;5582:45;;;::::0;::::1;::::0;;34254:2:1;5582:45:0::1;::::0;::::1;34236:21:1::0;34293:2;34273:18;;;34266:30;34332:17;34312:18;;;34305:45;34367:18;;5582:45:0::1;34052:339:1::0;5582:45:0::1;5642:46;5670:5;5677:2;5681:6;5642:27;:46::i;:::-;5326:381;5243:464:::0;;;:::o;10948:334::-;11145:50;;;;;11169:10;11145:50;;;30044:34:1;11189:4:0;30094:18:1;;;30087:43;11198:5:0;;11145:23;;;;;;29956:18:1;;11145:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;11141:134;;;11220:43;11231:5;11238;11245:8;11255:1;11258;11261;11220:10;:43::i;30121:280::-;-1:-1:-1;;;;;;;;;;;;;;;;;30252:8:0;18429;18411:15;:26;18407:75;;;18461:9;;;;;;;;;;;;;;18407:75;30330:63:::1;30350:5;30370:12;30330:5;:63::i;:::-;30318:75:::0;30121:280;-1:-1:-1;;;;;30121:280:0:o;21510:530::-;21777:14;21816:181;21843:4;21862:6;;21883:4;;21902:12;21929:8;21952:12;;21979:7;21816:12;:181::i;:::-;21804:193;;22010:22;22027:4;22010:16;:22::i;4602:201::-;3591:13;:11;:13::i;:::-;4691:22:::1;::::0;::::1;4683:73;;;::::0;::::1;::::0;;34598:2:1;4683:73:0::1;::::0;::::1;34580:21:1::0;34637:2;34617:18;;;34610:30;34676:34;34656:18;;;34649:62;34747:8;34727:18;;;34720:36;34773:19;;4683:73:0::1;34396:402:1::0;4683:73:0::1;4767:28;4786:8;4767:18;:28::i;:::-;4602:201:::0;:::o;10673:267::-;10853:79;;;;;10880:10;10853:79;;;27976:34:1;10900:4:0;28026:18:1;;;28019:43;28078:18;;;28071:34;;;28121:18;;;28114:34;;;28197:4;28185:17;;28164:19;;;28157:46;28219:19;;;28212:35;;;28263:19;;;28256:35;;;10853:26:0;;;;;;27887:19:1;;10853:79:0;27604:693:1;31964:189:0;32064:29;32071:6;32079:5;32086:6;32064;:29::i;:::-;32104:41;;;;;:22;35084:15:1;;;32104:41:0;;;35066:34:1;35116:18;;;35109:34;;;35179:15;;;35159:18;;;35152:43;32104:22:0;;;;;34978:18:1;;32104:41:0;34803:398:1;23388:615:0;23708:14;23747:213;23784:4;23803:6;;23824:4;;23843:12;23870:8;23893:12;;23920:7;23942;23747:22;:213::i;:::-;23735:225;;23973:22;23990:4;23973:16;:22::i;20772:730::-;21036:14;21075:171;21114:4;21133:6;;21154:4;;21173:12;21200:8;21223:12;;21075:24;:171::i;:::-;21063:183;-1:-1:-1;21263:21:0;;;;21259:236;;21303:17;21324:36;;;;21335:4;21324:36;:::i;:::-;21301:59;-1:-1:-1;;21379:23:0;;;;21375:109;;21423:45;;;;;;;;28901:25:1;;;21423:23:0;28962:55:1;;;28942:18;;;28935:83;21423:23:0;;;;;28874:18:1;;21423:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21375:109;21286:209;20772:730;;;;;;;;;;;;:::o;3870:130::-;3945:10;3934:7;3751;3778:6;;;;3705:87;3934:7;:21;;;3926:66;;;;;;;35408:2:1;3926:66:0;;;35390:21:1;;;35427:18;;;35420:30;35486:34;35466:18;;;35459:62;35538:18;;3926:66:0;35206:356:1;7886:260:0;8016:12;8034:2;:7;;8049:5;8034:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8015:44;;;8077:7;8072:67;;8108:19;;;;;;;;;;;;;;8072:67;7944:202;7886:260;;:::o;24034:755::-;24316:57;;;;;24345:10;24316:57;;;36040:34:1;24316:28:0;;;36090:18:1;;;36083:43;;;36142:18;;;36135:34;;;24269::0;;24316:28;;35952:18:1;;24316:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;24396:58:0;;;;;:16;;;;;;:58;;24413:4;;24419:10;;24431:8;;24441:12;;;;24396:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24476:14;;24386:68;;-1:-1:-1;24467:6:0;24503:279;24520:1;24516;:5;24503:279;;;24540:36;24579:7;24587:1;24579:10;;;;;;;;:::i;:::-;;;;;;;24540:49;;24631:10;24642:1;24631:13;;;;;;;;:::i;:::-;;;;;;;24610:11;:18;;;:34;24606:101;;;24672:19;;;;;;;;;;;;;;24606:101;-1:-1:-1;24752:3:0;;24503:279;;;;24305:484;24034:755;;;;;;;;;:::o;19742:795::-;-1:-1:-1;;;;;;;;19985:14:0;-1:-1:-1;;;;;;;;;;;;;;;20068:6:0;;20135;20130:215;20147:1;20143;:5;20130:215;;;20175:6;;20182:1;20175:9;;;;;;;:::i;:::-;;;;;;20167:17;;;;;;;;;;:::i;:::-;;;20201:68;20221:5;:11;;;20234:4;20240:5;:12;;;20254:5;:14;;;20201:19;:68::i;:::-;20315:3;;20130:215;;;-1:-1:-1;20369:58:0;;;;;:16;;;;;;:58;;20386:4;;;;20392:10;;20404:8;;20414:12;;;;20369:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20357:70;;20456:12;20444:9;:24;20440:90;;;20492:26;;;;;;;;;;;;;;20440:90;20001:536;;19742:795;;;;;;;;;;;:::o;26065:529::-;-1:-1:-1;;;;;;;;;;;;;;;;26341:57:0;;;;;26370:10;26341:57;;;36040:34:1;26341:28:0;;;36090:18:1;;;36083:43;;;36142:18;;;36135:34;;;26341:28:0;;;35952:18:1;;26341:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;26423:64:0;;;;;:22;;;;;;:64;;26446:4;;26452:10;;26464:8;;26474:12;;26423:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26411:76;;26523:9;26504;:16;;;:28;26500:87;;;26556:19;;;;;;;;;;;;;;31281:423;31360:73;31392:5;31399:10;31419:4;31426:6;31360:31;:73::i;:::-;31450:46;;;;;31482:4;31450:46;;;30044:34:1;31450:23:0;30114:15:1;;;30094:18;;;30087:43;31499:6:0;;31450:23;;;;;;29956:18:1;;31450:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;31446:251;;;31628:57;31655:5;31662:6;31670:14;31628:26;:57::i;4963:191::-;5037:16;5056:6;;;5073:17;;;;;;;;;;5106:40;;5056:6;;;;;;;5106:40;;5037:16;5106:40;5026:128;4963:191;:::o;27849:2264::-;-1:-1:-1;;;;;;;;;;;;;;;;;28016:12:0;;-1:-1:-1;;;;;;;;;;;27997:16:0;-1:-1:-1;;;;;;;;;;;;;28072:20:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28072:20:0;-1:-1:-1;;;;;;;;;;;;;;;;;28157:6:0;28152:1852;28169:11;28165:1;:15;28152:1852;;;28206:5;28212:1;28206:8;;;;;;;;:::i;:::-;;;;;;;28199:15;;28278:4;:10;;;28289:1;28278:13;;;;;;;;:::i;:::-;;;;;;;28271:20;;28306:74;28326:4;:12;;;28340:4;:9;;;28351:4;:13;;;28366:4;:13;;;28306:19;:74::i;:::-;28452:10;;:17;28433:16;28507:1422;28548:15;28562:1;28548:11;:15;:::i;:::-;28543:1;:20;28539:1375;;28679:4;:9;;;28669:25;;;28721:4;:9;;;28732:10;28744:4;:13;;;28759:4;:17;;;28669:130;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28842:17;;28824:35;;;;28902:18;;;;;28882:16;;;:38;;28655:144;;-1:-1:-1;28902:18:0;;28882:38;;28902:18;;28882:38;:::i;:::-;;;-1:-1:-1;28945:5:0;;28539:1375;29086:4;:9;;;29076:25;;;29128:4;:9;;;29139:10;29151:4;:13;;;29166:4;:17;;;29076:130;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29248:13;;;;29424:10;;:13;;29062:144;;-1:-1:-1;29368:3:0;;;;;29248:13;;29368:3;;29424:13;;;;;;:::i;:::-;;;;;;;29417:20;;29467:9;29466:10;:27;;;;;29480:4;:13;;;29466:27;29462:433;;;29543:17;;29536:50;;;;;29580:4;29536:50;;;1138:74:1;29522:11:0;;29536:35;;;;;1111:18:1;;29536:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29522:64;;29673:61;29701:11;:17;;;29720:5;29727:6;29673:27;:61::i;:::-;29842:17;;29861:9;;29820:51;;;;;:21;29827:5;29820:21;;;;:51;;;;29993:42:1;30062:15;;;30044:34;;30114:15;;30109:2;30094:18;;30087:43;29971:2;29956:18;;29809:327;29820:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29495:400;29462:433;28976:938;28507:1422;;;-1:-1:-1;;29974:3:0;;28152:1852;;;;30039:12;30020:9;:16;;;:31;30016:90;;;30075:19;;;;;;;;;;;;;;30016:90;27986:2127;;;;27849:2264;;;;:::o;6881:470::-;7170:45;;;7159:10;41338:55:1;;;7170:45:0;;;41320:74:1;41410:18;;;;41403:34;;;7170:45:0;;;;;;;;;;41293:18:1;;;;7170:45:0;;;;;;;;;;;;;7159:57;;-1:-1:-1;;;;7159:10:0;;;;:57;;7170:45;7159:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7123:93;;;;7234:7;7233:8;:59;;;-1:-1:-1;7246:11:0;;:16;;;;:45;;;7278:4;7267:24;;;;;;;;;;;;:::i;:::-;7266:25;7246:45;7229:115;;;7316:16;;;;;;;;;;;;;;20545:219;20609:19;;;;;;;:13;:19;;;;;;;;20629:10;20609:31;;;;;;;;;;20604:153;;20657:19;;;;;;20691:4;20657:19;;;;;;;;20677:10;20657:31;;;;;;;:38;;;;;;;;20710:12;:24;;;;:35;;;;;;;;;;;;;;;;;;;;;;20545:219::o;18752:982::-;18859:8;18855:872;;;18888:19;;;18884:411;;18974:47;;;;;:21;30062:15:1;;;18974:47:0;;;30044:34:1;30114:15;;;30094:18;;;30087:43;18981:5:0;18974:21;;;;19003:6;;29956:18:1;;18974:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18855:872;;18884:411;19112:65;19144:5;19151:10;19163:5;19170:6;19112:31;:65::i;:::-;19247:32;;;;;:21;30062:15:1;;;19247:32:0;;;30044:34:1;30114:15;;;30094:18;;;30087:43;19254:5:0;19247:21;;;;29956:18:1;;19247:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18855:872::-;19331:19;;;19327:389;;19422:4;19416:19;;;19443:6;19416:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19516:32:0;;;;;:20;41338:55:1;;;19516:32:0;;;41320:74:1;41410:18;;;41403:34;;;19522:4:0;19516:20;;-1:-1:-1;19516:20:0;;-1:-1:-1;41293:18:1;;;-1:-1:-1;19516:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19327:389::-;19638:62;19670:5;19677:10;19689:2;19693:6;7359:519;7687:51;;;7676:10;36058:15:1;;;7687:51:0;;;36040:34:1;36110:15;;;36090:18;;;36083:43;36142:18;;;;36135:34;;;7687:51:0;;;;;;;;;;35952:18:1;;;;7687:51:0;;;;;;;;;;;;;7676:63;;-1:-1:-1;;;;7676:10:0;;;;:63;;7687:51;7676:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7640:99;;;;7757:7;7756:8;:59;;;-1:-1:-1;7769:11:0;;:16;;;;:45;;;7801:4;7790:24;;;;;;;;;;;;:::i;:::-;7789:25;7769:45;7752:119;;;7839:20;;;;;;;;;;;;;;6406:467;6693:45;;;6682:10;41338:55:1;;;6693:45:0;;;41320:74:1;41410:18;;;;41403:34;;;6693:45:0;;;;;;;;;;41293:18:1;;;;6693:45:0;;;;;;;;;;;;;6682:57;;-1:-1:-1;;;;6682:10:0;;;;:57;;6693:45;6682:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6646:93;;;;6757:7;6756:8;:59;;;-1:-1:-1;6769:11:0;;:16;;;;:45;;;6801:4;6790:24;;;;;;;;;;;;:::i;:::-;6789:25;6769:45;6752:114;;;6839:15;;;;;;;;;;;;;;14:162:1;108:42;101:5;97:54;90:5;87:65;77:93;;166:1;163;156:12;181:331;257:6;265;318:2;306:9;297:7;293:23;289:32;286:52;;;334:1;331;324:12;286:52;373:9;360:23;392:39;425:5;392:39;:::i;:::-;450:5;502:2;487:18;;;;474:32;;-1:-1:-1;;;181:331:1:o;517:142::-;585:20;;614:39;585:20;614:39;:::i;:::-;517:142;;;:::o;1223:347::-;1274:8;1284:6;1338:3;1331:4;1323:6;1319:17;1315:27;1305:55;;1356:1;1353;1346:12;1305:55;-1:-1:-1;1379:20:1;;1422:18;1411:30;;1408:50;;;1454:1;1451;1444:12;1408:50;1491:4;1483:6;1479:17;1467:29;;1543:3;1536:4;1527:6;1519;1515:19;1511:30;1508:39;1505:59;;;1560:1;1557;1550:12;1505:59;1223:347;;;;;:::o;1575:367::-;1638:8;1648:6;1702:3;1695:4;1687:6;1683:17;1679:27;1669:55;;1720:1;1717;1710:12;1669:55;-1:-1:-1;1743:20:1;;1786:18;1775:30;;1772:50;;;1818:1;1815;1808:12;1772:50;1855:4;1847:6;1843:17;1831:29;;1915:3;1908:4;1898:6;1895:1;1891:14;1883:6;1879:27;1875:38;1872:47;1869:67;;;1932:1;1929;1922:12;1947:184;1999:77;1996:1;1989:88;2096:4;2093:1;2086:15;2120:4;2117:1;2110:15;2136:253;2208:2;2202:9;2250:4;2238:17;;2285:18;2270:34;;2306:22;;;2267:62;2264:88;;;2332:18;;:::i;:::-;2368:2;2361:22;2136:253;:::o;2394:::-;2466:2;2460:9;2508:4;2496:17;;2543:18;2528:34;;2564:22;;;2525:62;2522:88;;;2590:18;;:::i;2652:253::-;2724:2;2718:9;2766:4;2754:17;;2801:18;2786:34;;2822:22;;;2783:62;2780:88;;;2848:18;;:::i;2910:334::-;2981:2;2975:9;3037:2;3027:13;;3042:66;3023:86;3011:99;;3140:18;3125:34;;3161:22;;;3122:62;3119:88;;;3187:18;;:::i;:::-;3223:2;3216:22;2910:334;;-1:-1:-1;2910:334:1:o;3249:245::-;3297:4;3330:18;3322:6;3319:30;3316:56;;;3352:18;;:::i;:::-;-1:-1:-1;3409:2:1;3397:15;3414:66;3393:88;3483:4;3389:99;;3249:245::o;3499:462::-;3541:5;3594:3;3587:4;3579:6;3575:17;3571:27;3561:55;;3612:1;3609;3602:12;3561:55;3648:6;3635:20;3679:48;3695:31;3723:2;3695:31;:::i;:::-;3679:48;:::i;:::-;3752:2;3743:7;3736:19;3798:3;3791:4;3786:2;3778:6;3774:15;3770:26;3767:35;3764:55;;;3815:1;3812;3805:12;3764:55;3880:2;3873:4;3865:6;3861:17;3854:4;3845:7;3841:18;3828:55;3928:1;3903:16;;;3921:4;3899:27;3892:38;;;;3907:7;3499:462;-1:-1:-1;;;3499:462:1:o;3966:484::-;4030:5;4078:4;4066:9;4061:3;4057:19;4053:30;4050:50;;;4096:1;4093;4086:12;4050:50;4118:22;;:::i;:::-;4109:31;;4176:9;4163:23;4156:5;4149:38;4247:2;4236:9;4232:18;4219:32;4214:2;4207:5;4203:14;4196:56;4303:2;4292:9;4288:18;4275:32;4330:18;4322:6;4319:30;4316:50;;;4362:1;4359;4352:12;4316:50;4398:45;4439:3;4430:6;4419:9;4415:22;4398:45;:::i;:::-;4393:2;4386:5;4382:14;4375:69;;3966:484;;;;:::o;4455:1493::-;4650:6;4658;4666;4674;4682;4690;4698;4706;4714;4722;4775:3;4763:9;4754:7;4750:23;4746:33;4743:53;;;4792:1;4789;4782:12;4743:53;4815:29;4834:9;4815:29;:::i;:::-;4805:39;;4891:2;4880:9;4876:18;4863:32;4853:42;;4946:2;4935:9;4931:18;4918:32;4969:18;5010:2;5002:6;4999:14;4996:34;;;5026:1;5023;5016:12;4996:34;5065:58;5115:7;5106:6;5095:9;5091:22;5065:58;:::i;:::-;5142:8;;-1:-1:-1;5039:84:1;-1:-1:-1;5230:2:1;5215:18;;5202:32;;-1:-1:-1;5246:16:1;;;5243:36;;;5275:1;5272;5265:12;5243:36;5314:72;5378:7;5367:8;5356:9;5352:24;5314:72;:::i;:::-;5405:8;;-1:-1:-1;5288:98:1;-1:-1:-1;5288:98:1;;-1:-1:-1;5459:39:1;5493:3;5478:19;;5459:39;:::i;:::-;5449:49;;5551:3;5540:9;5536:19;5523:33;5507:49;;5581:2;5571:8;5568:16;5565:36;;;5597:1;5594;5587:12;5565:36;5636:60;5688:7;5677:8;5666:9;5662:24;5636:60;:::i;:::-;5715:8;;-1:-1:-1;5610:86:1;-1:-1:-1;5803:3:1;5788:19;;5775:33;;-1:-1:-1;5820:16:1;;;5817:36;;;5849:1;5846;5839:12;5817:36;;5872:70;5934:7;5923:8;5912:9;5908:24;5872:70;:::i;:::-;5862:80;;;4455:1493;;;;;;;;;;;;;:::o;6159:732::-;6386:2;6438:21;;;6508:13;;6411:18;;;6530:22;;;6357:4;;6386:2;6571;;6589:18;;;;6630:15;;;6357:4;6673:192;6687:6;6684:1;6681:13;6673:192;;;6736:49;6781:3;6772:6;6766:13;6034:12;;6048:42;6030:61;6018:74;;6141:4;6130:16;;;6124:23;6108:14;;6101:47;5953:201;6736:49;6805:12;;;;6840:15;;;;6709:1;6702:9;6673:192;;;-1:-1:-1;6882:3:1;;6159:732;-1:-1:-1;;;;;;;6159:732:1:o;6896:389::-;6978:8;6988:6;7042:3;7035:4;7027:6;7023:17;7019:27;7009:55;;7060:1;7057;7050:12;7009:55;-1:-1:-1;7083:20:1;;7126:18;7115:30;;7112:50;;;7158:1;7155;7148:12;7112:50;7195:4;7187:6;7183:17;7171:29;;7258:3;7251:4;7243;7235:6;7231:17;7223:6;7219:30;7215:41;7212:50;7209:70;;;7275:1;7272;7265:12;7290:200;7367:4;7400:18;7392:6;7389:30;7386:56;;;7422:18;;:::i;:::-;-1:-1:-1;7467:1:1;7463:14;7479:4;7459:25;;7290:200::o;7495:156::-;7561:20;;7621:4;7610:16;;7600:27;;7590:55;;7641:1;7638;7631:12;7656:1368;7727:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:55;;7798:1;7795;7788:12;7747:55;7834:6;7821:20;7860:4;7884:77;7900:60;7957:2;7900:60;:::i;7884:77::-;7995:15;;;8057:4;8100:13;;;8088:26;;8084:35;;;8026:12;;;;7983:3;8131:15;;;8128:35;;;8159:1;8156;8149:12;8128:35;8195:2;8187:6;8183:15;8207:788;8223:6;8218:3;8215:15;8207:788;;;8299:2;8293:3;8288;8284:13;8280:22;8277:42;;;8315:1;8312;8305:12;8277:42;8345:22;;:::i;:::-;8408:3;8395:17;8425:41;8458:7;8425:41;:::i;:::-;8479:22;;8550:12;;;8537:26;8521:14;;;8514:50;8587:2;8638:12;;;8625:26;8609:14;;;8602:50;8675:2;8713:30;8730:12;;;8713:30;:::i;:::-;8697:14;;;8690:54;8767:3;8819:12;;;8806:26;8790:14;;;8783:50;8856:3;8908:12;;;8895:26;8879:14;;;8872:50;8935:18;;8973:12;;;;8240;;8207:788;;;-1:-1:-1;9013:5:1;;7656:1368;-1:-1:-1;;;;;;;7656:1368:1:o;9029:1626::-;9288:6;9296;9304;9312;9320;9328;9336;9344;9352;9360;9368:7;9422:3;9410:9;9401:7;9397:23;9393:33;9390:53;;;9439:1;9436;9429:12;9390:53;9462:29;9481:9;9462:29;:::i;:::-;9452:39;;9510:18;9577:2;9571;9560:9;9556:18;9543:32;9540:40;9537:60;;;9593:1;9590;9583:12;9537:60;9632:115;9739:7;9732:2;9721:9;9717:18;9704:32;9693:9;9689:48;9632:115;:::i;:::-;9766:8;;-1:-1:-1;9793:8:1;-1:-1:-1;9844:2:1;9829:18;;9816:32;9813:40;-1:-1:-1;9810:60:1;;;9866:1;9863;9856:12;9810:60;9905:84;9981:7;9974:2;9963:9;9959:18;9946:32;9935:9;9931:48;9905:84;:::i;:::-;10008:8;;-1:-1:-1;10035:8:1;-1:-1:-1;10090:2:1;10075:18;;10062:32;;-1:-1:-1;10113:39:1;10147:3;10132:19;;10113:39;:::i;:::-;10103:49;;10202:2;10195:3;10184:9;10180:19;10167:33;10164:41;10161:61;;;10218:1;10215;10208:12;10161:61;10257:85;10334:7;10326:3;10315:9;10311:19;10298:33;10287:9;10283:49;10257:85;:::i;:::-;10361:8;;-1:-1:-1;10388:8:1;-1:-1:-1;10439:3:1;10424:19;;10411:33;10408:41;-1:-1:-1;10405:61:1;;;10462:1;10459;10452:12;10405:61;;10485:105;10582:7;10574:3;10563:9;10559:19;10546:33;10535:9;10531:49;10485:105;:::i;:::-;10475:115;;10610:39;10644:3;10633:9;10629:19;10610:39;:::i;:::-;10599:50;;9029:1626;;;;;;;;;;;;;;:::o;10842:600::-;10944:6;10952;10960;10968;10976;10984;11037:3;11025:9;11016:7;11012:23;11008:33;11005:53;;;11054:1;11051;11044:12;11005:53;11093:9;11080:23;11112:39;11145:5;11112:39;:::i;:::-;11170:5;-1:-1:-1;11222:2:1;11207:18;;11194:32;;-1:-1:-1;11273:2:1;11258:18;;11245:32;;-1:-1:-1;11296:36:1;11328:2;11313:18;;11296:36;:::i;:::-;11286:46;;11379:3;11368:9;11364:19;11351:33;11341:43;;11431:3;11420:9;11416:19;11403:33;11393:43;;10842:600;;;;;;;;:::o;11447:404::-;11515:6;11523;11576:2;11564:9;11555:7;11551:23;11547:32;11544:52;;;11592:1;11589;11582:12;11544:52;11631:9;11618:23;11650:39;11683:5;11650:39;:::i;:::-;11708:5;-1:-1:-1;11765:2:1;11750:18;;11737:32;11778:41;11737:32;11778:41;:::i;:::-;11838:7;11828:17;;;11447:404;;;;;:::o;12048:970::-;12170:6;12178;12186;12194;12202;12210;12263:3;12251:9;12242:7;12238:23;12234:33;12231:53;;;12280:1;12277;12270:12;12231:53;12319:9;12306:23;12338:39;12371:5;12338:39;:::i;:::-;12396:5;-1:-1:-1;12448:2:1;12433:18;;12420:32;;-1:-1:-1;12503:2:1;12488:18;;12475:32;12526:18;12556:14;;;12553:34;;;12583:1;12580;12573:12;12553:34;12606:49;12647:7;12638:6;12627:9;12623:22;12606:49;:::i;:::-;12596:59;;12702:2;12691:9;12687:18;12674:32;12664:42;;12758:3;12747:9;12743:19;12730:33;12715:48;;12772:41;12805:7;12772:41;:::i;:::-;12832:7;;-1:-1:-1;12892:3:1;12877:19;;12864:33;;12909:16;;;12906:36;;;12938:1;12935;12928:12;12906:36;;12961:51;13004:7;12993:8;12982:9;12978:24;12961:51;:::i;:::-;12951:61;;;12048:970;;;;;;;;:::o;13023:256::-;6034:12;;6048:42;6030:61;6018:74;;6141:4;6130:16;;;6124:23;6108:14;;;6101:47;13213:2;13198:18;;13225:48;13023:256;;;;:::o;13284:622::-;13370:6;13378;13386;13394;13447:3;13435:9;13426:7;13422:23;13418:33;13415:53;;;13464:1;13461;13454:12;13415:53;13503:9;13490:23;13522:39;13555:5;13522:39;:::i;:::-;13580:5;-1:-1:-1;13637:2:1;13622:18;;13609:32;13650:41;13609:32;13650:41;:::i;:::-;13710:7;-1:-1:-1;13764:2:1;13749:18;;13736:32;;-1:-1:-1;13820:2:1;13805:18;;13792:32;13833:41;13792:32;13833:41;:::i;:::-;13284:622;;;;-1:-1:-1;13284:622:1;;-1:-1:-1;;13284:622:1:o;13911:689::-;14008:6;14016;14024;14032;14040;14093:3;14081:9;14072:7;14068:23;14064:33;14061:53;;;14110:1;14107;14100:12;14061:53;14149:9;14136:23;14168:39;14201:5;14168:39;:::i;:::-;14226:5;-1:-1:-1;14278:2:1;14263:18;;14250:32;;-1:-1:-1;14329:2:1;14314:18;;14301:32;;-1:-1:-1;14384:2:1;14369:18;;14356:32;14411:18;14400:30;;14397:50;;;14443:1;14440;14433:12;14397:50;14482:58;14532:7;14523:6;14512:9;14508:22;14482:58;:::i;:::-;13911:689;;;;-1:-1:-1;13911:689:1;;-1:-1:-1;14559:8:1;;14456:84;13911:689;-1:-1:-1;;;13911:689:1:o;14605:118::-;14691:5;14684:13;14677:21;14670:5;14667:32;14657:60;;14713:1;14710;14703:12;14728:128;14793:20;;14822:28;14793:20;14822:28;:::i;14861:3172::-;14923:5;14976:3;14969:4;14961:6;14957:17;14953:27;14943:55;;14994:1;14991;14984:12;14943:55;15018:95;15034:78;15104:6;15091:20;15034:78;:::i;15018:95::-;15159:20;;15147:33;;;15205:4;15196:14;;;;15135:3;15245:1;15241:28;15229:41;;15225:52;15222:61;-1:-1:-1;15219:81:1;;;15296:1;15293;15286:12;15219:81;15332:4;15324:6;15320:17;15346:2658;15417:4;15406:6;15393:20;15390:1;15386:28;15378:6;15374:41;15370:52;15365:3;15362:61;15346:2658;;;15490:18;15546:2;15540:3;15527:17;15524:25;15521:45;;;15562:1;15559;15552:12;15521:45;15701:4;15632:66;15624:3;15611:17;15603:6;15599:30;15594:3;15590:40;15586:113;15582:124;15579:144;;;15719:1;15716;15709:12;15579:144;15749:22;;:::i;:::-;15847:2;15839:4;15832:3;15819:17;15811:6;15807:30;15803:41;15790:55;15787:63;15784:83;;;15863:1;15860;15853:12;15784:83;15955:17;;15943:30;;15975:4;15939:41;;15926:55;15890:92;16017:2;16009:11;;16005:21;-1:-1:-1;15995:49:1;;16040:1;16037;16030:12;15995:49;16070:102;16086:85;16164:4;16160:2;16156:13;16143:27;16086:85;:::i;16070:102::-;16251:4;16243:13;;;16230:27;16216:42;;;16280:16;;;;16198:5;16331:1;16327:35;16319:44;;16365:2;16315:53;16312:62;-1:-1:-1;16309:82:1;;;16387:1;16384;16377:12;16309:82;16425:2;16421;16417:11;16441:1265;16521:2;16511:4;16507:2;16503:13;16490:27;16487:1;16483:35;16479:2;16475:44;16471:53;16464:5;16461:64;16441:1265;;;16625:2;16617:5;16604:19;16601:27;16598:47;;;16641:1;16638;16631:12;16598:47;16693:5;16680:19;16676:2;16672:28;16811:4;16742:66;16737:2;16732:3;16728:12;16724:85;16720:96;16717:116;;;16829:1;16826;16819:12;16717:116;16865:22;;:::i;:::-;16904:59;16958:2;16954;16950:11;16937:25;16904:59;:::i;:::-;17017:2;17013;17009:11;16996:25;16987:7;16980:42;17074:2;17066:4;17062:2;17058:13;17045:27;17042:35;17039:55;;;17090:1;17087;17080:12;17039:55;17138:68;17202:3;17197:2;17188:4;17184:2;17180:13;17167:27;17163:2;17159:36;17155:45;17138:68;:::i;:::-;17131:4;17122:7;17118:18;17111:96;17224:60;17278:3;17274:2;17270:12;17257:26;17224:60;:::i;:::-;17347:3;17343:2;17339:12;17326:26;17321:2;17312:7;17308:16;17301:52;17405:2;17397:4;17393:2;17389:13;17376:27;17373:35;17370:55;;;17421:1;17418;17411:12;17370:55;17469:68;17533:3;17528:2;17519:4;17515:2;17511:13;17498:27;17494:2;17490:36;17486:45;17469:68;:::i;:::-;17462:4;17453:7;17449:18;17442:96;17581:29;17605:3;17601:2;17597:12;17581:29;:::i;:::-;17575:3;17562:17;;17555:56;17628:22;;-1:-1:-1;17687:4:1;17676:16;;;;16549;16441:1265;;;-1:-1:-1;17719:20:1;;-1:-1:-1;17777:59:1;;-1:-1:-1;17812:17:1;;17800:30;;17832:2;17796:39;17777:59;:::i;:::-;17770:4;17763:5;17759:16;17752:85;17922:4;17915:3;17902:17;17894:6;17890:30;17886:41;17873:55;17868:2;17861:5;17857:14;17850:79;17954:5;17949:3;17942:18;;;17989:4;17984:3;17980:14;17973:21;;15450:4;15445:3;15441:14;15434:21;;15346:2658;;;-1:-1:-1;18022:5:1;14861:3172;-1:-1:-1;;;;14861:3172:1:o;18038:741::-;18208:6;18216;18224;18232;18276:9;18267:7;18263:23;18306:3;18302:2;18298:12;18295:32;;;18323:1;18320;18313:12;18295:32;18363:9;18350:23;18396:18;18388:6;18385:30;18382:50;;;18428:1;18425;18418:12;18382:50;18451:69;18512:7;18503:6;18492:9;18488:22;18451:69;:::i;:::-;18441:79;;;18567:2;18556:9;18552:18;18539:32;18529:42;;18618:2;18607:9;18603:18;18590:32;18580:42;;18715:3;18646:66;18642:2;18638:75;18634:85;18631:105;;;18732:1;18729;18722:12;18631:105;-1:-1:-1;18038:741:1;;;;-1:-1:-1;18038:741:1;18770:2;18755:18;;-1:-1:-1;18038:741:1:o;18784:165::-;18854:5;18899:2;18890:6;18885:3;18881:16;18877:25;18874:45;;;18915:1;18912;18905:12;18874:45;-1:-1:-1;18937:6:1;18784:165;-1:-1:-1;18784:165:1:o;18954:1223::-;19120:6;19128;19136;19144;19152;19160;19168;19221:3;19209:9;19200:7;19196:23;19192:33;19189:53;;;19238:1;19235;19228:12;19189:53;19277:9;19264:23;19296:39;19329:5;19296:39;:::i;:::-;19354:5;-1:-1:-1;19406:2:1;19391:18;;19378:32;;-1:-1:-1;19461:2:1;19446:18;;19433:32;19484:18;19514:14;;;19511:34;;;19541:1;19538;19531:12;19511:34;19564:49;19605:7;19596:6;19585:9;19581:22;19564:49;:::i;:::-;19554:59;;19660:2;19649:9;19645:18;19632:32;19622:42;;19716:3;19705:9;19701:19;19688:33;19673:48;;19730:41;19763:7;19730:41;:::i;:::-;19790:7;;-1:-1:-1;19850:3:1;19835:19;;19822:33;;19867:16;;;19864:36;;;19896:1;19893;19886:12;19864:36;19919:51;19962:7;19951:8;19940:9;19936:24;19919:51;:::i;:::-;19909:61;;20023:3;20012:9;20008:19;19995:33;19979:49;;20053:2;20043:8;20040:16;20037:36;;;20069:1;20066;20059:12;20037:36;;20092:79;20163:7;20152:8;20141:9;20137:24;20092:79;:::i;:::-;20082:89;;;18954:1223;;;;;;;;;;:::o;20182:552::-;20261:6;20269;20277;20330:2;20318:9;20309:7;20305:23;20301:32;20298:52;;;20346:1;20343;20336:12;20298:52;20385:9;20372:23;20404:39;20437:5;20404:39;:::i;:::-;20462:5;-1:-1:-1;20518:2:1;20503:18;;20490:32;20545:18;20534:30;;20531:50;;;20577:1;20574;20567:12;20531:50;20616:58;20666:7;20657:6;20646:9;20642:22;20616:58;:::i;:::-;20182:552;;20693:8;;-1:-1:-1;20590:84:1;;-1:-1:-1;;;;20182:552:1:o;20739:448::-;20836:6;20844;20897:2;20885:9;20876:7;20872:23;20868:32;20865:52;;;20913:1;20910;20903:12;20865:52;20953:9;20940:23;20986:18;20978:6;20975:30;20972:50;;;21018:1;21015;21008:12;20972:50;21057:70;21119:7;21110:6;21099:9;21095:22;21057:70;:::i;:::-;21146:8;;21031:96;;-1:-1:-1;20739:448:1;-1:-1:-1;;;;20739:448:1:o;21192:250::-;21277:1;21287:113;21301:6;21298:1;21295:13;21287:113;;;21377:11;;;21371:18;21358:11;;;21351:39;21323:2;21316:10;21287:113;;;-1:-1:-1;;21434:1:1;21416:16;;21409:27;21192:250::o;21447:329::-;21488:3;21526:5;21520:12;21553:6;21548:3;21541:19;21569:76;21638:6;21631:4;21626:3;21622:14;21615:4;21608:5;21604:16;21569:76;:::i;:::-;21690:2;21678:15;21695:66;21674:88;21665:98;;;;21765:4;21661:109;;21447:329;-1:-1:-1;;21447:329:1:o;21781:859::-;21941:4;21970:2;22010;21999:9;21995:18;22040:2;22029:9;22022:21;22063:6;22098;22092:13;22129:6;22121;22114:22;22167:2;22156:9;22152:18;22145:25;;22229:2;22219:6;22216:1;22212:14;22201:9;22197:30;22193:39;22179:53;;22267:2;22259:6;22255:15;22288:1;22298:313;22312:6;22309:1;22306:13;22298:313;;;22401:66;22389:9;22381:6;22377:22;22373:95;22368:3;22361:108;22492:39;22524:6;22515;22509:13;22492:39;:::i;:::-;22482:49;-1:-1:-1;22589:12:1;;;;22554:15;;;;22334:1;22327:9;22298:313;;;-1:-1:-1;22628:6:1;;21781:859;-1:-1:-1;;;;;;;21781:859:1:o;22645:1395::-;22798:6;22806;22814;22822;22830;22838;22846;22854;22862;22915:3;22903:9;22894:7;22890:23;22886:33;22883:53;;;22932:1;22929;22922:12;22883:53;22971:9;22958:23;22990:39;23023:5;22990:39;:::i;:::-;23048:5;-1:-1:-1;23100:2:1;23085:18;;23072:32;;-1:-1:-1;23155:2:1;23140:18;;23127:32;23178:18;23208:14;;;23205:34;;;23235:1;23232;23225:12;23205:34;23274:58;23324:7;23315:6;23304:9;23300:22;23274:58;:::i;:::-;23351:8;;-1:-1:-1;23248:84:1;-1:-1:-1;23439:2:1;23424:18;;23411:32;;-1:-1:-1;23455:16:1;;;23452:36;;;23484:1;23481;23474:12;23452:36;23523:72;23587:7;23576:8;23565:9;23561:24;23523:72;:::i;:::-;23614:8;;-1:-1:-1;23497:98:1;-1:-1:-1;23701:3:1;23686:19;;23673:33;;-1:-1:-1;23715:41:1;23673:33;23715:41;:::i;:::-;23775:7;;-1:-1:-1;23835:3:1;23820:19;;23807:33;;23852:16;;;23849:36;;;23881:1;23878;23871:12;23849:36;;23920:60;23972:7;23961:8;23950:9;23946:24;23920:60;:::i;:::-;23894:86;;23999:8;23989:18;;;24026:8;24016:18;;;22645:1395;;;;;;;;;;;:::o;24045:472::-;24122:6;24130;24138;24191:2;24179:9;24170:7;24166:23;24162:32;24159:52;;;24207:1;24204;24197:12;24159:52;24246:9;24233:23;24265:39;24298:5;24265:39;:::i;:::-;24323:5;-1:-1:-1;24380:2:1;24365:18;;24352:32;24393:41;24352:32;24393:41;:::i;:::-;24045:472;;24453:7;;-1:-1:-1;;;24507:2:1;24492:18;;;;24479:32;;24045:472::o;24522:255::-;24581:6;24634:2;24622:9;24613:7;24609:23;24605:32;24602:52;;;24650:1;24647;24640:12;24602:52;24689:9;24676:23;24708:39;24741:5;24708:39;:::i;:::-;24766:5;24522:255;-1:-1:-1;;;24522:255:1:o;24782:516::-;24908:6;24916;24924;24977:2;24965:9;24956:7;24952:23;24948:32;24945:52;;;24993:1;24990;24983:12;24945:52;25033:9;25020:23;25066:18;25058:6;25055:30;25052:50;;;25098:1;25095;25088:12;25052:50;25121:69;25182:7;25173:6;25162:9;25158:22;25121:69;:::i;:::-;25111:79;25237:2;25222:18;;25209:32;;-1:-1:-1;25288:2:1;25273:18;;;25260:32;;24782:516;-1:-1:-1;;;;24782:516:1:o;25303:1519::-;25495:6;25503;25511;25519;25527;25535;25543;25551;25559;25567;25620:3;25608:9;25599:7;25595:23;25591:33;25588:53;;;25637:1;25634;25627:12;25588:53;25676:9;25663:23;25695:39;25728:5;25695:39;:::i;:::-;25753:5;-1:-1:-1;25809:2:1;25794:18;;25781:32;25832:18;25862:14;;;25859:34;;;25889:1;25886;25879:12;25859:34;25928:89;26009:7;26000:6;25989:9;25985:22;25928:89;:::i;:::-;26036:8;;-1:-1:-1;25902:115:1;-1:-1:-1;26124:2:1;26109:18;;26096:32;;-1:-1:-1;26140:16:1;;;26137:36;;;26169:1;26166;26159:12;26137:36;26208:60;26260:7;26249:8;26238:9;26234:24;26208:60;:::i;:::-;26287:8;;-1:-1:-1;26182:86:1;-1:-1:-1;26369:2:1;26354:18;;26341:32;;-1:-1:-1;26425:3:1;26410:19;;26397:33;;-1:-1:-1;26439:41:1;26397:33;26439:41;:::i;:::-;26499:7;;-1:-1:-1;26559:3:1;26544:19;;26531:33;;26576:16;;;26573:36;;;26605:1;26602;26595:12;26573:36;;26644:60;26696:7;26685:8;26674:9;26670:24;26644:60;:::i;:::-;26723:8;;-1:-1:-1;26618:86:1;-1:-1:-1;26777:39:1;;-1:-1:-1;26811:3:1;26796:19;;26777:39;:::i;:::-;26767:49;;25303:1519;;;;;;;;;;;;;:::o;26827:583::-;27049:4;27078:42;27159:2;27151:6;27147:15;27136:9;27129:34;27211:2;27203:6;27199:15;27194:2;27183:9;27179:18;27172:43;;27251:6;27246:2;27235:9;27231:18;27224:34;27294:6;27289:2;27278:9;27274:18;27267:34;27338:3;27332;27321:9;27317:19;27310:32;27359:45;27399:3;27388:9;27384:19;27376:6;27359:45;:::i;27415:184::-;27467:77;27464:1;27457:88;27564:4;27561:1;27554:15;27588:4;27585:1;27578:15;30141:184;30211:6;30264:2;30252:9;30243:7;30239:23;30235:32;30232:52;;;30280:1;30277;30270:12;30232:52;-1:-1:-1;30303:16:1;;30141:184;-1:-1:-1;30141:184:1:o;30330:325::-;30418:6;30413:3;30406:19;30470:6;30463:5;30456:4;30451:3;30447:14;30434:43;;30522:1;30515:4;30506:6;30501:3;30497:16;30493:27;30486:38;30388:3;30644:4;30574:66;30569:2;30561:6;30557:15;30553:88;30548:3;30544:98;30540:109;30533:116;;30330:325;;;;:::o;30660:610::-;30892:4;30921:42;31002:2;30994:6;30990:15;30979:9;30972:34;31054:2;31046:6;31042:15;31037:2;31026:9;31022:18;31015:43;;31094:6;31089:2;31078:9;31074:18;31067:34;31137:6;31132:2;31121:9;31117:18;31110:34;31181:3;31175;31164:9;31160:19;31153:32;31202:62;31259:3;31248:9;31244:19;31236:6;31228;31202:62;:::i;31275:182::-;31332:6;31385:2;31373:9;31364:7;31360:23;31356:32;31353:52;;;31401:1;31398;31391:12;31353:52;31424:27;31441:9;31424:27;:::i;31462:580::-;31539:4;31545:6;31605:11;31592:25;31695:66;31684:8;31668:14;31664:29;31660:102;31640:18;31636:127;31626:155;;31777:1;31774;31767:12;31626:155;31804:33;;31856:20;;;-1:-1:-1;31899:18:1;31888:30;;31885:50;;;31931:1;31928;31921:12;31885:50;31964:4;31952:17;;-1:-1:-1;31995:14:1;31991:27;;;31981:38;;31978:58;;;32032:1;32029;32022:12;32047:244;32204:2;32193:9;32186:21;32167:4;32224:61;32281:2;32270:9;32266:18;32258:6;32250;32224:61;:::i;32296:259::-;32366:6;32419:2;32407:9;32398:7;32394:23;32390:32;32387:52;;;32435:1;32432;32425:12;32387:52;32467:9;32461:16;32486:39;32519:5;32486:39;:::i;32560:271::-;32743:6;32735;32730:3;32717:33;32699:3;32769:16;;32794:13;;;32769:16;32560:271;-1:-1:-1;32560:271:1:o;32836:648::-;32916:6;32969:2;32957:9;32948:7;32944:23;32940:32;32937:52;;;32985:1;32982;32975:12;32937:52;33018:9;33012:16;33051:18;33043:6;33040:30;33037:50;;;33083:1;33080;33073:12;33037:50;33106:22;;33159:4;33151:13;;33147:27;-1:-1:-1;33137:55:1;;33188:1;33185;33178:12;33137:55;33217:2;33211:9;33242:48;33258:31;33286:2;33258:31;:::i;33242:48::-;33313:2;33306:5;33299:17;33353:7;33348:2;33343;33339;33335:11;33331:20;33328:33;33325:53;;;33374:1;33371;33364:12;33325:53;33387:67;33451:2;33446;33439:5;33435:14;33430:2;33426;33422:11;33387:67;:::i;33489:219::-;33638:2;33627:9;33620:21;33601:4;33658:44;33698:2;33687:9;33683:18;33675:6;33658:44;:::i;36180:245::-;36247:6;36300:2;36288:9;36279:7;36275:23;36271:32;36268:52;;;36316:1;36313;36306:12;36268:52;36348:9;36342:16;36367:28;36389:5;36367:28;:::i;36430:627::-;36689:3;36678:9;36671:22;36652:4;36716:45;36756:3;36745:9;36741:19;36733:6;36716:45;:::i;:::-;36780:42;36858:15;;;36853:2;36838:18;;36831:43;36910:15;;36905:2;36890:18;;36883:43;36962:22;;;36957:2;36942:18;;36935:50;37002:49;36966:6;37036;37028;37002:49;:::i;37062:558::-;37131:5;37179:4;37167:9;37162:3;37158:19;37154:30;37151:50;;;37197:1;37194;37187:12;37151:50;37230:4;37224:11;37274:4;37266:6;37262:17;37345:6;37333:10;37330:22;37309:18;37297:10;37294:34;37291:62;37288:88;;;37356:18;;:::i;:::-;37398:10;37392:4;37385:24;;37427:6;37418:15;;37463:9;37457:16;37482:41;37515:7;37482:41;:::i;:::-;37532:23;;37609:2;37594:18;;;37588:25;37571:15;;37564:50;;;;37062:558;;-1:-1:-1;37062:558:1:o;37625:972::-;37748:6;37779:2;37822;37810:9;37801:7;37797:23;37793:32;37790:52;;;37838:1;37835;37828:12;37790:52;37871:9;37865:16;37904:18;37896:6;37893:30;37890:50;;;37936:1;37933;37926:12;37890:50;37959:22;;38012:4;38004:13;;38000:27;-1:-1:-1;37990:55:1;;38041:1;38038;38031:12;37990:55;38070:2;38064:9;38093:77;38109:60;38166:2;38109:60;:::i;38093:77::-;38192:3;38216:2;38211:3;38204:15;38244:2;38239:3;38235:12;38228:19;;38295:2;38289;38286:1;38282:10;38278:2;38274:19;38270:28;38256:42;;38321:7;38313:6;38310:19;38307:39;;;38342:1;38339;38332:12;38307:39;38374:2;38370;38366:11;38355:22;;38386:181;38402:6;38397:3;38394:15;38386:181;;;38470:54;38516:7;38511:3;38470:54;:::i;:::-;38465:3;38458:67;38554:2;38549:3;38545:12;38538:19;;38428:4;38423:3;38419:14;38412:21;;38386:181;;38602:562;38689:6;38742:2;38730:9;38721:7;38717:23;38713:32;38710:52;;;38758:1;38755;38748:12;38710:52;38784:22;;:::i;:::-;38843:9;38830:23;38862:41;38895:7;38862:41;:::i;:::-;38912:22;;38994:2;38979:18;;;38966:32;38950:14;;;38943:56;39051:2;39036:18;;39023:32;39064:30;39023:32;39064:30;:::i;:::-;39121:2;39110:14;;39103:31;39114:5;38602:562;-1:-1:-1;;;38602:562:1:o;39169:654::-;39438:3;39427:9;39420:22;39401:4;39465:62;39522:3;39511:9;39507:19;39499:6;39491;39465:62;:::i;:::-;39546:42;39624:15;;;39619:2;39604:18;;39597:43;39676:15;;39671:2;39656:18;;39649:43;39728:22;;;39723:2;39708:18;;39701:50;39768:49;39732:6;39802;39794;39768:49;:::i;:::-;39760:57;39169:654;-1:-1:-1;;;;;;;;;39169:654:1:o;39828:600::-;40077:3;40066:9;40059:22;40040:4;40104:45;40144:3;40133:9;40129:19;40121:6;40104:45;:::i;:::-;40168:42;40246:15;;;40241:2;40226:18;;40219:43;40298:15;;40293:2;40278:18;;40271:43;40350:22;;;40345:2;40330:18;;40323:50;40390:32;40354:6;40407;40390:32;:::i;40433:256::-;40531:6;40584:2;40572:9;40563:7;40559:23;40555:32;40552:52;;;40600:1;40597;40590:12;40552:52;40623:60;40675:7;40664:9;40623:60;:::i;40694:184::-;40746:77;40743:1;40736:88;40843:4;40840:1;40833:15;40867:4;40864:1;40857:15;40883:128;40950:9;;;40971:11;;;40968:37;;;40985:18;;:::i;41016:125::-;41081:9;;;41102:10;;;41099:36;;;41115:18;;:::i;41448:287::-;41577:3;41615:6;41609:13;41631:66;41690:6;41685:3;41678:4;41670:6;41666:17;41631:66;:::i;:::-;41713:16;;;;;41448:287;-1:-1:-1;;41448:287:1:o

Swarm Source

ipfs://e7e228b0257ec786322a8338c89336fcf2b285e97fddf24624ec476bb6daccd0

Block Transaction Gas Used Reward
view all blocks sequenced

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
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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