Contract 0xd9deC7c3C06e62a4c1BeEB07CadF568f496b14c2 2

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x92fb193062fee0cf3c262ad706dda4941ab700c00f2bde0af10ba6103235c42cDodo Swap V2Toke...18873592022-05-24 7:33:3058 mins ago0x93663bad5bf5c4e15cf7a222b52965fa37a382d4 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002935125
0x5b851386373f41c067ba8ccb647befbb75b5dfa72f1e1ae528f85f241b7b48c8Dodo Swap V2Toke...18873202022-05-24 7:23:001 hr 9 mins ago0x735dd9dd1fee6454ec033dac876c50870c44768a IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000117381
0xaaa6cd0529dd811e5f39acc14a9b5f885ff8744ba17a4d6f9901ab14a4a30e81Dodo Swap V2Toke...18871312022-05-24 6:40:001 hr 52 mins ago0x96bf1e85eecf3b971a3e1ebc88bd4efe3f8698ee IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000411915
0x1cbbb27881687e519f9659edf1481fbef5bf81ca16b98f247ee04eec0c36ca16Add DVM Liquidit...18870672022-05-24 6:24:242 hrs 7 mins ago0xcefc6e5826dfa7a81f0abab83c46e7173ea014c3 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002477375
0xc72120a04053fca853fd1c896a247f29cb42a382aaa330c8c3aec8183aa3c50cAdd DVM Liquidit...18870222022-05-24 6:14:242 hrs 17 mins ago0x5cfc1e580bd80336e1474a804dd5b56444c9eaa6 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002974875
0x8e48e53ac1c75165ce426028a46c9ce56f91a7ced0dbf6d37c66ed69c4f8f08dAdd DVM Liquidit...18869652022-05-24 6:01:002 hrs 31 mins ago0x28858ec2759bf6c2da2315e0ff0a46131247b84a IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0003042025
0x603ec0eb4ca984151e7d6509a9e1a4952fff4d94c99a966f32619f2261d3a62bDodo Swap V2Toke...18869602022-05-24 5:59:542 hrs 32 mins ago0x28858ec2759bf6c2da2315e0ff0a46131247b84a IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0003432025
0x0f672d72c1c6a6299c54807ca77f3004dc7fc354b3e829fdf53ea6afd8775d06Dodo Swap V2Toke...18867742022-05-24 5:17:483 hrs 14 mins ago0xaa4d15bbb94b36c9f6c62b336833bd3aa030ce56 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002935125
0xe7f7e886da99e01de51aab0a192f4221c29a842a91ec54e786fd325d1c38f230Dodo Swap V2Toke...18865932022-05-24 4:37:243 hrs 54 mins ago0x5cfc1e580bd80336e1474a804dd5b56444c9eaa6 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000335905
0xa4384663a811db8a178457279f07aec69fb033558624684cd70cbed4ce1154beDodo Swap V2Toke...18865892022-05-24 4:36:303 hrs 55 mins ago0x5cfc1e580bd80336e1474a804dd5b56444c9eaa6 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000335905
0x4d5eb7a543481c267fbe7ed6cdaff5f6994e5d4f0c9eceeee3f8a73d36d16686Add Liquidity To...18864642022-05-24 4:08:004 hrs 24 mins ago0xbce7ef477c31e2f39f0b5a55dc6f39a7302739c2 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.00034051
0x7fe72ea0df83466b07335c0eac2989cf861d75cb0940b0a9337930227119f4feDodo Swap V2Toke...18864592022-05-24 4:07:004 hrs 25 mins ago0xbce7ef477c31e2f39f0b5a55dc6f39a7302739c2 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002934525
0xaaa4a357475d6d152b56d3bce8daaeeebc59b92a42a44c8487fe4a66536bc796Add DVM Liquidit...18864302022-05-24 4:00:064 hrs 32 mins ago0xbae6f47ec72aa3c8b09f442b35f981e587796666 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002545125
0x1567f87cec695da66ece2726f93a809a80b2ba53aef62220f6301d17987f5a83Dodo Swap V2Toke...18864022022-05-24 3:53:304 hrs 38 mins ago0xbae6f47ec72aa3c8b09f442b35f981e587796666 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000335905
0x075460458fd4d26abc4bc9b77aede074b7ab59a2569575cb5cd16f95057f2b0bDodo Swap V2Toke...18862752022-05-24 3:24:245 hrs 7 mins ago0xbae6f47ec72aa3c8b09f442b35f981e587796666 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000286185
0xffa1d351b8057f7afa23edff1766d77ac45da8a1f58ba7ea49dcdd5124d547f7Add DVM Liquidit...18842592022-05-23 19:41:1812 hrs 50 mins ago0x91b689c57b4faa77d4cc14029fdca104a4579980 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002544525
0x1be46f6a1a1aa9abd13a34a4ea7f9cdcc743445a7eb2d3367bbef78fa0c308efDodo Swap V2Toke...18842512022-05-23 19:39:2412 hrs 52 mins ago0x91b689c57b4faa77d4cc14029fdca104a4579980 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0003432325
0xd6ce952534152302e49936438a39dc59844b028860af1e484904ed7a2c0417c8Add DVM Liquidit...18839602022-05-23 18:30:2414 hrs 1 min ago0x06b375ae85a2961cac95524e99fe8eea2cc41e52 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002976075
0x2fa41950909e7d9379dba33c6a7ad780eb89baa46e9a71956d06b46da2936791Dodo Swap V2Toke...18837052022-05-23 17:31:4215 hrs ago0xbce7ef477c31e2f39f0b5a55dc6f39a7302739c2 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000287555
0xad7b5a8c8f9e01280f73b21ca96047bf685181c728ef5a4c7946a1a27fe2696aDodo Swap V2Toke...18836042022-05-23 17:08:0615 hrs 24 mins ago0x5cfc1e580bd80336e1474a804dd5b56444c9eaa6 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000335905
0x88b23cd6b7b5a793c385b5e2f6a6c0c9326b9ee59399ddfbb005a2a73137cde2Dodo Swap V2Toke...18834712022-05-23 16:36:3015 hrs 55 mins ago0x73831e7c600f48cebbbff957b466be8e5c087f34 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0003432325
0x2f9c5cf3bde07c2614e0ccdc880690d27e967ff47ca3371e6191e941c10fe6a6Add DVM Liquidit...18833562022-05-23 16:10:0016 hrs 22 mins ago0x3fb7142084c08ee966feede743a4e03acfe947c5 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.0002476775
0xaeb973039df01015416a978f49129eb3e8b7f85a2455ca2673cfb428a9d273aeAdd Liquidity To...18832002022-05-23 15:33:3016 hrs 58 mins ago0xc1d2d00770d25e5643a59cfcf33dc9dc41340cbf IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.00054887
0xad68feeb641ba737ef9aab40b1c38786bd7adae904533de97f7f042d4b8ff2ccAdd Liquidity To...18830812022-05-23 15:04:1817 hrs 27 mins ago0xfcc27c8babd150a09941802c20242dc8c2fc1eb5 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.00033642
0x47fc5a63baf65c2e3ad4377e617d1c2ac3206e7c842c7366ea1b9c781d192b51Dodo Swap V2Toke...18826752022-05-23 13:30:3619 hrs 1 min ago0x3c42871169f1434881fd669282e177fd952b9df1 IN  0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20 MOVR0.000204115
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb3088a38c8cd41c337a4afc3bcee7e97e7c64d4c7376e2adc9ef6fb1a054afc118847292022-05-23 21:29:4811 hrs 2 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a3.320845130279373066 MOVR
0xb3088a38c8cd41c337a4afc3bcee7e97e7c64d4c7376e2adc9ef6fb1a054afc118847292022-05-23 21:29:4811 hrs 2 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c23.320845130279373066 MOVR
0x29f44b467fbdb862662b0318d07c11b66361b362dbfe1eb33b5e651440556c2f18843662022-05-23 20:06:2412 hrs 25 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a2.768752822399477555 MOVR
0x29f44b467fbdb862662b0318d07c11b66361b362dbfe1eb33b5e651440556c2f18843662022-05-23 20:06:2412 hrs 25 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c22.768752822399477555 MOVR
0x93c56bc9dce192508cd34ae6d6a56acb3686a307bb2659fe2764a0152b72955b18843392022-05-23 20:00:2412 hrs 31 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a2.213117904290443384 MOVR
0x93c56bc9dce192508cd34ae6d6a56acb3686a307bb2659fe2764a0152b72955b18843392022-05-23 20:00:2412 hrs 31 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c22.213117904290443384 MOVR
0xc63a33d212000e70b039a231b2bbc824b12c787c40d7896ccd95b400d25401e918842542022-05-23 19:40:1212 hrs 51 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a6.096077251398719306 MOVR
0xc63a33d212000e70b039a231b2bbc824b12c787c40d7896ccd95b400d25401e918842542022-05-23 19:40:1212 hrs 51 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c26.096077251398719306 MOVR
0x2e9036a37b66aecce2b3271bae4aaf9515132c3868b008a7e35e9aabbdf9b04018842342022-05-23 19:35:3012 hrs 56 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a3.876882471388717709 MOVR
0x2e9036a37b66aecce2b3271bae4aaf9515132c3868b008a7e35e9aabbdf9b04018842342022-05-23 19:35:3012 hrs 56 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c23.876882471388717709 MOVR
0x6e29ec9d0504e5bf7d35f64978eda849bb8cbf3ac38f40e3cb13f7b870e32b8418841942022-05-23 19:26:0013 hrs 6 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a5.5345849114120245 MOVR
0x6e29ec9d0504e5bf7d35f64978eda849bb8cbf3ac38f40e3cb13f7b870e32b8418841942022-05-23 19:26:0013 hrs 6 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c25.5345849114120245 MOVR
0x20965dab44b63beb9573b40e261d306a0b0c185ddd83d628ace2d89448d9371318841592022-05-23 19:17:0013 hrs 15 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a3.316738722227309886 MOVR
0x20965dab44b63beb9573b40e261d306a0b0c185ddd83d628ace2d89448d9371318841592022-05-23 19:17:0013 hrs 15 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c23.316738722227309886 MOVR
0x023ea51b4fc1af7ab6b7862690f10be8fe66ca582b48e5c3822390e9083092fe18841122022-05-23 19:05:1813 hrs 26 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a2.763331879689424905 MOVR
0x023ea51b4fc1af7ab6b7862690f10be8fe66ca582b48e5c3822390e9083092fe18841122022-05-23 19:05:1813 hrs 26 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c22.763331879689424905 MOVR
0x3e9dc5ee59fd9fd53140fc02ce53f6b7f0cd0cd2328bdfb3af1459181c1480c218839372022-05-23 18:25:3014 hrs 6 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a2.209745573572369192 MOVR
0x3e9dc5ee59fd9fd53140fc02ce53f6b7f0cd0cd2328bdfb3af1459181c1480c218839372022-05-23 18:25:3014 hrs 6 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c22.209745573572369192 MOVR
0x538630965697c6299afda88f9a960b28dc02cdd427c3e78dd72c99ed3243b75e18828452022-05-23 14:09:3618 hrs 22 mins ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x98878b06940ae243284ca214f92bb71a2b032b8a3.304334116920324756 MOVR
0x538630965697c6299afda88f9a960b28dc02cdd427c3e78dd72c99ed3243b75e18828452022-05-23 14:09:3618 hrs 22 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c23.304334116920324756 MOVR
0xeb60849c3b7a6c6707d51af1eae38d6169477e192108880cc1c9e21addc6d49518826812022-05-23 13:31:4819 hrs ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x0e682221302cea425c4c8f989e66e9e4b897c6e01.650606879871075452 MOVR
0xeb60849c3b7a6c6707d51af1eae38d6169477e192108880cc1c9e21addc6d49518826812022-05-23 13:31:4819 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c21.650606879871075452 MOVR
0x47fc5a63baf65c2e3ad4377e617d1c2ac3206e7c842c7366ea1b9c781d192b5118826752022-05-23 13:30:3619 hrs 1 min ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20x3c42871169f1434881fd669282e177fd952b9df10.925212646688315594 MOVR
0x47fc5a63baf65c2e3ad4377e617d1c2ac3206e7c842c7366ea1b9c781d192b5118826752022-05-23 13:30:3619 hrs 1 min ago 0x98878b06940ae243284ca214f92bb71a2b032b8a 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c20.925212646688315594 MOVR
0x145128f127891a285332f8400bdb66d3295065a220b336520ff600e9e976b3eb18818782022-05-23 10:30:3622 hrs 1 min ago 0xd9dec7c3c06e62a4c1beeb07cadf568f496b14c2 0x0e682221302cea425c4c8f989e66e9e4b897c6e02.753175183444155631 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DODOV2Proxy02

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2021-11-05
*/

// File: contracts/SmartRoute/intf/IDODOV2Proxy01.sol

/*

    Copyright 2020 DODO ZOO.
    SPDX-License-Identifier: Apache-2.0

*/

pragma solidity 0.6.9;


