Contract 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 2

 
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5b59b36ccf1d4eedd241a6b2d4c1f51866cbbb4f3335bc1dd6def45968981501Dodo Swap V2ETH ...203664782021-10-19 3:14:068 mins ago0xf8ace76775f250a166964c917f03637d2df26ae3 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e701,500 MATIC0.02075749
0xcbe564c2ff09239498007df45f60f25b9b9fb04c5dd4d7edbd1f2457b697402dDodo Swap V2Toke...203660132021-10-19 2:55:5627 mins ago0x45a360f4d9875e3008839a0d956c10788a7e0f32 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.00452727
0x69f234dd093fbfdcb8f07cbe5397590d459face71ace786acd227632fb74d5abDodo Swap V2ETH ...203660002021-10-19 2:55:3027 mins ago0x45a360f4d9875e3008839a0d956c10788a7e0f32 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e704 MATIC0.00479274
0x708ed6ff0ca1ca2393332a6942585e164701dba62a06dd4f8ffd5d3438122e4fExternal Swap203643272021-10-19 1:44:461 hr 38 mins ago0x4f5a399e294474eeb06a24ab436c8cfe3cd4e127 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.001585944
0x9ead9c74facbee6279692d865e317040fe1264c25796d23c2e8510fea7fc96cfExternal Swap203643022021-10-19 1:43:561 hr 39 mins ago0x0f887a00334bb6d996206c190b912cc6c0d33789 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.03685839
0xe8efde00e32b0524a28b08f10c03548a352117713e689700085df5092b482143External Swap203641912021-10-19 1:40:051 hr 42 mins ago0x4f5a399e294474eeb06a24ab436c8cfe3cd4e127 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.0095033425
0xe4ebf6858f1630cd7c49ce0d92fcd2586cc1c05ec4298228f5f522be17eec8c6External Swap203639652021-10-19 1:32:171 hr 50 mins ago0x4f5a399e294474eeb06a24ab436c8cfe3cd4e127 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.0901476
0x1537bb419e9a56dba08e6f82565b0afa3b85940bcd0584b6b37414e32d531db2Dodo Swap V1203639462021-10-19 1:31:391 hr 51 mins ago0x0f887a00334bb6d996206c190b912cc6c0d33789 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.00846552
0x772e4254b309b8dac4aa5eb1f8769b0aee13841e014892c31665e66c874ba5adExternal Swap203638732021-10-19 1:28:091 hr 54 mins ago0x2b828e4418f893c04b71e99be76b26a98c42f8d7 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.035322795
0xa9c9edf874036186de3bfe83061b3b270e6c118bde17bff5767ad781d869ee7aExternal Swap203638032021-10-19 1:24:371 hr 58 mins ago0x2b828e4418f893c04b71e99be76b26a98c42f8d7 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.02032605
0x7d041ca32184b69426c7b4e4c01b64b006f490c5c88d2f2f044a37fb2a0782b2External Swap203637202021-10-19 1:21:472 hrs 1 min ago0x2b828e4418f893c04b71e99be76b26a98c42f8d7 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.017069895
0xe92f094ef46a5ba2a7309e785b62a8950ecbbcc445027260e25b4193a5eca903External Swap203636802021-10-19 1:19:212 hrs 3 mins ago0x2b828e4418f893c04b71e99be76b26a98c42f8d7 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.02307168
0x9b1ad5b203e039456a23153e9711fbf54cd14394805978e3fd9c71c693f4e9a1External Swap203636582021-10-19 1:17:532 hrs 5 mins ago0x661cdd585b3660de913bcef5861033171ba40754 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e702 MATIC0.00943965
0x740a5b95c0d3b990125ea6c40934a09a84382eff5db580cd04134b7af5924906Dodo Swap V2Toke...203636322021-10-19 1:16:352 hrs 6 mins ago0xf8ace76775f250a166964c917f03637d2df26ae3 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.03664774
0xb8a770774e858df86d74846bb08392a566b7d6855959118ba1c7d082dd9cf30aDodo Swap V2Toke...203636092021-10-19 1:15:492 hrs 7 mins ago0xf8ace76775f250a166964c917f03637d2df26ae3 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.03664774
0x9873363b1d3aaf42c99625dece372fe24225b55a767e5e21cea7de1eced24bd9Dodo Swap V2Toke...203635832021-10-19 1:14:532 hrs 8 mins ago0xf8ace76775f250a166964c917f03637d2df26ae3 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.02071394
0x8d75be06df05a02b0c892155f7dbea65ba5c2477ee28db429222e8cdaed4223aDodo Swap V2Toke...203635532021-10-19 1:13:532 hrs 9 mins ago0xf8ace76775f250a166964c917f03637d2df26ae3 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.024060038
0xe7fddc258d23b6747f0304cfa6cc8565e465f54b560b49fc1715956a7f548789External Swap203632452021-10-19 1:00:332 hrs 22 mins ago0x4f5a399e294474eeb06a24ab436c8cfe3cd4e127 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.00955461
0x07343677c85a47b12812a41d5b9c0b8834397be96dc180562003f67191b0f540External Swap203630222021-10-19 0:50:522 hrs 32 mins ago0xec0a1e09ba4539db181523dbceb0a00cd63597de IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e7018 MATIC0.01233705
0x6a7cd9a0de1115fe0f3597ed159ec1bb72c3dfe9451a813bc90f3a1c619fe99eDodo Swap V2ETH ...203629072021-10-19 0:45:422 hrs 37 mins ago0x9a232918d6fbee281885773388f655926d025e51 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700.2 MATIC0.007025976324
0xf75c5cd4b54a1a7289d2e1f6376192ddd473f22901d2a5d9b5e49eb6f33eb1eaDodo Swap V2Toke...203628502021-10-19 0:42:482 hrs 40 mins ago0x9a232918d6fbee281885773388f655926d025e51 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.00408162
0x53c384d613023cff71d1f4441c9f6d083a748eb39cd01dd7c038b8c5d97a1f8bExternal Swap203627352021-10-19 0:38:502 hrs 44 mins ago0x36e272fa836115837b1dce51fbd8f273f7d839d3 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.01479928
0x89c010435ceb6434a92d40c18e1fcdd4160d3336c3c2f814c751d63196dcbf7aExternal Swap203625522021-10-19 0:32:312 hrs 50 mins ago0xf2470b7676d9700d0df08c0ac09e7fa9c7f2429a IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.00998682
0x91b044b9dac9e0d3c875a4d1aa0127e2fd32f55be3f77d29057b149a79b1aae4External Swap203624532021-10-19 0:29:082 hrs 53 mins ago0xf2470b7676d9700d0df08c0ac09e7fa9c7f2429a IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.00649542
0x0f3539f3959e32bbeac7b8545eea57a7e52a04624b5b32101b9d92c359988a2cExternal Swap203618832021-10-19 0:05:143 hrs 17 mins ago0x2b8fe2d7ef18e6ead6d32b6b0547dabfb251ad61 IN  0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e700 MATIC0.01451265
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xcc0f86272e95b780f9f8eea0f9991f5d1aec6abacdf1695e0581554180e38f3b203666042021-10-19 3:20:052 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token5 MATIC
0xcc0f86272e95b780f9f8eea0f9991f5d1aec6abacdf1695e0581554180e38f3b203666042021-10-19 3:20:052 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e705 MATIC
0x73c72f910ff59db42075b9f6276d3584d962aaf70d10eba85d515366b1bb6483203665992021-10-19 3:19:353 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token339.822623078157854384 MATIC
0x73c72f910ff59db42075b9f6276d3584d962aaf70d10eba85d515366b1bb6483203665992021-10-19 3:19:353 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70339.822623078157854384 MATIC
0x490afcbf274419710c2080c3c82f463c88926debe3d208d5d41d70a373d3fc53203665992021-10-19 3:19:353 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token332.612464840386940851 MATIC
0x490afcbf274419710c2080c3c82f463c88926debe3d208d5d41d70a373d3fc53203665992021-10-19 3:19:353 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70332.612464840386940851 MATIC
0x22300f91d6dcf9114d8d2047d4fa89891cd1f08fb80857fa419de14bbcd50ec6203665762021-10-19 3:18:134 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token700 MATIC
0x22300f91d6dcf9114d8d2047d4fa89891cd1f08fb80857fa419de14bbcd50ec6203665762021-10-19 3:18:134 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70700 MATIC
0x5730798ccf66f93025b61a4e0fb4eda601841cfbdc7a2a49818f33c890593baa203665762021-10-19 3:18:134 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token200 MATIC
0x5730798ccf66f93025b61a4e0fb4eda601841cfbdc7a2a49818f33c890593baa203665762021-10-19 3:18:134 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70200 MATIC
0x19644f2253f480e3968a2fee6a93cf908e4826d7e67583fcb27ad5b72dbafbea203665752021-10-19 3:18:114 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token477.303464444381392003 MATIC
0x19644f2253f480e3968a2fee6a93cf908e4826d7e67583fcb27ad5b72dbafbea203665752021-10-19 3:18:114 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70477.303464444381392003 MATIC
0xd246efbf189a5cb87512432b651d1576991508e5a5ac5cdaadd064f7ee5978b2203665622021-10-19 3:17:455 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token10 MATIC
0xd246efbf189a5cb87512432b651d1576991508e5a5ac5cdaadd064f7ee5978b2203665622021-10-19 3:17:455 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e7010 MATIC
0x44da7e3c486d37c21afe415a07d381aaac1cc4876b8e370902a99fe01dc6920b203665262021-10-19 3:15:427 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token17.045 MATIC
0x44da7e3c486d37c21afe415a07d381aaac1cc4876b8e370902a99fe01dc6920b203665262021-10-19 3:15:427 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e7017.045 MATIC
0xf52830fa624f9b3538bb0460abbd351592526398aaee7b05cce8e83163a0bae5203665242021-10-19 3:15:387 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token65 MATIC
0xf52830fa624f9b3538bb0460abbd351592526398aaee7b05cce8e83163a0bae5203665242021-10-19 3:15:387 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e7065 MATIC
0xb8d0f4cef82a68cf231eab54f42fb8dfef1f73e14d51883a240f70df3676a33c203665222021-10-19 3:15:347 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token200 MATIC
0xb8d0f4cef82a68cf231eab54f42fb8dfef1f73e14d51883a240f70df3676a33c203665222021-10-19 3:15:347 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70200 MATIC
0x2d57178fc518447dfef5c183f69aa1bcd0dc3bbc0e4e37861a157b109093f9ea203665062021-10-19 3:15:027 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token29.987209899449495357 MATIC
0x2d57178fc518447dfef5c183f69aa1bcd0dc3bbc0e4e37861a157b109093f9ea203665062021-10-19 3:15:027 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e7029.987209899449495357 MATIC
0x25253ea52f8a80ebecdef3d91c760601e7c19a10915867106274506303c52c73203665022021-10-19 3:14:548 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token524.353170852396022437 MATIC
0x25253ea52f8a80ebecdef3d91c760601e7c19a10915867106274506303c52c73203665022021-10-19 3:14:548 mins ago Paraswap v5: Augustus Swapper 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70524.353170852396022437 MATIC
0x319f513198102ab307cb1b0676a799c36fa061ae3ad822828b5268c1bdaa3f99203665022021-10-19 3:14:548 mins ago 0xa222e6a71d1a1dd5f279805fbe38d5329c1d0e70 Polygon: WMATIC Token443.302894363589884968 MATIC
[ 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 polygonscan.com on 2021-06-11
*/

// 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);

    function mixSwap(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory mixAdapters,
        address[] memory mixPairs,
        address[] memory assetTo,
        uint256 directions,
        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 immutable _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 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);
    }


    function mixSwap(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory mixAdapters,
        address[] memory mixPairs,
        address[] memory assetTo,
        uint256 directions,
        bool,
        uint256 deadLine
    ) external override payable judgeExpired(deadLine) returns (uint256 returnAmount) {
        require(mixPairs.length > 0, "DODOV2Proxy02: PAIRS_EMPTY");
        require(mixPairs.length == mixAdapters.length, "DODOV2Proxy02: PAIR_ADAPTER_NOT_MATCH");
        require(mixPairs.length == assetTo.length - 1, "DODOV2Proxy02: PAIR_ASSETTO_NOT_MATCH");
        require(minReturnAmount > 0, "DODOV2Proxy02: RETURN_AMOUNT_ZERO");

        address _fromToken = fromToken;
        address _toToken = toToken;
        uint256 _fromTokenAmount = fromTokenAmount;
        
        uint256 toTokenOriginBalance = IERC20(_toToken).universalBalanceOf(msg.sender);
        
        _deposit(msg.sender, assetTo[0], _fromToken, _fromTokenAmount, _fromToken == _ETH_ADDRESS_);

        for (uint256 i = 0; i < mixPairs.length; i++) {
            if (directions & 1 == 0) {
                IDODOAdapter(mixAdapters[i]).sellBase(assetTo[i + 1],mixPairs[i], "");
            } else {
                IDODOAdapter(mixAdapters[i]).sellQuote(assetTo[i + 1],mixPairs[i], "");
            }
            directions = directions >> 1;
        }

        if(_toToken == _ETH_ADDRESS_) {
            returnAmount = IWETH(_WETH_).balanceOf(address(this));
            IWETH(_WETH_).withdraw(returnAmount);
            msg.sender.transfer(returnAmount);
        }else {
            returnAmount = IERC20(_toToken).tokenBalanceOf(msg.sender).sub(toTokenOriginBalance);
        }

        require(returnAmount >= minReturnAmount, "DODOV2Proxy02: Return amount is not enough");

        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 Security Audit

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":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minReturnAmount","type":"uint256"},{"internalType":"address[]","name":"mixAdapters","type":"address[]"},{"internalType":"address[]","name":"mixPairs","type":"address[]"},{"internalType":"address[]","name":"assetTo","type":"address[]"},{"internalType":"uint256","name":"directions","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"deadLine","type":"uint256"}],"name":"mixSwap","outputs":[{"internalType":"uint256","name":"returnAmount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddr","type":"address"}],"name":"removeWhiteList","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"}]

61012060405234801561001157600080fd5b506040516200523838038062005238833981810160405260a081101561003657600080fd5b508051602082015160408301516060808501516080958601516001600160601b031995831b861660e05293821b85166101005291811b8416909452831b821660a05290911b1660c05260805160601c60a05160601c60c05160601c60e05160601c6101005160601c6150f76200014160003980610dde5280610f8c5280613c375250806135be52806137785250806113e45280613c13525080611c7f5280612fc75280613e4b528061406b52806145bc525080610d245280610ed45280610f18528061153852806115ce528061201c52806120d152806125e4528061267a52806129f05280612a5452806136c4528061370e52806144d0528061455852806147fa52506150f76000f3fe60806040526004361061016a5760003560e01c8063674d9422116100d1578063af1280b01161008a578063e7cd4a0411610064578063e7cd4a0414610b39578063eb99be1214610b6c578063f2fde38b14610b81578063f87dc1b714610bb457610171565b8063af1280b014610ad4578063b730d15014610ae9578063db70b5c714610afe57610171565b8063674d94221461091157806369e4e4171461097c5780636f9170f6146109915780638456db15146109d85780638b3bb089146109ed57806399882c8f14610a6e57610171565b80631e6d24c2116101235780631e6d24c2146104775780632042e5c21461054e57806323c38fa3146105815780634e71e0c8146107595780635028bb951461076e57806354bacd131461083157610171565b80630d009297146101735780630d4eec8f146101a65780630d9be500146101d75780630dd4ebd91461023557806312ff148d1461031b57806316048bc41461046257610171565b3661017157005b005b34801561017f57600080fd5b506101716004803603602081101561019657600080fd5b50356001600160a01b0316610c95565b3480156101b257600080fd5b506101bb610d22565b604080516001600160a01b039092168252519081900360200190f35b6101bb60048036036101208110156101ee57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135610d46565b610309600480360361010081101561024c57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561028b57600080fd5b82018360208201111561029d57600080fd5b803590602001918460208302840111600160201b831117156102be57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505082359350505060208101351515906040013561100a565b60408051918252519081900360200190f35b610171600480360360e081101561033157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561035b57600080fd5b82018360208201111561036d57600080fd5b803590602001918460208302840111600160201b8311171561038e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103dd57600080fd5b8201836020820111156103ef57600080fd5b803590602001918460208302840111600160201b8311171561041057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505060ff83351693505050602081013590604081013590606001356116fc565b34801561046e57600080fd5b506101bb611ba0565b34801561048357600080fd5b50610309600480360360e081101561049a57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b8111156104d057600080fd5b8201836020820111156104e257600080fd5b803590602001918460208302840111600160201b8311171561050357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135611bb4565b34801561055a57600080fd5b506101716004803603602081101561057157600080fd5b50356001600160a01b03166121d8565b610309600480360361014081101561059857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b8111156105d757600080fd5b8201836020820111156105e957600080fd5b803590602001918460208302840111600160201b8311171561060a57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460208302840111600160201b8311171561068c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156106db57600080fd5b8201836020820111156106ed57600080fd5b803590602001918460208302840111600160201b8311171561070e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612249565b34801561076557600080fd5b506101716127d0565b610309600480360360c081101561078457600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111600160201b831117156107e657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135612894565b610309600480360361012081101561084857600080fd5b6001600160a01b038235811692602081013582169260408201358316926060830135169160808101359160a0820135919081019060e0810160c0820135600160201b81111561089657600080fd5b8201836020820111156108a857600080fd5b803590602001918460018302840111600160201b831117156108c957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050505080351515915060200135612ed2565b61095e600480360360e081101561092757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356132b6565b60408051938452602084019290925282820152519081900360600190f35b34801561098857600080fd5b506101bb6135bc565b34801561099d57600080fd5b506109c4600480360360208110156109b457600080fd5b50356001600160a01b03166135e0565b604080519115158252519081900360200190f35b3480156109e457600080fd5b506101bb6135f5565b610a4b6004803603610120811015610a0457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e08101351515906101000135613604565b604080516001600160a01b03909316835260208301919091528051918290030190f35b610abb600480360360e0811015610a8457600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060ff60a0820135169060c001356138d6565b6040805192835260208301919091528051918290030190f35b348015610ae057600080fd5b506101bb613c11565b348015610af557600080fd5b506101bb613c35565b61017160048036036080811015610b1457600080fd5b506001600160a01b038135169060208101359060ff6040820135169060600135613c59565b348015610b4557600080fd5b5061017160048036036020811015610b5c57600080fd5b50356001600160a01b0316613dd5565b348015610b7857600080fd5b506101bb613e49565b348015610b8d57600080fd5b5061017160048036036020811015610ba457600080fd5b50356001600160a01b0316613e6d565b348015610bc057600080fd5b506103096004803603610100811015610bd857600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610c1757600080fd5b820183602082011115610c2957600080fd5b803590602001918460208302840111600160201b83111715610c4a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013515159060400135613f1d565b600154600160a01b900460ff1615610ce7576040805162461bcd60e51b815260206004820152601060248201526f1113d113d7d25392551250531256915160821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000805460ff1615610d8b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558142811015610ddc576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166309b8adb86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b505191508a8a610e8d3385848e6001600160a01b038216600080516020614fab833981519152146144c2565b610eb33385838d6001600160a01b038216600080516020614fab833981519152146144c2565b6001600160a01b038216600080516020614fab8339815191521415610ef6577f000000000000000000000000000000000000000000000000000000000000000091505b6001600160a01b038116600080516020614fab8339815191521415610f3857507f00000000000000000000000000000000000000000000000000000000000000005b6040805162caf77f60e51b81526001600160a01b03868116600483015233602483015284811660448301528381166064830152608482018c905260a482018a905260c482018b905288151560e483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163195eefe0916101048082019260009290919082900301818387803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b50506000805460ff1916905550939d9c50505050505050505050505050565b60008142811015611050576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611094576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b600087116110d35760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b89896110fb3330848d6001600160a01b038216600080516020614fab833981519152146144c2565b60005b88518110156114f857600089828151811061111557fe5b6020026020010151905088600116600014156112bd576000816001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d602081101561120857600080fd5b505190506112266001600160a01b038316848363ffffffff61462616565b826001600160a01b0316638dae73338260006040518363ffffffff1660e01b815260040180838152602001828152602001806020018281038252600081526020016020019350505050602060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b505050506040513d60208110156112b357600080fd5b506114eb92505050565b6000816001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b1580156112f857600080fd5b505afa15801561130c573d6000803e3d6000fd5b505050506040513d602081101561132257600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561137057600080fd5b505afa158015611384573d6000803e3d6000fd5b505050506040513d602081101561139a57600080fd5b505190506113b86001600160a01b038316848363ffffffff61462616565b6040805163ca19ebd960e01b81526001600160a01b0385811660048301526024820184905291516000927f0000000000000000000000000000000000000000000000000000000000000000169163ca19ebd9916044808301926020929190829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b50516040805163733e738360e11b815260048101839052602481018590526060604482015260006064820181905291519293506001600160a01b0387169263e67ce7069260a480840193602093929083900390910190829087803b1580156114bb57600080fd5b505af11580156114cf573d6000803e3d6000fd5b505050506040513d60208110156114e557600080fd5b50505050505b50600197881c97016110fe565b506001600160a01b038116600080516020614fab833981519152141561163357604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561157e57600080fd5b505afa158015611592573d6000803e3d6000fd5b505050506040513d60208110156115a857600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519195506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b15801561161657600080fd5b505af115801561162a573d6000803e3d6000fd5b5050505061164f565b61164c6001600160a01b0382163063ffffffff6146f016565b93505b8884101561168e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b6116a86001600160a01b038216338663ffffffff61477d16565b604080516001600160a01b038085168252831660208201523381830152606081018c9052608081018690529051600080516020614eea8339815191529181900360a00190a150505098975050505050505050565b60005460ff1615611740576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015611791576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b61181c33898a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d60208110156117f957600080fd5b505189518a9060009061180857fe5b60200260200101518960ff166001146144c2565b6118a933898a6001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561185a57600080fd5b505afa15801561186e573d6000803e3d6000fd5b505050506040513d602081101561188457600080fd5b505189518a90600190811061189557fe5b60200260200101518960ff166002146144c2565b876001600160a01b03166316048bc46040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156118e457600080fd5b505af11580156118f8573d6000803e3d6000fd5b505050506040513d602081101561190e57600080fd5b505187516001600160a01b0390911690638ff3928c9033908a9060009061193157fe5b60200260200101518a60018151811061194657fe5b60200260200101518b60028151811061195b57fe5b60200260200101518b60028151811061197057fe5b60200260200101518c60038151811061198557fe5b60200260200101518b8b6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b0316815260200188815260200187815260200186815260200185815260200184815260200183815260200182815260200198505050505050505050602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d6020811015611a3257600080fd5b5051611a74576040805162461bcd60e51b815260206004820152600c60248201526b14995cd95d0811985a5b195960a21b604482015290519081900360640190fd5b611b0033896001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d6020811015611adb57600080fd5b5051885189906002908110611aec57fe5b60200260200101518860ff166003146147ec565b611b8c33896001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3d57600080fd5b505afa158015611b51573d6000803e3d6000fd5b505050506040513d6020811015611b6757600080fd5b5051885189906003908110611b7857fe5b60200260200101518860ff166004146147ec565b50506000805460ff19169055505050505050565b60005461010090046001600160a01b031681565b60008142811015611bfa576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111611c3e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711611c7d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a5ea4668a3389600081518110611cbb57fe5b60200260200101518c6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b158015611d4557600080fd5b505af1158015611d59573d6000803e3d6000fd5b506000925050505b8651811015611ffb576001875103811415611eb85760018616611e1b57868181518110611d8a57fe5b60200260200101516001600160a01b031663bd6015b4306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b505050506040513d6020811015611e1357600080fd5b50611eb39050565b868181518110611e2757fe5b60200260200101516001600160a01b031663dd93f59a306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b505af1158015611e9a573d6000803e3d6000fd5b505050506040513d6020811015611eb057600080fd5b50505b611fef565b60018616611f4157868181518110611ecc57fe5b60200260200101516001600160a01b031663bd6015b4888360010181518110611ef157fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611e8657600080fd5b868181518110611f4d57fe5b60200260200101516001600160a01b031663dd93f59a888360010181518110611f7257fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611fc257600080fd5b505af1158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b50505b600195861c9501611d61565b50604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561206257600080fd5b505afa158015612076573d6000803e3d6000fd5b505050506040513d602081101561208c57600080fd5b50519150868210156120cf5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561213557600080fd5b505af1158015612149573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f1935050505015801561217a573d6000803e3d6000fd5b50604080516001600160a01b038b168152600080516020614fab83398151915260208201523381830152606081018a9052608081018490529051600080516020614eea8339815191529181900360a00190a150979650505050505050565b60005461010090046001600160a01b03163314612228576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19169055565b6000814281101561228f576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008751116122d3576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b87518751146123135760405162461bcd60e51b8152600401808060200182810382526025815260200180614f0a6025913960400191505060405180910390fd5b60018651038751146123565760405162461bcd60e51b81526004018080602001828103825260258152602001806150676025913960400191505060405180910390fd5b600089116123955760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b8b8b8b60006123b36001600160a01b0384163363ffffffff6148c416565b90506123f8338b6000815181106123c657fe5b60200260200101518685600080516020614fab8339815191526001600160a01b0316896001600160a01b0316146144c2565b60005b8b518110156125a45760018a166124d4578c818151811061241857fe5b60200260200101516001600160a01b03166330e6ae318c836001018151811061243d57fe5b60200260200101518e848151811061245157fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b1580156124b757600080fd5b505af11580156124cb573d6000803e3d6000fd5b50505050612598565b8c81815181106124e057fe5b60200260200101516001600160a01b0316636f7929f28c836001018151811061250557fe5b60200260200101518e848151811061251957fe5b6020908102919091010151604080516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260606044830152600060648301819052905160a48084019382900301818387803b15801561257f57600080fd5b505af1158015612593573d6000803e3d6000fd5b505050505b6001998a1c99016123fb565b506001600160a01b038316600080516020614fab833981519152141561270d57604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561262a57600080fd5b505afa15801561263e573d6000803e3d6000fd5b505050506040513d602081101561265457600080fd5b505160408051632e1a7d4d60e01b81526004810183905290519197506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691632e1a7d4d9160248082019260009290919082900301818387803b1580156126c257600080fd5b505af11580156126d6573d6000803e3d6000fd5b505060405133925088156108fc02915088906000818181858888f19350505050158015612707573d6000803e3d6000fd5b50612739565b6127368161272a6001600160a01b0386163363ffffffff6146f016565b9063ffffffff61496e16565b95505b8c8610156127785760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808716825285166020820152338183015260608101849052608081018890529051600080516020614eea8339815191529181900360a00190a150505050509a9950505050505050505050565b6001546001600160a01b0316331461281f576040805162461bcd60e51b815260206004820152600d60248201526c494e56414c49445f434c41494d60981b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600081428110156128da576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b600086511161291e576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b6000871161295d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038b16916370a0823191602480820192602092909190829003018186803b1580156129a757600080fd5b505afa1580156129bb573d6000803e3d6000fd5b505050506040513d60208110156129d157600080fd5b505160408051630d0e30db60e41b815290519192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163d0e30db0913491600480830192600092919082900301818588803b158015612a3957600080fd5b505af1158015612a4d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb88600081518110612a8e57fe5b6020026020010151346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d6020811015612b1057600080fd5b50600090505b8751811015612db0576001885103811415612c6d5760018716612bd057878181518110612b3f57fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612b9e57600080fd5b505af1158015612bb2573d6000803e3d6000fd5b505050506040513d6020811015612bc857600080fd5b50612c689050565b878181518110612bdc57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b505af1158015612c4f573d6000803e3d6000fd5b505050506040513d6020811015612c6557600080fd5b50505b612da4565b60018716612cf657878181518110612c8157fe5b60200260200101516001600160a01b031663bd6015b4898360010181518110612ca657fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3b57600080fd5b878181518110612d0257fe5b60200260200101516001600160a01b031663dd93f59a898360010181518110612d2757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612d7757600080fd5b505af1158015612d8b573d6000803e3d6000fd5b505050506040513d6020811015612da157600080fd5b50505b600196871c9601612b16565b50604080516370a0823160e01b81523360048201529051612e359183916001600160a01b038d16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b505afa158015612e11573d6000803e3d6000fd5b505050506040513d6020811015612e2757600080fd5b50519063ffffffff61496e16565b925087831015612e765760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b60408051600080516020614fab83398151915281526001600160a01b038b1660208201523381830152346060820152608081018590529051600080516020614eea8339815191529181900360a00190a150509695505050505050565b60008142811015612f18576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008611612f575760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b6000612f726001600160a01b038c163363ffffffff6148c416565b90506001600160a01b038c16600080516020614fab8339815191521461303e576040805163052f523360e11b81526001600160a01b038e81166004830152336024830152306044830152606482018b905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561301157600080fd5b505af1158015613025573d6000803e3d6000fd5b5061303e925050506001600160a01b038d168b8a614626565b6001600160a01b03891660009081526002602052604090205460ff166130955760405162461bcd60e51b8152600401808060200182810382526025815260200180614feb6025913960400191505060405180910390fd5b60006001600160a01b03808b16908e16600080516020614fab833981519152146130c05760006130c2565b345b886040518082805190602001908083835b602083106130f25780518252601f1990920191602091820191016130d3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613154576040519150601f19603f3d011682016040523d82523d6000602084013e613159565b606091505b50509050806131995760405162461bcd60e51b815260040180806020018281038252602d815260200180615010602d913960400191505060405180910390fd5b6131cd336131b66001600160a01b038f163063ffffffff6148c416565b6001600160a01b038f16919063ffffffff61477d16565b6131ea8261272a6001600160a01b038f163363ffffffff6148c416565b93508784101561322b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b600080516020614eea8339815191528d8d338c8860405180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050509998505050505050505050565b600080548190819060ff16156132ff576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558342811015613350576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b8a61335c818c8c6149b7565b90945092508884108015906133715750878310155b6133ac5760405162461bcd60e51b815260040180806020018281038252602b815260200180614f80602b913960400191505060405180910390fd5b6134233382836001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133ea57600080fd5b505afa1580156133fe573d6000803e3d6000fd5b505050506040513d602081101561341457600080fd5b505187600160ff8d16146144c2565b61349a3382836001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b15801561346157600080fd5b505afa158015613475573d6000803e3d6000fd5b505050506040513d602081101561348b57600080fd5b505186600260ff8d16146144c2565b60408051634c85b42560e01b815233600482015290516001600160a01b03831691634c85b4259160248083019260609291908290030181600087803b1580156134e257600080fd5b505af11580156134f6573d6000803e3d6000fd5b505050506040513d606081101561350c57600080fd5b50519450600160ff881614801561352257508334115b156135585760405133903486900380156108fc02916000818181858888f19350505050158015613556573d6000803e3d6000fd5b505b8660ff16600214801561356a57508234115b156135a05760405133903485900380156108fc02916000818181858888f1935050505015801561359e573d6000803e3d6000fd5b505b50506000805460ff191690559199909850909650945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020526000908152604090205460ff1681565b6001546001600160a01b031681565b60008054819060ff161561364b576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561369c576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60006001600160a01b038d16600080516020614fab833981519152146136c2578c6136e4565b7f00000000000000000000000000000000000000000000000000000000000000005b905060006001600160a01b038d16600080516020614fab8339815191521461370c578c61372e565b7f00000000000000000000000000000000000000000000000000000000000000005b6040805163e18c40c760e01b81526001600160a01b0385811660048301528381166024830152604482018e9052606482018d9052608482018c90528a151560a483015291519293507f00000000000000000000000000000000000000000000000000000000000000009091169163e18c40c79160c4808201926020929091908290030181600087803b1580156137c357600080fd5b505af11580156137d7573d6000803e3d6000fd5b505050506040513d60208110156137ed57600080fd5b505194508d91508c905061381d3386848f6001600160a01b038216600080516020614fab833981519152146144c2565b6138433386838e6001600160a01b038216600080516020614fab833981519152146144c2565b505060408051634c85b42560e01b815233600482015290516001600160a01b03851691634c85b4259160248083019260609291908290030181600087803b15801561388d57600080fd5b505af11580156138a1573d6000803e3d6000fd5b505050506040513d60608110156138b757600080fd5b50516000805460ff19169055929c929b50919950505050505050505050565b60008054819060ff161561391d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff19166001179055824281101561396e576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b60008a6001600160a01b0316634a248d2a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139a957600080fd5b505afa1580156139bd573d6000803e3d6000fd5b505050506040513d60208110156139d357600080fd5b505160408051636a5cb82360e11b815290519192506000916001600160a01b038e169163d4b97046916004808301926020929190829003018186803b158015613a1b57600080fd5b505afa158015613a2f573d6000803e3d6000fd5b505050506040513d6020811015613a4557600080fd5b50519050613a5c3330848e600160ff8d16146144c2565b613a6f3330838d8b60ff166002146144c2565b8a15613b0d57613a8f6001600160a01b0383168d8d63ffffffff61462616565b6040805163aa06ce9b60e01b8152336004820152602481018d905290516001600160a01b038e169163aa06ce9b9160448083019260209291908290030181600087803b158015613ade57600080fd5b505af1158015613af2573d6000803e3d6000fd5b505050506040513d6020811015613b0857600080fd5b505194505b8915613bab57613b2d6001600160a01b0382168d8c63ffffffff61462616565b604080516317c5e7d960e21b8152336004820152602481018c905290516001600160a01b038e1691635f179f649160448083019260209291908290030181600087803b158015613b7c57600080fd5b505af1158015613b90573d6000803e3d6000fd5b505050506040513d6020811015613ba657600080fd5b505193505b888510158015613bbb5750878410155b613bf65760405162461bcd60e51b8152600401808060200182810382526027815260200180614f596027913960400191505060405180910390fd5b50506000805460ff1916905550909890975095505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1615613c9d576040805162461bcd60e51b815260206004820152600960248201526814915153951490539560ba1b604482015290519081900360640190fd5b6000805460ff191660011790558042811015613cee576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b613d653386876001600160a01b031663d4b970466040518163ffffffff1660e01b815260040160206040518083038186803b158015613d2c57600080fd5b505afa158015613d40573d6000803e3d6000fd5b505050506040513d6020811015613d5657600080fd5b505187600160ff8916146144c2565b60408051639cf5453d60e01b815233600482015290516001600160a01b03871691639cf5453d91602480830192600092919082900301818387803b158015613dac57600080fd5b505af1158015613dc0573d6000803e3d6000fd5b50506000805460ff1916905550505050505050565b60005461010090046001600160a01b03163314613e25576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005461010090046001600160a01b03163314613ebd576040805162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b604482015290519081900360640190fd5b600080546040516001600160a01b038085169361010090930416917fdcf55418cee3220104fef63f979ff3c4097ad240c0c43dcb33ce837748983e6291a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60008142811015613f63576040805162461bcd60e51b81526020600482015260166024820152600080516020614eca833981519152604482015290519081900360640190fd5b6000865111613fa7576040805162461bcd60e51b815260206004820152601a6024820152600080516020614fcb833981519152604482015290519081900360640190fd5b60008711613fe65760405162461bcd60e51b8152600401808060200182810382526021815260200180614ea96021913960400191505060405180910390fd5b604080516370a0823160e01b815233600482015290516000916001600160a01b038c16916370a0823191602480820192602092909190829003018186803b15801561403057600080fd5b505afa158015614044573d6000803e3d6000fd5b505050506040513d602081101561405a57600080fd5b505187519091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a5ea466908d9033908b906000906140a157fe5b60200260200101518d6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001945050505050600060405180830381600087803b15801561412b57600080fd5b505af115801561413f573d6000803e3d6000fd5b506000925050505b87518110156143e157600188510381141561429e57600187166142015787818151811061417057fe5b60200260200101516001600160a01b031663bd6015b4336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156141cf57600080fd5b505af11580156141e3573d6000803e3d6000fd5b505050506040513d60208110156141f957600080fd5b506142999050565b87818151811061420d57fe5b60200260200101516001600160a01b031663dd93f59a336040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b505af1158015614280573d6000803e3d6000fd5b505050506040513d602081101561429657600080fd5b50505b6143d5565b60018716614327578781815181106142b257fe5b60200260200101516001600160a01b031663bd6015b48983600101815181106142d757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561426c57600080fd5b87818151811061433357fe5b60200260200101516001600160a01b031663dd93f59a89836001018151811061435857fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b1580156143a857600080fd5b505af11580156143bc573d6000803e3d6000fd5b505050506040513d60208110156143d257600080fd5b50505b600196871c9601614147565b50604080516370a0823160e01b8152336004820152905161442e9183916001600160a01b038e16916370a08231916024808301926020929190829003018186803b158015612dfd57600080fd5b92508783101561446f5760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2f602a913960400191505060405180910390fd5b604080516001600160a01b03808e1682528c1660208201523381830152606081018b9052608081018590529051600080516020614eea8339815191529181900360a00190a1505098975050505050505050565b801561458357811561457e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561452957600080fd5b505af115801561453d573d6000803e3d6000fd5b505050506001600160a01b0385163014905061457e5761457e7f00000000000000000000000000000000000000000000000000000000000000008584614ac9565b61461f565b6040805163052f523360e11b81526001600160a01b038581166004830152878116602483015286811660448301526064820185905291517f000000000000000000000000000000000000000000000000000000000000000090921691630a5ea4669160848082019260009290919082900301818387803b15801561460657600080fd5b505af115801561461a573d6000803e3d6000fd5b505050505b5050505050565b60408051636eb1769f60e11b81523060048201526001600160a01b038481166024830152915160009286169163dd62ed3e916044808301926020929190829003018186803b15801561467757600080fd5b505afa15801561468b573d6000803e3d6000fd5b505050506040513d60208110156146a157600080fd5b50519050818110156146ea5780156146ce576146ce6001600160a01b03851684600063ffffffff614b1b16565b6146ea6001600160a01b0385168460001963ffffffff614b1b16565b50505050565b6000826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561474857600080fd5b505afa15801561475c573d6000803e3d6000fd5b505050506040513d602081101561477257600080fd5b505190505b92915050565b80156147e75761478c83614c2e565b156147cd576040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156147c7573d6000803e3d6000fd5b506147e7565b6147e76001600160a01b038416838363ffffffff614ac916565b505050565b80156148b35781156148ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561485e57600080fd5b505af1158015614872573d6000803e3d6000fd5b50506040516001600160a01b038716925084156108fc02915084906000818181858888f193505050501580156148ac573d6000803e3d6000fd5b505b6146ea565b81156146ea576146ea838584614ac9565b60006148cf83614c2e565b156148e557506001600160a01b03811631614777565b826001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561493b57600080fd5b505afa15801561494f573d6000803e3d6000fd5b505050506040513d602081101561496557600080fd5b50519050614777565b6000828211156149b1576040805162461bcd60e51b815260206004820152600960248201526829aaa12fa2a92927a960b91b604482015290519081900360640190fd5b50900390565b600080600080866001600160a01b03166336223ce96040518163ffffffff1660e01b8152600401604080518083038186803b1580156149f557600080fd5b505afa158015614a09573d6000803e3d6000fd5b505050506040513d6040811015614a1f57600080fd5b508051602090910151909250905080158015614a39575081155b15614a45578593508492505b80158015614a535750600082115b15614a6057859350600092505b600081118015614a705750600082115b15614abf576000614a818784614c4d565b90506000614a8f8784614c4d565b9050808211614aac57879550614aa58383614c7e565b9450614abc565b869450614ab98482614c7e565b95505b50505b5050935093915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526147e7908490614ca8565b801580614ba1575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614b7357600080fd5b505afa158015614b87573d6000803e3d6000fd5b505050506040513d6020811015614b9d57600080fd5b5051155b614bdc5760405162461bcd60e51b815260040180806020018281038252603681526020018061508c6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526147e7908490614ca8565b6001600160a01b038116600080516020614fab83398151915214919050565b6000614c7782614c6b85670de0b6b3a764000063ffffffff614dfd16565b9063ffffffff614e5816565b9392505050565b6000670de0b6b3a7640000614c99848463ffffffff614dfd16565b81614ca057fe5b049392505050565b60006060836001600160a01b0316836040518082805190602001908083835b60208310614ce65780518252601f199092019160209182019101614cc7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614d48576040519150601f19603f3d011682016040523d82523d6000602084013e614d4d565b606091505b509150915081614da4576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156146ea57808060200190516020811015614dc057600080fd5b50516146ea5760405162461bcd60e51b815260040180806020018281038252602a81526020018061503d602a913960400191505060405180910390fd5b600082614e0c57506000614777565b82820282848281614e1957fe5b0414614c77576040805162461bcd60e51b815260206004820152600960248201526826aaa62fa2a92927a960b91b604482015290519081900360640190fd5b6000808211614e9f576040805162461bcd60e51b815260206004820152600e60248201526d2224ab24a224a723afa2a92927a960911b604482015290519081900360640190fd5b818381614ca057fefe444f444f563250726f787930323a2052455455524e5f414d4f554e545f5a45524f444f444f563250726f787930323a20455850495245440000000000000000000092ceb067a9883c85aba061e46b9edf505a0d6e81927c4b966ebed543a5221787444f444f563250726f787930323a20504149525f414441505445525f4e4f545f4d41544348444f444f563250726f787930323a2052657475726e20616d6f756e74206973206e6f7420656e6f756768444f444f563250726f787930323a2052657475726e20444c50206973206e6f7420656e6f756768444f444f563250726f787930323a206465706f73697420616d6f756e74206973206e6f7420656e6f756768000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee444f444f563250726f787930323a2050414952535f454d505459000000000000444f444f563250726f787930323a204e6f742057686974656c69737420436f6e7472616374444f444f563250726f787930323a2045787465726e616c205377617020657865637574696f6e204661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564444f444f563250726f787930323a20504149525f4153534554544f5f4e4f545f4d415443485361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220ad86b25d9015e44584397f703bb1c2372be77b108e36e771bb292a272b32ecdc64736f6c6343000609003300000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1300000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a

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

00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe1300000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a80000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a

-----Decoded View---------------
Arg [0] : dvmFactory (address): 0x79887f65f83bdf15bcc8736b5e5bcdb48fb8fe13
Arg [1] : dppFactory (address): 0x95e887adf9eaa22cc1c6e3cb7f07adc95b4b25a8
Arg [2] : weth (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [3] : dodoApproveProxy (address): 0x01feea29da5ae41b0b5f6b10b93ee34752ef80d7
Arg [4] : dodoSellHelper (address): 0xdfaf9584f5d229a9dbe5978523317820a8897c5a

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000079887f65f83bdf15bcc8736b5e5bcdb48fb8fe13
Arg [1] : 00000000000000000000000095e887adf9eaa22cc1c6e3cb7f07adc95b4b25a8
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [3] : 00000000000000000000000001feea29da5ae41b0b5f6b10b93ee34752ef80d7
Arg [4] : 000000000000000000000000dfaf9584f5d229a9dbe5978523317820a8897c5a


Deployed ByteCode Sourcemap

32555:22846:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10246:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10246:127:0;-1:-1:-1;;;;;10246:127:0;;:::i;32841:31::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;32841:31:0;;;;;;;;;;;;;;38678:1270;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38678:1270:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48308:2378::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48308:2378:0;;-1:-1:-1;;48308:2378:0;;;-1:-1:-1;;;48308:2378:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39956:1391;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39956:1391:0;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39956:1391:0;;;;;;;;-1:-1:-1;39956:1391:0;;-1:-1:-1;;;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39956:1391:0;;-1:-1:-1;;39956:1391:0;;;;;-1:-1:-1;;;39956:1391:0;;;;;;;;;;;;;;:::i;9613:22::-;;;;;;;;;;;;;:::i;43096:1716::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43096:1716:0;;-1:-1:-1;;43096:1716:0;;;-1:-1:-1;;;43096:1716:0;;;;;;;;;;;:::i;34120:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34120:119:0;-1:-1:-1;;;;;34120:119:0;;:::i;50696:2075::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50696:2075:0;;-1:-1:-1;;50696:2075:0;;;-1:-1:-1;;;50696:2075:0;;;;;;;;;;;:::i;10552:228::-;;;;;;;;;;;;;:::i;41396:1692::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41396:1692:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41396:1692:0;;-1:-1:-1;;41396:1692:0;;;-1:-1:-1;;;41396:1692:0;;;;;;;;;;;:::i;46564:1736::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46564:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46564:1736:0;;-1:-1:-1;;;;46564:1736:0;;;;;-1:-1:-1;46564:1736:0;;;;:::i;35854:1465::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35854:1465:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;32981:38;;;;;;;;;;;;;:::i;33071:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33071:46:0;-1:-1:-1;;;;;33071:46:0;;:::i;:::-;;;;;;;;;;;;;;;;;;9642:26;;;;;;;;;;;;;:::i;34322:1524::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34322:1524:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;34322:1524:0;;;;;;;;;;;;;;;;;;;;;53227:1214;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53227:1214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32931:43;;;;;;;;;;;;;:::i;33026:38::-;;;;;;;;;;;;;:::i;52841:376::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52841:376:0;;;;;;;;;;;;;;;;;;;;:::i;33997:115::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33997:115:0;-1:-1:-1;;;;;33997:115:0;;:::i;32879:45::-;;;;;;;;;;;;;:::i;10381:163::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10381:163:0;-1:-1:-1;;;;;10381:163:0;;:::i;44820:1736::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44820:1736:0;;-1:-1:-1;;44820:1736:0;;;-1:-1:-1;;;44820:1736:0;;;;;;;;;;;:::i;10246:127::-;10035:13;;-1:-1:-1;;;10035:13:0;;;;10034:14;10026:43;;;;;-1:-1:-1;;;10026:43:0;;;;;;;;;;;;-1:-1:-1;;;10026:43:0;;;;;;;;;;;;;;;10332:4:::1;10316:20:::0;;-1:-1:-1;;;;10316:20:0::1;-1:-1:-1::0;;;10316:20:0::1;::::0;;;10347:18;;-1:-1:-1;;;;;10347:18:0;;::::1;10316:20;10347:18;-1:-1:-1::0;;;;;;10347:18:0;;::::1;::::0;;;::::1;::::0;;10246:127::o;32841:31::-;;;:::o;38678:1270::-;39086:22;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;39058:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;39151:13:::2;-1:-1:-1::0;;;;;39143:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;39143:46:0;;-1:-1:-1;39223:9:0;39265:10;39286:91:::2;39295:10;39143:46:::0;39223:9;39335:12;-1:-1:-1;;;;;39349:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39349:27:0::2;39286:8;:91::i;:::-;39388:170;39411:10;39436:14:::0;39465:11;39491:13;-1:-1:-1;;;;;39519:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39519:28:0::2;39388:8;:170::i;:::-;-1:-1:-1::0;;;;;39575:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;39575:27:0::2;39571:52;;;39617:6;39604:19;;39571:52;-1:-1:-1::0;;;;;39638:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;39638:28:0::2;39634:54;;;-1:-1:-1::0;39682:6:0::2;39634:54;39701:239;::::0;;-1:-1:-1;;;39701:239:0;;-1:-1:-1;;;;;39701:239:0;;::::2;;::::0;::::2;::::0;39787:10:::2;39701:239:::0;;;;;;::::2;::::0;;;;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;39709:13:::2;39701:42:::0;;::::2;::::0;::::2;::::0;:239;;;;;-1:-1:-1;;39701:239:0;;;;;;;;-1:-1:-1;39701:42:0;:239;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;38678:1270:0;;;-1:-1:-1;;;;;;;;;;;;;38678:1270:0:o;48308:2378::-;48668:20;48640:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;48733:1:::1;48714:9;:16;:20;48706:59;;;::::0;;-1:-1:-1;;;48706:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;48706:59:0;;;;;;;;;;;;;::::1;;48802:1;48784:15;:19;48776:65;;;;-1:-1:-1::0;;;48776:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48885:9:::0;48924:7;48952:93:::1;48961:10;48981:4;48885:9:::0;49000:15;-1:-1:-1;;;;;49017:27:0;::::1;-1:-1:-1::0;;;;;;;;;;;49017:27:0::1;48952:8;:93::i;:::-;49063:9;49058:1070;49082:9;:16;49078:1;:20;49058:1070;;;49120:19;49142:9;49152:1;49142:12;;;;;;;;;;;;;;49120:34;;49173:10;49186:1;49173:14;49191:1;49173:19;49169:905;;;49213:19;49243:11;-1:-1:-1::0;;;;;49235:33:0::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49235:35:0;49311:44:::1;::::0;;-1:-1:-1;;;49311:44:0;;49349:4:::1;49311:44;::::0;::::1;::::0;;;49235:35;;-1:-1:-1;49289:19:0::1;::::0;-1:-1:-1;;;;;49311:29:0;::::1;::::0;::::1;::::0;:44;;;;;49235:35:::1;::::0;49311:44;;;;;;;:29;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49311:44:0;;-1:-1:-1;49374:65:0::1;-1:-1:-1::0;;;;;49374:39:0;::::1;49414:11:::0;49311:44;49374:65:::1;:39;:65;:::i;:::-;49466:11;-1:-1:-1::0;;;;;49458:34:0::1;;49493:11;49506:1;49458:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49169:905:0::1;::::0;-1:-1:-1;;;49169:905:0::1;;49553:20;49584:11;-1:-1:-1::0;;;;;49576:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49576:36:0;49653:45:::1;::::0;;-1:-1:-1;;;49653:45:0;;49692:4:::1;49653:45;::::0;::::1;::::0;;;49576:36;;-1:-1:-1;49631:19:0::1;::::0;-1:-1:-1;;;;;49653:30:0;::::1;::::0;::::1;::::0;:45;;;;;49576:36:::1;::::0;49653:45;;;;;;;:30;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49653:45:0;;-1:-1:-1;49717:66:0::1;-1:-1:-1::0;;;;;49717:40:0;::::1;49758:11:::0;49653:45;49717:66:::1;:40;:66;:::i;:::-;49829:142;::::0;;-1:-1:-1;;;49829:142:0;;-1:-1:-1;;;;;49829:142:0;;::::1;;::::0;::::1;::::0;;;;;;;;;49802:24:::1;::::0;49845:18:::1;49829:55;::::0;::::1;::::0;:142;;;;;::::1;::::0;;;;;;;;:55;:142;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49829:142:0;49990:68:::1;::::0;;-1:-1:-1;;;49990:68:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;-1:-1:-1;49990:68:0;;;;;;;;49829:142;;-1:-1:-1;;;;;;49990:33:0;::::1;::::0;::::1;::::0;:68;;;;;49829:142:::1;::::0;49990:68;;;;;;;;;;;:33;:68;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;;49169:905:0::1;-1:-1:-1::0;50115:1:0::1;50101:15:::0;;::::1;::::0;49100:3:::1;49058:1070;;;-1:-1:-1::0;;;;;;50154:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;50154:25:0::1;50150:256;;;50211:38;::::0;;-1:-1:-1;;;50211:38:0;;50243:4:::1;50211:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;50217:6:0::1;50211:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;50211:38:0;50264:36:::1;::::0;;-1:-1:-1;;;50264:36:0;;::::1;::::0;::::1;::::0;;;;;50211:38;;-1:-1:-1;;;;;;50270:6:0::1;50264:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;50264:36:0;;;;;;;;-1:-1:-1;50264:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50150:256;;;50348:46;-1:-1:-1::0;;;;;50348:31:0;::::1;50388:4;50348:46;:31;:46;:::i;:::-;50333:61;;50150:256;50450:15;50434:12;:31;;50426:86;;;;-1:-1:-1::0;;;50426:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50523:60;-1:-1:-1::0;;;;;50523:34:0;::::1;50558:10;50570:12:::0;50523:60:::1;:34;:60;:::i;:::-;50601:77;::::0;;-1:-1:-1;;;;;50601:77:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;50636:10:::1;50601:77:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;50601:77:0;;;;;;;::::1;33512:1;;48308:2378:::0;;;;;;;;;;;:::o;39956:1391::-;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;40461:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;40482:170:::2;40505:10;40530;40563;-1:-1:-1::0;;;;;40555:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40555:34:0;40604:13;;:10;;40615:1:::2;::::0;40604:13:::2;;;;;;;;;;40632:4;:9;;40640:1;40632:9;40482:8;:170::i;:::-;40663:171;40686:10;40711;40744;-1:-1:-1::0;;;;;40736:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40736:35:0;40786:13;;:10;;40797:1:::2;::::0;40786:13;::::2;;;;;;;;;;;40814:4;:9;;40822:1;40814:9;40663:8;:171::i;:::-;40871:10;-1:-1:-1::0;;;;;40863:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40863:29:0;40939:12;;-1:-1:-1;;;;;40855:44:0;;::::2;::::0;::::2;::::0;40914:10:::2;::::0;40939:9;;40949:1:::2;::::0;40939:12:::2;;;;;;;;;;40966:9;40976:1;40966:12;;;;;;;;;;;;;;40993:9;41003:1;40993:12;;;;;;;;;;;;;;41020:10;41031:1;41020:13;;;;;;;;;;;;;;41048:10;41059:1;41048:13;;;;;;;;;;;;;;41076:14;41105:15;40855:276;;;;;;;;;;;;;-1:-1:-1::0;;;;;40855:276:0::2;-1:-1:-1::0;;;;;40855:276:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;40855:276:0;40847:301:::2;;;::::0;;-1:-1:-1;;;40847:301:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;40847:301:0;;;;;;;;;;;;;::::2;;41161:83;41171:10;41191;-1:-1:-1::0;;;;;41183:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41183:34:0;41219:13;;:10;;41230:1:::2;::::0;41219:13;::::2;;;;;;;;;;;41234:4;:9;;41242:1;41234:9;41161;:83::i;:::-;41255:84;41265:10;41285;-1:-1:-1::0;;;;;41277:33:0::2;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;41277:35:0;41314:13;;:10;;41325:1:::2;::::0;41314:13;::::2;;;;;;;;;;;41329:4;:9;;41337:1;41329:9;41255;:84::i;:::-;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;;;;;;39956:1391:0:o;9613:22::-;;;;;;-1:-1:-1;;;;;9613:22:0;;:::o;43096:1716::-;43423:20;43395:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;43488:1:::1;43469:9;:16;:20;43461:59;;;::::0;;-1:-1:-1;;;43461:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;43461:59:0;;;;;;;;;;;;;::::1;;43557:1;43539:15;:19;43531:65;;;;-1:-1:-1::0;;;43531:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43635:20;-1:-1:-1::0;;;;;43617:51:0::1;;43669:9;43680:10;43692:9;43702:1;43692:12;;;;;;;;;;;;;;43706:15;43617:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;-1:-1:-1::0;;;;;43617:105:0::1;-1:-1:-1::0;;;;;43617:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43740:9:0::1;::::0;-1:-1:-1;;;43735:643:0::1;43759:9;:16;43755:1;:20;43735:643;;;43825:1;43806:9;:16;:20;43801:1;:25;43797:527;;;43864:1;43851:14:::0;::::1;43847:208;;43903:9;43913:1;43903:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43895:30:0::1;;43934:4;43895:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;43895:45:0::1;-1:-1:-1::0;;;;;43895:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43847:208:0::1;::::0;-1:-1:-1;43847:208:0::1;;43997:9;44007:1;43997:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;43989:31:0::1;;44029:4;43989:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;43989:46:0::1;-1:-1:-1::0;;;;;43989:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;43847:208:0::1;43797:527;;;44112:1;44099:14:::0;::::1;44095:214;;44151:9;44161:1;44151:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44143:30:0::1;;44174:9;44184:1;44188;44184:5;44174:16;;;;;;;;;;;;;;44143:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;44143:48:0::1;-1:-1:-1::0;;;;;44143:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;44095:214;44248:9;44258:1;44248:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;44240:31:0::1;;44272:9;44282:1;44286;44282:5;44272:16;;;;;;;;;;;;;;44240:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;44240:49:0::1;-1:-1:-1::0;;;;;44240:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;44095:214:0::1;44365:1;44351:15:::0;;::::1;::::0;43777:3:::1;43735:643;;;-1:-1:-1::0;44403:38:0::1;::::0;;-1:-1:-1;;;44403:38:0;;44435:4:::1;44403:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;44409:6:0::1;44403:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;44403:38:0;;-1:-1:-1;44460:31:0;;::::1;;44452:86;;;;-1:-1:-1::0;;;44452:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44555:6;-1:-1:-1::0;;;;;44549:22:0::1;;44572:12;44549:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;44596:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;44596:33:0;::::1;;;::::0;-1:-1:-1;44616:12:0;;44596:33:::1;::::0;;;44616:12;44596:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44647:157:0::1;::::0;;-1:-1:-1;;;;;44647:157:0;::::1;::::0;;-1:-1:-1;;;;;;;;;;;44647:157:0::1;::::0;::::1;::::0;44726:10:::1;44647:157:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;44647:157:0;;;;;;;::::1;43096:1716:::0;;;;;;;;;;:::o;34120:119::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34196:27:0::1;34226:5;34196:27:::0;;;:13:::1;:27;::::0;;;;:35;;-1:-1:-1;;34196:35:0::1;::::0;;34120:119::o;50696:2075::-;51081:20;51062:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;51140:1:::1;51122:8;:15;:19;51114:58;;;::::0;;-1:-1:-1;;;51114:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;51114:58:0;;;;;;;;;;;;;::::1;;51210:11;:18;51191:8;:15;:37;51183:87;;;;-1:-1:-1::0;;;51183:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51325:1;51308:7;:14;:18;51289:8;:15;:37;51281:87;;;;-1:-1:-1::0;;;51281:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51405:1;51387:15;:19;51379:65;;;;-1:-1:-1::0;;;51379:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51478:9:::0;51517:7;51562:15;51457:18:::1;51629:47;-1:-1:-1::0;;;;;51629:35:0;::::1;51665:10;51629:47;:35;:47;:::i;:::-;51598:78;;51697:91;51706:10;51718:7;51726:1;51718:10;;;;;;;;;;;;;;51730;51742:16;-1:-1:-1::0;;;;;;;;;;;;;;;;51760:27:0::1;:10;-1:-1:-1::0;;;;;51760:27:0::1;;51697:8;:91::i;:::-;51806:9;51801:355;51825:8;:15;51821:1;:19;51801:355;;;51879:1;51866:14:::0;::::1;51862:240;;51919:11;51931:1;51919:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;51906:37:0::1;;51944:7;51952:1;51956;51952:5;51944:14;;;;;;;;;;;;;;51959:8;51968:1;51959:11;;;;;;;;;::::0;;::::1;::::0;;;;;;51906:69:::1;::::0;;-1:-1:-1;;;;;;51906:69:0::1;::::0;;;;;;-1:-1:-1;;;;;51906:69:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;-1:-1:-1;51906:69:0;;;;;;;;;;;;;;;;;;-1:-1:-1;51906:69:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:240;;;52029:11;52041:1;52029:14;;;;;;;;;;;;;;-1:-1:-1::0;;;;;52016:38:0::1;;52055:7;52063:1;52067;52063:5;52055:14;;;;;;;;;;;;;;52070:8;52079:1;52070:11;;;;;;;;;::::0;;::::1;::::0;;;;;;52016:70:::1;::::0;;-1:-1:-1;;;;;;52016:70:0::1;::::0;;;;;;-1:-1:-1;;;;;52016:70:0;;::::1;;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;-1:-1:-1;52016:70:0;;;;;;;;;;;;;;;;;;-1:-1:-1;52016:70:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51862:240;52143:1;52129:15:::0;;::::1;::::0;51842:3:::1;51801:355;;;-1:-1:-1::0;;;;;;52171:25:0;::::1;-1:-1:-1::0;;;;;;;;;;;52171:25:0::1;52168:325;;;52228:38;::::0;;-1:-1:-1;;;52228:38:0;;52260:4:::1;52228:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;52234:6:0::1;52228:23;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;52228:38:0;52281:36:::1;::::0;;-1:-1:-1;;;52281:36:0;;::::1;::::0;::::1;::::0;;;;;52228:38;;-1:-1:-1;;;;;;52287:6:0::1;52281:22;::::0;::::1;::::0;:36;;;;;-1:-1:-1;;52281:36:0;;;;;;;;-1:-1:-1;52281:22:0;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52332:33:0::1;::::0;:10:::1;::::0;-1:-1:-1;52332:33:0;::::1;;;::::0;-1:-1:-1;52352:12:0;;52332:33:::1;::::0;;;52352:12;52332:10;:33;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;52168:325;;;52412:69;52460:20:::0;52412:43:::1;-1:-1:-1::0;;;;;52412:31:0;::::1;52444:10;52412:43;:31;:43;:::i;:::-;:47:::0;:69:::1;:47;:69;:::i;:::-;52397:84;;52168:325;52529:15;52513:12;:31;;52505:86;;;;-1:-1:-1::0;;;52505:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52609:154;::::0;;-1:-1:-1;;;;;52609:154:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;52684:10:::1;52609:154:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;52609:154:0;;;;;;;::::1;33512:1;;;;50696:2075:::0;;;;;;;;;;;;;:::o;10552:228::-;10618:11;;-1:-1:-1;;;;;10618:11:0;10604:10;:25;10596:51;;;;;-1:-1:-1;;;10596:51:0;;;;;;;;;;;;-1:-1:-1;;;10596:51:0;;;;;;;;;;;;;;;10693:11;;;10684:7;;10663:42;;-1:-1:-1;;;;;10693:11:0;;;;;10684:7;;;;;;;10663:42;;;10726:11;;;;10716:21;;-1:-1:-1;;;;;;10716:21:0;10726:11;-1:-1:-1;;;;;10726:11:0;;10716:21;;;;-1:-1:-1;;;;;;10748:24:0;;;10552:228::o;41396:1692::-;41704:20;41676:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;41769:1:::1;41750:9;:16;:20;41742:59;;;::::0;;-1:-1:-1;;;41742:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;41742:59:0;;;;;;;;;;;;;::::1;;41838:1;41820:15;:19;41812:65;;;;-1:-1:-1::0;;;41812:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41929:37;::::0;;-1:-1:-1;;;41929:37:0;;41955:10:::1;41929:37;::::0;::::1;::::0;;;41898:28:::1;::::0;-1:-1:-1;;;;;41929:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;41929:37:0;41977:41:::1;::::0;;-1:-1:-1;;;41977:41:0;;;;41929:37;;-1:-1:-1;;;;;;41983:6:0::1;41977:21;::::0;::::1;::::0;42006:9:::1;::::0;41977:41:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;42006:9;41977:21;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42035:6;-1:-1:-1::0;;;;;42029:22:0::1;;42052:9;42062:1;42052:12;;;;;;;;;;;;;;42066:9;42029:47;;;;;;;;;;;;;-1:-1:-1::0;;;;;42029:47:0::1;-1:-1:-1::0;;;;;42029:47:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42094:9:0::1;::::0;-1:-1:-1;42089:637:0::1;42113:9;:16;42109:1;:20;42089:637;;;42179:1;42160:9;:16;:20;42155:1;:25;42151:521;;;42218:1;42205:14:::0;::::1;42201:202;;42257:9;42267:1;42257:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42249:30:0::1;;42280:10;42249:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;42249:42:0::1;-1:-1:-1::0;;;;;42249:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42201:202:0::1;::::0;-1:-1:-1;42201:202:0::1;;42348:9;42358:1;42348:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42340:31:0::1;;42372:10;42340:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;42340:43:0::1;-1:-1:-1::0;;;;;42340:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42201:202:0::1;42151:521;;;42460:1;42447:14:::0;::::1;42443:214;;42499:9;42509:1;42499:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42491:30:0::1;;42522:9;42532:1;42536;42532:5;42522:16;;;;;;;;;;;;;;42491:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;42491:48:0::1;-1:-1:-1::0;;;;;42491:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;42443:214;42596:9;42606:1;42596:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;42588:31:0::1;;42620:9;42630:1;42634;42630:5;42620:16;;;;;;;;;;;;;;42588:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;42588:49:0::1;-1:-1:-1::0;;;;;42588:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;42443:214:0::1;42713:1;42699:15:::0;;::::1;::::0;42131:3:::1;42089:637;;;-1:-1:-1::0;42753:37:0::1;::::0;;-1:-1:-1;;;42753:37:0;;42779:10:::1;42753:37;::::0;::::1;::::0;;;:63:::1;::::0;42795:20;;-1:-1:-1;;;;;42753:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;42753:37:0;;:63:::1;:41;:63;:::i;:::-;42738:78;;42851:15;42835:12;:31;;42827:86;;;;-1:-1:-1::0;;;42827:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42931:149;::::0;;-1:-1:-1;;;;;;;;;;;42931:149:0;;-1:-1:-1;;;;;42931:149:0;::::1;;::::0;::::1;::::0;43008:10:::1;42931:149:::0;;;;43033:9:::1;42931:149:::0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;42931:149:0;;;;;;;::::1;33512:1;41396:1692:::0;;;;;;;;;:::o;46564:1736::-;46959:20;46931:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;47023:1:::1;47005:15;:19;46997:65;;;;-1:-1:-1::0;;;46997:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47083:28;47114:46;-1:-1:-1::0;;;;;47114:34:0;::::1;47149:10;47114:46;:34;:46;:::i;:::-;47083:77:::0;-1:-1:-1;;;;;;47175:26:0;::::1;-1:-1:-1::0;;;;;;;;;;;47175:26:0::1;47171:332;;47218:189;::::0;;-1:-1:-1;;;47218:189:0;;-1:-1:-1;;;;;47218:189:0;;::::1;;::::0;::::1;::::0;47316:10:::1;47218:189:::0;;;;47353:4:::1;47218:189:::0;;;;;;;;;;;;47236:20:::1;47218:51:::0;;::::1;::::0;::::1;::::0;:189;;;;;-1:-1:-1;;47218:189:0;;;;;;;;-1:-1:-1;47218:51:0;:189;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;47422:69:0::1;::::0;-1:-1:-1;;;;;;;;47422:37:0;::::1;47460:13:::0;47475:15;47422:37:::1;:69::i;:::-;-1:-1:-1::0;;;;;47523:25:0;::::1;;::::0;;;:13:::1;:25;::::0;;;;;::::1;;47515:75;;;;-1:-1:-1::0;;;47515:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47602:12;-1:-1:-1::0;;;;;47620:15:0;;::::1;::::0;47643:26;::::1;-1:-1:-1::0;;;;;;;;;;;47643:26:0::1;:42;;47684:1;47643:42;;;47672:9;47643:42;47687:14;47620:82;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;47620:82:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47601:101;;;47723:7;47715:65;;;;-1:-1:-1::0;;;47715:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47793:133;47841:10;47866:49;-1:-1:-1::0;;;;;47866:34:0;::::1;47909:4;47866:49;:34;:49;:::i;:::-;-1:-1:-1::0;;;;;47793:33:0;::::1;::::0;:133;::::1;:33;:133;:::i;:::-;47954:72;48005:20:::0;47954:46:::1;-1:-1:-1::0;;;;;47954:34:0;::::1;47989:10;47954:46;:34;:46;:::i;:72::-;47939:87;;48061:15;48045:12;:31;;48037:86;;;;-1:-1:-1::0;;;48037:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;48168:9:0::1;48192:7;48214:10;48239:15;48269:12;48141:151;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;-1:-1:-1::0;;;;;48141:151:0::1;-1:-1:-1::0;;;;;48141:151:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33512:1;;46564:1736:::0;;;;;;;;;;;;:::o;35854:1465::-;36278:14;32013:9;;36278:14;;;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;36236:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;36422:10:::0;36491:101:::2;36422:10:::0;36541:12;36568:13;36491:16:::2;:101::i;:::-;36443:149:::0;;-1:-1:-1;36443:149:0;-1:-1:-1;36625:37:0;;::::2;::::0;::::2;::::0;:80:::2;;;36691:14;36666:21;:39;;36625:80;36603:173;;;;-1:-1:-1::0;;;36603:173:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36789:89;36798:10;36810:4;36824;-1:-1:-1::0;;;;;36816:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36816:28:0;36846:20;36876:1:::2;36868:9;::::0;::::2;;36789:8;:89::i;:::-;36889:91;36898:10;36910:4;36924;-1:-1:-1::0;;;;;36916:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;36916:29:0;36947:21;36978:1:::2;36970:9;::::0;::::2;;36889:8;:91::i;:::-;37016:35;::::0;;-1:-1:-1;;;37016:35:0;;37040:10:::2;37016:35;::::0;::::2;::::0;;;-1:-1:-1;;;;;37016:23:0;::::2;::::0;::::2;::::0;:35;;;;;::::2;::::0;;;;;;;;-1:-1:-1;37016:23:0;:35;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;37016:35:0;;-1:-1:-1;37102:1:0::2;37094:9;::::0;::::2;;:45:::0;::::2;;;;37119:20;37107:9;:32;37094:45;37090:104;;;37141:53;::::0;:10:::2;::::0;37161:9:::2;:32:::0;;::::2;37141:53:::0;::::2;;;::::0;::::2;::::0;;;37161:32;37141:10;:53;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37090:104;37209:4;:9;;37217:1;37209:9;:46;;;;;37234:21;37222:9;:33;37209:46;37205:106;;;37257:54;::::0;:10:::2;::::0;37277:9:::2;:33:::0;;::::2;37257:54:::0;::::2;;;::::0;::::2;::::0;;;37277:33;37257:10;:54;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;37205:106;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;35854:1465;;;;-1:-1:-1;35854:1465:0;;-1:-1:-1;35854:1465:0;-1:-1:-1;;;;;35854:1465:0:o;32981:38::-;;;:::o;33071:46::-;;;;;;;;;;;;;;;:::o;9642:26::-;;;-1:-1:-1;;;;;9642:26:0;;:::o;34322:1524::-;34733:25;32013:9;;34733:25;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;34705:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;34807:18:::2;-1:-1:-1::0;;;;;34828:26:0;::::2;-1:-1:-1::0;;;;;;;;;;;34828:26:0::2;:47;;34866:9;34828:47;;;34857:6;34828:47;34807:68:::0;-1:-1:-1;34890:19:0::2;-1:-1:-1::0;;;;;34912:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;34912:27:0::2;:49;;34951:10;34912:49;;;34942:6;34912:49;34996:218;::::0;;-1:-1:-1;;;34996:218:0;;-1:-1:-1;;;;;34996:218:0;;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;;;;;;;;;;;;;;;::::2;;::::0;;;;;;;;-1:-1:-1;35004:13:0::2;34996:47:::0;;::::2;::::0;::::2;::::0;:218;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;34996:47:0;:218;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;34996:218:0;;-1:-1:-1;35274:9:0;;-1:-1:-1;35320:10:0;;-1:-1:-1;35345:194:0::2;35372:10;34996:218:::0;35274:9;35466:12;-1:-1:-1;;;;;35497:27:0;::::2;-1:-1:-1::0;;;;;;;;;;;35497:27:0::2;35345:8;:194::i;:::-;35554:197;35581:10;35610:17:::0;35646:11;35676:13;-1:-1:-1;;;;;35708:28:0;::::2;-1:-1:-1::0;;;;;;;;;;;35708:28:0::2;35554:8;:197::i;:::-;-1:-1:-1::0;;35790:48:0::2;::::0;;-1:-1:-1;;;35790:48:0;;35827:10:::2;35790:48;::::0;::::2;::::0;;;-1:-1:-1;;;;;35790:36:0;::::2;::::0;::::2;::::0;:48;;;;;::::2;::::0;;;;;;;;-1:-1:-1;35790:36:0;:48;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;35790:48:0;32098:5;32086:17;;-1:-1:-1;;32086:17:0;;;34322:1524;;35790:48;;-1:-1:-1;34322:1524:0;;-1:-1:-1;;;;;;;;;;34322:1524:0:o;53227:1214::-;53572:18;32013:9;;53572:18;;32013:9;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;53554:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;53624:18:::2;53653:4;-1:-1:-1::0;;;;;53645:26:0::2;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53645:28:0;53706:29:::2;::::0;;-1:-1:-1;;;53706:29:0;;;;53645:28;;-1:-1:-1;53684:19:0::2;::::0;-1:-1:-1;;;;;53706:27:0;::::2;::::0;::::2;::::0;:29:::2;::::0;;::::2;::::0;53645:28:::2;::::0;53706:29;;;;;;;:27;:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53706:29:0;;-1:-1:-1;53756:70:0::2;53765:10;53785:4;53792:10:::0;53804;53824:1:::2;53816:9;::::0;::::2;;53756:8;:70::i;:::-;53837:72;53846:10;53866:4;53873:11;53886;53899:4;:9;;53907:1;53899:9;53837:8;:72::i;:::-;53935:14:::0;;53932:181:::2;;53966:56;-1:-1:-1::0;;;;;53966:38:0;::::2;54005:4:::0;54011:10;53966:56:::2;:38;:56;:::i;:::-;54050:51;::::0;;-1:-1:-1;;;54050:51:0;;54078:10:::2;54050:51;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;54050:27:0;::::2;::::0;::::2;::::0;:51;;;;;::::2;::::0;;;;;;;;-1:-1:-1;54050:27:0;:51;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54050:51:0;;-1:-1:-1;53932:181:0::2;54126:15:::0;;54123:187:::2;;54158:58;-1:-1:-1::0;;;;;54158:39:0;::::2;54198:4:::0;54204:11;54158:58:::2;:39;:58;:::i;:::-;54245:53;::::0;;-1:-1:-1;;;54245:53:0;;54274:10:::2;54245:53;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;54245:28:0;::::2;::::0;::::2;::::0;:53;;;;;::::2;::::0;;;;;;;;-1:-1:-1;54245:28:0;:53;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;54245:53:0;;-1:-1:-1;54123:187:0::2;54344:13;54330:10;:27;;:60;;;;;54376:14;54361:11;:29;;54330:60;54322:111;;;;-1:-1:-1::0;;;54322:111:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;53227:1214:0;;;;-1:-1:-1;53227:1214:0;-1:-1:-1;;;;;;53227:1214:0:o;32931:43::-;;;:::o;33026:38::-;;;:::o;52841:376::-;32013:9;;;;32012:10;32004:32;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;-1:-1:-1;;;32004:32:0;;;;;;;;;;;;;;;32047:9;:16;;-1:-1:-1;;32047:16:0;32059:4;32047:16;;;53052:8;33459:15:::1;33447:27:::0;::::1;;33439:62;;;::::0;;-1:-1:-1;;;33439:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;::::1;;53073:91:::2;53082:10;53094:9;53113;-1:-1:-1::0;;;;;53105:32:0::2;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;-1:-1:-1::0;53105:34:0;53141:11;53162:1:::2;53154:9;::::0;::::2;;53073:8;:91::i;:::-;53175:34;::::0;;-1:-1:-1;;;53175:34:0;;53198:10:::2;53175:34;::::0;::::2;::::0;;;-1:-1:-1;;;;;53175:22:0;::::2;::::0;::::2;::::0;:34;;;;;-1:-1:-1;;53175:34:0;;;;;;;-1:-1:-1;53175:22:0;:34;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;32098:5:0;32086:17;;-1:-1:-1;;32086:17:0;;;-1:-1:-1;;;;;;;52841:376:0:o;33997:115::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34070:27:0::1;;::::0;;;:13:::1;:27;::::0;;;;:34;;-1:-1:-1;;34070:34:0::1;34100:4;34070:34;::::0;;33997:115::o;32879:45::-;;;:::o;10381:163::-;10151:7;;;;;-1:-1:-1;;;;;10151:7:0;10137:10;:21;10129:43;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;-1:-1:-1;;;10129:43:0;;;;;;;;;;;;;;;10485:7:::1;::::0;;10459:44:::1;::::0;-1:-1:-1;;;;;10459:44:0;;::::1;::::0;10485:7:::1;::::0;;::::1;;::::0;10459:44:::1;::::0;::::1;10514:11;:22:::0;;-1:-1:-1;;;;;;10514:22:0::1;-1:-1:-1::0;;;;;10514:22:0;;;::::1;::::0;;;::::1;::::0;;10381:163::o;44820:1736::-;45175:20;45147:8;33459:15;33447:8;:27;;33439:62;;;;;-1:-1:-1;;;33439:62:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33439:62:0;;;;;;;;;;;;;;;45240:1:::1;45221:9;:16;:20;45213:59;;;::::0;;-1:-1:-1;;;45213:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;45213:59:0;;;;;;;;;;;;;::::1;;45309:1;45291:15;:19;45283:65;;;;-1:-1:-1::0;;;45283:65:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45392:37;::::0;;-1:-1:-1;;;45392:37:0;;45418:10:::1;45392:37;::::0;::::1;::::0;;;45361:28:::1;::::0;-1:-1:-1;;;;;45392:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45392:37:0;45515:12;;45392:37;;-1:-1:-1;;;;;;45458:20:0::1;45440:51;::::0;::::1;::::0;45492:9;;45503:10:::1;::::0;45515:9;;45525:1:::1;::::0;45515:12:::1;;;;;;;;;;45529:15;45440:105;;;;;;;;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;-1:-1:-1::0;;;;;45440:105:0::1;-1:-1:-1::0;;;;;45440:105:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;45563:9:0::1;::::0;-1:-1:-1;;;45558:636:0::1;45582:9;:16;45578:1;:20;45558:636;;;45648:1;45629:9;:16;:20;45624:1;:25;45620:520;;;45687:1;45674:14:::0;::::1;45670:202;;45726:9;45736:1;45726:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45718:30:0::1;;45749:10;45718:42;;;;;;;;;;;;;-1:-1:-1::0;;;;;45718:42:0::1;-1:-1:-1::0;;;;;45718:42:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45670:202:0::1;::::0;-1:-1:-1;45670:202:0::1;;45817:9;45827:1;45817:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45809:31:0::1;;45841:10;45809:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;45809:43:0::1;-1:-1:-1::0;;;;;45809:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45670:202:0::1;45620:520;;;45928:1;45916:13:::0;::::1;45912:213;;45967:9;45977:1;45967:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45959:30:0::1;;45990:9;46000:1;46004;46000:5;45990:16;;;;;;;;;;;;;;45959:48;;;;;;;;;;;;;-1:-1:-1::0;;;;;45959:48:0::1;-1:-1:-1::0;;;;;45959:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;45912:213;46064:9;46074:1;46064:12;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46056:31:0::1;;46088:9;46098:1;46102;46098:5;46088:16;;;;;;;;;;;;;;46056:49;;;;;;;;;;;;;-1:-1:-1::0;;;;;46056:49:0::1;-1:-1:-1::0;;;;;46056:49:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;45912:213:0::1;46181:1;46167:15:::0;;::::1;::::0;45600:3:::1;45558:636;;;-1:-1:-1::0;46219:37:0::1;::::0;;-1:-1:-1;;;46219:37:0;;46245:10:::1;46219:37;::::0;::::1;::::0;;;:63:::1;::::0;46261:20;;-1:-1:-1;;;;;46219:25:0;::::1;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;:25;:37;::::1;;::::0;::::1;;;;::::0;::::1;:63;46204:78;;46317:15;46301:12;:31;;46293:86;;;;-1:-1:-1::0;;;46293:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46397:151;::::0;;-1:-1:-1;;;;;46397:151:0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;46470:10:::1;46397:151:::0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;46397:151:0;;;;;;;::::1;33512:1;44820:1736:::0;;;;;;;;;;;:::o;54455:495::-;54618:5;54614:329;;;54644:10;;54640:183;;54681:6;-1:-1:-1;;;;;54675:21:0;;54704:6;54675:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;54736:19:0;;54750:4;54736:19;;-1:-1:-1;54732:75:0;;54757:50;54787:6;54796:2;54800:6;54757:22;:50::i;:::-;54614:329;;;54855:76;;;-1:-1:-1;;;54855:76:0;;-1:-1:-1;;;;;54855:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54873:20;54855:51;;;;;;:76;;;;;-1:-1:-1;;54855:76:0;;;;;;;;-1:-1:-1;54855:51:0;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54614:329;54455:495;;;;;:::o;30708:374::-;30853:34;;;-1:-1:-1;;;30853:34:0;;30877:4;30853:34;;;;-1:-1:-1;;;;;30853:34:0;;;;;;;;;30833:17;;30853:15;;;;;:34;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30853:34:0;;-1:-1:-1;30902:18:0;;;30898:177;;;30941:13;;30937:78;;30975:24;-1:-1:-1;;;;;30975:17:0;;30993:2;30997:1;30975:24;:17;:24;:::i;:::-;31029:34;-1:-1:-1;;;;;31029:17:0;;31047:2;-1:-1:-1;;31029:34:0;:17;:34;:::i;:::-;30708:374;;;;:::o;31326:129::-;31400:7;31427:5;-1:-1:-1;;;;;31427:15:0;;31443:3;31427:20;;;;;;;;;;;;;-1:-1:-1;;;;;31427:20:0;-1:-1:-1;;;;;31427:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31427:20:0;;-1:-1:-1;31326:129:0;;;;;:::o;30377:323::-;30512:10;;30508:185;;30543:12;30549:5;30543;:12::i;:::-;30539:143;;;30576:19;;-1:-1:-1;;;;;30576:11:0;;;:19;;;;;30588:6;;30576:19;;;;30588:6;30576:11;:19;;;;;;;;;;;;;;;;;;;;;30539:143;;;30636:30;-1:-1:-1;;;;;30636:18:0;;30655:2;30659:6;30636:30;:18;:30;:::i;:::-;30377:323;;;:::o;54958:440::-;55107:5;55103:288;;;55133:10;;55129:119;;55170:6;-1:-1:-1;;;;;55164:22:0;;55187:6;55164:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55213:19:0;;-1:-1:-1;;;;;55213:11:0;;;-1:-1:-1;55213:19:0;;;;;-1:-1:-1;55225:6:0;;55213:19;;;;55225:6;55213:11;:19;;;;;;;;;;;;;;;;;;;;;55129:119;55103:288;;;55284:10;;55280:100;;55315:49;55345:5;55353:2;55357:6;55315:22;:49::i;31090:228::-;31168:7;31192:12;31198:5;31192;:12::i;:::-;31188:123;;;-1:-1:-1;;;;;;31228:11:0;;;31221:18;;31188:123;31279:5;-1:-1:-1;;;;;31279:15:0;;31295:3;31279:20;;;;;;;;;;;;;-1:-1:-1;;;;;31279:20:0;-1:-1:-1;;;;;31279:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31279:20:0;;-1:-1:-1;31272:27:0;;14035:137;14093:7;14126:1;14121;:6;;14113:28;;;;;-1:-1:-1;;;14113:28:0;;;;;;;;;;;;-1:-1:-1;;;14113:28:0;;;;;;;;;;;;;;;-1:-1:-1;14159:5:0;;;14035:137::o;37327:1276::-;37475:28;37505:29;37548:19;37569:20;37601:10;-1:-1:-1;;;;;37593:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37593:37:0;;;;;;;;;-1:-1:-1;37593:37:0;-1:-1:-1;37645:17:0;;:37;;;;-1:-1:-1;37666:16:0;;37645:37;37641:157;;;37722:12;37699:35;;37773:13;37749:37;;37641:157;37812:17;;:36;;;;;37847:1;37833:11;:15;37812:36;37808:144;;;37888:12;37865:35;;37939:1;37915:25;;37808:144;37981:1;37966:12;:16;:35;;;;;38000:1;37986:11;:15;37966:35;37962:634;;;38018:25;38046:47;38067:12;38081:11;38046:20;:47::i;:::-;38018:75;;38108:26;38137:49;38158:13;38173:12;38137:20;:49::i;:::-;38108:78;;38226:18;38205:17;:39;38201:384;;38288:12;38265:35;;38343:53;38364:12;38378:17;38343:20;:53::i;:::-;38319:77;;38201:384;;;38461:13;38437:37;;38516:53;38537:11;38550:18;38516:20;:53::i;:::-;38493:76;;38201:384;37962:634;;;37327:1276;;;;;;;;:::o;27498:211::-;27642:58;;;-1:-1:-1;;;;;27642:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27642:58:0;-1:-1:-1;;;27642:58:0;;;27615:86;;27635:5;;27615:19;:86::i;28010:670::-;28428:10;;;28427:62;;-1:-1:-1;28444:39:0;;;-1:-1:-1;;;28444:39:0;;28468:4;28444:39;;;;-1:-1:-1;;;;;28444:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28444:39:0;:44;28427:62;28405:166;;;;-1:-1:-1;;;28405:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28609:62;;;-1:-1:-1;;;;;28609:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28609:62:0;-1:-1:-1;;;28609:62:0;;;28582:90;;28602:5;;28582:19;:90::i;31463:104::-;-1:-1:-1;;;;;31539:20:0;;-1:-1:-1;;;;;;;;;;;31539:20:0;31463:104;;;:::o;15156:128::-;15224:7;15251:25;15274:1;15251:18;:6;15262;15251:18;:10;:18;:::i;:::-;:22;:25;:22;:25;:::i;:::-;15244:32;15156:128;-1:-1:-1;;;15156:128:0:o;14882:127::-;14950:7;14994:6;14977:13;:6;14988:1;14977:13;:10;:13;:::i;:::-;:24;;;;;;;14882:127;-1:-1:-1;;;14882:127:0:o;29071:1046::-;29731:12;29745:23;29780:5;-1:-1:-1;;;;;29772:19:0;29792:4;29772:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29772:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29730:67;;;;29816:7;29808:52;;;;;-1:-1:-1;;;29808:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29877:17;;:21;29873:237;;30032:10;30021:30;;;;;;;;;;;;;;;-1:-1:-1;30021:30:0;30013:85;;;;-1:-1:-1;;;30013:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13356:226;13414:7;13438:6;13434:47;;-1:-1:-1;13468:1:0;13461:8;;13434:47;13505:5;;;13509:1;13505;:5;:1;13529:5;;;;;:10;13521:32;;;;;-1:-1:-1;;;13521:32:0;;;;;;;;;;;;-1:-1:-1;;;13521:32:0;;;;;;;;;;;;;;13590:141;13648:7;13680:1;13676;:5;13668:32;;;;;-1:-1:-1;;;13668:32:0;;;;;;;;;;;;-1:-1:-1;;;13668:32:0;;;;;;;;;;;;;;;13722:1;13718;:5;;;

Swarm Source

ipfs://ad86b25d9015e44584397f703bb1c2372be77b108e36e771bb292a272b32ecdc
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.