Contract 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 16

 

Contract Overview

Balance:
0 ETH

EtherValue:
$0.00

Token:
Txn Hash Method
Block
From
To
Value
0x1efd82d2c0173ee4175d1b669c3d8a7f2ac2ff4c130f0c8509753e4216141e82Swap Exact Token...1097186942023-09-18 11:22:45161 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000401691040.247105835
0x26c510f7890eabc60351e8ba8d2b3494a8ba6113e76843f41126a24f07cc6c08Swap Exact Token...1097186482023-09-18 11:21:13161 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000387670290.266840799
0xd4e7172538eecd9d784101b75a4cfba1daea3111da2ad8e4ba2539f0293ce1ddSwap Exact Token...1097026732023-09-18 2:28:43162 days 8 hrs ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000868219560.375685864
0x512008254ad1fcc30ad960c1bb53563943abe664f07f179c750f1387e57a54aeSwap Exact Token...1096922682023-09-17 20:41:53162 days 14 hrs ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0001361148520.743996848
0xba53f86e1bbf05e5e0c502c8a32e2caceb16cd82c883b842a9562ff4b6a659ebSwap Exact Token...1096754912023-09-17 11:22:39162 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.00004067850.276265406
0x8685639924e400eb19d151b3801db3ff3d3a68bdd9850fd05383b62e9e3d94fbSwap Exact Token...1096754472023-09-17 11:21:11162 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.000041891120.282228749
0xb8c41464bb172e4d0d3d65145491b4106d5748b4deeb78c551ded0f518f22b20Swap Exact Token...1096555392023-09-17 0:17:35163 days 10 hrs ago0xebd318be780ef374ba7a864ebde498e4bdd7f299 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000931227970.421904102
0xdb088a4eef331dd9271d5cfd24ac6400a89aa3b9a6893f54654923295886c94bSwap Exact Token...1096322882023-09-16 11:22:33163 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000462968940.347653732
0xbb269b7f1ddf6e16cea7f49b3cd78c70447b36388b552f59c56484d813ac3ebdSwap Exact Token...1096322482023-09-16 11:21:13163 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000416950070.307648706
0xdd06c0202a40397e949c194753ae0ab7d6ddea8a26fe20087799f4b9d9411d05Swap Exact Token...1095890862023-09-15 11:22:29164 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000435289110.100000058
0x90ae3a0a3a39af135539c55df5527f0dc9be0fd84442cb54cf0a0f979ddb04eeSwap Exact Token...1095890482023-09-15 11:21:13164 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000408330830.100000063
0x4399566151a8982edae48e922d4f83ad482eddcd18a8c2bb9804f649fd0e22b8Swap Exact Token...1095883802023-09-15 10:58:57165 days 15 mins ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.000053992590.165
0xb6abc597e245ead90242a8a17f222d53a8e23c1afb2677ed7303c9abb956a585Swap Exact Token...1095743482023-09-15 3:11:13165 days 8 hrs ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000520213760.165
0x25fe9b6ad937eb4ec3fc1c340732f529d91349eddebef60d9dbfd9f5b78e3f35Swap Exact Token...1095494722023-09-14 13:22:01165 days 21 hrs ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000869835340.165
0x886b3d12febebd6c0b990d2cc6bbcab4387ea941d13ad13ef33d0527337111beSwap Exact Token...1095458852023-09-14 11:22:27165 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.000039408210.100000057
0xfbd41f0fc9ef41dc2bc90c1211910df356363be48e586d9b6ae6d25954e3989dSwap Exact Token...1095458462023-09-14 11:21:09165 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000391745020.100000056
0x236ae2f57f36010514bfdd80a0846bb76b0a76dcf657bbd55fe631c0f006e256Swap Exact Token...1095026852023-09-13 11:22:27166 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000696087120.100000053
0x8b95ac8ec44ba89f95ab200496e22987d3716f37cac59666120a882cdf7e819aSwap Exact Token...1095026472023-09-13 11:21:11166 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000769072390.100000053
0x863470251cf86a8bf76eb93930fade37dd519f039eab8f9b8bfa7a444b0a750cSwap Exact Token...1094959682023-09-13 7:38:33167 days 3 hrs ago0xebd318be780ef374ba7a864ebde498e4bdd7f299 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000619885630.025
0x76573d51c1d98b43f4682dafbe0ae3ba09d44c73ea898e9d6a7a6094b0e92338Swap Exact Token...1094959662023-09-13 7:38:29167 days 3 hrs ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000888617750.198
0x91ec06323ebfdd095f9bc508744cfa89acba107a5b1c0d1b707efba2c3698ce6Swap Exact Token...1094594942023-09-12 11:22:45167 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000492366350.100000266
0xb3b9bc1e3a2020415e4c209db875b8002d7e10f9f4aa31d16390808ba287b524Swap Exact Token...1094594492023-09-12 11:21:15167 days 23 hrs ago0x46537463cc9764db02f88a9b944ad8e37762f0f4 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000471733260.10000036
0xe728c2817a3f88b28b6fb56ede836a025e49bf2e61744430255228ed457effbdSwap Exact Token...1094577432023-09-12 10:24:23168 days 50 mins ago0xebd318be780ef374ba7a864ebde498e4bdd7f299 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000716776010.100052371
0x8b9466bd045ee374dae4b4277909ca03ddc395dae101ac68ea005dde27abfd06Swap Exact Token...1094576932023-09-12 10:22:43168 days 51 mins ago0x1f34275b946f002bcde2371179ef0360b5a876e5 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000607517630.165
0xc4641ea7231bd0978e116acfb9e16591bccce416e43c006d77cb8643a440a4b1Swap Exact Token...1094576792023-09-12 10:22:15168 days 52 mins ago0xebd318be780ef374ba7a864ebde498e4bdd7f299 IN  0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH0.0000361991570.025
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0xe8633ce5d216ebfdddf6875067dfb8397dedcaf30 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x7f5c764cbc14f9669b88837ca1490cca17c316070 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0xe8633ce5d216ebfdddf6875067dfb8397dedcaf30 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Velodrome Finance: Pair Factory0 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xafea5601b0a894451955355e79ad3026515e500d 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x3905870e647c97cb9c8d99db24384f480531b5b90 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Lido: wstETH Token0 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x3905870e647c97cb9c8d99db24384f480531b5b90 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Velodrome Finance: Pair Factory0 ETH
0xeed4e795cb29d8e73380a800fa9288cd0420329b07b3378064b9777023b0b72f1075583882023-07-30 11:12:33212 days 1 min ago 0xafea5601b0a894451955355e79ad3026515e500d 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH
0xbb3b120de2caef9b21ee4af83fc9804cda92fc1326650ced3b4204be3abc0cc41075583832023-07-30 11:12:23212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x47029bc8f5cbe3b464004e87ef9c9419a48018cd0 ETH
0xbb3b120de2caef9b21ee4af83fc9804cda92fc1326650ced3b4204be3abc0cc41075583832023-07-30 11:12:23212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x7f5c764cbc14f9669b88837ca1490cca17c316070 ETH
0xbb3b120de2caef9b21ee4af83fc9804cda92fc1326650ced3b4204be3abc0cc41075583832023-07-30 11:12:23212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x47029bc8f5cbe3b464004e87ef9c9419a48018cd0 ETH
0xbb3b120de2caef9b21ee4af83fc9804cda92fc1326650ced3b4204be3abc0cc41075583832023-07-30 11:12:23212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Velodrome Finance: Pair Factory0 ETH
0xbb3b120de2caef9b21ee4af83fc9804cda92fc1326650ced3b4204be3abc0cc41075583832023-07-30 11:12:23212 days 2 mins ago 0x1ae5bf70981b8f18299e82322524a02fc86d97c6 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH
0x865e5db4220a4d23dca340ee570e453684de3dbdfbee44e3d4159a83fd2751891075583752023-07-30 11:12:07212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x43c3f2d0aa0ebc433d654bb6ebf67f0c03f8d8d90 ETH
0x865e5db4220a4d23dca340ee570e453684de3dbdfbee44e3d4159a83fd2751891075583752023-07-30 11:12:07212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Maker: DAI Stablecoin0 ETH
0x865e5db4220a4d23dca340ee570e453684de3dbdfbee44e3d4159a83fd2751891075583752023-07-30 11:12:07212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0x43c3f2d0aa0ebc433d654bb6ebf67f0c03f8d8d90 ETH
0x865e5db4220a4d23dca340ee570e453684de3dbdfbee44e3d4159a83fd2751891075583752023-07-30 11:12:07212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Velodrome Finance: Pair Factory0 ETH
0x865e5db4220a4d23dca340ee570e453684de3dbdfbee44e3d4159a83fd2751891075583752023-07-30 11:12:07212 days 2 mins ago 0xafea5601b0a894451955355e79ad3026515e500d 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH
0xc7b0b4dd611b9f55b513659f5126d092e32863bba03ee113a081d0aefa3298e11075583622023-07-30 11:11:41212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0xcdd41009e74bd1ae4f7b2eecf892e4bc718b93020 ETH
0xc7b0b4dd611b9f55b513659f5126d092e32863bba03ee113a081d0aefa3298e11075583622023-07-30 11:11:41212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Optimism: OP Token0 ETH
0xc7b0b4dd611b9f55b513659f5126d092e32863bba03ee113a081d0aefa3298e11075583622023-07-30 11:11:41212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 0xcdd41009e74bd1ae4f7b2eecf892e4bc718b93020 ETH
0xc7b0b4dd611b9f55b513659f5126d092e32863bba03ee113a081d0aefa3298e11075583622023-07-30 11:11:41212 days 2 mins ago 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c9 Velodrome Finance: Pair Factory0 ETH
0xc7b0b4dd611b9f55b513659f5126d092e32863bba03ee113a081d0aefa3298e11075583622023-07-30 11:11:41212 days 2 mins ago 0x: Flash Wallet 0xa132dab612db5cb9fc9ac426a0cc215a3423f9c90 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Optimistic.Etherscan.io on 2022-06-01
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.13;