interface IDODOV2Proxy01 {
    function dodoSwapV2ETHToToken(
        address toToken,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

    function dodoSwapV2TokenToETH(
        address fromToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external returns (uint256 returnAmount);

    function dodoSwapV2TokenToToken(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external returns (uint256 returnAmount);

    function createDODOVendingMachine(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTWAP,
        uint256 deadLine
    ) external payable returns (address newVendingMachine, uint256 shares);

    function addDVMLiquidity(
        address dvmAddress,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 baseMinAmount,
        uint256 quoteMinAmount,
        uint8 flag, //  0 - ERC20, 1 - baseInETH, 2 - quoteInETH
        uint256 deadLine
    )
        external
        payable
        returns (
            uint256 shares,
            uint256 baseAdjustedInAmount,
            uint256 quoteAdjustedInAmount
        );

    function createDODOPrivatePool(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTwap,
        uint256 deadLine
    ) external payable returns (address newPrivatePool);

    function resetDODOPrivatePool(
        address dppAddress,
        uint256[] memory paramList,  //0 - newLpFeeRate, 1 - newI, 2 - newK
        uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3 - quoteOutAmount
        uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH
        uint256 minBaseReserve,
        uint256 minQuoteReserve,
        uint256 deadLine
    ) external payable;


    function bid(
        address cpAddress,
        uint256 quoteAmount,
        uint8 flag, // 0 - ERC20, 1 - quoteInETH
        uint256 deadLine
    ) external payable;

    function addLiquidityToV1(
        address pair,
        uint256 baseAmount,
        uint256 quoteAmount,
        uint256 baseMinShares,
        uint256 quoteMinShares,
        uint8 flag, // 0 erc20 Out  1 baseInETH  2 quoteInETH 
        uint256 deadLine
    ) external payable returns(uint256, uint256);

    function dodoSwapV1(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

    function externalSwap(
        address fromToken,
        address toToken,
        address approveTarget,
        address to,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        bytes memory callDataConcat,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 returnAmount);

}

// File: contracts/SmartRoute/intf/IDODOV2.sol


interface IDODOV2 {

    //========== Common ==================

    function sellBase(address to) external returns (uint256 receiveQuoteAmount);

    function sellQuote(address to) external returns (uint256 receiveBaseAmount);

    function getVaultReserve() external view returns (uint256 baseReserve, uint256 quoteReserve);

    function _BASE_TOKEN_() external view returns (address);

    function _QUOTE_TOKEN_() external view returns (address);

    function getPMMStateForCall() external view returns (
            uint256 i,
            uint256 K,
            uint256 B,
            uint256 Q,
            uint256 B0,
            uint256 Q0,
            uint256 R
    );

    function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate);

    
    function getDODOPoolBidirection(address token0, address token1) external view returns (address[] memory, address[] memory);

    //========== DODOVendingMachine ========
    
    function createDODOVendingMachine(
        address baseToken,
        address quoteToken,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTWAP
    ) external returns (address newVendingMachine);
    
    function buyShares(address to) external returns (uint256,uint256,uint256);


    //========== DODOPrivatePool ===========

    function createDODOPrivatePool() external returns (address newPrivatePool);

    function initDODOPrivatePool(
        address dppAddress,
        address creator,
        address baseToken,
        address quoteToken,
        uint256 lpFeeRate,
        uint256 k,
        uint256 i,
        bool isOpenTwap
    ) external;

    function reset(
        address operator,
        uint256 newLpFeeRate,
        uint256 newI,
        uint256 newK,
        uint256 baseOutAmount,
        uint256 quoteOutAmount,
        uint256 minBaseReserve,
        uint256 minQuoteReserve
    ) external returns (bool); 


    function _OWNER_() external returns (address);
    
    //========== CrowdPooling ===========

    function createCrowdPooling() external returns (address payable newCrowdPooling);

    function initCrowdPooling(
        address cpAddress,
        address creator,
        address baseToken,
        address quoteToken,
        uint256[] memory timeLine,
        uint256[] memory valueList,
        bool isOpenTWAP
    ) external;

    function bid(address to) external;
}

// File: contracts/SmartRoute/intf/IDODOV1.sol


interface IDODOV1 {
    function init(
        address owner,
        address supervisor,
        address maintainer,
        address baseToken,
        address quoteToken,
        address oracle,
        uint256 lpFeeRate,
        uint256 mtFeeRate,
        uint256 k,
        uint256 gasPriceLimit
    ) external;

    function transferOwnership(address newOwner) external;

    function claimOwnership() external;

    function sellBaseToken(
        uint256 amount,
        uint256 minReceiveQuote,
        bytes calldata data
    ) external returns (uint256);

    function buyBaseToken(
        uint256 amount,
        uint256 maxPayQuote,
        bytes calldata data
    ) external returns (uint256);

    function querySellBaseToken(uint256 amount) external view returns (uint256 receiveQuote);

    function queryBuyBaseToken(uint256 amount) external view returns (uint256 payQuote);

    function depositBaseTo(address to, uint256 amount) external returns (uint256);

    function withdrawBase(uint256 amount) external returns (uint256);

    function withdrawAllBase() external returns (uint256);

    function depositQuoteTo(address to, uint256 amount) external returns (uint256);

    function withdrawQuote(uint256 amount) external returns (uint256);

    function withdrawAllQuote() external returns (uint256);

    function _BASE_CAPITAL_TOKEN_() external returns (address);

    function _QUOTE_CAPITAL_TOKEN_() external returns (address);

    function _BASE_TOKEN_() external view returns (address);

    function _QUOTE_TOKEN_() external view returns (address);

    function _R_STATUS_() external view returns (uint8);

    function _QUOTE_BALANCE_() external view returns (uint256);

    function _BASE_BALANCE_() external view returns (uint256);

    function _K_() external view returns (uint256);

    function _MT_FEE_RATE_() external view returns (uint256);

    function _LP_FEE_RATE_() external view returns (uint256);

    function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget);

    function getOraclePrice() external view returns (uint256);

    function getMidPrice() external view returns (uint256 midPrice); 
}

// File: contracts/intf/IDODOApprove.sol


interface IDODOApprove {
    function claimTokens(address token,address who,address dest,uint256 amount) external;
    function getDODOProxy() external view returns (address);
}

// File: contracts/lib/InitializableOwnable.sol


/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract InitializableOwnable {
    address public _OWNER_;
    address public _NEW_OWNER_;
    bool internal _INITIALIZED_;

    // ============ Events ============

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

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

    // ============ Modifiers ============

    modifier notInitialized() {
        require(!_INITIALIZED_, "DODO_INITIALIZED");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    function initOwner(address newOwner) public notInitialized {
        _INITIALIZED_ = true;
        _OWNER_ = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() public {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/SmartRoute/DODOApproveProxy.sol


interface IDODOApproveProxy {
    function isAllowedProxy(address _proxy) external view returns (bool);
    function claimTokens(address token,address who,address dest,uint256 amount) external;
}

/**
 * @title DODOApproveProxy
 * @author DODO Breeder
 *
 * @notice Allow different version dodoproxy to claim from DODOApprove
 */
contract DODOApproveProxy is InitializableOwnable {
    
    // ============ Storage ============
    uint256 private constant _TIMELOCK_DURATION_ = 3 days;
    mapping (address => bool) public _IS_ALLOWED_PROXY_;
    uint256 public _TIMELOCK_;
    address public _PENDING_ADD_DODO_PROXY_;
    address public immutable _DODO_APPROVE_;

    // ============ Modifiers ============
    modifier notLocked() {
        require(
            _TIMELOCK_ <= block.timestamp,
            "SetProxy is timelocked"
        );
        _;
    }

    constructor(address dodoApporve) public {
        _DODO_APPROVE_ = dodoApporve;
    }

    function init(address owner, address[] memory proxies) external {
        initOwner(owner);
        for(uint i = 0; i < proxies.length; i++) 
            _IS_ALLOWED_PROXY_[proxies[i]] = true;
    }

    function unlockAddProxy(address newDodoProxy) public onlyOwner {
        _TIMELOCK_ = block.timestamp + _TIMELOCK_DURATION_;
        _PENDING_ADD_DODO_PROXY_ = newDodoProxy;
    }

    function lockAddProxy() public onlyOwner {
       _PENDING_ADD_DODO_PROXY_ = address(0);
       _TIMELOCK_ = 0;
    }


    function addDODOProxy() external onlyOwner notLocked() {
        _IS_ALLOWED_PROXY_[_PENDING_ADD_DODO_PROXY_] = true;
        lockAddProxy();
    }

    function removeDODOProxy (address oldDodoProxy) public onlyOwner {
        _IS_ALLOWED_PROXY_[oldDodoProxy] = false;
    }
    
    function claimTokens(
        address token,
        address who,
        address dest,
        uint256 amount
    ) external {
        require(_IS_ALLOWED_PROXY_[msg.sender], "DODOApproveProxy:Access restricted");
        IDODOApprove(_DODO_APPROVE_).claimTokens(
            token,
            who,
            dest,
            amount
        );
    }

    function isAllowedProxy(address _proxy) external view returns (bool) {
        return _IS_ALLOWED_PROXY_[_proxy];
    }
}

// File: contracts/lib/SafeMath.sol


/**
 * @title SafeMath
 * @author DODO Breeder
 *
 * @notice Math operations with safety checks that revert on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "MUL_ERROR");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "DIVIDING_ERROR");
        return a / b;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 quotient = div(a, b);
        uint256 remainder = a - quotient * b;
        if (remainder > 0) {
            return quotient + 1;
        } else {
            return quotient;
        }
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SUB_ERROR");
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "ADD_ERROR");
        return c;
    }

    function sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = x / 2 + 1;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}

// File: contracts/lib/DecimalMath.sol

/**
 * @title DecimalMath
 * @author DODO Breeder
 *
 * @notice Functions for fixed point number with 18 decimals
 */
library DecimalMath {
    using SafeMath for uint256;

    uint256 internal constant ONE = 10**18;
    uint256 internal constant ONE2 = 10**36;

    function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d) / (10**18);
    }

    function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d).divCeil(10**18);
    }

    function divFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).div(d);
    }

    function divCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).divCeil(d);
    }

    function reciprocalFloor(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).div(target);
    }

    function reciprocalCeil(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).divCeil(target);
    }
}

// File: contracts/SmartRoute/helper/DODOSellHelper.sol



// import {DODOMath} from "../lib/DODOMath.sol";

interface IDODOSellHelper {
    function querySellQuoteToken(address dodo, uint256 amount) external view returns (uint256);
    
    function querySellBaseToken(address dodo, uint256 amount) external view returns (uint256);
}

library DODOMath {
    using SafeMath for uint256;

    /*
        Integrate dodo curve fron V1 to V2
        require V0>=V1>=V2>0
        res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1)
        let V1-V2=delta
        res = i*delta*(1-k+k(V0^2/V1/V2))
    */
    function _GeneralIntegrate(
        uint256 V0,
        uint256 V1,
        uint256 V2,
        uint256 i,
        uint256 k
    ) internal pure returns (uint256) {
        uint256 fairAmount = DecimalMath.mulFloor(i, V1.sub(V2)); // i*delta
        uint256 V0V0V1V2 = DecimalMath.divCeil(V0.mul(V0).div(V1), V2);
        uint256 penalty = DecimalMath.mulFloor(k, V0V0V1V2); // k(V0^2/V1/V2)
        return DecimalMath.mulFloor(fairAmount, DecimalMath.ONE.sub(k).add(penalty));
    }

    /*
        The same with integration expression above, we have:
        i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2)
        Given Q1 and deltaB, solve Q2
        This is a quadratic function and the standard version is
        aQ2^2 + bQ2 + c = 0, where
        a=1-k
        -b=(1-k)Q1-kQ0^2/Q1+i*deltaB
        c=-kQ0^2
        and Q2=(-b+sqrt(b^2+4(1-k)kQ0^2))/2(1-k)
        note: another root is negative, abondan
        if deltaBSig=true, then Q2>Q1
        if deltaBSig=false, then Q2<Q1
    */
    function _SolveQuadraticFunctionForTrade(
        uint256 Q0,
        uint256 Q1,
        uint256 ideltaB,
        bool deltaBSig,
        uint256 k
    ) internal pure returns (uint256) {
        // calculate -b value and sig
        // -b = (1-k)Q1-kQ0^2/Q1+i*deltaB
        uint256 kQ02Q1 = DecimalMath.mulFloor(k, Q0).mul(Q0).div(Q1); // kQ0^2/Q1
        uint256 b = DecimalMath.mulFloor(DecimalMath.ONE.sub(k), Q1); // (1-k)Q1
        bool minusbSig = true;
        if (deltaBSig) {
            b = b.add(ideltaB); // (1-k)Q1+i*deltaB
        } else {
            kQ02Q1 = kQ02Q1.add(ideltaB); // i*deltaB+kQ0^2/Q1
        }
        if (b >= kQ02Q1) {
            b = b.sub(kQ02Q1);
            minusbSig = true;
        } else {
            b = kQ02Q1.sub(b);
            minusbSig = false;
        }

        // calculate sqrt
        uint256 squareRoot = DecimalMath.mulFloor(
            DecimalMath.ONE.sub(k).mul(4),
            DecimalMath.mulFloor(k, Q0).mul(Q0)
        ); // 4(1-k)kQ0^2
        squareRoot = b.mul(b).add(squareRoot).sqrt(); // sqrt(b*b+4(1-k)kQ0*Q0)

        // final res
        uint256 denominator = DecimalMath.ONE.sub(k).mul(2); // 2(1-k)
        uint256 numerator;
        if (minusbSig) {
            numerator = b.add(squareRoot);
        } else {
            numerator = squareRoot.sub(b);
        }

        if (deltaBSig) {
            return DecimalMath.divFloor(numerator, denominator);
        } else {
            return DecimalMath.divCeil(numerator, denominator);
        }
    }

    /*
        Start from the integration function
        i*deltaB = (Q2-Q1)*(1-k+kQ0^2/Q1/Q2)
        Assume Q2=Q0, Given Q1 and deltaB, solve Q0
        let fairAmount = i*deltaB
    */
    function _SolveQuadraticFunctionForTarget(
        uint256 V1,
        uint256 k,
        uint256 fairAmount
    ) internal pure returns (uint256 V0) {
        // V0 = V1+V1*(sqrt-1)/2k
        uint256 sqrt = DecimalMath.divCeil(DecimalMath.mulFloor(k, fairAmount).mul(4), V1);
        sqrt = sqrt.add(DecimalMath.ONE).mul(DecimalMath.ONE).sqrt();
        uint256 premium = DecimalMath.divCeil(sqrt.sub(DecimalMath.ONE), k.mul(2));
        // V0 is greater than or equal to V1 according to the solution
        return DecimalMath.mulFloor(V1, DecimalMath.ONE.add(premium));
    }
}

contract DODOSellHelper {
    using SafeMath for uint256;

    enum RStatus {ONE, ABOVE_ONE, BELOW_ONE}

    uint256 constant ONE = 10**18;

    struct DODOState {
        uint256 oraclePrice;
        uint256 K;
        uint256 B;
        uint256 Q;
        uint256 baseTarget;
        uint256 quoteTarget;
        RStatus rStatus;
    }

    function querySellBaseToken(address dodo, uint256 amount) public view returns (uint256) {
        return IDODOV1(dodo).querySellBaseToken(amount);
    }

    function querySellQuoteToken(address dodo, uint256 amount) public view returns (uint256) {
        DODOState memory state;
        (state.baseTarget, state.quoteTarget) = IDODOV1(dodo).getExpectedTarget();
        state.rStatus = RStatus(IDODOV1(dodo)._R_STATUS_());
        state.oraclePrice = IDODOV1(dodo).getOraclePrice();
        state.Q = IDODOV1(dodo)._QUOTE_BALANCE_();
        state.B = IDODOV1(dodo)._BASE_BALANCE_();
        state.K = IDODOV1(dodo)._K_();

        uint256 boughtAmount;
        // Determine the status (RStatus) and calculate the amount
        // based on the state
        if (state.rStatus == RStatus.ONE) {
            boughtAmount = _ROneSellQuoteToken(amount, state);
        } else if (state.rStatus == RStatus.ABOVE_ONE) {
            boughtAmount = _RAboveSellQuoteToken(amount, state);
        } else {
            uint256 backOneBase = state.B.sub(state.baseTarget);
            uint256 backOneQuote = state.quoteTarget.sub(state.Q);
            if (amount <= backOneQuote) {
                boughtAmount = _RBelowSellQuoteToken(amount, state);
            } else {
                boughtAmount = backOneBase.add(
                    _ROneSellQuoteToken(amount.sub(backOneQuote), state)
                );
            }
        }
        // Calculate fees
        return
            DecimalMath.divFloor(
                boughtAmount,
                DecimalMath.ONE.add(IDODOV1(dodo)._MT_FEE_RATE_()).add(
                    IDODOV1(dodo)._LP_FEE_RATE_()
                )
            );
    }

    function _ROneSellQuoteToken(uint256 amount, DODOState memory state)
        internal
        pure
        returns (uint256 receiveBaseToken)
    {
        uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice);
        uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade(
            state.baseTarget,
            state.baseTarget,
            DecimalMath.mulFloor(i, amount),
            false,
            state.K
        );
        return state.baseTarget.sub(B2);
    }

    function _RAboveSellQuoteToken(uint256 amount, DODOState memory state)
        internal
        pure
        returns (uint256 receieBaseToken)
    {
        uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice);
        uint256 B2 = DODOMath._SolveQuadraticFunctionForTrade(
            state.baseTarget,
            state.B,
            DecimalMath.mulFloor(i, amount),
            false,
            state.K
        );
        return state.B.sub(B2);
    }

    function _RBelowSellQuoteToken(uint256 amount, DODOState memory state)
        internal
        pure
        returns (uint256 receiveBaseToken)
    {
        uint256 Q1 = state.Q.add(amount);
        uint256 i = DecimalMath.divFloor(ONE, state.oraclePrice);
        return DODOMath._GeneralIntegrate(state.quoteTarget, Q1, state.Q, i, state.K);
    }
}

// File: contracts/intf/IERC20.sol


/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

// File: contracts/intf/IWETH.sol



interface IWETH {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address src,
        address dst,
        uint256 wad
    ) external returns (bool);

    function deposit() external payable;

    function withdraw(uint256 wad) external;
}

// File: contracts/SmartRoute/intf/IUni.sol


interface IUni {
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function token0() external view returns (address);
    
    function token1() external view returns (address);
}

// File: contracts/lib/SafeERC20.sol



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

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

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

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length

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

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

// File: contracts/SmartRoute/lib/UniversalERC20.sol



library UniversalERC20 {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IERC20 private constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);

    function universalTransfer(
        IERC20 token,
        address payable to,
        uint256 amount
    ) internal {
        if (amount > 0) {
            if (isETH(token)) {
                to.transfer(amount);
            } else {
                token.safeTransfer(to, amount);
            }
        }
    }

    function universalApproveMax(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        uint256 allowance = token.allowance(address(this), to);
        if (allowance < amount) {
            if (allowance > 0) {
                token.safeApprove(to, 0);
            }
            token.safeApprove(to, uint256(-1));
        }
    }

    function universalBalanceOf(IERC20 token, address who) internal view returns (uint256) {
        if (isETH(token)) {
            return who.balance;
        } else {
            return token.balanceOf(who);
        }
    }

    function tokenBalanceOf(IERC20 token, address who) internal view returns (uint256) {
        return token.balanceOf(who);
    }

    function isETH(IERC20 token) internal pure returns (bool) {
        return token == ETH_ADDRESS;
    }
}

// File: contracts/lib/ReentrancyGuard.sol


/**
 * @title ReentrancyGuard
 * @author DODO Breeder
 *
 * @notice Protect functions from Reentrancy Attack
 */
contract ReentrancyGuard {
    // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations
    // zero-state of _ENTERED_ is false
    bool private _ENTERED_;

    modifier preventReentrant() {
        require(!_ENTERED_, "REENTRANT");
        _ENTERED_ = true;
        _;
        _ENTERED_ = false;
    }
}

// File: contracts/SmartRoute/intf/IDODOAdapter.sol


interface IDODOAdapter {
    
    function sellBase(address to, address pool, bytes memory data) external;

    function sellQuote(address to, address pool, bytes memory data) external;
}

// File: contracts/SmartRoute/DODOV2Proxy02.sol




/**
 * @title DODOV2Proxy02
 * @author DODO Breeder
 *
 * @notice Entrance of trading in DODO platform
 */