library Math {
    function max(uint a, uint b) internal pure returns (uint) {
        return a >= b ? a : b;
    }
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
    function cbrt(uint256 n) internal pure returns (uint256) { unchecked {
        uint256 x = 0;
        for (uint256 y = 1 << 255; y > 0; y >>= 3) {
            x <<= 1;
            uint256 z = 3 * x * (x + 1) + 1;
            if (n / y >= z) {
                n -= y * z;
                x += 1;
            }
        }
        return x;
    }}
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

interface IPair {
    function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1);
    function claimFees() external returns (uint, uint);
    function tokens() external returns (address, address);
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

interface IPairFactory {
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function pairCodeHash() external pure returns (bytes32);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

interface IRouter {
    function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair);
}

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

contract Router is IRouter {

    struct route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWETH public immutable weth;
    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'Router: EXPIRED');
        _;
    }

    constructor(address _factory, address _weth) {
        factory = _factory;
        pairCodeHash = IPairFactory(_factory).pairCodeHash();
        weth = IWETH(_weth);
    }

    receive() external payable {
        assert(msg.sender == address(weth)); // only accept ETH via fallback from the WETH contract
    }

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'Router: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'Router: ZERO_ADDRESS');
    }

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

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

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IPairFactory(factory).isPair(pair)) {
            amountStable = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IPairFactory(factory).isPair(pair)) {
            amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, 'Router: INVALID_PATH');
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IPairFactory(factory).isPair(pair)) {
                amounts[i+1] = IPair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IPairFactory(factory).isPair(pair);
    }

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = IERC20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = IERC20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin);
        require(amountBDesired >= amountBMin);
        // create the pair if it doesn't exist yet
        address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            address(weth),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, address(weth), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        weth.deposit{value: amountETH}();
        assert(weth.transfer(pair, amountETH));
        liquidity = IPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        require(IPair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair
        (uint amount0, uint amount1) = IPair(pair).burn(to);
        (address token0,) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'Router: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(weth),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        weth.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(weth), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        route[] memory routes = new route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    payable
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[0].from == address(weth), 'Router: INVALID_PATH');
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        weth.deposit{value: amounts[0]}();
        assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(weth), 'Router: INVALID_PATH');
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        weth.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

    function _safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162003a0338038062003a038339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c05161380f620001f46000396000610f0b01526000818161013e0152818161020b0152818161091901528181610b5801528181610dbb01528181611482015281816115950152818161163501528181611e0d01528181611e4301528181611e7801528181611f220152818161205d01526120ad01526000818161042d01528181610c5001528181610ed0015281816111890152818161129d015281816119ba01528181611b2e0152818161215c0152818161274601526127e7015261380f6000f3fe60806040526004361061012e5760003560e01c80635e60dab5116100ab578063a32b1fcd1161006f578063a32b1fcd146103e8578063b7e0d4c014610408578063c45a01551461041b578063d7b0e0a51461044f578063e5e31b131461046f578063f41766d81461049f57600080fd5b80635e60dab51461035557806367ffb66a146103755780637301e3c8146103885780639881fcb4146103a857806398a0fb3c146103c857600080fd5b8063448725b4116100f2578063448725b4146102655780634c1ee03e14610285578063544caa56146102a55780635a47ddc3146102e55780635e1e63251461032057600080fd5b80630dede6c41461017257806313dcfc59146101ac57806318a13086146101d95780633fc8cef3146101f95780634386e63c1461024557600080fd5b3661016d57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461016b5761016b612bce565b005b600080fd5b34801561017e57600080fd5b5061019261018d366004612c15565b6104bf565b604080519283526020830191909152015b60405180910390f35b3480156101b857600080fd5b506101cc6101c7366004612c9a565b6106d9565b6040516101a39190612d15565b3480156101e557600080fd5b506101cc6101f4366004612d9e565b6108ec565b34801561020557600080fd5b5061022d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101a3565b34801561025157600080fd5b50610192610260366004612e11565b610c49565b34801561027157600080fd5b50610192610280366004612e73565b610db0565b34801561029157600080fd5b5061022d6102a0366004612f1d565b610e89565b3480156102b157600080fd5b506102c56102c0366004612f68565b610f91565b604080516001600160a01b039384168152929091166020830152016101a3565b3480156102f157600080fd5b50610305610300366004612fa1565b611071565b604080519384526020840192909252908201526060016101a3565b34801561032c57600080fd5b5061034061033b366004613030565b611151565b604080519283529015156020830152016101a3565b34801561036157600080fd5b50610192610370366004612f1d565b6113a5565b6101cc610383366004613067565b61145d565b34801561039457600080fd5b506101cc6103a3366004613139565b6117ce565b3480156103b457600080fd5b506101cc6103c336600461327b565b6118a4565b3480156103d457600080fd5b506103056103e3366004613321565b611b26565b3480156103f457600080fd5b5061019261040336600461337c565b611d26565b610305610416366004613438565b611de1565b34801561042757600080fd5b5061022d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561045b57600080fd5b5061019261046a366004613438565b612033565b34801561047b57600080fd5b5061048f61048a366004613493565b61213a565b60405190151581526020016101a3565b3480156104ab57600080fd5b506101cc6104ba366004612d9e565b6121cf565b60008082428110156104ec5760405162461bcd60e51b81526004016104e3906134b0565b60405180910390fd5b60006104f98c8c8c610e89565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561054f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057391906134d9565b61057c57600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec91906134f6565b9150915060006105fc8f8f610f91565b509050806001600160a01b03168f6001600160a01b03161461061f578183610622565b82825b90975095508a8710156106775760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e5400000060448201526064016104e3565b898610156106c75760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e5400000060448201526064016104e3565b50505050509850989650505050505050565b606081428110156106fc5760405162461bcd60e51b81526004016104e3906134b0565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161071357905050905087816000815181106107565761075661351a565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061078e5761078e61351a565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107c6576107c661351a565b60209081029190910101519015156040909101526107e48a826118a4565b92508883600185516107f69190613546565b815181106108065761080661351a565b6020026020010151101561082c5760405162461bcd60e51b81526004016104e39061355d565b6108d4816000815181106108425761084261351a565b602002602001015160000151336108b4846000815181106108655761086561351a565b602002602001015160000151856000815181106108845761088461351a565b602002602001015160200151866000815181106108a3576108a361351a565b602002602001015160400151610e89565b866000815181106108c7576108c761351a565b60200260200101516122f4565b6108df8382876123ec565b5050979650505050505050565b6060814281101561090f5760405162461bcd60e51b81526004016104e3906134b0565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610946600182613546565b8181106109555761095561351a565b905060600201602001602081019061096d9190613493565b6001600160a01b0316146109935760405162461bcd60e51b81526004016104e39061359f565b6109ef888787808060200260200160405190810160405280939291908181526020016000905b828210156109e5576109d6606083028601368190038101906135cd565b815260200190600101906109b9565b50505050506118a4565b9150868260018451610a019190613546565b81518110610a1157610a1161351a565b60200260200101511015610a375760405162461bcd60e51b81526004016104e39061355d565b610af986866000818110610a4d57610a4d61351a565b610a639260206060909202019081019150613493565b33610ae689896000818110610a7a57610a7a61351a565b610a909260206060909202019081019150613493565b8a8a6000818110610aa357610aa361351a565b9050606002016020016020810190610abb9190613493565b8b8b6000818110610ace57610ace61351a565b90506060020160400160208101906102a091906135e9565b856000815181106108c7576108c761351a565b610b56828787808060200260200160405190810160405280939291908181526020016000905b82821015610b4b57610b3c606083028601368190038101906135cd565b81526020019060010190610b1f565b5050505050306123ec565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610b949190613546565b81518110610ba457610ba461351a565b60200260200101516040518263ffffffff1660e01b8152600401610bca91815260200190565b6020604051808303816000875af1158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190613606565b50610c3e848360018551610c219190613546565b81518110610c3157610c3161351a565b6020026020010151612641565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610c9e9392919061361f565b602060405180830381865afa158015610cbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdf9190613643565b90506001600160a01b038116610cfc576000809250925050610da7565b600080610d0a8989896113a5565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d729190613606565b905080610d7f8489613660565b610d89919061367f565b955080610d968389613660565b610da0919061367f565b9450505050505b94509492505050565b6000806000610de08e7f00000000000000000000000000000000000000000000000000000000000000008f610e89565b9050600087610def578c610df3565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610e2e903390309086908f908e908e908e906004016136a1565b600060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b50505050610e6f8f8f8f8f8f8f8f612033565b809450819550505050509b509b9950505050505050505050565b6000806000610e988686610f91565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610f6f939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b031603610ff55760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a204944454e544943414c5f414444524553534553000000000060448201526064016104e3565b826001600160a01b0316846001600160a01b031610611015578284611018565b83835b90925090506001600160a01b03821661106a5760405162461bcd60e51b8152602060048201526014602482015273526f757465723a205a45524f5f4144445245535360601b60448201526064016104e3565b9250929050565b600080600083428110156110975760405162461bcd60e51b81526004016104e3906134b0565b6110a68d8d8d8d8d8d8d61270f565b909450925060006110b88e8e8e610e89565b90506110c68e3383886122f4565b6110d28d3383876122f4565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190613606565b9250505099509950999650505050505050565b600080600061116285856001610e89565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f691906134d9565b1561126f576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126c9190613606565b91505b61127b87876000610e89565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906134d9565b15611383576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190613606565b90505b80821161139257806000611396565b8160015b94509450505050935093915050565b60008060006113b48686610f91565b5090506000806113c5888888610e89565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142691906136e2565b5091509150826001600160a01b0316886001600160a01b03161461144b57808261144e565b81815b90999098509650505050505050565b606081428110156114805760405162461bcd60e51b81526004016104e3906134b0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106114bd576114bd61351a565b6114d39260206060909202019081019150613493565b6001600160a01b0316146114f95760405162461bcd60e51b81526004016104e39061359f565b61154b348787808060200260200160405190810160405280939291908181526020016000905b828210156109e55761153c606083028601368190038101906135cd565b8152602001906001019061151f565b915086826001845161155d9190613546565b8151811061156d5761156d61351a565b602002602001015110156115935760405162461bcd60e51b81526004016104e39061355d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106115d5576115d561351a565b60200260200101516040518263ffffffff1660e01b815260040160206040518083038185885af115801561160d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116329190613606565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6116cc888860008181106116785761167861351a565b61168e9260206060909202019081019150613493565b898960008181106116a1576116a161351a565b90506060020160200160208101906116b99190613493565b8a8a6000818110610ace57610ace61351a565b846000815181106116df576116df61351a565b60200260200101516040518363ffffffff1660e01b81526004016117189291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611737573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175b91906134d9565b61176757611767612bce565b6117c4828787808060200260200160405190810160405280939291908181526020016000905b828210156117b9576117aa606083028601368190038101906135cd565b8152602001906001019061178d565b5050505050866123ec565b5095945050505050565b606081428110156117f15760405162461bcd60e51b81526004016104e3906134b0565b611847868660008181106118075761180761351a565b61181d9260206060909202019081019150613493565b3361183489896000818110610a7a57610a7a61351a565b8a6000815181106108c7576108c761351a565b611899878787808060200260200160405190810160405280939291908181526020016000905b828210156117b95761188a606083028601368190038101906135cd565b8152602001906001019061186d565b509495945050505050565b60606001825110156118c85760405162461bcd60e51b81526004016104e39061359f565b81516118d5906001613710565b67ffffffffffffffff8111156118ed576118ed6130ce565b604051908082528060200260200182016040528015611916578160200160208202803683370190505b509050828160008151811061192d5761192d61351a565b60200260200101818152505060005b8251811015611b1f57600061199884838151811061195c5761195c61351a565b60200260200101516000015185848151811061197a5761197a61351a565b6020026020010151602001518685815181106108a3576108a361351a565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2791906134d9565b15611b0c57806001600160a01b031663f140a35a848481518110611a4d57611a4d61351a565b6020026020010151868581518110611a6757611a6761351a565b6020026020010151600001516040518363ffffffff1660e01b8152600401611aa29291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015611abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae39190613606565b83611aef846001613710565b81518110611aff57611aff61351a565b6020026020010181815250505b5080611b1781613728565b91505061193c565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611b7c9392919061361f565b602060405180830381865afa158015611b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbd9190613643565b9050600080806001600160a01b03841615611c4757836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190613606565b9050611c418c8c8c6113a5565b90935091505b82158015611c53575081155b15611c84578896508795506103e8611c73611c6e888a613660565b61298d565b611c7d9190613546565b9450611d17565b6000611c918a85856129fd565b9050888111611cd957899750955085611cd284611cae848b613660565b611cb8919061367f565b84611cc3858b613660565b611ccd919061367f565b612ac7565b9550611d15565b6000611ce68a85876129fd565b9850899750889050611d1185611cfc8584613660565b611d06919061367f565b85611cc3868c613660565b9650505b505b50505050955095509592505050565b6000806000611d368f8f8f610e89565b9050600087611d45578c611d49565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d84903390309086908f908e908e908e906004016136a1565b600060405180830381600087803b158015611d9e57600080fd5b505af1158015611db2573d6000803e3d6000fd5b5050505050611dc78f8f8f8f8f8f8f8f6104bf565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015611e075760405162461bcd60e51b81526004016104e3906134b0565b611e368b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d61270f565b90945092506000611e688c7f00000000000000000000000000000000000000000000000000000000000000008d610e89565b9050611e768c3383886122f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b815260040160206040518083038185885af1158015611ed6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611efb9190613606565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611f6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8f91906134d9565b611f9b57611f9b612bce565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120079190613606565b925083341115612024576120243361201f8634613546565b612641565b50509750975097945050505050565b60008082428110156120575760405162461bcd60e51b81526004016104e3906134b0565b6120878a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6104bf565b90935091506120978a8685612adf565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024016020604051808303816000875af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121229190613606565b5061212d8583612641565b5097509795505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c991906134d9565b92915050565b606081428110156121f25760405162461bcd60e51b81526004016104e3906134b0565b612244888787808060200260200160405190810160405280939291908181526020016000905b828210156109e557612235606083028601368190038101906135cd565b81526020019060010190612218565b91508682600184516122569190613546565b815181106122665761226661351a565b6020026020010151101561228c5760405162461bcd60e51b81526004016104e39061355d565b6122a286866000818110610a4d57610a4d61351a565b610c3e828787808060200260200160405190810160405280939291908181526020016000905b828210156117b9576122e5606083028601368190038101906135cd565b815260200190600101906122c8565b6000846001600160a01b03163b1161230b57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161236f919061376d565b6000604051808303816000865af19150503d80600081146123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b50915091508180156123db5750805115806123db5750808060200190518101906123db91906134d9565b6123e457600080fd5b505050505050565b60005b825181101561263b57600061243e84838151811061240f5761240f61351a565b60200260200101516000015185848151811061242d5761242d61351a565b602002602001015160200151610f91565b50905060008561244f846001613710565b8151811061245f5761245f61351a565b60200260200101519050600080836001600160a01b03168786815181106124885761248861351a565b6020026020010151600001516001600160a01b0316146124aa578260006124ae565b6000835b915091506000600188516124c29190613546565b86106124ce5786612541565b612541886124dd886001613710565b815181106124ed576124ed61351a565b602002602001015160000151898860016125079190613710565b815181106125175761251761351a565b6020026020010151602001518a8960016125319190613710565b815181106108a3576108a361351a565b90506125948887815181106125585761255861351a565b6020026020010151600001518988815181106125765761257661351a565b6020026020010151602001518a89815181106108a3576108a361351a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156125d1576020820181803683370190505b506040518563ffffffff1660e01b81526004016125f19493929190613789565b600060405180830381600087803b15801561260b57600080fd5b505af115801561261f573d6000803e3d6000fd5b505050505050505050808061263390613728565b9150506123ef565b50505050565b604080516000808252602082019092526001600160a01b03841690839060405161266b919061376d565b60006040518083038185875af1925050503d80600081146126a8576040519150601f19603f3d011682016040523d82523d6000602084013e6126ad565b606091505b505090508061270a5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016104e3565b505050565b6000808386101561271f57600080fd5b8285101561272c57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc309061277f908d908d908d9060040161361f565b602060405180830381865afa15801561279c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c09190613643565b90506001600160a01b038116612866576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490612820908d908d908d9060040161361f565b6020604051808303816000875af115801561283f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128639190613643565b90505b6000806128748c8c8c6113a5565b91509150816000148015612886575080155b156128965788945087935061297e565b60006128a38a84846129fd565b905088811161290757868110156128fc5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e5400000060448201526064016104e3565b89955093508361297c565b60006129148a84866129fd565b90508a81111561292657612926612bce565b888110156129765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e5400000060448201526064016104e3565b95508894505b505b50505097509795505050505050565b600060038211156129ee57508060006129a760028361367f565b6129b2906001613710565b90505b818110156129e8579050806002816129cd818661367f565b6129d79190613710565b6129e1919061367f565b90506129b5565b50919050565b81156129f8575060015b919050565b6000808411612a4e5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a20494e53554646494349454e545f414d4f554e54000000000060448201526064016104e3565b600083118015612a5e5750600082115b612aaa5760405162461bcd60e51b815260206004820152601e60248201527f526f757465723a20494e53554646494349454e545f4c4951554944495459000060448201526064016104e3565b82612ab58386613660565b612abf919061367f565b949350505050565b6000818310612ad65781612ad8565b825b9392505050565b6000836001600160a01b03163b11612af657600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612b52919061376d565b6000604051808303816000865af19150503d8060008114612b8f576040519150601f19603f3d011682016040523d82523d6000602084013e612b94565b606091505b5091509150818015612bbe575080511580612bbe575080806020019051810190612bbe91906134d9565b612bc757600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612bf957600080fd5b50565b80356129f881612be4565b8015158114612bf957600080fd5b600080600080600080600080610100898b031215612c3257600080fd5b8835612c3d81612be4565b97506020890135612c4d81612be4565b96506040890135612c5d81612c07565b9550606089013594506080890135935060a0890135925060c0890135612c8281612be4565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612cb557600080fd5b87359650602088013595506040880135612cce81612be4565b94506060880135612cde81612be4565b93506080880135612cee81612c07565b925060a0880135612cfe81612be4565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612d4d57835183529284019291840191600101612d31565b50909695505050505050565b60008083601f840112612d6b57600080fd5b50813567ffffffffffffffff811115612d8357600080fd5b60208301915083602060608302850101111561106a57600080fd5b60008060008060008060a08789031215612db757600080fd5b8635955060208701359450604087013567ffffffffffffffff811115612ddc57600080fd5b612de889828a01612d59565b9095509350506060870135612dfc81612be4565b80925050608087013590509295509295509295565b60008060008060808587031215612e2757600080fd5b8435612e3281612be4565b93506020850135612e4281612be4565b92506040850135612e5281612c07565b9396929550929360600135925050565b803560ff811681146129f857600080fd5b60008060008060008060008060008060006101608c8e031215612e9557600080fd5b8b35612ea081612be4565b9a5060208c0135612eb081612c07565b995060408c0135985060608c0135975060808c0135965060a08c0135612ed581612be4565b955060c08c0135945060e08c0135612eec81612c07565b9350612efb6101008d01612e62565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215612f3257600080fd5b8335612f3d81612be4565b92506020840135612f4d81612be4565b91506040840135612f5d81612c07565b809150509250925092565b60008060408385031215612f7b57600080fd5b8235612f8681612be4565b91506020830135612f9681612be4565b809150509250929050565b60008060008060008060008060006101208a8c031215612fc057600080fd5b8935612fcb81612be4565b985060208a0135612fdb81612be4565b975060408a0135612feb81612c07565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561301781612be4565b809250506101008a013590509295985092959850929598565b60008060006060848603121561304557600080fd5b83359250602084013561305781612be4565b91506040840135612f5d81612be4565b60008060008060006080868803121561307f57600080fd5b85359450602086013567ffffffffffffffff81111561309d57600080fd5b6130a988828901612d59565b90955093505060408601356130bd81612be4565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561310d5761310d6130ce565b604052919050565b600067ffffffffffffffff82111561312f5761312f6130ce565b5060051b60200190565b60008060008060006080868803121561315157600080fd5b853567ffffffffffffffff8082111561316957600080fd5b818801915088601f83011261317d57600080fd5b8135602061319261318d83613115565b6130e4565b82815260059290921b8401810191818101908c8411156131b157600080fd5b948201945b838610156131cf578535825294820194908201906131b6565b995050890135925050808211156131e557600080fd5b506131f288828901612d59565b90955093506130bd905060408701612bfc565b60006060828403121561321757600080fd5b6040516060810181811067ffffffffffffffff8211171561323a5761323a6130ce565b604052905080823561324b81612be4565b8152602083013561325b81612be4565b6020820152604083013561326e81612c07565b6040919091015292915050565b6000806040838503121561328e57600080fd5b8235915060208084013567ffffffffffffffff8111156132ad57600080fd5b8401601f810186136132be57600080fd5b80356132cc61318d82613115565b818152606091820283018401918482019190898411156132eb57600080fd5b938501935b83851015613311576133028a86613205565b835293840193918501916132f0565b5080955050505050509250929050565b600080600080600060a0868803121561333957600080fd5b853561334481612be4565b9450602086013561335481612be4565b9350604086013561336481612c07565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561339f57600080fd5b8c356133aa81612be4565b9b5060208d01356133ba81612be4565b9a5060408d01356133ca81612c07565b995060608d0135985060808d0135975060a08d0135965060c08d01356133ef81612be4565b955060e08d013594506101008d013561340781612c07565b93506134166101208e01612e62565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561345357600080fd5b873561345e81612be4565b9650602088013561346e81612c07565b955060408801359450606088013593506080880135925060a0880135612cfe81612be4565b6000602082840312156134a557600080fd5b8135612ad881612be4565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b6000602082840312156134eb57600080fd5b8151612ad881612c07565b6000806040838503121561350957600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561355857613558613530565b500390565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6000606082840312156135df57600080fd5b612ad88383613205565b6000602082840312156135fb57600080fd5b8135612ad881612c07565b60006020828403121561361857600080fd5b5051919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b60006020828403121561365557600080fd5b8151612ad881612be4565b600081600019048311821515161561367a5761367a613530565b500290565b60008261369c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806000606084860312156136f757600080fd5b8351925060208401519150604084015190509250925092565b6000821982111561372357613723613530565b500190565b60006001820161373a5761373a613530565b5060010190565b60005b8381101561375c578181015183820152602001613744565b8381111561263b5750506000910152565b6000825161377f818460208701613741565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526137c28160a0850160208701613741565b601f01601f19169190910160a0019594505050505056fea26469706673582212206e4900dfdd039707da891ddd17657c281f314f0146e14f58f3ea39ce3ebd3f3e64736f6c634300080d003300000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7460000000000000000000000004200000000000000000000000000000000000006