contract DODOV2Proxy02 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable {
    using SafeMath for uint256;
    using UniversalERC20 for IERC20;

    // ============ Storage ============

    address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    address public _WETH_;
    address public immutable _DODO_APPROVE_PROXY_;
    address public immutable _DODO_SELL_HELPER_;
    address public immutable _DVM_FACTORY_;
    address public immutable _DPP_FACTORY_;
    mapping (address => bool) public isWhiteListed;

    // ============ Events ============

    event OrderHistory(
        address fromToken,
        address toToken,
        address sender,
        uint256 fromAmount,
        uint256 returnAmount
    );

    // ============ Modifiers ============

    modifier judgeExpired(uint256 deadLine) {
        require(deadLine >= block.timestamp, "DODOV2Proxy02: EXPIRED");
        _;
    }

    fallback() external payable {}

    receive() external payable {}

    constructor(
        address dvmFactory,
        address dppFactory,
        address payable weth,
        address dodoApproveProxy,
        address dodoSellHelper
    ) public {
        _DVM_FACTORY_ = dvmFactory;
        _DPP_FACTORY_ = dppFactory;
        _WETH_ = weth;
        _DODO_APPROVE_PROXY_ = dodoApproveProxy;
        _DODO_SELL_HELPER_ = dodoSellHelper;
    }

    function replaceWETH (address newWeth) public onlyOwner {
        _WETH_ = newWeth;
    }

    function addWhiteList (address contractAddr) public onlyOwner {
        isWhiteListed[contractAddr] = true;
    }

    function removeWhiteList (address contractAddr) public onlyOwner {
        isWhiteListed[contractAddr] = false;
    }

    // ============ DVM Functions (create & add liquidity) ============

    function createDODOVendingMachine(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTWAP,
        uint256 deadLine
    )
        external
        override
        payable
        preventReentrant
        judgeExpired(deadLine)
        returns (address newVendingMachine, uint256 shares)
    {
        {
            address _baseToken = baseToken == _ETH_ADDRESS_ ? _WETH_ : baseToken;
            address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken;
            newVendingMachine = IDODOV2(_DVM_FACTORY_).createDODOVendingMachine(
                _baseToken,
                _quoteToken,
                lpFeeRate,
                i,
                k,
                isOpenTWAP
            );
        }

        {
            address _baseToken = baseToken;
            address _quoteToken = quoteToken;
            _deposit(
                msg.sender,
                newVendingMachine,
                _baseToken,
                baseInAmount,
                _baseToken == _ETH_ADDRESS_
            );
            _deposit(
                msg.sender,
                newVendingMachine,
                _quoteToken,
                quoteInAmount,
                _quoteToken == _ETH_ADDRESS_
            );
        }

        (shares, , ) = IDODOV2(newVendingMachine).buyShares(msg.sender);
    }

    function addDVMLiquidity(
        address dvmAddress,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 baseMinAmount,
        uint256 quoteMinAmount,
        uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH
        uint256 deadLine
    )
        external
        override
        payable
        preventReentrant
        judgeExpired(deadLine)
        returns (
            uint256 shares,
            uint256 baseAdjustedInAmount,
            uint256 quoteAdjustedInAmount
        )
    {
        address _dvm = dvmAddress;
        (baseAdjustedInAmount, quoteAdjustedInAmount) = _addDVMLiquidity(
            _dvm,
            baseInAmount,
            quoteInAmount
        );
        require(
            baseAdjustedInAmount >= baseMinAmount && quoteAdjustedInAmount >= quoteMinAmount,
            "DODOV2Proxy02: deposit amount is not enough"
        );

        _deposit(msg.sender, _dvm, IDODOV2(_dvm)._BASE_TOKEN_(), baseAdjustedInAmount, flag == 1);
        _deposit(msg.sender, _dvm, IDODOV2(_dvm)._QUOTE_TOKEN_(), quoteAdjustedInAmount, flag == 2);
        
        (shares, , ) = IDODOV2(_dvm).buyShares(msg.sender);
        // refund dust eth
        if (flag == 1 && msg.value > baseAdjustedInAmount) msg.sender.transfer(msg.value - baseAdjustedInAmount);
        if (flag == 2 && msg.value > quoteAdjustedInAmount) msg.sender.transfer(msg.value - quoteAdjustedInAmount);
    }

    function _addDVMLiquidity(
        address dvmAddress,
        uint256 baseInAmount,
        uint256 quoteInAmount
    ) internal view returns (uint256 baseAdjustedInAmount, uint256 quoteAdjustedInAmount) {
        (uint256 baseReserve, uint256 quoteReserve) = IDODOV2(dvmAddress).getVaultReserve();
        if (quoteReserve == 0 && baseReserve == 0) {
            baseAdjustedInAmount = baseInAmount;
            quoteAdjustedInAmount = quoteInAmount;
        }
        if (quoteReserve == 0 && baseReserve > 0) {
            baseAdjustedInAmount = baseInAmount;
            quoteAdjustedInAmount = 0;
        }
        if (quoteReserve > 0 && baseReserve > 0) {
            uint256 baseIncreaseRatio = DecimalMath.divFloor(baseInAmount, baseReserve);
            uint256 quoteIncreaseRatio = DecimalMath.divFloor(quoteInAmount, quoteReserve);
            if (baseIncreaseRatio <= quoteIncreaseRatio) {
                baseAdjustedInAmount = baseInAmount;
                quoteAdjustedInAmount = DecimalMath.mulFloor(quoteReserve, baseIncreaseRatio);
            } else {
                quoteAdjustedInAmount = quoteInAmount;
                baseAdjustedInAmount = DecimalMath.mulFloor(baseReserve, quoteIncreaseRatio);
            }
        }
    }

    // ============ DPP Functions (create & reset) ============

    function createDODOPrivatePool(
        address baseToken,
        address quoteToken,
        uint256 baseInAmount,
        uint256 quoteInAmount,
        uint256 lpFeeRate,
        uint256 i,
        uint256 k,
        bool isOpenTwap,
        uint256 deadLine
    )
        external
        override
        payable
        preventReentrant
        judgeExpired(deadLine)
        returns (address newPrivatePool)
    {
        newPrivatePool = IDODOV2(_DPP_FACTORY_).createDODOPrivatePool();

        address _baseToken = baseToken;
        address _quoteToken = quoteToken;
        _deposit(msg.sender, newPrivatePool, _baseToken, baseInAmount, _baseToken == _ETH_ADDRESS_);
        _deposit(
            msg.sender,
            newPrivatePool,
            _quoteToken,
            quoteInAmount,
            _quoteToken == _ETH_ADDRESS_
        );

        if (_baseToken == _ETH_ADDRESS_) _baseToken = _WETH_;
        if (_quoteToken == _ETH_ADDRESS_) _quoteToken = _WETH_;

        IDODOV2(_DPP_FACTORY_).initDODOPrivatePool(
            newPrivatePool,
            msg.sender,
            _baseToken,
            _quoteToken,
            lpFeeRate,
            k,
            i,
            isOpenTwap
        );
    }

    function resetDODOPrivatePool(
        address dppAddress,
        uint256[] memory paramList,  //0 - newLpFeeRate, 1 - newI, 2 - newK
        uint256[] memory amountList, //0 - baseInAmount, 1 - quoteInAmount, 2 - baseOutAmount, 3- quoteOutAmount
        uint8 flag, // 0 - ERC20, 1 - baseInETH, 2 - quoteInETH, 3 - baseOutETH, 4 - quoteOutETH
        uint256 minBaseReserve,
        uint256 minQuoteReserve,
        uint256 deadLine
    ) external override payable preventReentrant judgeExpired(deadLine) {
        _deposit(
            msg.sender,
            dppAddress,
            IDODOV2(dppAddress)._BASE_TOKEN_(),
            amountList[0],
            flag == 1
        );
        _deposit(
            msg.sender,
            dppAddress,
            IDODOV2(dppAddress)._QUOTE_TOKEN_(),
            amountList[1],
            flag == 2
        );

        require(IDODOV2(IDODOV2(dppAddress)._OWNER_()).reset(
            msg.sender,
            paramList[0],
            paramList[1],
            paramList[2],
            amountList[2],
            amountList[3],
            minBaseReserve,
            minQuoteReserve
        ), "Reset Failed");

        _withdraw(msg.sender, IDODOV2(dppAddress)._BASE_TOKEN_(), amountList[2], flag == 3);
        _withdraw(msg.sender, IDODOV2(dppAddress)._QUOTE_TOKEN_(), amountList[3], flag == 4);
    }

    // ============ Swap ============

    function dodoSwapV2ETHToToken(
        address toToken,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        payable
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        
        uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender);
        IWETH(_WETH_).deposit{value: msg.value}();
        IWETH(_WETH_).transfer(dodoPairs[0], msg.value);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            if (i == dodoPairs.length - 1) {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(msg.sender);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(msg.sender);
                }
            } else {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]);
                }
            }
            directions = directions >> 1;
        }

        returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance);
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            _ETH_ADDRESS_,
            toToken,
            msg.sender,
            msg.value,
            returnAmount
        );
    }

    function dodoSwapV2TokenToETH(
        address fromToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        
        IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            if (i == dodoPairs.length - 1) {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(address(this));
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(address(this));
                }
            } else {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]);
                }
            }
            directions = directions >> 1;
        }
        returnAmount = IWETH(_WETH_).balanceOf(address(this));
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");
        IWETH(_WETH_).withdraw(returnAmount);
        msg.sender.transfer(returnAmount);

        emit OrderHistory(
            fromToken,
            _ETH_ADDRESS_,
            msg.sender,
            fromTokenAmount,
            returnAmount
        );
    }

    function dodoSwapV2TokenToToken(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");

        uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender);
        IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            if (i == dodoPairs.length - 1) {
                if (directions & 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(msg.sender);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(msg.sender);
                }
            } else {
                if (directions& 1 == 0) {
                    IDODOV2(dodoPairs[i]).sellBase(dodoPairs[i + 1]);
                } else {
                    IDODOV2(dodoPairs[i]).sellQuote(dodoPairs[i + 1]);
                }
            }
            directions = directions >> 1;
        }
        returnAmount = IERC20(toToken).balanceOf(msg.sender).sub(originToTokenBalance);
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            fromToken,
            toToken,
            msg.sender,
            fromTokenAmount,
            returnAmount
        );
    }

    function externalSwap(
        address fromToken,
        address toToken,
        address approveTarget,
        address swapTarget,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        bytes memory callDataConcat,
        bool,
        uint256 deadLine
    )
        external
        override
        payable
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        
        uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender);
        if (fromToken != _ETH_ADDRESS_) {
            IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(
                fromToken,
                msg.sender,
                address(this),
                fromTokenAmount
            );
            IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount);
        }

        require(isWhiteListed[swapTarget], "DODOV2Proxy02: Not Whitelist Contract");
        (bool success, ) = swapTarget.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat);

        require(success, "DODOV2Proxy02: External Swap execution Failed");

        IERC20(toToken).universalTransfer(
            msg.sender,
            IERC20(toToken).universalBalanceOf(address(this))
        );

        returnAmount = IERC20(toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance);
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        emit OrderHistory(
            fromToken,
            toToken,
            msg.sender,
            fromTokenAmount,
            returnAmount
        );
    }

    function dodoSwapV1(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool,
        uint256 deadLine
    )
        external
        override
        payable
        judgeExpired(deadLine)
        returns (uint256 returnAmount)
    {
        require(dodoPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");
        

        address _fromToken = fromToken;
        address _toToken = toToken;
        
        _deposit(msg.sender, address(this), _fromToken, fromTokenAmount, _fromToken == _ETH_ADDRESS_);

        for (uint256 i = 0; i < dodoPairs.length; i++) {
            address curDodoPair = dodoPairs[i];
            if (directions & 1 == 0) {
                address curDodoBase = IDODOV1(curDodoPair)._BASE_TOKEN_();
                uint256 curAmountIn = IERC20(curDodoBase).balanceOf(address(this));
                IERC20(curDodoBase).universalApproveMax(curDodoPair, curAmountIn);
                IDODOV1(curDodoPair).sellBaseToken(curAmountIn, 0, "");
            } else {
                address curDodoQuote = IDODOV1(curDodoPair)._QUOTE_TOKEN_();
                uint256 curAmountIn = IERC20(curDodoQuote).balanceOf(address(this));
                IERC20(curDodoQuote).universalApproveMax(curDodoPair, curAmountIn);
                uint256 canBuyBaseAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken(
                    curDodoPair,
                    curAmountIn
                );
                IDODOV1(curDodoPair).buyBaseToken(canBuyBaseAmount, curAmountIn, "");
            }
            directions = directions >> 1;
        }

        
        if (_toToken == _ETH_ADDRESS_) {
            returnAmount = IWETH(_WETH_).balanceOf(address(this));
            IWETH(_WETH_).withdraw(returnAmount);
        } else {
            returnAmount = IERC20(_toToken).tokenBalanceOf(address(this));
        }
        
        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");
        IERC20(_toToken).universalTransfer(msg.sender, returnAmount);

        emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount);
    }

    //============ CrowdPooling Functions (bid) ============
    function bid(
        address cpAddress,
        uint256 quoteAmount,
        uint8 flag, // 0 - ERC20, 1 - quoteInETH
        uint256 deadLine
    ) external override payable preventReentrant judgeExpired(deadLine) {
        _deposit(msg.sender, cpAddress, IDODOV2(cpAddress)._QUOTE_TOKEN_(), quoteAmount, flag == 1);
        IDODOV2(cpAddress).bid(msg.sender);
    }


    function addLiquidityToV1(
        address pair,
        uint256 baseAmount,
        uint256 quoteAmount,
        uint256 baseMinShares,
        uint256 quoteMinShares,
        uint8 flag, // 0 erc20 In  1 baseInETH  2 quoteIn ETH 
        uint256 deadLine
    ) external override payable preventReentrant judgeExpired(deadLine) returns(uint256 baseShares, uint256 quoteShares) {
        address _baseToken = IDODOV1(pair)._BASE_TOKEN_();
        address _quoteToken = IDODOV1(pair)._QUOTE_TOKEN_();
        
        _deposit(msg.sender, address(this), _baseToken, baseAmount, flag == 1);
        _deposit(msg.sender, address(this), _quoteToken, quoteAmount, flag == 2);

        
        if(baseAmount > 0) {
            IERC20(_baseToken).universalApproveMax(pair, baseAmount);
            baseShares = IDODOV1(pair).depositBaseTo(msg.sender, baseAmount);
        }
        if(quoteAmount > 0) {
            IERC20(_quoteToken).universalApproveMax(pair, quoteAmount);
            quoteShares = IDODOV1(pair).depositQuoteTo(msg.sender, quoteAmount);
        }

        require(baseShares >= baseMinShares && quoteShares >= quoteMinShares,"DODOV2Proxy02: Return DLP is not enough");
    }
    

    function _deposit(
        address from,
        address to,
        address token,
        uint256 amount,
        bool isETH
    ) internal {
        if (isETH) {
            if (amount > 0) {
                IWETH(_WETH_).deposit{value: amount}();
                if (to != address(this)) SafeERC20.safeTransfer(IERC20(_WETH_), to, amount);
            }
        } else {
            IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(token, from, to, amount);
        }
    }

    function _withdraw(
        address payable to,
        address token,
        uint256 amount,
        bool isETH
    ) internal {
        if (isETH) {
            if (amount > 0) {
                IWETH(_WETH_).withdraw(amount);
                to.transfer(amount);
            }
        } else {
            if (amount > 0) {
                SafeERC20.safeTransfer(IERC20(token), to, amount);
            }
        }
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"dvmFactory","type":"address"},{"internalType":"address","name":"dppFactory","type":"address"},{"internalType":"address payable","name":"weth","type":"address"},{"internalType":"address","name":"dodoApproveProxy","type":"address"},{"internalType":"address","name":"dodoSellHelper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnAmount","type":"uint256"}],"name":"OrderHistory","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_DODO_APPROVE_PROXY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DODO_SELL_HELPER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DPP_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_DVM_FACTORY_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_WETH_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dvmAddress","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinAmount","type":"uint256"},{"internalType":"uint256","name":"quoteMinAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addDVMLiquidity","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"baseAdjustedInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAdjustedInAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"baseAmount","type":"uint256"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint256","name":"baseMinShares","type":"uint256"},{"internalType":"uint256","name":"quoteMinShares","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"addLiquidityToV1","outputs":[{"internalType":"uint256","name":"baseShares","type":"uint256"},{"internalType":"uint256","name":"quoteShares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cpAddress","type":"address"},{"internalType":"uint256","name":"quoteAmount","type":"uint256"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTwap","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOPrivatePool","outputs":[{"internalType":"address","name":"newPrivatePool","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"uint256","name":"baseInAmount","type":"uint256"},{"internalType":"uint256","name":"quoteInAmount","type":"uint256"},{"internalType":"uint256","name":"lpFeeRate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"bool","name":"isOpenTWAP","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"createDODOVendingMachine","outputs":[{"internalType":"address","name":"newVendingMachine","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV1","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2ETHToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToETH","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"dodoPairs","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"dodoSwapV2TokenToToken","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"address","name":"approveTarget","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"bytes","name":"callDataConcat","type":"bytes"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"externalSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWeth","type":"address"}],"name":"replaceWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dppAddress","type":"address"},{"internalType":"uint256[]","name":"paramList","type":"uint256[]"},{"internalType":"uint256[]","name":"amountList","type":"uint256[]"},{"internalType":"uint8","name":"flag","type":"uint8"},{"internalType":"uint256","name":"minBaseReserve","type":"uint256"},{"internalType":"uint256","name":"minQuoteReserve","type":"uint256"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"resetDODOPrivatePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405234801561001157600080fd5b50604051620049cd380380620049cd833981810160405260a081101561003657600080fd5b5080516020820151604083015160608085015160809586015185831b6001600160601b031990811660c05285841b811660e052600280546001600160a01b0319166001600160a01b0396871617905582841b81169097529182901b90951660a05293811693811692811691166148d9620000f460003980610c245280610da8528061343a525080612deb5280612f7b52508061120f5280613416525080611a8252806127e852806136c052806138ef5280613e2152506148d96000f3fe60806040526004361061016a5760003560e01c806369e4e417116100d1578063b730d1501161008a578063e7cd4a0411610064578063e7cd4a0414610994578063eb99be12146109c7578063f2fde38b146109dc578063f87dc1b714610a0f57610171565b8063b730d15014610911578063c67f873d14610926578063db70b5c71461095957610171565b806369e4e417146107a45780636f9170f6146107b95780638456db15146108005780638b3bb0891461081557806399882c8f14610896578063af1280b0146108fc57610171565b80631e6d24c2116101235780631e6d24c2146104775780632042e5c21461054e5780634e71e0c8146105815780635028bb951461059657806354bacd1314610659578063674d94221461073957610171565b80630d009297146101735780630d4eec8f146101a65780630d9be500146101d75780630dd4ebd91461023557806312ff148d1461031b57806316048bc41461046257610171565b3661017157005b005b34801561017f57600080fd5b506101716004803603602081101561019657600080fd5b50356001600160a01b0316610af0565b3480156101b257600080fd5b506101bb610b7d565b604080516001600160a01b039092168252519081900360200190f35b6101bb60048036036101208110156101ee57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135610b8c565b610309600480360361010081101561024c57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561028b57600080fd5b82018360208201111561029d57600080fd5b803590602001918460208302840111600160201b831117156102be57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135610e26565b60408051918252519081900360200190f35b610171600480360360e081101561033157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035b57600080fd5b82018360208201111561036d57600080fd5b803590602001918460208302840111600160201b8311171561038e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dd57600080fd5b8201836020820111156103ef57600080fd5b803590602001918460208302840111600160201b8311171561041057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff83351693505050602081013590604081013590606001356114f0565b34801561046e57600080fd5b506101bb611994565b34801561048357600080fd5b50610309600480360360e081101561049a57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156104d057600080fd5b8201836020820111156104e257600080fd5b803590602001918460208302840111600160201b8311171561050357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020810135151590604001356119a8565b34801561055a57600080fd5b506101716004803603602081101561057157600080fd5b50356001600160a01b0316611fa7565b34801561058d57600080fd5b50610171612018565b610309600480360360c08110156105ac57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156105db57600080fd5b8201836020820111156105ed57600080fd5b803590602001918460208302840111600160201b8311171561060e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550508235935050506020810135151590604001356120dc565b610309600480360361012081101561067057600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b8111156106be57600080fd5b8201836020820111156106d057600080fd5b803590602001918460018302840111600160201b831117156106f157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505050803515159150602001356126f3565b610786600480360360e081101561074f57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c00135612ae3565b60408051938452602084019290925282820152519081900360600190f35b3480156107b057600080fd5b506101bb612de9565b3480156107c557600080fd5b506107ec600480360360208110156107dc57600080fd5b50356001600160a01b0316612e0d565b604080519115158252519081900360200190f35b34801561080c57600080fd5b506101bb612e22565b610873600480360361012081101561082c57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135612e31565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6108e3600480360360e08110156108ac57600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356130d9565b6040805192835260208301919091528051918290030190f35b34801561090857600080fd5b506101bb613414565b34801561091d57600080fd5b506101bb613438565b34801561093257600080fd5b506101716004803603602081101561094957600080fd5b50356001600160a01b031661345c565b6101716004803603608081101561096f57600080fd5b506001600160a01b038135169060208101359060ff60408201351690606001356134ce565b3480156109a057600080fd5b50610171600480360360208110156109b757600080fd5b50356001600160a01b031661364a565b3480156109d357600080fd5b506101bb6136be565b3480156109e857600080fd5b50610171600480360360208110156109ff57600080fd5b50356001600160a01b03166136e2565b348015610a1b57600080fd5b506103096004803603610100811015610a3357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610a7257600080fd5b820183602082011115610a8457600080fd5b803590602001918460208302840111600160201b83111715610aa557600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135613792565b600154600160a01b900460ff1615610b42576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6002546001600160a01b031681565b6000805460ff1615610bd1576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610c22576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c7d57600080fd5b505af1158015610c91573d6000803e3d6000fd5b505050506040513d6020811015610ca757600080fd5b505191508a8a610cd33385848e6001600160a01b0382166000805160206147d283398151915214613d46565b610cf93385838d6001600160a01b0382166000805160206147d283398151915214613d46565b6001600160a01b0382166000805160206147d28339815191521415610d27576002546001600160a01b031691505b6001600160a01b0381166000805160206147d28339815191521415610d5457506002546001600160a01b03165b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163195eefe0916101048082019260009290919082900301818387803b158015610df357600080fd5b505af1158015610e07573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015610e6c576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b6000865111610ebf576040805162461bcd60e51b815260206004820152601a602482015279444f444f563250726f787930323a2050414952535f454d50545960301b604482015290519081900360640190fd5b60008711610efe5760405162461bcd60e51b81526004018080602001828103825260218152602001806146f56021913960400191505060405180910390fd5b8989610f263330848d6001600160a01b0382166000805160206147d283398151915214613d46565b60005b8851811015611323576000898281518110610f4057fe5b6020026020010151905088600116600014156110e8576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9157600080fd5b505afa158015610fa5573d6000803e3d6000fd5b505050506040513d6020811015610fbb57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561100957600080fd5b505afa15801561101d573d6000803e3d6000fd5b505050506040513d602081101561103357600080fd5b505190506110516001600160a01b038316848363ffffffff613e8b16565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b1580156110b457600080fd5b505af11580156110c8573d6000803e3d6000fd5b505050506040513d60208110156110de57600080fd5b5061131692505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561112357600080fd5b505afa158015611137573d6000803e3d6000fd5b505050506040513d602081101561114d57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561119b57600080fd5b505afa1580156111af573d6000803e3d6000fd5b505050506040513d60208110156111c557600080fd5b505190506111e36001600160a01b038316848363ffffffff613e8b16565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561125557600080fd5b505afa158015611269573d6000803e3d6000fd5b505050506040513d602081101561127f57600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b1580156112e657600080fd5b505af11580156112fa573d6000803e3d6000fd5b505050506040513d602081101561131057600080fd5b50505050505b50600197881c9701610f29565b506001600160a01b0381166000805160206147d2833981519152141561142757600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561138e57600080fd5b505afa1580156113a2573d6000803e3d6000fd5b505050506040513d60208110156113b857600080fd5b505160025460408051632e1a7d4d60e01b81526004810184905290519296506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b15801561140a57600080fd5b505af115801561141e573d6000803e3d6000fd5b50505050611443565b6114406001600160a01b0382163063ffffffff613f5516565b93505b888410156114825760405162461bcd60e51b815260040180806020018281038252602a815260200180614756602a913960400191505060405180910390fd5b61149c6001600160a01b038216338663ffffffff613fe216565b604080516001600160a01b038085168252831660208201523381830152606081018c90526080810186905290516000805160206147368339815191529181900360a00190a150505098975050505050505050565b60005460ff1615611534576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611585576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b61161033898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115c357600080fd5b505afa1580156115d7573d6000803e3d6000fd5b505050506040513d60208110156115ed57600080fd5b505189518a906000906115fc57fe5b60200260200101518960ff16600114613d46565b61169d33898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561164e57600080fd5b505afa158015611662573d6000803e3d6000fd5b505050506040513d602081101561167857600080fd5b505189518a90600190811061168957fe5b60200260200101518960ff16600214613d46565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156116d857600080fd5b505af11580156116ec573d6000803e3d6000fd5b505050506040513d602081101561170257600080fd5b505187516001600160a01b0390911690638ff3928c9033908a9060009061172557fe5b60200260200101518a60018151811061173a57fe5b60200260200101518b60028151811061174f57fe5b60200260200101518b60028151811061176457fe5b60200260200101518c60038151811061177957fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b1580156117fc57600080fd5b505af1158015611810573d6000803e3d6000fd5b505050506040513d602081101561182657600080fd5b5051611868576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b6118f433896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156118a557600080fd5b505afa1580156118b9573d6000803e3d6000fd5b505050506040513d60208110156118cf57600080fd5b50518851899060029081106118e057fe5b60200260200101518860ff16600314614051565b61198033896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561193157600080fd5b505afa158015611945573d6000803e3d6000fd5b505050506040513d602081101561195b57600080fd5b505188518990600390811061196c57fe5b60200260200101518860ff16600414614051565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b600081428110156119ee576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b6000865111611a41576040805162461bcd60e51b815260206004820152601a602482015279444f444f563250726f787930323a2050414952535f454d50545960301b604482015290519081900360640190fd5b60008711611a805760405162461bcd60e51b81526004018080602001828103825260218152602001806146f56021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668a3389600081518110611abe57fe5b60200260200101518c6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015611b4857600080fd5b505af1158015611b5c573d6000803e3d6000fd5b506000925050505b8651811015611dfe576001875103811415611cbb5760018616611c1e57868181518110611b8d57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b505050506040513d6020811015611c1657600080fd5b50611cb69050565b868181518110611c2a57fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b505050506040513d6020811015611cb357600080fd5b50505b611df2565b60018616611d4457868181518110611ccf57fe5b60200260200101516001600160a01b031663bd6015b4888360010181518110611cf457fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611c8957600080fd5b868181518110611d5057fe5b60200260200101516001600160a01b031663dd93f59a888360010181518110611d7557fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611dc557600080fd5b505af1158015611dd9573d6000803e3d6000fd5b505050506040513d6020811015611def57600080fd5b50505b600195861c9501611b64565b50600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611e4a57600080fd5b505afa158015611e5e573d6000803e3d6000fd5b505050506040513d6020811015611e7457600080fd5b5051915086821015611eb75760405162461bcd60e51b815260040180806020018281038252602a815260200180614756602a913960400191505060405180910390fd5b60025460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611f0457600080fd5b505af1158015611f18573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f19350505050158015611f49573d6000803e3d6000fd5b50604080516001600160a01b038b1681526000805160206147d283398151915260208201523381830152606081018a90526080810184905290516000805160206147368339815191529181900360a00190a150979650505050505050565b60005461010090046001600160a01b03163314611ff7576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600360205260409020805460ff19169055565b6001546001600160a01b03163314612067576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b60008142811015612122576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b6000865111612175576040805162461bcd60e51b815260206004820152601a602482015279444f444f563250726f787930323a2050414952535f454d50545960301b604482015290519081900360640190fd5b600087116121b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146f56021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038b16916370a0823191602480820192602092909190829003018186803b1580156121fe57600080fd5b505afa158015612212573d6000803e3d6000fd5b505050506040513d602081101561222857600080fd5b505160025460408051630d0e30db60e41b815290519293506001600160a01b039091169163d0e30db0913491600480830192600092919082900301818588803b15801561227457600080fd5b505af1158015612288573d6000803e3d6000fd5b50506002548a516001600160a01b03909116935063a9059cbb92508a91506000906122af57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050506040513d602081101561233157600080fd5b50600090505b87518110156125d157600188510381141561248e57600187166123f15787818151811061236057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156123bf57600080fd5b505af11580156123d3573d6000803e3d6000fd5b505050506040513d60208110156123e957600080fd5b506124899050565b8781815181106123fd57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d602081101561248657600080fd5b50505b6125c5565b60018716612517578781815181106124a257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106124c757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561245c57600080fd5b87818151811061252357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061254857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561259857600080fd5b505af11580156125ac573d6000803e3d6000fd5b505050506040513d60208110156125c257600080fd5b50505b600196871c9601612337565b50604080516370a0823160e01b815233600482015290516126569183916001600160a01b038d16916370a08231916024808301926020929190829003018186803b15801561261e57600080fd5b505afa158015612632573d6000803e3d6000fd5b505050506040513d602081101561264857600080fd5b50519063ffffffff61411016565b9250878310156126975760405162461bcd60e51b815260040180806020018281038252602a815260200180614756602a913960400191505060405180910390fd5b604080516000805160206147d283398151915281526001600160a01b038b16602082015233818301523460608201526080810185905290516000805160206147368339815191529181900360a00190a150509695505050505050565b60008142811015612739576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b600086116127785760405162461bcd60e51b81526004018080602001828103825260218152602001806146f56021913960400191505060405180910390fd5b60006127936001600160a01b038c163363ffffffff61415916565b90506001600160a01b038c166000805160206147d28339815191521461285f576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b5061285f925050506001600160a01b038d168b8a613e8b565b6001600160a01b03891660009081526003602052604090205460ff166128b65760405162461bcd60e51b81526004018080602001828103825260258152602001806147f26025913960400191505060405180910390fd5b60006001600160a01b03808b16908e166000805160206147d2833981519152146128e15760006128e3565b345b886040518082805190602001908083835b602083106129135780518252601f1990920191602091820191016128f4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612975576040519150601f19603f3d011682016040523d82523d6000602084013e61297a565b606091505b50509050806129ba5760405162461bcd60e51b815260040180806020018281038252602d815260200180614817602d913960400191505060405180910390fd5b6129ee336129d76001600160a01b038f163063ffffffff61415916565b6001600160a01b038f16919063ffffffff613fe216565b612a1782612a0b6001600160a01b038f163363ffffffff61415916565b9063ffffffff61411016565b935087841015612a585760405162461bcd60e51b815260040180806020018281038252602a815260200180614756602a913960400191505060405180910390fd5b6000805160206147368339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff1615612b2c576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015612b7d576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b8a612b89818c8c614203565b9094509250888410801590612b9e5750878310155b612bd95760405162461bcd60e51b815260040180806020018281038252602b8152602001806147a7602b913960400191505060405180910390fd5b612c503382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1757600080fd5b505afa158015612c2b573d6000803e3d6000fd5b505050506040513d6020811015612c4157600080fd5b505187600160ff8d1614613d46565b612cc73382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8e57600080fd5b505afa158015612ca2573d6000803e3d6000fd5b505050506040513d6020811015612cb857600080fd5b505186600260ff8d1614613d46565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b158015612d0f57600080fd5b505af1158015612d23573d6000803e3d6000fd5b505050506040513d6060811015612d3957600080fd5b50519450600160ff8816148015612d4f57508334115b15612d855760405133903486900380156108fc02916000818181858888f19350505050158015612d83573d6000803e3d6000fd5b505b8660ff166002148015612d9757508234115b15612dcd5760405133903485900380156108fc02916000818181858888f19350505050158015612dcb573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff1615612e78576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558242811015612ec9576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b60006001600160a01b038d166000805160206147d283398151915214612eef578c612efc565b6002546001600160a01b03165b905060006001600160a01b038d166000805160206147d283398151915214612f24578c612f31565b6002546001600160a01b03165b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e18c40c79160c4808201926020929091908290030181600087803b158015612fc657600080fd5b505af1158015612fda573d6000803e3d6000fd5b505050506040513d6020811015612ff057600080fd5b505194508d91508c90506130203386848f6001600160a01b0382166000805160206147d283398151915214613d46565b6130463386838e6001600160a01b0382166000805160206147d283398151915214613d46565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b505050506040513d60608110156130ba57600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff1615613120576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558242811015613171576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131ac57600080fd5b505afa1580156131c0573d6000803e3d6000fd5b505050506040513d60208110156131d657600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b15801561321e57600080fd5b505afa158015613232573d6000803e3d6000fd5b505050506040513d602081101561324857600080fd5b5051905061325f3330848e600160ff8d1614613d46565b6132723330838d8b60ff16600214613d46565b8a15613310576132926001600160a01b0383168d8d63ffffffff613e8b16565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b1580156132e157600080fd5b505af11580156132f5573d6000803e3d6000fd5b505050506040513d602081101561330b57600080fd5b505194505b89156133ae576133306001600160a01b0382168d8c63ffffffff613e8b16565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b505193505b8885101580156133be5750878410155b6133f95760405162461bcd60e51b81526004018080602001828103825260278152602001806147806027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b031633146134ac576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60005460ff1615613512576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015613563576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b6135da3386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a157600080fd5b505afa1580156135b5573d6000803e3d6000fd5b505050506040513d60208110156135cb57600080fd5b505187600160ff891614613d46565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b15801561362157600080fd5b505af1158015613635573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b0316331461369a576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b03163314613732576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600081428110156137d8576040805162461bcd60e51b81526020600482015260166024820152600080516020614716833981519152604482015290519081900360640190fd5b600086511161382b576040805162461bcd60e51b815260206004820152601a602482015279444f444f563250726f787930323a2050414952535f454d50545960301b604482015290519081900360640190fd5b6000871161386a5760405162461bcd60e51b81526004018080602001828103825260218152602001806146f56021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038c16916370a0823191602480820192602092909190829003018186803b1580156138b457600080fd5b505afa1580156138c8573d6000803e3d6000fd5b505050506040513d60208110156138de57600080fd5b505187519091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea466908d9033908b9060009061392557fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b1580156139af57600080fd5b505af11580156139c3573d6000803e3d6000fd5b506000925050505b8751811015613c65576001885103811415613b225760018716613a85578781815181106139f457fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015613a5357600080fd5b505af1158015613a67573d6000803e3d6000fd5b505050506040513d6020811015613a7d57600080fd5b50613b1d9050565b878181518110613a9157fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015613af057600080fd5b505af1158015613b04573d6000803e3d6000fd5b505050506040513d6020811015613b1a57600080fd5b50505b613c59565b60018716613bab57878181518110613b3657fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110613b5b57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015613af057600080fd5b878181518110613bb757fe5b60200260200101516001600160a01b031663dd93f59a898360010181518110613bdc57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015613c2c57600080fd5b505af1158015613c40573d6000803e3d6000fd5b505050506040513d6020811015613c5657600080fd5b50505b600196871c96016139cb565b50604080516370a0823160e01b81523360048201529051613cb29183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b15801561261e57600080fd5b925087831015613cf35760405162461bcd60e51b815260040180806020018281038252602a815260200180614756602a913960400191505060405180910390fd5b604080516001600160a01b03808e1682528c1660208201523381830152606081018b90526080810185905290516000805160206147368339815191529181900360a00190a1505098975050505050505050565b8015613de8578115613de357600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015613da257600080fd5b505af1158015613db6573d6000803e3d6000fd5b505050506001600160a01b03851630149050613de357600254613de3906001600160a01b03168584614315565b613e84565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b158015613e6b57600080fd5b505af1158015613e7f573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b158015613edc57600080fd5b505afa158015613ef0573d6000803e3d6000fd5b505050506040513d6020811015613f0657600080fd5b5051905081811015613f4f578015613f3357613f336001600160a01b03851684600063ffffffff61436716565b613f4f6001600160a01b0385168460001963ffffffff61436716565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015613fad57600080fd5b505afa158015613fc1573d6000803e3d6000fd5b505050506040513d6020811015613fd757600080fd5b505190505b92915050565b801561404c57613ff18361447a565b15614032576040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561402c573d6000803e3d6000fd5b5061404c565b61404c6001600160a01b038416838363ffffffff61431516565b505050565b80156140ff5781156140fa5760025460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b1580156140aa57600080fd5b505af11580156140be573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f193505050501580156140f8573d6000803e3d6000fd5b505b613f4f565b8115613f4f57613f4f838584614315565b600082821115614153576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b60006141648361447a565b1561417a57506001600160a01b03811631613fdc565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156141d057600080fd5b505afa1580156141e4573d6000803e3d6000fd5b505050506040513d60208110156141fa57600080fd5b50519050613fdc565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b15801561424157600080fd5b505afa158015614255573d6000803e3d6000fd5b505050506040513d604081101561426b57600080fd5b508051602090910151909250905080158015614285575081155b15614291578593508492505b8015801561429f5750600082115b156142ac57859350600092505b6000811180156142bc5750600082115b1561430b5760006142cd8784614499565b905060006142db8784614499565b90508082116142f8578795506142f183836144ca565b9450614308565b86945061430584826144ca565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261404c9084906144f4565b8015806143ed575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156143bf57600080fd5b505afa1580156143d3573d6000803e3d6000fd5b505050506040513d60208110156143e957600080fd5b5051155b6144285760405162461bcd60e51b815260040180806020018281038252603681526020018061486e6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261404c9084906144f4565b6001600160a01b0381166000805160206147d283398151915214919050565b60006144c3826144b785670de0b6b3a764000063ffffffff61464916565b9063ffffffff6146a416565b9392505050565b6000670de0b6b3a76400006144e5848463ffffffff61464916565b816144ec57fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b602083106145325780518252601f199092019160209182019101614513565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614594576040519150601f19603f3d011682016040523d82523d6000602084013e614599565b606091505b5091509150816145f0576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115613f4f5780806020019051602081101561460c57600080fd5b5051613f4f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614844602a913960400191505060405180910390fd5b60008261465857506000613fdc565b8282028284828161466557fe5b04146144c3576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b60008082116146eb576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b8183816144ec57fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220d5fe66f7dd41b77cb9e162fd9a8dd36299ad6d604e70d7c9f1bd1d18f2814d9764736f6c63430006090033000000000000000000000000738ebf387a0ce0eb46b0ef8fa5dea2eae6b1df51000000000000000000000000b57dd5c265dbb13ca014f2332069e90cd0e22e65000000000000000000000000f50225a84382c74cbdea10b0c176f71fc3de0c4d0000000000000000000000007737fd30535c69545deeea54ab8dd590ccaebd3c0000000000000000000000005e84190a270333ace5b9202a3f4cebf11b81bb01

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

000000000000000000000000738ebf387a0ce0eb46b0ef8fa5dea2eae6b1df51000000000000000000000000b57dd5c265dbb13ca014f2332069e90cd0e22e65000000000000000000000000f50225a84382c74cbdea10b0c176f71fc3de0c4d0000000000000000000000007737fd30535c69545deeea54ab8dd590ccaebd3c0000000000000000000000005e84190a270333ace5b9202a3f4cebf11b81bb01

-----Decoded View---------------
Arg [0] : dvmFactory (address): 0x738ebf387a0ce0eb46b0ef8fa5dea2eae6b1df51
Arg [1] : dppFactory (address): 0xb57dd5c265dbb13ca014f2332069e90cd0e22e65
Arg [2] : weth (address): 0xf50225a84382c74cbdea10b0c176f71fc3de0c4d
Arg [3] : dodoApproveProxy (address): 0x7737fd30535c69545deeea54ab8dd590ccaebd3c
Arg [4] : dodoSellHelper (address): 0x5e84190a270333ace5b9202a3f4cebf11b81bb01

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000738ebf387a0ce0eb46b0ef8fa5dea2eae6b1df51
Arg [1] : 000000000000000000000000b57dd5c265dbb13ca014f2332069e90cd0e22e65
Arg [2] : 000000000000000000000000f50225a84382c74cbdea10b0c176f71fc3de0c4d
Arg [3] : 0000000000000000000000007737fd30535c69545deeea54ab8dd590ccaebd3c
Arg [4] : 0000000000000000000000005e84190a270333ace5b9202a3f4cebf11b81bb01


Deployed ByteCode Sourcemap

32154:20850:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9855:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9855:127:0;-1:-1:-1;;;;;9855:127:0;;:::i;32440:21::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32440:21:0;;;;;;;;;;;;;;38366:1270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38366:1270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47996:2378::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47996:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47996:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;47996:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47996:2378:0;;-1:-1:-1;;47996:2378:0;;;-1:-1:-1;;;47996:2378:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39644:1391;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39644:1391:0;;;;;;;;;;;;;;;-1:-1:-1;;;39644:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39644:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39644:1391:0;;;;;;;;-1:-1:-1;39644:1391:0;;-1:-1:-1;;;;;39644:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39644:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39644:1391:0;;-1:-1:-1;;39644:1391:0;;;;;-1:-1:-1;;;39644:1391:0;;;;;;;;;;;;;;:::i;9222:22::-;;;;;;;;;;;;;:::i;42784:1716::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42784:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42784:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42784:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42784:1716:0;;-1:-1:-1;;42784:1716:0;;;-1:-1:-1;;;42784:1716:0;;;;;;;;;;;:::i;33808:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33808:119:0;-1:-1:-1;;;;;33808:119:0;;:::i;10161:228::-;;;;;;;;;;;;;:::i;41084:1692::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41084:1692:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41084:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41084:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41084:1692:0;;-1:-1:-1;;41084:1692:0;;;-1:-1:-1;;;41084:1692:0;;;;;;;;;;;:::i;46252:1736::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46252:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46252:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46252:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46252:1736:0;;-1:-1:-1;;;;46252:1736:0;;;;;-1:-1:-1;46252:1736:0;;;;:::i;35542:1465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35542:1465:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;32570:38;;;;;;;;;;;;;:::i;32660:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32660:46:0;-1:-1:-1;;;;;32660:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;9251:26;;;;;;;;;;;;;:::i;34010:1524::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34010:1524:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;34010:1524:0;;;;;;;;;;;;;;;;;;;;;50830:1214;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50830:1214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32520:43;;;;;;;;;;;;;:::i;32615:38::-;;;;;;;;;;;;;:::i;33586:91::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33586:91:0;-1:-1:-1;;;;;33586:91:0;;:::i;50444:376::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;50444:376:0;;;;;;;;;;;;;;;;;;;;:::i;33685:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33685:115:0;-1:-1:-1;;;;;33685:115:0;;:::i;32468:45::-;;;;;;;;;;;;;:::i;9990:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9990:163:0;-1:-1:-1;;;;;9990:163:0;;:::i;44508:1736::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44508:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44508:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44508:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44508:1736:0;;-1:-1:-1;;44508:1736:0;;;-1:-1:-1;;;44508:1736:0;;;;;;;;;;;:::i;9855:127::-;9644:13;;-1:-1:-1;;;9644:13:0;;;;9643:14;9635:43;;;;;-1:-1:-1;;;9635:43:0;;;;;;;;;;;;-1:-1:-1;;;9635:43:0;;;;;;;;;;;;;;;9941:4:::1;9925:20:::0;;-1:-1:-1;;;;9925:20:0::1;-1:-1:-1::0;;;9925:20:0::1;::::0;;;9956:18;;-1:-1:-1;;;;;9956:18:0;;::::1;9925:20;9956:18;-1:-1:-1::0;;;;;;9956:18:0;;::::1;::::0;;;::::1;::::0;;9855:127::o;32440:21::-;;;-1:-1:-1;;;;;32440:21:0;;:::o;38366:1270::-;38774:22;31626:9;;;;31625:10;31617:32;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;;;;31660:9;:16;;-1:-1:-1;;31660:16:0;31672:4;31660:16;;;38746:8;33048:15:::1;33036:27:::0;::::1;;33028:62;;;::::0;;-1:-1:-1;;;33028:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;::::1;;38839:13:::2;-1:-1:-1::0;;;;;38831:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;38831:46:0;;-1:-1:-1;38911:9:0;38953:10;38974:91:::2;38983:10;38831:46:::0;38911:9;39023:12;-1:-1:-1;;;;;39037:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39037:27:0::2;38974:8;:91::i;:::-;39076:170;39099:10;39124:14:::0;39153:11;39179:13;-1:-1:-1;;;;;39207:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39207:28:0::2;39076:8;:170::i;:::-;-1:-1:-1::0;;;;;39263:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39263:27:0::2;39259:52;;;39305:6;::::0;-1:-1:-1;;;;;39305:6:0::2;::::0;-1:-1:-1;39259:52:0::2;-1:-1:-1::0;;;;;39326:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39326:28:0::2;39322:54;;;-1:-1:-1::0;39370:6:0::2;::::0;-1:-1:-1;;;;;39370:6:0::2;39322:54;39389:239;::::0;;-1:-1:-1;;;39389:239:0;;-1:-1:-1;;;;;39389:239:0;;::::2;;::::0;::::2;::::0;39475:10:::2;39389:239:::0;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;39397:13:::2;39389:42:::0;;::::2;::::0;::::2;::::0;:239;;;;;-1:-1:-1;;39389:239:0;;;;;;;;-1:-1:-1;39389:42:0;:239;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;31711:5:0;31699:17;;-1:-1:-1;;31699:17:0;;;-1:-1:-1;38366:1270:0;;;-1:-1:-1;;;;;;;;;;;;;38366:1270:0:o;47996:2378::-;48356:20;48328:8;33048:15;33036:8;:27;;33028:62;;;;;-1:-1:-1;;;33028:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;;;48421:1:::1;48402:9;:16;:20;48394:59;;;::::0;;-1:-1:-1;;;48394:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;48394:59:0;;;;;;;;;;;;;::::1;;48490:1;48472:15;:19;48464:65;;;;-1:-1:-1::0;;;48464:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48573:9:::0;48612:7;48640:93:::1;48649:10;48669:4;48573:9:::0;48688:15;-1:-1:-1;;;;;48705:27:0;::::1;-1:-1:-1::0;;;;;;;;;;;48705:27:0::1;48640:8;:93::i;:::-;48751:9;48746:1070;48770:9;:16;48766:1;:20;48746:1070;;;48808:19;48830:9;48840:1;48830:12;;;;;;;;;;;;;;48808:34;;48861:10;48874:1;48861:14;48879:1;48861:19;48857:905;;;48901:19;48931:11;-1:-1:-1::0;;;;;48923:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48923:35:0;48999:44:::1;::::0;;-1:-1:-1;;;48999:44:0;;49037:4:::1;48999:44;::::0;::::1;::::0;;;48923:35;;-1:-1:-1;48977:19:0::1;::::0;-1:-1:-1;;;;;48999:29:0;::::1;::::0;::::1;::::0;:44;;;;;48923:35:::1;::::0;48999:44;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48999:44:0;;-1:-1:-1;49062:65:0::1;-1:-1:-1::0;;;;;49062:39:0;::::1;49102:11:::0;48999:44;49062:65:::1;:39;:65;:::i;:::-;49154:11;-1:-1:-1::0;;;;;49146:34:0::1;;49181:11;49194:1;49146:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;48857:905:0::1;::::0;-1:-1:-1;;;48857:905:0::1;;49241:20;49272:11;-1:-1:-1::0;;;;;49264:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49264:36:0;49341:45:::1;::::0;;-1:-1:-1;;;49341:45:0;;49380:4:::1;49341:45;::::0;::::1;::::0;;;49264:36;;-1:-1:-1;49319:19:0::1;::::0;-1:-1:-1;;;;;49341:30:0;::::1;::::0;::::1;::::0;:45;;;;;49264:36:::1;::::0;49341:45;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49341:45:0;;-1:-1:-1;49405:66:0::1;-1:-1:-1::0;;;;;49405:40:0;::::1;49446:11:::0;49341:45;49405:66:::1;:40;:66;:::i;:::-;49517:142;::::0;;-1:-1:-1;;;49517:142:0;;-1:-1:-1;;;;;49517:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;49490:24:::1;::::0;49533:18:::1;49517:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49517:142:0;49678:68:::1;::::0;;-1:-1:-1;;;49678:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;49678:68:0;;;;;;;;49517:142;;-1:-1:-1;;;;;;49678:33:0;::::1;::::0;::::1;::::0;:68;;;;;49517:142:::1;::::0;49678:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;48857:905:0::1;-1:-1:-1::0;49803:1:0::1;49789:15:::0;;::::1;::::0;48788:3:::1;48746:1070;;;-1:-1:-1::0;;;;;;49842:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;49842:25:0::1;49838:256;;;49905:6;::::0;49899:38:::1;::::0;;-1:-1:-1;;;49899:38:0;;49931:4:::1;49899:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;49905:6:0;;::::1;::::0;49899:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;49905:6;49899:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49899:38:0;49958:6:::1;::::0;49952:36:::1;::::0;;-1:-1:-1;;;49952:36:0;;::::1;::::0;::::1;::::0;;;;;49899:38;;-1:-1:-1;;;;;;49958:6:0;;::::1;::::0;49952:22:::1;::::0;:36;;;;;49958:6:::1;::::0;49952:36;;;;;;;;49958:6;;49952:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49838:256;;;50036:46;-1:-1:-1::0;;;;;50036:31:0;::::1;50076:4;50036:46;:31;:46;:::i;:::-;50021:61;;49838:256;50138:15;50122:12;:31;;50114:86;;;;-1:-1:-1::0;;;50114:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50211:60;-1:-1:-1::0;;;;;50211:34:0;::::1;50246:10;50258:12:::0;50211:60:::1;:34;:60;:::i;:::-;50289:77;::::0;;-1:-1:-1;;;;;50289:77:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;50324:10:::1;50289:77:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;50289:77:0;;;;;;;::::1;33101:1;;47996:2378:::0;;;;;;;;;;;:::o;39644:1391::-;31626:9;;;;31625:10;31617:32;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;;;;31660:9;:16;;-1:-1:-1;;31660:16:0;31672:4;31660:16;;;40149:8;33048:15:::1;33036:27:::0;::::1;;33028:62;;;::::0;;-1:-1:-1;;;33028:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;::::1;;40170:170:::2;40193:10;40218;40251;-1:-1:-1::0;;;;;40243:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40243:34:0;40292:13;;:10;;40303:1:::2;::::0;40292:13:::2;;;;;;;;;;40320:4;:9;;40328:1;40320:9;40170:8;:170::i;:::-;40351:171;40374:10;40399;40432;-1:-1:-1::0;;;;;40424:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40424:35:0;40474:13;;:10;;40485:1:::2;::::0;40474:13;::::2;;;;;;;;;;;40502:4;:9;;40510:1;40502:9;40351:8;:171::i;:::-;40559:10;-1:-1:-1::0;;;;;40551:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40551:29:0;40627:12;;-1:-1:-1;;;;;40543:44:0;;::::2;::::0;::::2;::::0;40602:10:::2;::::0;40627:9;;40637:1:::2;::::0;40627:12:::2;;;;;;;;;;40654:9;40664:1;40654:12;;;;;;;;;;;;;;40681:9;40691:1;40681:12;;;;;;;;;;;;;;40708:10;40719:1;40708:13;;;;;;;;;;;;;;40736:10;40747:1;40736:13;;;;;;;;;;;;;;40764:14;40793:15;40543:276;;;;;;;;;;;;;-1:-1:-1::0;;;;;40543:276:0::2;-1:-1:-1::0;;;;;40543:276:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40543:276:0;40535:301:::2;;;::::0;;-1:-1:-1;;;40535:301:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40535:301:0;;;;;;;;;;;;;::::2;;40849:83;40859:10;40879;-1:-1:-1::0;;;;;40871:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40871:34:0;40907:13;;:10;;40918:1:::2;::::0;40907:13;::::2;;;;;;;;;;;40922:4;:9;;40930:1;40922:9;40849;:83::i;:::-;40943:84;40953:10;40973;-1:-1:-1::0;;;;;40965:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40965:35:0;41002:13;;:10;;41013:1:::2;::::0;41002:13;::::2;;;;;;;;;;;41017:4;:9;;41025:1;41017:9;40943;:84::i;:::-;-1:-1:-1::0;;31711:5:0;31699:17;;-1:-1:-1;;31699:17:0;;;-1:-1:-1;;;;;;39644:1391:0:o;9222:22::-;;;;;;-1:-1:-1;;;;;9222:22:0;;:::o;42784:1716::-;43111:20;43083:8;33048:15;33036:8;:27;;33028:62;;;;;-1:-1:-1;;;33028:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;;;43176:1:::1;43157:9;:16;:20;43149:59;;;::::0;;-1:-1:-1;;;43149:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43149:59:0;;;;;;;;;;;;;::::1;;43245:1;43227:15;:19;43219:65;;;;-1:-1:-1::0;;;43219:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43323:20;-1:-1:-1::0;;;;;43305:51:0::1;;43357:9;43368:10;43380:9;43390:1;43380:12;;;;;;;;;;;;;;43394:15;43305:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;43305:105:0::1;-1:-1:-1::0;;;;;43305:105:0::1;;;;;;-1:-1:-1::0;;;;;43305:105:0::1;-1:-1:-1::0;;;;;43305:105:0::1;;;;;;-1:-1:-1::0;;;;;43305:105:0::1;-1:-1:-1::0;;;;;43305:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43428:9:0::1;::::0;-1:-1:-1;;;43423:643:0::1;43447:9;:16;43443:1;:20;43423:643;;;43513:1;43494:9;:16;:20;43489:1;:25;43485:527;;;43552:1;43539:14:::0;::::1;43535:208;;43591:9;43601:1;43591:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43583:30:0::1;;43622:4;43583:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;43583:45:0::1;-1:-1:-1::0;;;;;43583:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43535:208:0::1;::::0;-1:-1:-1;43535:208:0::1;;43685:9;43695:1;43685:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43677:31:0::1;;43717:4;43677:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;43677:46:0::1;-1:-1:-1::0;;;;;43677:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;43535:208:0::1;43485:527;;;43800:1;43787:14:::0;::::1;43783:214;;43839:9;43849:1;43839:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43831:30:0::1;;43862:9;43872:1;43876;43872:5;43862:16;;;;;;;;;;;;;;43831:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;43831:48:0::1;-1:-1:-1::0;;;;;43831:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;43783:214;43936:9;43946:1;43936:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43928:31:0::1;;43960:9;43970:1;43974;43970:5;43960:16;;;;;;;;;;;;;;43928:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;43928:49:0::1;-1:-1:-1::0;;;;;43928:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;43783:214:0::1;44053:1;44039:15:::0;;::::1;::::0;43465:3:::1;43423:643;;;-1:-1:-1::0;44097:6:0::1;::::0;44091:38:::1;::::0;;-1:-1:-1;;;44091:38:0;;44123:4:::1;44091:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;44097:6:0;;::::1;::::0;44091:23:::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;44097:6;44091:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44091:38:0;;-1:-1:-1;44148:31:0;;::::1;;44140:86;;;;-1:-1:-1::0;;;44140:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44243:6;::::0;44237:36:::1;::::0;;-1:-1:-1;;;44237:36:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;44243:6:0;;::::1;::::0;44237:22:::1;::::0;:36;;;;;44243:6:::1;::::0;44237:36;;;;;;;;44243:6;;44237:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44284:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;44284:33:0;::::1;;;::::0;-1:-1:-1;44304:12:0;;44284:33:::1;::::0;;;44304:12;44284:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44335:157:0::1;::::0;;-1:-1:-1;;;;;44335:157:0;::::1;::::0;;-1:-1:-1;;;;;;;;;;;44335:157:0::1;::::0;::::1;::::0;44414:10:::1;44335:157:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44335:157:0;;;;;;;::::1;42784:1716:::0;;;;;;;;;;:::o;33808:119::-;9760:7;;;;;-1:-1:-1;;;;;9760:7:0;9746:10;:21;9738:43;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33884:27:0::1;33914:5;33884:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;33884:35:0::1;::::0;;33808:119::o;10161:228::-;10227:11;;-1:-1:-1;;;;;10227:11:0;10213:10;:25;10205:51;;;;;-1:-1:-1;;;10205:51:0;;;;;;;;;;;;-1:-1:-1;;;10205:51:0;;;;;;;;;;;;;;;10302:11;;;10293:7;;10272:42;;-1:-1:-1;;;;;10302:11:0;;;;;10293:7;;;;;;;10272:42;;;10335:11;;;;10325:21;;-1:-1:-1;;;;;;10325:21:0;10335:11;-1:-1:-1;;;;;10335:11:0;;10325:21;;;;-1:-1:-1;;;;;;10357:24:0;;;10161:228::o;41084:1692::-;41392:20;41364:8;33048:15;33036:8;:27;;33028:62;;;;;-1:-1:-1;;;33028:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;;;41457:1:::1;41438:9;:16;:20;41430:59;;;::::0;;-1:-1:-1;;;41430:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41430:59:0;;;;;;;;;;;;;::::1;;41526:1;41508:15;:19;41500:65;;;;-1:-1:-1::0;;;41500:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41617:37;::::0;;-1:-1:-1;;;41617:37:0;;41643:10:::1;41617:37;::::0;::::1;::::0;;;41586:28:::1;::::0;-1:-1:-1;;;;;41617:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41617:37:0;41671:6:::1;::::0;41665:41:::1;::::0;;-1:-1:-1;;;41665:41:0;;;;41617:37;;-1:-1:-1;;;;;;41671:6:0;;::::1;::::0;41665:21:::1;::::0;41694:9:::1;::::0;41665:41:::1;::::0;;::::1;::::0;41671:6:::1;::::0;41665:41;;;;;;;41694:9;41671:6;41665:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41723:6:0::1;::::0;41740:12;;-1:-1:-1;;;;;41723:6:0;;::::1;::::0;-1:-1:-1;41717:22:0::1;::::0;-1:-1:-1;41740:9:0;;-1:-1:-1;41723:6:0::1;::::0;41740:12:::1;;;;;;;;;;41754:9;41717:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;41717:47:0::1;-1:-1:-1::0;;;;;41717:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41782:9:0::1;::::0;-1:-1:-1;41777:637:0::1;41801:9;:16;41797:1;:20;41777:637;;;41867:1;41848:9;:16;:20;41843:1;:25;41839:521;;;41906:1;41893:14:::0;::::1;41889:202;;41945:9;41955:1;41945:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;41937:30:0::1;;41968:10;41937:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;41937:42:0::1;-1:-1:-1::0;;;;;41937:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41889:202:0::1;::::0;-1:-1:-1;41889:202:0::1;;42036:9;42046:1;42036:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42028:31:0::1;;42060:10;42028:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;42028:43:0::1;-1:-1:-1::0;;;;;42028:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;41889:202:0::1;41839:521;;;42148:1;42135:14:::0;::::1;42131:214;;42187:9;42197:1;42187:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42179:30:0::1;;42210:9;42220:1;42224;42220:5;42210:16;;;;;;;;;;;;;;42179:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;42179:48:0::1;-1:-1:-1::0;;;;;42179:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;42131:214;42284:9;42294:1;42284:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42276:31:0::1;;42308:9;42318:1;42322;42318:5;42308:16;;;;;;;;;;;;;;42276:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;42276:49:0::1;-1:-1:-1::0;;;;;42276:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42131:214:0::1;42401:1;42387:15:::0;;::::1;::::0;41819:3:::1;41777:637;;;-1:-1:-1::0;42441:37:0::1;::::0;;-1:-1:-1;;;42441:37:0;;42467:10:::1;42441:37;::::0;::::1;::::0;;;:63:::1;::::0;42483:20;;-1:-1:-1;;;;;42441:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42441:37:0;;:63:::1;:41;:63;:::i;:::-;42426:78;;42539:15;42523:12;:31;;42515:86;;;;-1:-1:-1::0;;;42515:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42619:149;::::0;;-1:-1:-1;;;;;;;;;;;42619:149:0;;-1:-1:-1;;;;;42619:149:0;::::1;;::::0;::::1;::::0;42696:10:::1;42619:149:::0;;;;42721:9:::1;42619:149:::0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42619:149:0;;;;;;;::::1;33101:1;41084:1692:::0;;;;;;;;;:::o;46252:1736::-;46647:20;46619:8;33048:15;33036:8;:27;;33028:62;;;;;-1:-1:-1;;;33028:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;;;46711:1:::1;46693:15;:19;46685:65;;;;-1:-1:-1::0;;;46685:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46771:28;46802:46;-1:-1:-1::0;;;;;46802:34:0;::::1;46837:10;46802:46;:34;:46;:::i;:::-;46771:77:::0;-1:-1:-1;;;;;;46863:26:0;::::1;-1:-1:-1::0;;;;;;;;;;;46863:26:0::1;46859:332;;46906:189;::::0;;-1:-1:-1;;;46906:189:0;;-1:-1:-1;;;;;46906:189:0;;::::1;;::::0;::::1;::::0;47004:10:::1;46906:189:::0;;;;47041:4:::1;46906:189:::0;;;;;;;;;;;;46924:20:::1;46906:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;46906:189:0;;;;;;;;-1:-1:-1;46906:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47110:69:0::1;::::0;-1:-1:-1;;;;;;;;47110:37:0;::::1;47148:13:::0;47163:15;47110:37:::1;:69::i;:::-;-1:-1:-1::0;;;;;47211:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;47203:75;;;;-1:-1:-1::0;;;47203:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47290:12;-1:-1:-1::0;;;;;47308:15:0;;::::1;::::0;47331:26;::::1;-1:-1:-1::0;;;;;;;;;;;47331:26:0::1;:42;;47372:1;47331:42;;;47360:9;47331:42;47375:14;47308:82;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;47308:82:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47289:101;;;47411:7;47403:65;;;;-1:-1:-1::0;;;47403:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47481:133;47529:10;47554:49;-1:-1:-1::0;;;;;47554:34:0;::::1;47597:4;47554:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;47481:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;47642:72;47693:20:::0;47642:46:::1;-1:-1:-1::0;;;;;47642:34:0;::::1;47677:10;47642:46;:34;:46;:::i;:::-;:50:::0;:72:::1;:50;:72;:::i;:::-;47627:87;;47749:15;47733:12;:31;;47725:86;;;;-1:-1:-1::0;;;47725:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;47856:9:0::1;47880:7;47902:10;47927:15;47957:12;47829:151;;;;-1:-1:-1::0;;;;;47829:151:0::1;-1:-1:-1::0;;;;;47829:151:0::1;;;;;;-1:-1:-1::0;;;;;47829:151:0::1;-1:-1:-1::0;;;;;47829:151:0::1;;;;;;-1:-1:-1::0;;;;;47829:151:0::1;-1:-1:-1::0;;;;;47829:151:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33101:1;;46252:1736:::0;;;;;;;;;;;;:::o;35542:1465::-;35966:14;31626:9;;35966:14;;;;31626:9;;31625:10;31617:32;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;;;;31660:9;:16;;-1:-1:-1;;31660:16:0;31672:4;31660:16;;;35924:8;33048:15:::1;33036:27:::0;::::1;;33028:62;;;::::0;;-1:-1:-1;;;33028:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;::::1;;36110:10:::0;36179:101:::2;36110:10:::0;36229:12;36256:13;36179:16:::2;:101::i;:::-;36131:149:::0;;-1:-1:-1;36131:149:0;-1:-1:-1;36313:37:0;;::::2;::::0;::::2;::::0;:80:::2;;;36379:14;36354:21;:39;;36313:80;36291:173;;;;-1:-1:-1::0;;;36291:173:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36477:89;36486:10;36498:4;36512;-1:-1:-1::0;;;;;36504:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36504:28:0;36534:20;36564:1:::2;36556:9;::::0;::::2;;36477:8;:89::i;:::-;36577:91;36586:10;36598:4;36612;-1:-1:-1::0;;;;;36604:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36604:29:0;36635:21;36666:1:::2;36658:9;::::0;::::2;;36577:8;:91::i;:::-;36704:35;::::0;;-1:-1:-1;;;36704:35:0;;36728:10:::2;36704:35;::::0;::::2;::::0;;;-1:-1:-1;;;;;36704:23:0;::::2;::::0;::::2;::::0;:35;;;;;::::2;::::0;;;;;;;;-1:-1:-1;36704:23:0;:35;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36704:35:0;;-1:-1:-1;36790:1:0::2;36782:9;::::0;::::2;;:45:::0;::::2;;;;36807:20;36795:9;:32;36782:45;36778:104;;;36829:53;::::0;:10:::2;::::0;36849:9:::2;:32:::0;;::::2;36829:53:::0;::::2;;;::::0;::::2;::::0;;;36849:32;36829:10;:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;36778:104;36897:4;:9;;36905:1;36897:9;:46;;;;;36922:21;36910:9;:33;36897:46;36893:106;;;36945:54;::::0;:10:::2;::::0;36965:9:::2;:33:::0;;::::2;36945:54:::0;::::2;;;::::0;::::2;::::0;;;36965:33;36945:10;:54;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;36893:106;-1:-1:-1::0;;31711:5:0;31699:17;;-1:-1:-1;;31699:17:0;;;35542:1465;;;;-1:-1:-1;35542:1465:0;;-1:-1:-1;35542:1465:0;-1:-1:-1;;;;;35542:1465:0:o;32570:38::-;;;:::o;32660:46::-;;;;;;;;;;;;;;;:::o;9251:26::-;;;-1:-1:-1;;;;;9251:26:0;;:::o;34010:1524::-;34421:25;31626:9;;34421:25;;31626:9;;31625:10;31617:32;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;;;;31660:9;:16;;-1:-1:-1;;31660:16:0;31672:4;31660:16;;;34393:8;33048:15:::1;33036:27:::0;::::1;;33028:62;;;::::0;;-1:-1:-1;;;33028:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;::::1;;34495:18:::2;-1:-1:-1::0;;;;;34516:26:0;::::2;-1:-1:-1::0;;;;;;;;;;;34516:26:0::2;:47;;34554:9;34516:47;;;34545:6;::::0;-1:-1:-1;;;;;34545:6:0::2;34516:47;34495:68:::0;-1:-1:-1;34578:19:0::2;-1:-1:-1::0;;;;;34600:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;34600:27:0::2;:49;;34639:10;34600:49;;;34630:6;::::0;-1:-1:-1;;;;;34630:6:0::2;34600:49;34684:218;::::0;;-1:-1:-1;;;34684:218:0;;-1:-1:-1;;;;;34684:218:0;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;;;-1:-1:-1;34692:13:0::2;34684:47:::0;;::::2;::::0;::::2;::::0;:218;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;34684:47:0;:218;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34684:218:0;;-1:-1:-1;34962:9:0;;-1:-1:-1;35008:10:0;;-1:-1:-1;35033:194:0::2;35060:10;34684:218:::0;34962:9;35154:12;-1:-1:-1;;;;;35185:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;35185:27:0::2;35033:8;:194::i;:::-;35242:197;35269:10;35298:17:::0;35334:11;35364:13;-1:-1:-1;;;;;35396:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;35396:28:0::2;35242:8;:197::i;:::-;-1:-1:-1::0;;35478:48:0::2;::::0;;-1:-1:-1;;;35478:48:0;;35515:10:::2;35478:48;::::0;::::2;::::0;;;-1:-1:-1;;;;;35478:36:0;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;-1:-1:-1;35478:36:0;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35478:48:0;31711:5;31699:17;;-1:-1:-1;;31699:17:0;;;34010:1524;;35478:48;;-1:-1:-1;34010:1524:0;;-1:-1:-1;;;;;;;;;;34010:1524:0:o;50830:1214::-;51175:18;31626:9;;51175:18;;31626:9;;31625:10;31617:32;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;;;;31660:9;:16;;-1:-1:-1;;31660:16:0;31672:4;31660:16;;;51157:8;33048:15:::1;33036:27:::0;::::1;;33028:62;;;::::0;;-1:-1:-1;;;33028:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;::::1;;51227:18:::2;51256:4;-1:-1:-1::0;;;;;51248:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;51248:28:0;51309:29:::2;::::0;;-1:-1:-1;;;51309:29:0;;;;51248:28;;-1:-1:-1;51287:19:0::2;::::0;-1:-1:-1;;;;;51309:27:0;::::2;::::0;::::2;::::0;:29:::2;::::0;;::::2;::::0;51248:28:::2;::::0;51309:29;;;;;;;:27;:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;51309:29:0;;-1:-1:-1;51359:70:0::2;51368:10;51388:4;51395:10:::0;51407;51427:1:::2;51419:9;::::0;::::2;;51359:8;:70::i;:::-;51440:72;51449:10;51469:4;51476:11;51489;51502:4;:9;;51510:1;51502:9;51440:8;:72::i;:::-;51538:14:::0;;51535:181:::2;;51569:56;-1:-1:-1::0;;;;;51569:38:0;::::2;51608:4:::0;51614:10;51569:56:::2;:38;:56;:::i;:::-;51653:51;::::0;;-1:-1:-1;;;51653:51:0;;51681:10:::2;51653:51;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;51653:27:0;::::2;::::0;::::2;::::0;:51;;;;;::::2;::::0;;;;;;;;-1:-1:-1;51653:27:0;:51;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;51653:51:0;;-1:-1:-1;51535:181:0::2;51729:15:::0;;51726:187:::2;;51761:58;-1:-1:-1::0;;;;;51761:39:0;::::2;51801:4:::0;51807:11;51761:58:::2;:39;:58;:::i;:::-;51848:53;::::0;;-1:-1:-1;;;51848:53:0;;51877:10:::2;51848:53;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;51848:28:0;::::2;::::0;::::2;::::0;:53;;;;;::::2;::::0;;;;;;;;-1:-1:-1;51848:28:0;:53;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;51848:53:0;;-1:-1:-1;51726:187:0::2;51947:13;51933:10;:27;;:60;;;;;51979:14;51964:11;:29;;51933:60;51925:111;;;;-1:-1:-1::0;;;51925:111:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;31711:5:0;31699:17;;-1:-1:-1;;31699:17:0;;;-1:-1:-1;50830:1214:0;;;;-1:-1:-1;50830:1214:0;-1:-1:-1;;;;;;50830:1214:0:o;32520:43::-;;;:::o;32615:38::-;;;:::o;33586:91::-;9760:7;;;;;-1:-1:-1;;;;;9760:7:0;9746:10;:21;9738:43;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;;;;33653:6:::1;:16:::0;;-1:-1:-1;;;;;;33653:16:0::1;-1:-1:-1::0;;;;;33653:16:0;;;::::1;::::0;;;::::1;::::0;;33586:91::o;50444:376::-;31626:9;;;;31625:10;31617:32;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;-1:-1:-1;;;31617:32:0;;;;;;;;;;;;;;;31660:9;:16;;-1:-1:-1;;31660:16:0;31672:4;31660:16;;;50655:8;33048:15:::1;33036:27:::0;::::1;;33028:62;;;::::0;;-1:-1:-1;;;33028:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;::::1;;50676:91:::2;50685:10;50697:9;50716;-1:-1:-1::0;;;;;50708:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;50708:34:0;50744:11;50765:1:::2;50757:9;::::0;::::2;;50676:8;:91::i;:::-;50778:34;::::0;;-1:-1:-1;;;50778:34:0;;50801:10:::2;50778:34;::::0;::::2;::::0;;;-1:-1:-1;;;;;50778:22:0;::::2;::::0;::::2;::::0;:34;;;;;-1:-1:-1;;50778:34:0;;;;;;;-1:-1:-1;50778:22:0;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;31711:5:0;31699:17;;-1:-1:-1;;31699:17:0;;;-1:-1:-1;;;;;;;50444:376:0:o;33685:115::-;9760:7;;;;;-1:-1:-1;;;;;9760:7:0;9746:10;:21;9738:43;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33758:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;33758:34:0::1;33788:4;33758:34;::::0;;33685:115::o;32468:45::-;;;:::o;9990:163::-;9760:7;;;;;-1:-1:-1;;;;;9760:7:0;9746:10;:21;9738:43;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;-1:-1:-1;;;9738:43:0;;;;;;;;;;;;;;;10094:7:::1;::::0;;10068:44:::1;::::0;-1:-1:-1;;;;;10068:44:0;;::::1;::::0;10094:7:::1;::::0;;::::1;;::::0;10068:44:::1;::::0;::::1;10123:11;:22:::0;;-1:-1:-1;;;;;;10123:22:0::1;-1:-1:-1::0;;;;;10123:22:0;;;::::1;::::0;;;::::1;::::0;;9990:163::o;44508:1736::-;44863:20;44835:8;33048:15;33036:8;:27;;33028:62;;;;;-1:-1:-1;;;33028:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33028:62:0;;;;;;;;;;;;;;;44928:1:::1;44909:9;:16;:20;44901:59;;;::::0;;-1:-1:-1;;;44901:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;44901:59:0;;;;;;;;;;;;;::::1;;44997:1;44979:15;:19;44971:65;;;;-1:-1:-1::0;;;44971:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45080:37;::::0;;-1:-1:-1;;;45080:37:0;;45106:10:::1;45080:37;::::0;::::1;::::0;;;45049:28:::1;::::0;-1:-1:-1;;;;;45080:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45080:37:0;45203:12;;45080:37;;-1:-1:-1;;;;;;45146:20:0::1;45128:51;::::0;::::1;::::0;45180:9;;45191:10:::1;::::0;45203:9;;45213:1:::1;::::0;45203:12:::1;;;;;;;;;;45217:15;45128:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;45128:105:0::1;-1:-1:-1::0;;;;;45128:105:0::1;;;;;;-1:-1:-1::0;;;;;45128:105:0::1;-1:-1:-1::0;;;;;45128:105:0::1;;;;;;-1:-1:-1::0;;;;;45128:105:0::1;-1:-1:-1::0;;;;;45128:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45251:9:0::1;::::0;-1:-1:-1;;;45246:636:0::1;45270:9;:16;45266:1;:20;45246:636;;;45336:1;45317:9;:16;:20;45312:1;:25;45308:520;;;45375:1;45362:14:::0;::::1;45358:202;;45414:9;45424:1;45414:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45406:30:0::1;;45437:10;45406:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;45406:42:0::1;-1:-1:-1::0;;;;;45406:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45358:202:0::1;::::0;-1:-1:-1;45358:202:0::1;;45505:9;45515:1;45505:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45497:31:0::1;;45529:10;45497:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;45497:43:0::1;-1:-1:-1::0;;;;;45497:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45358:202:0::1;45308:520;;;45616:1;45604:13:::0;::::1;45600:213;;45655:9;45665:1;45655:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45647:30:0::1;;45678:9;45688:1;45692;45688:5;45678:16;;;;;;;;;;;;;;45647:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;45647:48:0::1;-1:-1:-1::0;;;;;45647:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;45600:213;45752:9;45762:1;45752:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45744:31:0::1;;45776:9;45786:1;45790;45786:5;45776:16;;;;;;;;;;;;;;45744:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;45744:49:0::1;-1:-1:-1::0;;;;;45744:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45600:213:0::1;45869:1;45855:15:::0;;::::1;::::0;45288:3:::1;45246:636;;;-1:-1:-1::0;45907:37:0::1;::::0;;-1:-1:-1;;;45907:37:0;;45933:10:::1;45907:37;::::0;::::1;::::0;;;:63:::1;::::0;45949:20;;-1:-1:-1;;;;;45907:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;:63;45892:78;;46005:15;45989:12;:31;;45981:86;;;;-1:-1:-1::0;;;45981:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46085:151;::::0;;-1:-1:-1;;;;;46085:151:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;46158:10:::1;46085:151:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46085:151:0;;;;;;;::::1;33101:1;44508:1736:::0;;;;;;;;;;;:::o;52058:495::-;52221:5;52217:329;;;52247:10;;52243:183;;52284:6;;;;;;;;;-1:-1:-1;;;;;52284:6:0;-1:-1:-1;;;;;52278:21:0;;52307:6;52278:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;52339:19:0;;52353:4;52339:19;;-1:-1:-1;52335:75:0;;52390:6;;52360:50;;-1:-1:-1;;;;;52390:6:0;52399:2;52403:6;52360:22;:50::i;:::-;52217:329;;;52458:76;;;-1:-1:-1;;;52458:76:0;;-1:-1:-1;;;;;52458:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52476:20;52458:51;;;;;;:76;;;;;-1:-1:-1;;52458:76:0;;;;;;;;-1:-1:-1;52458:51:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52217:329;52058:495;;;;;:::o;30321:374::-;30466:34;;;-1:-1:-1;;;30466:34:0;;30490:4;30466:34;;;;-1:-1:-1;;;;;30466:34:0;;;;;;;;;30446:17;;30466:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30466:34:0;;-1:-1:-1;30515:18:0;;;30511:177;;;30554:13;;30550:78;;30588:24;-1:-1:-1;;;;;30588:17:0;;30606:2;30610:1;30588:24;:17;:24;:::i;:::-;30642:34;-1:-1:-1;;;;;30642:17:0;;30660:2;-1:-1:-1;;30642:34:0;:17;:34;:::i;:::-;30321:374;;;;:::o;30939:129::-;31013:7;31040:5;-1:-1:-1;;;;;31040:15:0;;31056:3;31040:20;;;;;;;;;;;;;-1:-1:-1;;;;;31040:20:0;-1:-1:-1;;;;;31040:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31040:20:0;;-1:-1:-1;30939:129:0;;;;;:::o;29990:323::-;30125:10;;30121:185;;30156:12;30162:5;30156;:12::i;:::-;30152:143;;;30189:19;;-1:-1:-1;;;;;30189:11:0;;;:19;;;;;30201:6;;30189:19;;;;30201:6;30189:11;:19;;;;;;;;;;;;;;;;;;;;;30152:143;;;30249:30;-1:-1:-1;;;;;30249:18:0;;30268:2;30272:6;30249:30;:18;:30;:::i;:::-;29990:323;;;:::o;52561:440::-;52710:5;52706:288;;;52736:10;;52732:119;;52773:6;;52767:30;;;-1:-1:-1;;;52767:30:0;;;;;;;;;;-1:-1:-1;;;;;52773:6:0;;;;52767:22;;:30;;;;;52773:6;;52767:30;;;;;;;;52773:6;;52767:30;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52816:19:0;;-1:-1:-1;;;;;52816:11:0;;;-1:-1:-1;52816:19:0;;;;;-1:-1:-1;52828:6:0;;52816:19;;;;52828:6;52816:11;:19;;;;;;;;;;;;;;;;;;;;;52732:119;52706:288;;;52887:10;;52883:100;;52918:49;52948:5;52956:2;52960:6;52918:22;:49::i;13640:137::-;13698:7;13731:1;13726;:6;;13718:28;;;;;-1:-1:-1;;;13718:28:0;;;;;;;;;;;;-1:-1:-1;;;13718:28:0;;;;;;;;;;;;;;;-1:-1:-1;13764:5:0;;;13640:137::o;30703:228::-;30781:7;30805:12;30811:5;30805;:12::i;:::-;30801:123;;;-1:-1:-1;;;;;;30841:11:0;;;30834:18;;30801:123;30892:5;-1:-1:-1;;;;;30892:15:0;;30908:3;30892:20;;;;;;;;;;;;;-1:-1:-1;;;;;30892:20:0;-1:-1:-1;;;;;30892:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30892:20:0;;-1:-1:-1;30885:27:0;;37015:1276;37163:28;37193:29;37236:19;37257:20;37289:10;-1:-1:-1;;;;;37281:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37281:37:0;;;;;;;;;-1:-1:-1;37281:37:0;-1:-1:-1;37333:17:0;;:37;;;;-1:-1:-1;37354:16:0;;37333:37;37329:157;;;37410:12;37387:35;;37461:13;37437:37;;37329:157;37500:17;;:36;;;;;37535:1;37521:11;:15;37500:36;37496:144;;;37576:12;37553:35;;37627:1;37603:25;;37496:144;37669:1;37654:12;:16;:35;;;;;37688:1;37674:11;:15;37654:35;37650:634;;;37706:25;37734:47;37755:12;37769:11;37734:20;:47::i;:::-;37706:75;;37796:26;37825:49;37846:13;37861:12;37825:20;:49::i;:::-;37796:78;;37914:18;37893:17;:39;37889:384;;37976:12;37953:35;;38031:53;38052:12;38066:17;38031:20;:53::i;:::-;38007:77;;37889:384;;;38149:13;38125:37;;38204:53;38225:11;38238:18;38204:20;:53::i;:::-;38181:76;;37889:384;37650:634;;;37015:1276;;;;;;;;:::o;27109:211::-;27253:58;;;-1:-1:-1;;;;;27253:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27253:58:0;-1:-1:-1;;;27253:58:0;;;27226:86;;27246:5;;27226:19;:86::i;27621:670::-;28039:10;;;28038:62;;-1:-1:-1;28055:39:0;;;-1:-1:-1;;;28055:39:0;;28079:4;28055:39;;;;-1:-1:-1;;;;;28055:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28055:39:0;:44;28038:62;28016:166;;;;-1:-1:-1;;;28016:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28220:62;;;-1:-1:-1;;;;;28220:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28220:62:0;-1:-1:-1;;;28220:62:0;;;28193:90;;28213:5;;28193:19;:90::i;31076:104::-;-1:-1:-1;;;;;31152:20:0;;-1:-1:-1;;;;;;;;;;;31152:20:0;31076:104;;;:::o;14761:128::-;14829:7;14856:25;14879:1;14856:18;:6;14867;14856:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;:::-;14849:32;14761:128;-1:-1:-1;;;14761:128:0:o;14487:127::-;14555:7;14599:6;14582:13;:6;14593:1;14582:13;:10;:13;:::i;:::-;:24;;;;;;;14487:127;-1:-1:-1;;;14487:127:0:o;28682:1046::-;29342:12;29356:23;29391:5;-1:-1:-1;;;;;29383:19:0;29403:4;29383:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29383:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29341:67;;;;29427:7;29419:52;;;;;-1:-1:-1;;;29419:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29488:17;;:21;29484:237;;29643:10;29632:30;;;;;;;;;;;;;;;-1:-1:-1;29632:30:0;29624:85;;;;-1:-1:-1;;;29624:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12961:226;13019:7;13043:6;13039:47;;-1:-1:-1;13073:1:0;13066:8;;13039:47;13110:5;;;13114:1;13110;:5;:1;13134:5;;;;;:10;13126:32;;;;;-1:-1:-1;;;13126:32:0;;;;;;;;;;;;-1:-1:-1;;;13126:32:0;;;;;;;;;;;;;;13195:141;13253:7;13285:1;13281;:5;13273:32;;;;;-1:-1:-1;;;13273:32:0;;;;;;;;;;;;-1:-1:-1;;;13273:32:0;;;;;;;;;;;;;;;13327:1;13323;:5;;;

Swarm Source

ipfs://d5fe66f7dd41b77cb9e162fd9a8dd36299ad6d604e70d7c9f1bd1d18f2814d97
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.