Deployed Bytecode

0x60806040526004361061012e5760003560e01c80635e60dab5116100ab578063a32b1fcd1161006f578063a32b1fcd146103e8578063b7e0d4c014610408578063c45a01551461041b578063d7b0e0a51461044f578063e5e31b131461046f578063f41766d81461049f57600080fd5b80635e60dab51461035557806367ffb66a146103755780637301e3c8146103885780639881fcb4146103a857806398a0fb3c146103c857600080fd5b8063448725b4116100f2578063448725b4146102655780634c1ee03e14610285578063544caa56146102a55780635a47ddc3146102e55780635e1e63251461032057600080fd5b80630dede6c41461017257806313dcfc59146101ac57806318a13086146101d95780633fc8cef3146101f95780634386e63c1461024557600080fd5b3661016d57336001600160a01b037f0000000000000000000000004200000000000000000000000000000000000006161461016b5761016b612bce565b005b600080fd5b34801561017e57600080fd5b5061019261018d366004612c15565b6104bf565b604080519283526020830191909152015b60405180910390f35b3480156101b857600080fd5b506101cc6101c7366004612c9a565b6106d9565b6040516101a39190612d15565b3480156101e557600080fd5b506101cc6101f4366004612d9e565b6108ec565b34801561020557600080fd5b5061022d7f000000000000000000000000420000000000000000000000000000000000000681565b6040516001600160a01b0390911681526020016101a3565b34801561025157600080fd5b50610192610260366004612e11565b610c49565b34801561027157600080fd5b50610192610280366004612e73565b610db0565b34801561029157600080fd5b5061022d6102a0366004612f1d565b610e89565b3480156102b157600080fd5b506102c56102c0366004612f68565b610f91565b604080516001600160a01b039384168152929091166020830152016101a3565b3480156102f157600080fd5b50610305610300366004612fa1565b611071565b604080519384526020840192909252908201526060016101a3565b34801561032c57600080fd5b5061034061033b366004613030565b611151565b604080519283529015156020830152016101a3565b34801561036157600080fd5b50610192610370366004612f1d565b6113a5565b6101cc610383366004613067565b61145d565b34801561039457600080fd5b506101cc6103a3366004613139565b6117ce565b3480156103b457600080fd5b506101cc6103c336600461327b565b6118a4565b3480156103d457600080fd5b506103056103e3366004613321565b611b26565b3480156103f457600080fd5b5061019261040336600461337c565b611d26565b610305610416366004613438565b611de1565b34801561042757600080fd5b5061022d7f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b74681565b34801561045b57600080fd5b5061019261046a366004613438565b612033565b34801561047b57600080fd5b5061048f61048a366004613493565b61213a565b60405190151581526020016101a3565b3480156104ab57600080fd5b506101cc6104ba366004612d9e565b6121cf565b60008082428110156104ec5760405162461bcd60e51b81526004016104e3906134b0565b60405180910390fd5b60006104f98c8c8c610e89565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af115801561054f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057391906134d9565b61057c57600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156105c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ec91906134f6565b9150915060006105fc8f8f610f91565b509050806001600160a01b03168f6001600160a01b03161461061f578183610622565b82825b90975095508a8710156106775760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e5400000060448201526064016104e3565b898610156106c75760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e5400000060448201526064016104e3565b50505050509850989650505050505050565b606081428110156106fc5760405162461bcd60e51b81526004016104e3906134b0565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161071357905050905087816000815181106107565761075661351a565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061078e5761078e61351a565b6020026020010151602001906001600160a01b031690816001600160a01b03168152505085816000815181106107c6576107c661351a565b60209081029190910101519015156040909101526107e48a826118a4565b92508883600185516107f69190613546565b815181106108065761080661351a565b6020026020010151101561082c5760405162461bcd60e51b81526004016104e39061355d565b6108d4816000815181106108425761084261351a565b602002602001015160000151336108b4846000815181106108655761086561351a565b602002602001015160000151856000815181106108845761088461351a565b602002602001015160200151866000815181106108a3576108a361351a565b602002602001015160400151610e89565b866000815181106108c7576108c761351a565b60200260200101516122f4565b6108df8382876123ec565b5050979650505050505050565b6060814281101561090f5760405162461bcd60e51b81526004016104e3906134b0565b6001600160a01b037f0000000000000000000000004200000000000000000000000000000000000006168686610946600182613546565b8181106109555761095561351a565b905060600201602001602081019061096d9190613493565b6001600160a01b0316146109935760405162461bcd60e51b81526004016104e39061359f565b6109ef888787808060200260200160405190810160405280939291908181526020016000905b828210156109e5576109d6606083028601368190038101906135cd565b815260200190600101906109b9565b50505050506118a4565b9150868260018451610a019190613546565b81518110610a1157610a1161351a565b60200260200101511015610a375760405162461bcd60e51b81526004016104e39061355d565b610af986866000818110610a4d57610a4d61351a565b610a639260206060909202019081019150613493565b33610ae689896000818110610a7a57610a7a61351a565b610a909260206060909202019081019150613493565b8a8a6000818110610aa357610aa361351a565b9050606002016020016020810190610abb9190613493565b8b8b6000818110610ace57610ace61351a565b90506060020160400160208101906102a091906135e9565b856000815181106108c7576108c761351a565b610b56828787808060200260200160405190810160405280939291908181526020016000905b82821015610b4b57610b3c606083028601368190038101906135cd565b81526020019060010190610b1f565b5050505050306123ec565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316632e1a7d4d8360018551610b949190613546565b81518110610ba457610ba461351a565b60200260200101516040518263ffffffff1660e01b8152600401610bca91815260200190565b6020604051808303816000875af1158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190613606565b50610c3e848360018551610c219190613546565b81518110610c3157610c3161351a565b6020026020010151612641565b509695505050505050565b60008060007f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7466001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610c9e9392919061361f565b602060405180830381865afa158015610cbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdf9190613643565b90506001600160a01b038116610cfc576000809250925050610da7565b600080610d0a8989896113a5565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d729190613606565b905080610d7f8489613660565b610d89919061367f565b955080610d968389613660565b610da0919061367f565b9450505050505b94509492505050565b6000806000610de08e7f00000000000000000000000042000000000000000000000000000000000000068f610e89565b9050600087610def578c610df3565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610e2e903390309086908f908e908e908e906004016136a1565b600060405180830381600087803b158015610e4857600080fd5b505af1158015610e5c573d6000803e3d6000fd5b50505050610e6f8f8f8f8f8f8f8f612033565b809450819550505050509b509b9950505050505050505050565b6000806000610e988686610f91565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b74690604901604051602081830303815290604052805190602001207fc1ac28b1c4ebe53c0cff67bab5878c4eb68759bb1e9f73977cd266b247d149f0604051602001610f6f939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b031603610ff55760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a204944454e544943414c5f414444524553534553000000000060448201526064016104e3565b826001600160a01b0316846001600160a01b031610611015578284611018565b83835b90925090506001600160a01b03821661106a5760405162461bcd60e51b8152602060048201526014602482015273526f757465723a205a45524f5f4144445245535360601b60448201526064016104e3565b9250929050565b600080600083428110156110975760405162461bcd60e51b81526004016104e3906134b0565b6110a68d8d8d8d8d8d8d61270f565b909450925060006110b88e8e8e610e89565b90506110c68e3383886122f4565b6110d28d3383876122f4565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113e9190613606565b9250505099509950999650505050505050565b600080600061116285856001610e89565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7469091169063e5e31b1390602401602060405180830381865afa1580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f691906134d9565b1561126f576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126c9190613606565b91505b61127b87876000610e89565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7469091169063e5e31b1390602401602060405180830381865afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906134d9565b15611383576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190613606565b90505b80821161139257806000611396565b8160015b94509450505050935093915050565b60008060006113b48686610f91565b5090506000806113c5888888610e89565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142691906136e2565b5091509150826001600160a01b0316886001600160a01b03161461144b57808261144e565b81815b90999098509650505050505050565b606081428110156114805760405162461bcd60e51b81526004016104e3906134b0565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b0316868660008181106114bd576114bd61351a565b6114d39260206060909202019081019150613493565b6001600160a01b0316146114f95760405162461bcd60e51b81526004016104e39061359f565b61154b348787808060200260200160405190810160405280939291908181526020016000905b828210156109e55761153c606083028601368190038101906135cd565b8152602001906001019061151f565b915086826001845161155d9190613546565b8151811061156d5761156d61351a565b602002602001015110156115935760405162461bcd60e51b81526004016104e39061355d565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663d0e30db0836000815181106115d5576115d561351a565b60200260200101516040518263ffffffff1660e01b815260040160206040518083038185885af115801561160d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116329190613606565b507f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663a9059cbb6116cc888860008181106116785761167861351a565b61168e9260206060909202019081019150613493565b898960008181106116a1576116a161351a565b90506060020160200160208101906116b99190613493565b8a8a6000818110610ace57610ace61351a565b846000815181106116df576116df61351a565b60200260200101516040518363ffffffff1660e01b81526004016117189291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611737573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061175b91906134d9565b61176757611767612bce565b6117c4828787808060200260200160405190810160405280939291908181526020016000905b828210156117b9576117aa606083028601368190038101906135cd565b8152602001906001019061178d565b5050505050866123ec565b5095945050505050565b606081428110156117f15760405162461bcd60e51b81526004016104e3906134b0565b611847868660008181106118075761180761351a565b61181d9260206060909202019081019150613493565b3361183489896000818110610a7a57610a7a61351a565b8a6000815181106108c7576108c761351a565b611899878787808060200260200160405190810160405280939291908181526020016000905b828210156117b95761188a606083028601368190038101906135cd565b8152602001906001019061186d565b509495945050505050565b60606001825110156118c85760405162461bcd60e51b81526004016104e39061359f565b81516118d5906001613710565b67ffffffffffffffff8111156118ed576118ed6130ce565b604051908082528060200260200182016040528015611916578160200160208202803683370190505b509050828160008151811061192d5761192d61351a565b60200260200101818152505060005b8251811015611b1f57600061199884838151811061195c5761195c61351a565b60200260200101516000015185848151811061197a5761197a61351a565b6020026020010151602001518685815181106108a3576108a361351a565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7469091169063e5e31b1390602401602060405180830381865afa158015611a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2791906134d9565b15611b0c57806001600160a01b031663f140a35a848481518110611a4d57611a4d61351a565b6020026020010151868581518110611a6757611a6761351a565b6020026020010151600001516040518363ffffffff1660e01b8152600401611aa29291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015611abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae39190613606565b83611aef846001613710565b81518110611aff57611aff61351a565b6020026020010181815250505b5080611b1781613728565b91505061193c565b5092915050565b6000806000807f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7466001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611b7c9392919061361f565b602060405180830381865afa158015611b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbd9190613643565b9050600080806001600160a01b03841615611c4757836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c349190613606565b9050611c418c8c8c6113a5565b90935091505b82158015611c53575081155b15611c84578896508795506103e8611c73611c6e888a613660565b61298d565b611c7d9190613546565b9450611d17565b6000611c918a85856129fd565b9050888111611cd957899750955085611cd284611cae848b613660565b611cb8919061367f565b84611cc3858b613660565b611ccd919061367f565b612ac7565b9550611d15565b6000611ce68a85876129fd565b9850899750889050611d1185611cfc8584613660565b611d06919061367f565b85611cc3868c613660565b9650505b505b50505050955095509592505050565b6000806000611d368f8f8f610e89565b9050600087611d45578c611d49565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611d84903390309086908f908e908e908e906004016136a1565b600060405180830381600087803b158015611d9e57600080fd5b505af1158015611db2573d6000803e3d6000fd5b5050505050611dc78f8f8f8f8f8f8f8f6104bf565b8093508194505050509c509c9a5050505050505050505050565b60008060008342811015611e075760405162461bcd60e51b81526004016104e3906134b0565b611e368b7f00000000000000000000000042000000000000000000000000000000000000068c8c348d8d61270f565b90945092506000611e688c7f00000000000000000000000042000000000000000000000000000000000000068d610e89565b9050611e768c3383886122f4565b7f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031663d0e30db0856040518263ffffffff1660e01b815260040160206040518083038185885af1158015611ed6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611efb9190613606565b5060405163a9059cbb60e01b81526001600160a01b038281166004830152602482018690527f0000000000000000000000004200000000000000000000000000000000000006169063a9059cbb906044016020604051808303816000875af1158015611f6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8f91906134d9565b611f9b57611f9b612bce565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120079190613606565b925083341115612024576120243361201f8634613546565b612641565b50509750975097945050505050565b60008082428110156120575760405162461bcd60e51b81526004016104e3906134b0565b6120878a7f00000000000000000000000042000000000000000000000000000000000000068b8b8b8b308b6104bf565b90935091506120978a8685612adf565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000042000000000000000000000000000000000000066001600160a01b031690632e1a7d4d906024016020604051808303816000875af11580156120fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121229190613606565b5061212d8583612641565b5097509795505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7469091169063e5e31b1390602401602060405180830381865afa1580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c991906134d9565b92915050565b606081428110156121f25760405162461bcd60e51b81526004016104e3906134b0565b612244888787808060200260200160405190810160405280939291908181526020016000905b828210156109e557612235606083028601368190038101906135cd565b81526020019060010190612218565b91508682600184516122569190613546565b815181106122665761226661351a565b6020026020010151101561228c5760405162461bcd60e51b81526004016104e39061355d565b6122a286866000818110610a4d57610a4d61351a565b610c3e828787808060200260200160405190810160405280939291908181526020016000905b828210156117b9576122e5606083028601368190038101906135cd565b815260200190600101906122c8565b6000846001600160a01b03163b1161230b57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161236f919061376d565b6000604051808303816000865af19150503d80600081146123ac576040519150601f19603f3d011682016040523d82523d6000602084013e6123b1565b606091505b50915091508180156123db5750805115806123db5750808060200190518101906123db91906134d9565b6123e457600080fd5b505050505050565b60005b825181101561263b57600061243e84838151811061240f5761240f61351a565b60200260200101516000015185848151811061242d5761242d61351a565b602002602001015160200151610f91565b50905060008561244f846001613710565b8151811061245f5761245f61351a565b60200260200101519050600080836001600160a01b03168786815181106124885761248861351a565b6020026020010151600001516001600160a01b0316146124aa578260006124ae565b6000835b915091506000600188516124c29190613546565b86106124ce5786612541565b612541886124dd886001613710565b815181106124ed576124ed61351a565b602002602001015160000151898860016125079190613710565b815181106125175761251761351a565b6020026020010151602001518a8960016125319190613710565b815181106108a3576108a361351a565b90506125948887815181106125585761255861351a565b6020026020010151600001518988815181106125765761257661351a565b6020026020010151602001518a89815181106108a3576108a361351a565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156125d1576020820181803683370190505b506040518563ffffffff1660e01b81526004016125f19493929190613789565b600060405180830381600087803b15801561260b57600080fd5b505af115801561261f573d6000803e3d6000fd5b505050505050505050808061263390613728565b9150506123ef565b50505050565b604080516000808252602082019092526001600160a01b03841690839060405161266b919061376d565b60006040518083038185875af1925050503d80600081146126a8576040519150601f19603f3d011682016040523d82523d6000602084013e6126ad565b606091505b505090508061270a5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016104e3565b505050565b6000808386101561271f57600080fd5b8285101561272c57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7461690636801cc309061277f908d908d908d9060040161361f565b602060405180830381865afa15801561279c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c09190613643565b90506001600160a01b038116612866576040516320b7f73960e21b81526001600160a01b037f00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b74616906382dfdce490612820908d908d908d9060040161361f565b6020604051808303816000875af115801561283f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128639190613643565b90505b6000806128748c8c8c6113a5565b91509150816000148015612886575080155b156128965788945087935061297e565b60006128a38a84846129fd565b905088811161290757868110156128fc5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f425f414d4f554e5400000060448201526064016104e3565b89955093508361297c565b60006129148a84866129fd565b90508a81111561292657612926612bce565b888110156129765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f415f414d4f554e5400000060448201526064016104e3565b95508894505b505b50505097509795505050505050565b600060038211156129ee57508060006129a760028361367f565b6129b2906001613710565b90505b818110156129e8579050806002816129cd818661367f565b6129d79190613710565b6129e1919061367f565b90506129b5565b50919050565b81156129f8575060015b919050565b6000808411612a4e5760405162461bcd60e51b815260206004820152601b60248201527f526f757465723a20494e53554646494349454e545f414d4f554e54000000000060448201526064016104e3565b600083118015612a5e5750600082115b612aaa5760405162461bcd60e51b815260206004820152601e60248201527f526f757465723a20494e53554646494349454e545f4c4951554944495459000060448201526064016104e3565b82612ab58386613660565b612abf919061367f565b949350505050565b6000818310612ad65781612ad8565b825b9392505050565b6000836001600160a01b03163b11612af657600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612b52919061376d565b6000604051808303816000865af19150503d8060008114612b8f576040519150601f19603f3d011682016040523d82523d6000602084013e612b94565b606091505b5091509150818015612bbe575080511580612bbe575080806020019051810190612bbe91906134d9565b612bc757600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114612bf957600080fd5b50565b80356129f881612be4565b8015158114612bf957600080fd5b600080600080600080600080610100898b031215612c3257600080fd5b8835612c3d81612be4565b97506020890135612c4d81612be4565b96506040890135612c5d81612c07565b9550606089013594506080890135935060a0890135925060c0890135612c8281612be4565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215612cb557600080fd5b87359650602088013595506040880135612cce81612be4565b94506060880135612cde81612be4565b93506080880135612cee81612c07565b925060a0880135612cfe81612be4565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015612d4d57835183529284019291840191600101612d31565b50909695505050505050565b60008083601f840112612d6b57600080fd5b50813567ffffffffffffffff811115612d8357600080fd5b60208301915083602060608302850101111561106a57600080fd5b60008060008060008060a08789031215612db757600080fd5b8635955060208701359450604087013567ffffffffffffffff811115612ddc57600080fd5b612de889828a01612d59565b9095509350506060870135612dfc81612be4565b80925050608087013590509295509295509295565b60008060008060808587031215612e2757600080fd5b8435612e3281612be4565b93506020850135612e4281612be4565b92506040850135612e5281612c07565b9396929550929360600135925050565b803560ff811681146129f857600080fd5b60008060008060008060008060008060006101608c8e031215612e9557600080fd5b8b35612ea081612be4565b9a5060208c0135612eb081612c07565b995060408c0135985060608c0135975060808c0135965060a08c0135612ed581612be4565b955060c08c0135945060e08c0135612eec81612c07565b9350612efb6101008d01612e62565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215612f3257600080fd5b8335612f3d81612be4565b92506020840135612f4d81612be4565b91506040840135612f5d81612c07565b809150509250925092565b60008060408385031215612f7b57600080fd5b8235612f8681612be4565b91506020830135612f9681612be4565b809150509250929050565b60008060008060008060008060006101208a8c031215612fc057600080fd5b8935612fcb81612be4565b985060208a0135612fdb81612be4565b975060408a0135612feb81612c07565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a013561301781612be4565b809250506101008a013590509295985092959850929598565b60008060006060848603121561304557600080fd5b83359250602084013561305781612be4565b91506040840135612f5d81612be4565b60008060008060006080868803121561307f57600080fd5b85359450602086013567ffffffffffffffff81111561309d57600080fd5b6130a988828901612d59565b90955093505060408601356130bd81612be4565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561310d5761310d6130ce565b604052919050565b600067ffffffffffffffff82111561312f5761312f6130ce565b5060051b60200190565b60008060008060006080868803121561315157600080fd5b853567ffffffffffffffff8082111561316957600080fd5b818801915088601f83011261317d57600080fd5b8135602061319261318d83613115565b6130e4565b82815260059290921b8401810191818101908c8411156131b157600080fd5b948201945b838610156131cf578535825294820194908201906131b6565b995050890135925050808211156131e557600080fd5b506131f288828901612d59565b90955093506130bd905060408701612bfc565b60006060828403121561321757600080fd5b6040516060810181811067ffffffffffffffff8211171561323a5761323a6130ce565b604052905080823561324b81612be4565b8152602083013561325b81612be4565b6020820152604083013561326e81612c07565b6040919091015292915050565b6000806040838503121561328e57600080fd5b8235915060208084013567ffffffffffffffff8111156132ad57600080fd5b8401601f810186136132be57600080fd5b80356132cc61318d82613115565b818152606091820283018401918482019190898411156132eb57600080fd5b938501935b83851015613311576133028a86613205565b835293840193918501916132f0565b5080955050505050509250929050565b600080600080600060a0868803121561333957600080fd5b853561334481612be4565b9450602086013561335481612be4565b9350604086013561336481612c07565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f03121561339f57600080fd5b8c356133aa81612be4565b9b5060208d01356133ba81612be4565b9a5060408d01356133ca81612c07565b995060608d0135985060808d0135975060a08d0135965060c08d01356133ef81612be4565b955060e08d013594506101008d013561340781612c07565b93506134166101208e01612e62565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561345357600080fd5b873561345e81612be4565b9650602088013561346e81612c07565b955060408801359450606088013593506080880135925060a0880135612cfe81612be4565b6000602082840312156134a557600080fd5b8135612ad881612be4565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b6000602082840312156134eb57600080fd5b8151612ad881612c07565b6000806040838503121561350957600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561355857613558613530565b500390565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6000606082840312156135df57600080fd5b612ad88383613205565b6000602082840312156135fb57600080fd5b8135612ad881612c07565b60006020828403121561361857600080fd5b5051919050565b6001600160a01b039384168152919092166020820152901515604082015260600190565b60006020828403121561365557600080fd5b8151612ad881612be4565b600081600019048311821515161561367a5761367a613530565b500290565b60008261369c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806000606084860312156136f757600080fd5b8351925060208401519150604084015190509250925092565b6000821982111561372357613723613530565b500190565b60006001820161373a5761373a613530565b5060010190565b60005b8381101561375c578181015183820152602001613744565b8381111561263b5750506000910152565b6000825161377f818460208701613741565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526137c28160a0850160208701613741565b601f01601f19169190910160a0019594505050505056fea26469706673582212206e4900dfdd039707da891ddd17657c281f314f0146e14f58f3ea39ce3ebd3f3e64736f6c634300080d0033

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

00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b7460000000000000000000000004200000000000000000000000000000000000006

-----Decoded View---------------
Arg [0] : _factory (address): 0x25CbdDb98b35ab1FF77413456B31EC81A6B6B746
Arg [1] : _weth (address): 0x4200000000000000000000000000000000000006

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000025cbddb98b35ab1ff77413456b31ec81a6b6b746
Arg [1] : 0000000000000000000000004200000000000000000000000000000000000006


Deployed ByteCode Sourcemap

3382:17147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4033:10;-1:-1:-1;;;;;4055:4:0;4033:27;;4026:35;;;;:::i;:::-;3382:17147;;;;;12789:808;;;;;;;;;;-1:-1:-1;12789:808:0;;;;;:::i;:::-;;:::i;:::-;;;;1664:25:1;;;1720:2;1705:18;;1698:34;;;;1637:18;12789:808:0;;;;;;;;16464:780;;;;;;;;;;-1:-1:-1;16464:780:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18457:755::-;;;;;;;;;;-1:-1:-1;18457:755:0;;;;;:::i;:::-;;:::i;3552:27::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4644:32:1;;;4626:51;;4614:2;4599:18;3552:27:0;4467:216:1;8831:752:0;;;;;;;;;;-1:-1:-1;8831:752:0;;;;;:::i;:::-;;:::i;14995:670::-;;;;;;;;;;-1:-1:-1;14995:670:0;;;;;:::i;:::-;;:::i;4551:415::-;;;;;;;;;;-1:-1:-1;4551:415:0;;;;;:::i;:::-;;:::i;4132:327::-;;;;;;;;;;-1:-1:-1;4132:327:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7956:15:1;;;7938:34;;8008:15;;;;8003:2;7988:18;;7981:43;7873:18;4132:327:0;7726:304:1;11093:696:0;;;;;;;;;;-1:-1:-1;11093:696:0;;;;;:::i;:::-;;:::i;:::-;;;;9252:25:1;;;9308:2;9293:18;;9286:34;;;;9336:18;;;9329:34;9240:2;9225:18;11093:696:0;9050:319:1;5901:664:0;;;;;;;;;;-1:-1:-1;5901:664:0;;;;;:::i;:::-;;:::i;:::-;;;;10003:25:1;;;10071:14;;10064:22;10059:2;10044:18;;10037:50;9976:18;5901:664:0;9835:258:1;5444:375:0;;;;;;;;;;-1:-1:-1;5444:375:0;;;;;:::i;:::-;;:::i;17837:612::-;;;;;;:::i;:::-;;:::i;19220:404::-;;;;;;;;;;-1:-1:-1;19220:404:0;;;;;:::i;:::-;;:::i;6647:559::-;;;;;;;;;;-1:-1:-1;6647:559:0;;;;;:::i;:::-;;:::i;7341:1482::-;;;;;;;;;;-1:-1:-1;7341:1482:0;;;;;:::i;:::-;;:::i;14286:701::-;;;;;;;;;;-1:-1:-1;14286:701:0;;;;;:::i;:::-;;:::i;11797:949::-;;;;;;:::i;:::-;;:::i;3513:32::-;;;;;;;;;;;;;;;13605:673;;;;;;;;;;-1:-1:-1;13605:673:0;;;;;:::i;:::-;;:::i;7214:119::-;;;;;;;;;;-1:-1:-1;7214:119:0;;;;;:::i;:::-;;:::i;:::-;;;17834:14:1;;17827:22;17809:41;;17797:2;17782:18;7214:119:0;17669:187:1;17252:577:0;;;;;;;;;;-1:-1:-1;17252:577:0;;;;;:::i;:::-;;:::i;12789:808::-;13048:12;13062;13029:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;;;;;;;;;13087:12:::1;13102:31;13110:6;13118;13126;13102:7;:31::i;:::-;13152:53;::::0;-1:-1:-1;;;13152:53:0;;13177:10:::1;13152:53;::::0;::::1;18445:34:1::0;-1:-1:-1;;;;;13152:24:0;::::1;18495:18:1::0;;;18488:43;;;18547:18;;;18540:34;;;13087:46:0;;-1:-1:-1;13152:24:0::1;::::0;18380:18:1;;13152:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13144:62;;;::::0;::::1;;13274:20;::::0;-1:-1:-1;;;13274:20:0;;-1:-1:-1;;;;;4644:32:1;;;13274:20:0::1;::::0;::::1;4626:51:1::0;13244:12:0::1;::::0;;;13274:16;::::1;::::0;::::1;::::0;4599:18:1;;13274:20:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13243:51;;;;13306:14;13325:26;13336:6;13344;13325:10;:26::i;:::-;13305:46;;;13393:6;-1:-1:-1::0;;;;;13383:16:0::1;:6;-1:-1:-1::0;;;;;13383:16:0::1;;:58;;13424:7;13433;13383:58;;;13403:7;13412;13383:58;13362:79:::0;;-1:-1:-1;13362:79:0;-1:-1:-1;13460:21:0;;::::1;;13452:63;;;::::0;-1:-1:-1;;;13452:63:0;;19287:2:1;13452:63:0::1;::::0;::::1;19269:21:1::0;19326:2;19306:18;;;19299:30;19365:31;19345:18;;;19338:59;19414:18;;13452:63:0::1;19085:353:1::0;13452:63:0::1;13545:10;13534:7;:21;;13526:63;;;::::0;-1:-1:-1;;;13526:63:0;;19645:2:1;13526:63:0::1;::::0;::::1;19627:21:1::0;19684:2;19664:18;;;19657:30;19723:31;19703:18;;;19696:59;19772:18;;13526:63:0::1;19443:353:1::0;13526:63:0::1;13076:521;;;;12789:808:::0;;;;;;;;;;;;:::o;16464:780::-;16719:21;16700:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;16777:14:::1;::::0;;16789:1:::1;16777:14:::0;;;;;::::1;::::0;;;16753:21:::1;::::0;16777:14:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;16777:14:0;;-1:-1:-1;;16777:14:0;;;;::::1;::::0;::::1;;;;;16753:38;;16819:9;16802:6;16809:1;16802:9;;;;;;;;:::i;:::-;;;;;;;:14;;:26;-1:-1:-1::0;;;;;16802:26:0::1;;;-1:-1:-1::0;;;;;16802:26:0::1;;;::::0;::::1;16854:7;16839:6;16846:1;16839:9;;;;;;;;:::i;:::-;;;;;;;:12;;:22;-1:-1:-1::0;;;;;16839:22:0::1;;;-1:-1:-1::0;;;;;16839:22:0::1;;;::::0;::::1;16891:6;16872;16879:1;16872:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:25;::::1;;:16;::::0;;::::1;:25:::0;16918:31:::1;16932:8:::0;16942:6;16918:13:::1;:31::i;:::-;16908:41;;16999:12;16968:7;16993:1;16976:7;:14;:18;;;;:::i;:::-;16968:27;;;;;;;;:::i;:::-;;;;;;;:43;;16960:90;;;;-1:-1:-1::0;;;16960:90:0::1;;;;;;;:::i;:::-;17061:138;17093:6;17100:1;17093:9;;;;;;;;:::i;:::-;;;;;;;:14;;;17109:10;17121:55;17129:6;17136:1;17129:9;;;;;;;;:::i;:::-;;;;;;;:14;;;17145:6;17152:1;17145:9;;;;;;;;:::i;:::-;;;;;;;:12;;;17159:6;17166:1;17159:9;;;;;;;;:::i;:::-;;;;;;;:16;;;17121:7;:55::i;:::-;17178:7;17186:1;17178:10;;;;;;;;:::i;:::-;;;;;;;17061:17;:138::i;:::-;17210:26;17216:7;17225:6;17233:2;17210:5;:26::i;:::-;16742:502;16464:780:::0;;;;;;;;;;:::o;18457:755::-;18624:21;18600:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18711:4:0::1;18671:45;:6:::0;;18678:17:::1;18694:1;18671:6:::0;18678:17:::1;:::i;:::-;18671:25;;;;;;;:::i;:::-;;;;;;:28;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18671:45:0::1;;18663:78;;;;-1:-1:-1::0;;;18663:78:0::1;;;;;;;:::i;:::-;18762:31;18776:8;18786:6;;18762:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;:13;:31::i;:::-;18752:41;;18843:12;18812:7;18837:1;18820:7;:14;:18;;;;:::i;:::-;18812:27;;;;;;;;:::i;:::-;;;;;;;:43;;18804:90;;;;-1:-1:-1::0;;;18804:90:0::1;;;;;;;:::i;:::-;18905:138;18937:6;;18944:1;18937:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18937:14:0::1;:::i;:::-;18953:10;18965:55;18973:6;;18980:1;18973:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18973:14:0::1;:::i;:::-;18989:6;;18996:1;18989:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;19003:6;;19010:1;19003:9;;;;;;;:::i;:::-;;;;;;:16;;;;;;;;;;:::i;18965:55::-;19022:7;19030:1;19022:10;;;;;;;;:::i;18905:138::-;19054:37;19060:7;19069:6;;19054:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;19085:4;19054:5;:37::i;:::-;19102:4;-1:-1:-1::0;;;;;19102:13:0::1;;19116:7;19141:1;19124:7;:14;:18;;;;:::i;:::-;19116:27;;;;;;;;:::i;:::-;;;;;;;19102:42;;;;;;;;;;;;;21566:25:1::0;;21554:2;21539:18;;21420:177;19102:42:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19155:49;19172:2;19176:7;19201:1;19184:7;:14;:18;;;;:::i;:::-;19176:27;;;;;;;;:::i;:::-;;;;;;;19155:16;:49::i;:::-;18457:755:::0;;;;;;;;;:::o;8831:752::-;8988:12;9002;9079:13;9108:7;-1:-1:-1;;;;;9095:29:0;;9125:6;9133;9141;9095:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9079:69;-1:-1:-1;;;;;;9165:19:0;;9161:64;;9209:1;9211;9201:12;;;;;;;9161:64;9238:13;9253;9270:35;9282:6;9290;9298;9270:11;:35::i;:::-;9237:68;;;;9316:17;9343:5;-1:-1:-1;;;;;9336:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9316:47;-1:-1:-1;9316:47:0;9386:20;9398:8;9386:9;:20;:::i;:::-;:35;;;;:::i;:::-;9376:45;-1:-1:-1;9513:12:0;9490:20;9502:8;9490:9;:20;:::i;:::-;:35;;;;:::i;:::-;9480:45;;9016:567;;;;8831:752;;;;;;;;:::o;14995:670::-;15289:16;15307:14;15334:12;15349:37;15357:5;15372:4;15379:6;15349:7;:37::i;:::-;15334:52;;15397:10;15410;:39;;15440:9;15410:39;;;-1:-1:-1;;15410:39:0;15460:71;;-1:-1:-1;;;15460:71:0;;15397:52;;-1:-1:-1;;;;;;15460:18:0;;;;;:71;;15479:10;;15499:4;;15397:52;;15513:8;;15523:1;;15526;;15529;;15460:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15569:88;15588:5;15595:6;15603:9;15614:14;15630:12;15644:2;15648:8;15569:18;:88::i;:::-;15542:115;;;;;;;;15323:342;;14995:670;;;;;;;;;;;;;;:::o;4551:415::-;4634:12;4660:14;4676;4694:26;4705:6;4713;4694:10;:26::i;:::-;4857:40;;-1:-1:-1;;23756:2:1;23752:15;;;23748:24;;4857:40:0;;;23736:37:1;23807:15;;;23803:24;23789:12;;;23782:46;23874:14;;23867:22;23862:3;23858:32;23844:12;;;23837:54;4659:61:0;;-1:-1:-1;4659:61:0;-1:-1:-1;4825:7:0;;23907:12:1;;4857:40:0;;;;;;;;;;;;4847:51;;;;;;4913:12;4772:182;;;;;;;;;-1:-1:-1;;;;;;24216:26:1;;24279:2;24275:15;;;;-1:-1:-1;;24271:53:1;24267:1;24258:11;;24251:74;24350:2;24341:12;;24334:28;;;;24387:2;24378:12;;24371:28;24424:2;24415:12;;23930:503;4772:182:0;;;;-1:-1:-1;;4772:182:0;;;;;;;;;4762:193;;4772:182;4762:193;;;;;4551:415;-1:-1:-1;;;;;;4551:415:0:o;4132:327::-;4205:14;4221;4266:6;-1:-1:-1;;;;;4256:16:0;:6;-1:-1:-1;;;;;4256:16:0;;4248:56;;;;-1:-1:-1;;;4248:56:0;;24640:2:1;4248:56:0;;;24622:21:1;24679:2;24659:18;;;24652:30;24718:29;24698:18;;;24691:57;24765:18;;4248:56:0;24438:351:1;4248:56:0;4343:6;-1:-1:-1;;;;;4334:15:0;:6;-1:-1:-1;;;;;4334:15:0;;:53;;4372:6;4380;4334:53;;;4353:6;4361;4334:53;4315:72;;-1:-1:-1;4315:72:0;-1:-1:-1;;;;;;4406:20:0;;4398:53;;;;-1:-1:-1;;;4398:53:0;;24996:2:1;4398:53:0;;;24978:21:1;25035:2;25015:18;;;25008:30;-1:-1:-1;;;25054:18:1;;;25047:50;25114:18;;4398:53:0;24794:344:1;4398:53:0;4132:327;;;;;:::o;11093:696::-;11386:12;11400;11414:14;11367:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;11462:93:::1;11476:6;11484;11492;11500:14;11516;11532:10;11544;11462:13;:93::i;:::-;11441:114:::0;;-1:-1:-1;11441:114:0;-1:-1:-1;11566:12:0::1;11581:31;11589:6:::0;11597;11605;11581:7:::1;:31::i;:::-;11566:46;;11623:52;11641:6;11649:10;11661:4;11667:7;11623:17;:52::i;:::-;11686;11704:6;11712:10;11724:4;11730:7;11686:17;:52::i;:::-;11761:20;::::0;-1:-1:-1;;;11761:20:0;;-1:-1:-1;;;;;4644:32:1;;;11761:20:0::1;::::0;::::1;4626:51:1::0;11761:16:0;::::1;::::0;::::1;::::0;4599:18:1;;11761:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11749:32;;11430:359;11093:696:::0;;;;;;;;;;;;;;:::o;5901:664::-;5996:11;6009;6033:12;6048:32;6056:7;6065:8;6075:4;6048:7;:32::i;:::-;6153:34;;-1:-1:-1;;;6153:34:0;;-1:-1:-1;;;;;4644:32:1;;;6153:34:0;;;4626:51:1;4644:32;;-1:-1:-1;;;;;6166:7:0;6153:28;;;;;;4599:18:1;;6153:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6149:125;;;6219:43;;-1:-1:-1;;;6219:43:0;;;;;25317:25:1;;;-1:-1:-1;;;;;25378:32:1;;;25358:18;;;25351:60;6219:24:0;;;;;25290:18:1;;6219:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6204:58;;6149:125;6291:33;6299:7;6308:8;6318:5;6291:7;:33::i;:::-;6339:34;;-1:-1:-1;;;6339:34:0;;-1:-1:-1;;;;;4644:32:1;;;6339:34:0;;;4626:51:1;6284:40:0;;-1:-1:-1;6352:7:0;6339:28;;;;;;4599:18:1;;6339:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6335:127;;;6407:43;;-1:-1:-1;;;6407:43:0;;;;;25317:25:1;;;-1:-1:-1;;;;;25378:32:1;;;25358:18;;;25351:60;6407:24:0;;;;;25290:18:1;;6407:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6390:60;;6335:127;6494:14;6479:12;:29;:78;;6535:14;6551:5;6479:78;;;6512:12;6526:4;6479:78;6472:85;;;;;;;5901:664;;;;;;:::o;5444:375::-;5531:13;5546;5573:14;5592:26;5603:6;5611;5592:10;:26::i;:::-;5572:46;;;5630:13;5645;5669:31;5677:6;5685;5693;5669:7;:31::i;:::-;-1:-1:-1;;;;;5663:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5629:86;;;;;5759:6;-1:-1:-1;;;;;5749:16:0;:6;-1:-1:-1;;;;;5749:16:0;;:62;;5792:8;5802;5749:62;;;5769:8;5779;5749:62;5726:85;;;;-1:-1:-1;5444:375:0;-1:-1:-1;;;;;;;5444:375:0:o;17837:612::-;18002:21;17978:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;18075:4:::1;-1:-1:-1::0;;;;;18049:31:0::1;:6;;18056:1;18049:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18049:14:0::1;:::i;:::-;-1:-1:-1::0;;;;;18049:31:0::1;;18041:64;;;;-1:-1:-1::0;;;18041:64:0::1;;;;;;;:::i;:::-;18126:32;18140:9;18151:6;;18126:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;18116:42;;18208:12;18177:7;18202:1;18185:7;:14;:18;;;;:::i;:::-;18177:27;;;;;;;;:::i;:::-;;;;;;;:43;;18169:90;;;;-1:-1:-1::0;;;18169:90:0::1;;;;;;;:::i;:::-;18270:4;-1:-1:-1::0;;;;;18270:12:0::1;;18290:7;18298:1;18290:10;;;;;;;;:::i;:::-;;;;;;;18270:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18321:4;-1:-1:-1::0;;;;;18321:13:0::1;;18335:55;18343:6;;18350:1;18343:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;18343:14:0::1;:::i;:::-;18359:6;;18366:1;18359:9;;;;;;;:::i;:::-;;;;;;:12;;;;;;;;;;:::i;:::-;18373:6;;18380:1;18373:9;;;;;;;:::i;18335:55::-;18392:7;18400:1;18392:10;;;;;;;;:::i;:::-;;;;;;;18321:82;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25925:32:1;;;;25907:51;;25989:2;25974:18;;25967:34;25895:2;25880:18;;25733:274;18321:82:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18314:90;;;;:::i;:::-;18415:26;18421:7;18430:6;;18415:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;18438:2;18415:5;:26::i;:::-;17837:612:::0;;;;;;;;:::o;19220:404::-;19414:13;19395:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;19440:114:::1;19458:6;;19465:1;19458:9;;;;;;;:::i;:::-;:14;::::0;::::1;:9;::::0;;::::1;;:14:::0;;::::1;::::0;-1:-1:-1;19458:14:0::1;:::i;:::-;19474:10;19486:55;19494:6;;19501:1;19494:9;;;;;;;:::i;19486:55::-;19543:7;19551:1;19543:10;;;;;;;;:::i;19440:114::-;19565:26;19571:7;19580:6;;19565:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;-1:-1:-1::0;19609:7:0;;19220:404;-1:-1:-1;;;;;19220:404:0:o;6647:559::-;6729:21;6788:1;6771:6;:13;:18;;6763:51;;;;-1:-1:-1;;;6763:51:0;;;;;;;:::i;:::-;6846:13;;:15;;6860:1;6846:15;:::i;:::-;6835:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6835:27:0;;6825:37;;6886:8;6873:7;6881:1;6873:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;6910:6;6905:294;6926:6;:13;6922:1;:17;6905:294;;;6961:12;6976:55;6984:6;6991:1;6984:9;;;;;;;;:::i;:::-;;;;;;;:14;;;7000:6;7007:1;7000:9;;;;;;;;:::i;:::-;;;;;;;:12;;;7014:6;7021:1;7014:9;;;;;;;;:::i;6976:55::-;7050:34;;-1:-1:-1;;;7050:34:0;;-1:-1:-1;;;;;4644:32:1;;;7050:34:0;;;4626:51:1;6961:70:0;;-1:-1:-1;7063:7:0;7050:28;;;;;;4599:18:1;;7050:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7046:142;;;7126:4;-1:-1:-1;;;;;7120:24:0;;7145:7;7153:1;7145:10;;;;;;;;:::i;:::-;;;;;;;7157:6;7164:1;7157:9;;;;;;;;:::i;:::-;;;;;;;:14;;;7120:52;;;;;;;;;;;;;;;25317:25:1;;;-1:-1:-1;;;;;25378:32:1;25373:2;25358:18;;25351:60;25305:2;25290:18;;25143:274;7120:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7105:7;7113:3;:1;7115;7113:3;:::i;:::-;7105:12;;;;;;;;:::i;:::-;;;;;;:67;;;;;7046:142;-1:-1:-1;6941:3:0;;;;:::i;:::-;;;;6905:294;;;;6647:559;;;;:::o;7341:1482::-;7530:12;7544;7558:14;7637:13;7666:7;-1:-1:-1;;;;;7653:29:0;;7683:6;7691;7699;7653:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7637:69;-1:-1:-1;7718:13:0;;;-1:-1:-1;;;;;7802:19:0;;;7798:167;;7860:5;-1:-1:-1;;;;;7853:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7838:42;;7918:35;7930:6;7938;7946;7918:11;:35::i;:::-;7895:58;;-1:-1:-1;7895:58:0;-1:-1:-1;7798:167:0;7979:13;;:30;;;;-1:-1:-1;7996:13:0;;7979:30;7975:841;;;8048:14;;-1:-1:-1;8064:14:0;;-1:-1:-1;3629:5:0;8106:28;8116:17;8064:14;8048;8116:17;:::i;:::-;8106:9;:28::i;:::-;:48;;;;:::i;:::-;8094:60;;7975:841;;;8189:19;8211:50;8226:14;8242:8;8252;8211:14;:50::i;:::-;8189:72;;8298:14;8280;:32;8276:529;;8355:14;;-1:-1:-1;8371:14:0;-1:-1:-1;8371:14:0;8417:78;8451:8;8426:22;8436:12;8355:14;8426:22;:::i;:::-;:33;;;;:::i;:::-;8486:8;8461:22;8471:12;8461:7;:22;:::i;:::-;:33;;;;:::i;:::-;8417:8;:78::i;:::-;8405:90;;8276:529;;;8536:19;8558:50;8573:14;8589:8;8599;8558:14;:50::i;:::-;8536:72;-1:-1:-1;8665:14:0;;-1:-1:-1;8536:72:0;;-1:-1:-1;8711:78:0;8745:8;8720:22;8730:12;8536:72;8720:22;:::i;:::-;:33;;;;:::i;:::-;8780:8;8755:22;8765:12;8755:7;:22;:::i;8711:78::-;8699:90;;8517:288;8276:529;8172:644;7975:841;7574:1249;;;;7341:1482;;;;;;;;;:::o;14286:701::-;14597:12;14611;14636;14651:31;14659:6;14667;14675;14651:7;:31::i;:::-;14636:46;;14708:10;14721;:39;;14751:9;14721:39;;;-1:-1:-1;;14721:39:0;14775:71;;-1:-1:-1;;;14775:71:0;;14708:52;;-1:-1:-1;;;;;;14775:18:0;;;;;:71;;14794:10;;14814:4;;14708:52;;14828:8;;14838:1;;14841;;14844;;14775:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14693:165;14891:88;14907:6;14915;14923;14931:9;14942:10;14954;14966:2;14970:8;14891:15;:88::i;:::-;14870:109;;;;;;;;14625:362;14286:701;;;;;;;;;;;;;;;:::o;11797:949::-;12055:16;12073:14;12089;12036:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;12143:206:::1;12171:5;12199:4;12219:6;12240:18;12273:9;12297:14;12326:12;12143:13;:206::i;:::-;12116:233:::0;;-1:-1:-1;12116:233:0;-1:-1:-1;12360:12:0::1;12375:37;12383:5:::0;12398:4:::1;12405:6:::0;12375:7:::1;:37::i;:::-;12360:52;;12423:55;12441:5;12448:10;12460:4;12466:11;12423:17;:55::i;:::-;12489:4;-1:-1:-1::0;;;;;12489:12:0::1;;12509:9;12489:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12539:30:0::1;::::0;-1:-1:-1;;;12539:30:0;;-1:-1:-1;;;;;25925:32:1;;;12539:30:0::1;::::0;::::1;25907:51:1::0;25974:18;;;25967:34;;;12539:4:0::1;:13;::::0;::::1;::::0;25880:18:1;;12539:30:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12532:38;;;;:::i;:::-;12593:20;::::0;-1:-1:-1;;;12593:20:0;;-1:-1:-1;;;;;4644:32:1;;;12593:20:0::1;::::0;::::1;4626:51:1::0;12593:16:0;::::1;::::0;::::1;::::0;4599:18:1;;12593:20:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12581:32;;12676:9;12664;:21;12660:78;;;12687:51;12704:10;12716:21;12728:9:::0;12716::::1;:21;:::i;:::-;12687:16;:51::i;:::-;12105:641;11797:949:::0;;;;;;;;;;;;:::o;13605:673::-;13847:16;13865:14;13828:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;13919:226:::1;13949:5;13977:4;13997:6;14018:9;14042:14;14071:12;14106:4;14126:8;13919:15;:226::i;:::-;13892:253:::0;;-1:-1:-1;13892:253:0;-1:-1:-1;14156:37:0::1;14170:5:::0;14177:2;13892:253;14156:13:::1;:37::i;:::-;14204:24;::::0;-1:-1:-1;;;14204:24:0;;::::1;::::0;::::1;21566:25:1::0;;;14204:4:0::1;-1:-1:-1::0;;;;;14204:13:0::1;::::0;::::1;::::0;21539:18:1;;14204:24:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14239:31;14256:2;14260:9;14239:16;:31::i;:::-;13605:673:::0;;;;;;;;;;;:::o;7214:119::-;7291:34;;-1:-1:-1;;;7291:34:0;;-1:-1:-1;;;;;4644:32:1;;;7291:34:0;;;4626:51:1;7267:4:0;;7304:7;7291:28;;;;;;4599:18:1;;7291:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7284:41;7214:119;-1:-1:-1;;7214:119:0:o;17252:577::-;17459:21;17440:8;3742:15;3730:8;:27;;3722:55;;;;-1:-1:-1;;;3722:55:0;;;;;;;:::i;:::-;17503:31:::1;17517:8;17527:6;;17503:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;17493:41;;17584:12;17553:7;17578:1;17561:7;:14;:18;;;;:::i;:::-;17553:27;;;;;;;;:::i;:::-;;;;;;;:43;;17545:90;;;;-1:-1:-1::0;;;17545:90:0::1;;;;;;;:::i;:::-;17646:138;17678:6;;17685:1;17678:9;;;;;;;:::i;17646:138::-;17795:26;17801:7;17810:6;;17795:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;20171:355:::0;20302:1;20282:5;-1:-1:-1;;;;;20282:17:0;;:21;20274:30;;;;;;20371:69;;;-1:-1:-1;;;;;18463:15:1;;;20371:69:0;;;18445:34:1;18515:15;;;18495:18;;;18488:43;18547:18;;;;18540:34;;;20371:69:0;;;;;;;;;;18380:18:1;;;;20371:69:0;;;;;;;-1:-1:-1;;;;;20371:69:0;-1:-1:-1;;;20371:69:0;;;20360:81;;-1:-1:-1;;;;20360:10:0;;;;:81;;20371:69;20360:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20315:126;;;;20460:7;:57;;;;-1:-1:-1;20472:11:0;;:16;;:44;;;20503:4;20492:24;;;;;;;;;;;;:::i;:::-;20452:66;;;;;;20263:263;;20171:355;;;;:::o;15776:680::-;15883:6;15878:571;15899:6;:13;15895:1;:17;15878:571;;;15935:14;15954:40;15965:6;15972:1;15965:9;;;;;;;;:::i;:::-;;;;;;;:14;;;15981:6;15988:1;15981:9;;;;;;;;:::i;:::-;;;;;;;:12;;;15954:10;:40::i;:::-;-1:-1:-1;15934:60:0;-1:-1:-1;16009:14:0;16026:7;16034:5;:1;16038;16034:5;:::i;:::-;16026:14;;;;;;;;:::i;:::-;;;;;;;16009:31;;16056:15;16073;16110:6;-1:-1:-1;;;;;16092:24:0;:6;16099:1;16092:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;16092:24:0;;:70;;16143:9;16159:1;16092:70;;;16125:1;16129:9;16092:70;16055:107;;;;16177:10;16210:1;16194:6;:13;:17;;;;:::i;:::-;16190:1;:21;:91;;16278:3;16190:91;;;16214:61;16222:6;16229:3;:1;16231;16229:3;:::i;:::-;16222:11;;;;;;;;:::i;:::-;;;;;;;:16;;;16240:6;16247:1;16249;16247:3;;;;:::i;:::-;16240:11;;;;;;;;:::i;:::-;;;;;;;:14;;;16256:6;16263:1;16265;16263:3;;;;:::i;:::-;16256:11;;;;;;;;:::i;16214:61::-;16177:104;;16302:55;16310:6;16317:1;16310:9;;;;;;;;:::i;:::-;;;;;;;:14;;;16326:6;16333:1;16326:9;;;;;;;;:::i;:::-;;;;;;;:12;;;16340:6;16347:1;16340:9;;;;;;;;:::i;16302:55::-;-1:-1:-1;;;;;16296:67:0;;16382:10;16394;16406:2;16420:1;16410:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16410:12:0;;16296:141;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15919:530;;;;;15914:3;;;;;:::i;:::-;;;;15878:571;;;;15776:680;;;:::o;19632:196::-;19741:12;;;19703;19741;;;;;;;;;-1:-1:-1;;;;;19720:7:0;;;19734:5;;19720:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19702:52;;;19773:7;19765:55;;;;-1:-1:-1;;;19765:55:0;;27658:2:1;19765:55:0;;;27640:21:1;27697:2;27677:18;;;27670:30;27736:34;27716:18;;;27709:62;-1:-1:-1;;;27787:18:1;;;27780:33;27830:19;;19765:55:0;27456:399:1;19765:55:0;19691:137;19632:196;;:::o;9591:1494::-;9823:12;9837;9888:10;9870:14;:28;;9862:37;;;;;;9936:10;9918:14;:28;;9910:37;;;;;;10026:53;;-1:-1:-1;;;10026:53:0;;10010:13;;-1:-1:-1;;;;;10039:7:0;10026:29;;;;:53;;10056:6;;10064;;10072;;10026:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10010:69;-1:-1:-1;;;;;;10094:19:0;;10090:116;;10138:56;;-1:-1:-1;;;10138:56:0;;-1:-1:-1;;;;;10151:7:0;10138:32;;;;:56;;10171:6;;10179;;10187;;10138:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10130:64;;10090:116;10217:13;10232;10249:35;10261:6;10269;10277;10249:11;:35::i;:::-;10216:68;;;;10299:8;10311:1;10299:13;:30;;;;-1:-1:-1;10316:13:0;;10299:30;10295:783;;;10368:14;;-1:-1:-1;10384:14:0;;-1:-1:-1;10295:783:0;;;10432:19;10454:50;10469:14;10485:8;10495;10454:14;:50::i;:::-;10432:72;;10541:14;10523;:32;10519:548;;10602:10;10584:14;:28;;10576:70;;;;-1:-1:-1;;;10576:70:0;;19645:2:1;10576:70:0;;;19627:21:1;19684:2;19664:18;;;19657:30;19723:31;19703:18;;;19696:59;19772:18;;10576:70:0;19443:353:1;10576:70:0;10687:14;;-1:-1:-1;10703:14:0;-1:-1:-1;10703:14:0;10519:548;;;10759:19;10781:50;10796:14;10812:8;10822;10781:14;:50::i;:::-;10759:72;;10875:14;10857;:32;;10850:40;;;;:::i;:::-;10935:10;10917:14;:28;;10909:70;;;;-1:-1:-1;;;10909:70:0;;19287:2:1;10909:70:0;;;19269:21:1;19326:2;19306:18;;;19299:30;19365:31;19345:18;;;19338:59;19414:18;;10909:70:0;19085:353:1;10909:70:0;11020:14;-1:-1:-1;11036:14:0;;-1:-1:-1;10519:548:0;10417:661;10295:783;9851:1234;;;9591:1494;;;;;;;;;;:::o;289:303::-;334:6;361:1;357;:5;353:232;;;-1:-1:-1;383:1:0;399:6;408:5;412:1;383;408:5;:::i;:::-;:9;;416:1;408:9;:::i;:::-;399:18;;432:92;443:1;439;:5;432:92;;;469:1;-1:-1:-1;469:1:0;507;469;494:5;469:1;494;:5;:::i;:::-;:9;;;;:::i;:::-;493:15;;;;:::i;:::-;489:19;;432:92;;;364:171;289:303;;;:::o;353:232::-;545:6;;541:44;;-1:-1:-1;572:1:0;541:44;289:303;;;:::o;5079:307::-;5170:12;5213:1;5203:7;:11;5195:51;;;;-1:-1:-1;;;5195:51:0;;28062:2:1;5195:51:0;;;28044:21:1;28101:2;28081:18;;;28074:30;28140:29;28120:18;;;28113:57;28187:18;;5195:51:0;27860:351:1;5195:51:0;5276:1;5265:8;:12;:28;;;;;5292:1;5281:8;:12;5265:28;5257:71;;;;-1:-1:-1;;;5257:71:0;;28418:2:1;5257:71:0;;;28400:21:1;28457:2;28437:18;;;28430:30;28496:32;28476:18;;;28469:60;28546:18;;5257:71:0;28216:354:1;5257:71:0;5370:8;5349:18;5359:8;5349:7;:18;:::i;:::-;:29;;;;:::i;:::-;5339:39;5079:307;-1:-1:-1;;;;5079:307:0:o;186:97::-;238:4;266:1;262;:5;:13;;274:1;262:13;;;270:1;262:13;255:20;186:97;-1:-1:-1;;;186:97:0:o;19836:327::-;19949:1;19929:5;-1:-1:-1;;;;;19929:17:0;;:21;19921:30;;;;;;20018:59;;;-1:-1:-1;;;;;25925:32:1;;;20018:59:0;;;25907:51:1;25974:18;;;;25967:34;;;20018:59:0;;;;;;;;;;25880:18:1;;;;20018:59:0;;;;;;;-1:-1:-1;;;;;20018:59:0;-1:-1:-1;;;20018:59:0;;;20007:71;;-1:-1:-1;;;;20007:10:0;;;;:71;;20018:59;20007:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19962:116;;;;20097:7;:57;;;;-1:-1:-1;20109:11:0;;:16;;:44;;;20140:4;20129:24;;;;;;;;;;;;:::i;:::-;20089:66;;;;;;19910:253;;19836:327;;;:::o;14:127:1:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;421:118::-;507:5;500:13;493:21;486:5;483:32;473:60;;529:1;526;519:12;544:941;663:6;671;679;687;695;703;711;719;772:3;760:9;751:7;747:23;743:33;740:53;;;789:1;786;779:12;740:53;828:9;815:23;847:31;872:5;847:31;:::i;:::-;897:5;-1:-1:-1;954:2:1;939:18;;926:32;967:33;926:32;967:33;:::i;:::-;1019:7;-1:-1:-1;1078:2:1;1063:18;;1050:32;1091:30;1050:32;1091:30;:::i;:::-;1140:7;-1:-1:-1;1194:2:1;1179:18;;1166:32;;-1:-1:-1;1245:3:1;1230:19;;1217:33;;-1:-1:-1;1297:3:1;1282:19;;1269:33;;-1:-1:-1;1354:3:1;1339:19;;1326:33;1368;1326;1368;:::i;:::-;1420:7;1410:17;;;1474:3;1463:9;1459:19;1446:33;1436:43;;544:941;;;;;;;;;;;:::o;1743:872::-;1853:6;1861;1869;1877;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;2007:9;1994:23;1984:33;;2064:2;2053:9;2049:18;2036:32;2026:42;;2118:2;2107:9;2103:18;2090:32;2131:31;2156:5;2131:31;:::i;:::-;2181:5;-1:-1:-1;2238:2:1;2223:18;;2210:32;2251:33;2210:32;2251:33;:::i;:::-;2303:7;-1:-1:-1;2362:3:1;2347:19;;2334:33;2376:30;2334:33;2376:30;:::i;:::-;2425:7;-1:-1:-1;2484:3:1;2469:19;;2456:33;2498;2456;2498;:::i;:::-;2550:7;2540:17;;;2604:3;2593:9;2589:19;2576:33;2566:43;;1743:872;;;;;;;;;;:::o;2620:632::-;2791:2;2843:21;;;2913:13;;2816:18;;;2935:22;;;2762:4;;2791:2;3014:15;;;;2988:2;2973:18;;;2762:4;3057:169;3071:6;3068:1;3065:13;3057:169;;;3132:13;;3120:26;;3201:15;;;;3166:12;;;;3093:1;3086:9;3057:169;;;-1:-1:-1;3243:3:1;;2620:632;-1:-1:-1;;;;;;2620:632:1:o;3257:384::-;3334:8;3344:6;3398:3;3391:4;3383:6;3379:17;3375:27;3365:55;;3416:1;3413;3406:12;3365:55;-1:-1:-1;3439:20:1;;3482:18;3471:30;;3468:50;;;3514:1;3511;3504:12;3468:50;3551:4;3543:6;3539:17;3527:29;;3614:3;3607:4;3599;3591:6;3587:17;3579:6;3575:30;3571:41;3568:50;3565:70;;;3631:1;3628;3621:12;3646:816;3792:6;3800;3808;3816;3824;3832;3885:3;3873:9;3864:7;3860:23;3856:33;3853:53;;;3902:1;3899;3892:12;3853:53;3938:9;3925:23;3915:33;;3995:2;3984:9;3980:18;3967:32;3957:42;;4050:2;4039:9;4035:18;4022:32;4077:18;4069:6;4066:30;4063:50;;;4109:1;4106;4099:12;4063:50;4148:84;4224:7;4215:6;4204:9;4200:22;4148:84;:::i;:::-;4251:8;;-1:-1:-1;4122:110:1;-1:-1:-1;;4336:2:1;4321:18;;4308:32;4349:31;4308:32;4349:31;:::i;:::-;4399:5;4389:15;;;4451:3;4440:9;4436:19;4423:33;4413:43;;3646:816;;;;;;;;:::o;4688:592::-;4771:6;4779;4787;4795;4848:3;4836:9;4827:7;4823:23;4819:33;4816:53;;;4865:1;4862;4855:12;4816:53;4904:9;4891:23;4923:31;4948:5;4923:31;:::i;:::-;4973:5;-1:-1:-1;5030:2:1;5015:18;;5002:32;5043:33;5002:32;5043:33;:::i;:::-;5095:7;-1:-1:-1;5154:2:1;5139:18;;5126:32;5167:30;5126:32;5167:30;:::i;:::-;4688:592;;;;-1:-1:-1;5216:7:1;;5270:2;5255:18;5242:32;;-1:-1:-1;;4688:592:1:o;5285:156::-;5351:20;;5411:4;5400:16;;5390:27;;5380:55;;5431:1;5428;5421:12;5446:1146;5587:6;5595;5603;5611;5619;5627;5635;5643;5651;5659;5667:7;5721:3;5709:9;5700:7;5696:23;5692:33;5689:53;;;5738:1;5735;5728:12;5689:53;5777:9;5764:23;5796:31;5821:5;5796:31;:::i;:::-;5846:5;-1:-1:-1;5903:2:1;5888:18;;5875:32;5916:30;5875:32;5916:30;:::i;:::-;5965:7;-1:-1:-1;6019:2:1;6004:18;;5991:32;;-1:-1:-1;6070:2:1;6055:18;;6042:32;;-1:-1:-1;6121:3:1;6106:19;;6093:33;;-1:-1:-1;6178:3:1;6163:19;;6150:33;6192;6150;6192;:::i;:::-;6244:7;-1:-1:-1;6298:3:1;6283:19;;6270:33;;-1:-1:-1;6355:3:1;6340:19;;6327:33;6369:30;6327:33;6369:30;:::i;:::-;6418:7;-1:-1:-1;6444:37:1;6476:3;6461:19;;6444:37;:::i;:::-;6434:47;;6528:3;6517:9;6513:19;6500:33;6490:43;;6581:3;6570:9;6566:19;6553:33;6542:44;;5446:1146;;;;;;;;;;;;;;:::o;6597:523::-;6671:6;6679;6687;6740:2;6728:9;6719:7;6715:23;6711:32;6708:52;;;6756:1;6753;6746:12;6708:52;6795:9;6782:23;6814:31;6839:5;6814:31;:::i;:::-;6864:5;-1:-1:-1;6921:2:1;6906:18;;6893:32;6934:33;6893:32;6934:33;:::i;:::-;6986:7;-1:-1:-1;7045:2:1;7030:18;;7017:32;7058:30;7017:32;7058:30;:::i;:::-;7107:7;7097:17;;;6597:523;;;;;:::o;7333:388::-;7401:6;7409;7462:2;7450:9;7441:7;7437:23;7433:32;7430:52;;;7478:1;7475;7468:12;7430:52;7517:9;7504:23;7536:31;7561:5;7536:31;:::i;:::-;7586:5;-1:-1:-1;7643:2:1;7628:18;;7615:32;7656:33;7615:32;7656:33;:::i;:::-;7708:7;7698:17;;;7333:388;;;;;:::o;8035:1010::-;8163:6;8171;8179;8187;8195;8203;8211;8219;8227;8280:3;8268:9;8259:7;8255:23;8251:33;8248:53;;;8297:1;8294;8287:12;8248:53;8336:9;8323:23;8355:31;8380:5;8355:31;:::i;:::-;8405:5;-1:-1:-1;8462:2:1;8447:18;;8434:32;8475:33;8434:32;8475:33;:::i;:::-;8527:7;-1:-1:-1;8586:2:1;8571:18;;8558:32;8599:30;8558:32;8599:30;:::i;:::-;8648:7;-1:-1:-1;8702:2:1;8687:18;;8674:32;;-1:-1:-1;8753:3:1;8738:19;;8725:33;;-1:-1:-1;8805:3:1;8790:19;;8777:33;;-1:-1:-1;8857:3:1;8842:19;;8829:33;;-1:-1:-1;8914:3:1;8899:19;;8886:33;8928;8886;8928;:::i;:::-;8980:7;8970:17;;;9034:3;9023:9;9019:19;9006:33;8996:43;;8035:1010;;;;;;;;;;;:::o;9374:456::-;9451:6;9459;9467;9520:2;9508:9;9499:7;9495:23;9491:32;9488:52;;;9536:1;9533;9526:12;9488:52;9572:9;9559:23;9549:33;;9632:2;9621:9;9617:18;9604:32;9645:31;9670:5;9645:31;:::i;:::-;9695:5;-1:-1:-1;9752:2:1;9737:18;;9724:32;9765:33;9724:32;9765:33;:::i;10098:747::-;10235:6;10243;10251;10259;10267;10320:3;10308:9;10299:7;10295:23;10291:33;10288:53;;;10337:1;10334;10327:12;10288:53;10373:9;10360:23;10350:33;;10434:2;10423:9;10419:18;10406:32;10461:18;10453:6;10450:30;10447:50;;;10493:1;10490;10483:12;10447:50;10532:84;10608:7;10599:6;10588:9;10584:22;10532:84;:::i;:::-;10635:8;;-1:-1:-1;10506:110:1;-1:-1:-1;;10720:2:1;10705:18;;10692:32;10733:31;10692:32;10733:31;:::i;:::-;10098:747;;;;-1:-1:-1;10098:747:1;;10835:2;10820:18;10807:32;;10098:747;-1:-1:-1;;10098:747:1:o;10850:127::-;10911:10;10906:3;10902:20;10899:1;10892:31;10942:4;10939:1;10932:15;10966:4;10963:1;10956:15;10982:275;11053:2;11047:9;11118:2;11099:13;;-1:-1:-1;;11095:27:1;11083:40;;11153:18;11138:34;;11174:22;;;11135:62;11132:88;;;11200:18;;:::i;:::-;11236:2;11229:22;10982:275;;-1:-1:-1;10982:275:1:o;11262:183::-;11322:4;11355:18;11347:6;11344:30;11341:56;;;11377:18;;:::i;:::-;-1:-1:-1;11422:1:1;11418:14;11434:4;11414:25;;11262:183::o;11450:1410::-;11612:6;11620;11628;11636;11644;11697:3;11685:9;11676:7;11672:23;11668:33;11665:53;;;11714:1;11711;11704:12;11665:53;11754:9;11741:23;11783:18;11824:2;11816:6;11813:14;11810:34;;;11840:1;11837;11830:12;11810:34;11878:6;11867:9;11863:22;11853:32;;11923:7;11916:4;11912:2;11908:13;11904:27;11894:55;;11945:1;11942;11935:12;11894:55;11981:2;11968:16;12003:4;12027:60;12043:43;12083:2;12043:43;:::i;:::-;12027:60;:::i;:::-;12121:15;;;12203:1;12199:10;;;;12191:19;;12187:28;;;12152:12;;;;12227:19;;;12224:39;;;12259:1;12256;12249:12;12224:39;12283:11;;;;12303:142;12319:6;12314:3;12311:15;12303:142;;;12385:17;;12373:30;;12336:12;;;;12423;;;;12303:142;;;12464:5;-1:-1:-1;;12507:18:1;;12494:32;;-1:-1:-1;;12538:16:1;;;12535:36;;;12567:1;12564;12557:12;12535:36;;12606:86;12684:7;12673:8;12662:9;12658:24;12606:86;:::i;:::-;12711:8;;-1:-1:-1;12580:112:1;-1:-1:-1;12765:38:1;;-1:-1:-1;12799:2:1;12784:18;;12765:38;:::i;12865:752::-;12917:5;12965:4;12953:9;12948:3;12944:19;12940:30;12937:50;;;12983:1;12980;12973:12;12937:50;13016:2;13010:9;13058:4;13050:6;13046:17;13129:6;13117:10;13114:22;13093:18;13081:10;13078:34;13075:62;13072:88;;;13140:18;;:::i;:::-;13176:2;13169:22;13209:6;-1:-1:-1;13209:6:1;13239:23;;13271:33;13239:23;13271:33;:::i;:::-;13313:23;;13388:2;13373:18;;13360:32;13401:33;13360:32;13401:33;:::i;:::-;13462:2;13450:15;;13443:32;13527:2;13512:18;;13499:32;13540:30;13499:32;13540:30;:::i;:::-;13598:2;13586:15;;;;13579:32;12865:752;;-1:-1:-1;;12865:752:1:o;13622:1025::-;13737:6;13745;13798:2;13786:9;13777:7;13773:23;13769:32;13766:52;;;13814:1;13811;13804:12;13766:52;13850:9;13837:23;13827:33;;13879:2;13932;13921:9;13917:18;13904:32;13959:18;13951:6;13948:30;13945:50;;;13991:1;13988;13981:12;13945:50;14014:22;;14067:4;14059:13;;14055:27;-1:-1:-1;14045:55:1;;14096:1;14093;14086:12;14045:55;14132:2;14119:16;14155:60;14171:43;14211:2;14171:43;:::i;14155:60::-;14249:15;;;14311:4;14350:11;;;14342:20;;14338:29;;;14280:12;;;;14237:3;14379:19;;;14376:39;;;14411:1;14408;14401:12;14376:39;14435:11;;;;14455:162;14471:6;14466:3;14463:15;14455:162;;;14537:37;14566:7;14561:3;14537:37;:::i;:::-;14525:50;;14488:12;;;;14595;;;;14455:162;;;14459:3;14636:5;14626:15;;;;;;;13622:1025;;;;;:::o;14652:661::-;14744:6;14752;14760;14768;14776;14829:3;14817:9;14808:7;14804:23;14800:33;14797:53;;;14846:1;14843;14836:12;14797:53;14885:9;14872:23;14904:31;14929:5;14904:31;:::i;:::-;14954:5;-1:-1:-1;15011:2:1;14996:18;;14983:32;15024:33;14983:32;15024:33;:::i;:::-;15076:7;-1:-1:-1;15135:2:1;15120:18;;15107:32;15148:30;15107:32;15148:30;:::i;:::-;14652:661;;;;-1:-1:-1;15197:7:1;;15251:2;15236:18;;15223:32;;-1:-1:-1;15302:3:1;15287:19;15274:33;;14652:661;-1:-1:-1;;14652:661:1:o;15318:1290::-;15468:6;15476;15484;15492;15500;15508;15516;15524;15532;15540;15548:7;15557;15611:3;15599:9;15590:7;15586:23;15582:33;15579:53;;;15628:1;15625;15618:12;15579:53;15667:9;15654:23;15686:31;15711:5;15686:31;:::i;:::-;15736:5;-1:-1:-1;15793:2:1;15778:18;;15765:32;15806:33;15765:32;15806:33;:::i;:::-;15858:7;-1:-1:-1;15917:2:1;15902:18;;15889:32;15930:30;15889:32;15930:30;:::i;:::-;15979:7;-1:-1:-1;16033:2:1;16018:18;;16005:32;;-1:-1:-1;16084:3:1;16069:19;;16056:33;;-1:-1:-1;16136:3:1;16121:19;;16108:33;;-1:-1:-1;16193:3:1;16178:19;;16165:33;16207;16165;16207;:::i;:::-;16259:7;-1:-1:-1;16313:3:1;16298:19;;16285:33;;-1:-1:-1;16370:3:1;16355:19;;16342:33;16384:30;16342:33;16384:30;:::i;:::-;16433:7;-1:-1:-1;16459:37:1;16491:3;16476:19;;16459:37;:::i;:::-;16449:47;;16544:3;16533:9;16529:19;16516:33;16505:44;;16597:3;16586:9;16582:19;16569:33;16558:44;;15318:1290;;;;;;;;;;;;;;:::o;16613:799::-;16723:6;16731;16739;16747;16755;16763;16771;16824:3;16812:9;16803:7;16799:23;16795:33;16792:53;;;16841:1;16838;16831:12;16792:53;16880:9;16867:23;16899:31;16924:5;16899:31;:::i;:::-;16949:5;-1:-1:-1;17006:2:1;16991:18;;16978:32;17019:30;16978:32;17019:30;:::i;:::-;17068:7;-1:-1:-1;17122:2:1;17107:18;;17094:32;;-1:-1:-1;17173:2:1;17158:18;;17145:32;;-1:-1:-1;17224:3:1;17209:19;;17196:33;;-1:-1:-1;17281:3:1;17266:19;;17253:33;17295;17253;17295;:::i;17417:247::-;17476:6;17529:2;17517:9;17508:7;17504:23;17500:32;17497:52;;;17545:1;17542;17535:12;17497:52;17584:9;17571:23;17603:31;17628:5;17603:31;:::i;17861:339::-;18063:2;18045:21;;;18102:2;18082:18;;;18075:30;-1:-1:-1;;;18136:2:1;18121:18;;18114:45;18191:2;18176:18;;17861:339::o;18585:245::-;18652:6;18705:2;18693:9;18684:7;18680:23;18676:32;18673:52;;;18721:1;18718;18711:12;18673:52;18753:9;18747:16;18772:28;18794:5;18772:28;:::i;18835:245::-;18914:6;18922;18975:2;18963:9;18954:7;18950:23;18946:32;18943:52;;;18991:1;18988;18981:12;18943:52;-1:-1:-1;;19014:16:1;;19070:2;19055:18;;;19049:25;19014:16;;19049:25;;-1:-1:-1;18835:245:1:o;19801:127::-;19862:10;19857:3;19853:20;19850:1;19843:31;19893:4;19890:1;19883:15;19917:4;19914:1;19907:15;19933:127;19994:10;19989:3;19985:20;19982:1;19975:31;20025:4;20022:1;20015:15;20049:4;20046:1;20039:15;20065:125;20105:4;20133:1;20130;20127:8;20124:34;;;20138:18;;:::i;:::-;-1:-1:-1;20175:9:1;;20065:125::o;20195:398::-;20397:2;20379:21;;;20436:2;20416:18;;;20409:30;20475:34;20470:2;20455:18;;20448:62;-1:-1:-1;;;20541:2:1;20526:18;;20519:32;20583:3;20568:19;;20195:398::o;20598:344::-;20800:2;20782:21;;;20839:2;20819:18;;;20812:30;-1:-1:-1;;;20873:2:1;20858:18;;20851:50;20933:2;20918:18;;20598:344::o;20947:222::-;21028:6;21081:2;21069:9;21060:7;21056:23;21052:32;21049:52;;;21097:1;21094;21087:12;21049:52;21120:43;21155:7;21144:9;21120:43;:::i;21174:241::-;21230:6;21283:2;21271:9;21262:7;21258:23;21254:32;21251:52;;;21299:1;21296;21289:12;21251:52;21338:9;21325:23;21357:28;21379:5;21357:28;:::i;21602:184::-;21672:6;21725:2;21713:9;21704:7;21700:23;21696:32;21693:52;;;21741:1;21738;21731:12;21693:52;-1:-1:-1;21764:16:1;;21602:184;-1:-1:-1;21602:184:1:o;21791:385::-;-1:-1:-1;;;;;22043:15:1;;;22025:34;;22095:15;;;;22090:2;22075:18;;22068:43;22154:14;;22147:22;22142:2;22127:18;;22120:50;21975:2;21960:18;;21791:385::o;22181:251::-;22251:6;22304:2;22292:9;22283:7;22279:23;22275:32;22272:52;;;22320:1;22317;22310:12;22272:52;22352:9;22346:16;22371:31;22396:5;22371:31;:::i;22437:168::-;22477:7;22543:1;22539;22535:6;22531:14;22528:1;22525:21;22520:1;22513:9;22506:17;22502:45;22499:71;;;22550:18;;:::i;:::-;-1:-1:-1;22590:9:1;;22437:168::o;22610:217::-;22650:1;22676;22666:132;;22720:10;22715:3;22711:20;22708:1;22701:31;22755:4;22752:1;22745:15;22783:4;22780:1;22773:15;22666:132;-1:-1:-1;22812:9:1;;22610:217::o;22832:670::-;-1:-1:-1;;;;;23199:15:1;;;23181:34;;23251:15;;;;23246:2;23231:18;;23224:43;23298:2;23283:18;;23276:34;;;;23341:2;23326:18;;23319:34;;;;23402:4;23390:17;23384:3;23369:19;;23362:46;23161:3;23424:19;;23417:35;23483:3;23468:19;;23461:35;;;;23130:3;23115:19;;22832:670::o;25422:306::-;25510:6;25518;25526;25579:2;25567:9;25558:7;25554:23;25550:32;25547:52;;;25595:1;25592;25585:12;25547:52;25624:9;25618:16;25608:26;;25674:2;25663:9;25659:18;25653:25;25643:35;;25718:2;25707:9;25703:18;25697:25;25687:35;;25422:306;;;;;:::o;26012:128::-;26052:3;26083:1;26079:6;26076:1;26073:13;26070:39;;;26089:18;;:::i;:::-;-1:-1:-1;26125:9:1;;26012:128::o;26145:135::-;26184:3;26205:17;;;26202:43;;26225:18;;:::i;:::-;-1:-1:-1;26272:1:1;26261:13;;26145:135::o;26285:258::-;26357:1;26367:113;26381:6;26378:1;26375:13;26367:113;;;26457:11;;;26451:18;26438:11;;;26431:39;26403:2;26396:10;26367:113;;;26498:6;26495:1;26492:13;26489:48;;;-1:-1:-1;;26533:1:1;26515:16;;26508:27;26285:258::o;26548:274::-;26677:3;26715:6;26709:13;26731:53;26777:6;26772:3;26765:4;26757:6;26753:17;26731:53;:::i;:::-;26800:16;;;;;26548:274;-1:-1:-1;;26548:274:1:o;26827:624::-;27058:6;27047:9;27040:25;27101:6;27096:2;27085:9;27081:18;27074:34;27173:1;27169;27164:3;27160:11;27156:19;27148:6;27144:32;27139:2;27128:9;27124:18;27117:60;27213:3;27208:2;27197:9;27193:18;27186:31;27021:4;27246:6;27240:13;27290:6;27284:3;27273:9;27269:19;27262:35;27306:67;27366:6;27360:3;27349:9;27345:19;27340:2;27332:6;27328:15;27306:67;:::i;:::-;27434:2;27413:15;-1:-1:-1;;27409:29:1;27394:45;;;;27441:3;27390:55;;26827:624;-1:-1:-1;;;;;26827:624:1:o

Swarm Source

ipfs://6e4900dfdd039707da891ddd17657c281f314f0146e14f58f3ea39ce3ebd3f3e
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.