Contract 0x65187fec6ecc4774c1f632c7503466d5b4353db1 7

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa27d5e3f396ec4ea7c9919ca3885008362007706375154197dfe9cef98951a9aClose Trade Mark...364771942022-12-06 1:35:2049 secs ago0x2bfae5f58b469fb9b06fc91dae83fc333f5cc6a5 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.058867391233 46.020062442
0x78286589562f90e3857bce9c70ce29ad2c54d1434b19509d4429ba2cb173cfeeTigris Trade364771632022-12-06 1:34:141 min ago0xb34d0bfe6e941185e2f5cc9bbc2e21656905754e IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.062375065639 44.610975282
0xe940f003e7affbce5989aab8ec385cda080fde503558756fd5047beeb5235e86Update Sl364771462022-12-06 1:33:402 mins ago0x3c7531564b8a6806bc42890301be6596cb6c3754 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.034875154636 30.000029795
0x216d948fd2def347d66b9f98202f3ed789d562d7473804374a0c2f158387f909Close Trade Mark...364771282022-12-06 1:33:043 mins ago0x23290408157e8f0c7a8fd565a22d92b63f83c6fb IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.055819913039 43.637671549
0xaf14e425570db19abd6b8c31e1649a06bf872e665b194549520fa3de559a8028Tigris Trade364770622022-12-06 1:30:485 mins ago0x146d5a7c4cfa58d08204587ffb7fbb8966902661 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.061783137237 44.210232838
0x56922ca69e42c75ff714e9e440b4c22c763c030e0adb53a92b3cd91078d457f7Close Trade Mark...364770592022-12-06 1:30:425 mins ago0x87217fb750dbede98df002b2bfd3aefc228dad50 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.065174514268 50.169746489
0x4d51d7f6712ddb5d98511e8447481c570e1f0fa2804ac8885b21343f8d50afe6Update Sl364770552022-12-06 1:30:305 mins ago0x9c963f367020e0e618c5cf8f6905176875dce32b IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.003934304022 33.000092455
0xbe967ba9b3e08559d53a36402dbd8d5465f4763bce45c4e4bb5693ac9a4e9afcCancel Open Limi...364770282022-12-06 1:29:266 mins ago0x2bfae5f58b469fb9b06fc91dae83fc333f5cc6a5 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.007428840006 45.519852982
0x12826a0abadbeb71fc75fb4d9780c12bf9e8693c2c9e1b026014f97d72e38215Tigris Trade364770052022-12-06 1:28:407 mins ago0x8a67c9f45f9cc67421fae41ab550d5d88625d9d6 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.016658838913 44.514260823
0x99acd3b7fb35a689334c21a0ee84aee075ea53b3f9563a75b325d7f7c6bbddccTigris Trade364769992022-12-06 1:28:287 mins ago0xe361ae84591adcdd27926fdaa22ab5b0407d15bd IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.061972048693 44.961137285
0x4837de1202e856c7ada4b7ad1b128bb5738a717fbb4acd142a3ae96c7e333045Close Trade Mark...364769822022-12-06 1:27:268 mins ago0x8b15cf936672e0aaefe7e950360dadad0d3a516e IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.054043387434 43.606023963
0x6b356665570ff4501b14465d69039969f6d4a8beb09476cdda03122168ff31ccClose Trade Mark...364769662022-12-06 1:26:549 mins ago0xb36543a91792be59f2f31dd23db1377d74f40146 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.055891163676 43.693372314
0x3ff11c6d523d9ee769da6ecc8d2d3e6c6fa48e016fd2c753aab5f85ae3379a9fExecute Nft Orde...364769662022-12-06 1:26:549 mins ago0x6b8ebedc27efaa552ccad495949eab1c9d0987d1 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.003823708389 53.000324196
0x3339894926b934e3df699a96cb0b1546531d11ed98a9ba16fc086119448546b5Execute Nft Orde...364769662022-12-06 1:26:549 mins ago0xb103b61dd7c449e3cc79fbac9e377010f706a4ce IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.003823072385 53.000324196
0x8c30be2045393dad6339113cb351f98ad21422a9cbe56f0bb36f920b53d8068eExecute Nft Orde...364769652022-12-06 1:26:529 mins ago0x514a987c87af016371cc352407f98a3144d5d486 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.003823074095 53.000347906
0x2a42641747a3c77fe15cadc8a52446c9255ddf1e44f8c5254cd26ce27df7c7c8Execute Nft Orde...364769612022-12-06 1:26:449 mins ago0xb103b61dd7c449e3cc79fbac9e377010f706a4ce IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.006148256983 53.000387774
0x3509b7c4c3d28d33b104dcc2aae0b8f41dcd3fad4b64f0d64e32af2da868855fExecute Nft Orde...364769602022-12-06 1:26:429 mins ago0x9b59a4c9ca4ba1ac77fcfc17d6e42b847cb9cbee IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.005675950301 48.000391563
0x503e2f3012ba32a824effbc995c969552085a1d695e000d6eeaf092ea41ebd2bExecute Nft Orde...364769602022-12-06 1:26:429 mins ago0x6a33b68894c643a92b94a95b6d950add64b2a179 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.005793610296 49.000391563
0x290895dc47f3664ae5e64816d841b7e289119418c71312dc3b03f777b54e7860Execute Nft Orde...364769602022-12-06 1:26:429 mins ago0xa20dec41a1e26b050fdd352eeb387cc6cb28c2be IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.005911846296 50.000391563
0x674be6e1b2298fd52771a2a4386a20592fc60d435a0f5555637f8c42946b5952Execute Nft Orde...364769602022-12-06 1:26:429 mins ago0x7676d49df89c7cf60953beb193724bd6403b8eb0 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.006148942301 52.000391563
0xe2b686f4786da1de8b55002161d7d898ecacb751385bc21969dcfaeb1f1b8c4bExecute Nft Orde...364769602022-12-06 1:26:429 mins ago0xf54e8b1b6f1ef4d2b1839991dab3ec4adc9d068d IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.006148318296 52.000391563
0x709a9a0083a924578fb0cf1d8ad4c63fcb04d6e501ca50f72bdecfa39dd63008Execute Nft Orde...364769602022-12-06 1:26:429 mins ago0x514a987c87af016371cc352407f98a3144d5d486 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.006266554296 53.000391563
0x5ef7d91227b348a7e413a1942ce468cfc233dbfe80d6ef224eb647f2be98bc3dExecute Nft Orde...364769602022-12-06 1:26:429 mins ago0x12243b5bfc0269cd0cebf5a92c1ea1f14e6067e6 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.006267190301 53.000391563
0x001be126f103f4f2a8a536acf8913918b3d3fbf1fee2633d853d5c21f03b5e83Execute Nft Orde...364769602022-12-06 1:26:429 mins ago0x3755d7c8f37eced3a3d2e6062d43674ba2ac61a6 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.007706945938 53.000391563
0x180c2499bae0cf73ee13a65553bc57c7c663d6ebcc9996f3b99beb7b03eced1dExecute Nft Orde...364769602022-12-06 1:26:429 mins ago0xcedbbf30944ac2df3fd14ab2987e0c512751ffa8 IN  0x65187fec6ecc4774c1f632c7503466d5b4353db10 MATIC0.007584409033 53.000391563
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
GNSTradingV6_2

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 125 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-08-16
*/

// File: contracts\interfaces\UniswapRouterInterfaceV5.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

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

	function swapTokensForExactTokens(
		uint amountOut,
		uint amountInMax,
		address[] calldata path,
		address to,
		uint deadline
	) external returns (uint[] memory amounts);
}

// File: contracts\interfaces\TokenInterfaceV5.sol

pragma solidity 0.8.15;

interface TokenInterfaceV5{
    function burn(address, uint256) external;
    function mint(address, uint256) external;
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns(bool);
    function balanceOf(address) external view returns(uint256);
    function hasRole(bytes32, address) external view returns (bool);
    function approve(address, uint256) external returns (bool);
    function allowance(address, address) external view returns (uint256);
}

// File: contracts\interfaces\NftInterfaceV5.sol

pragma solidity 0.8.15;

interface NftInterfaceV5{
    function balanceOf(address) external view returns (uint);
    function ownerOf(uint) external view returns (address);
    function transferFrom(address, address, uint) external;
    function tokenOfOwnerByIndex(address, uint) external view returns(uint);
}

// File: contracts\interfaces\VaultInterfaceV5.sol

pragma solidity 0.8.15;

interface VaultInterfaceV5{
	function sendDaiToTrader(address, uint) external;
	function receiveDaiFromTrader(address, uint, uint) external;
	function currentBalanceDai() external view returns(uint);
	function distributeRewardDai(uint) external;
}

// File: contracts\interfaces\PairsStorageInterfaceV6.sol

pragma solidity 0.8.15;

interface PairsStorageInterfaceV6{
    enum FeedCalculation { DEFAULT, INVERT, COMBINE }    // FEED 1, 1 / (FEED 1), (FEED 1)/(FEED 2)
    struct Feed{ address feed1; address feed2; FeedCalculation feedCalculation; uint maxDeviationP; } // PRECISION (%)
    function incrementCurrentOrderId() external returns(uint);
    function updateGroupCollateral(uint, uint, bool, bool) external;
    function pairJob(uint) external returns(string memory, string memory, bytes32, uint);
    function pairFeed(uint) external view returns(Feed memory);
    function pairSpreadP(uint) external view returns(uint);
    function pairMinLeverage(uint) external view returns(uint);
    function pairMaxLeverage(uint) external view returns(uint);
    function groupMaxCollateral(uint) external view returns(uint);
    function groupCollateral(uint, bool) external view returns(uint);
    function guaranteedSlEnabled(uint) external view returns(bool);
    function pairOpenFeeP(uint) external view returns(uint);
    function pairCloseFeeP(uint) external view returns(uint);
    function pairOracleFeeP(uint) external view returns(uint);
    function pairNftLimitOrderFeeP(uint) external view returns(uint);
    function pairReferralFeeP(uint) external view returns(uint);
    function pairMinLevPosDai(uint) external view returns(uint);
}

// File: contracts\interfaces\StorageInterfaceV5.sol

pragma solidity 0.8.15;

interface StorageInterfaceV5{
    enum LimitOrder { TP, SL, LIQ, OPEN }
    struct Trader{
        uint leverageUnlocked;
        address referral;
        uint referralRewardsTotal;  // 1e18
    }
    struct Trade{
        address trader;
        uint pairIndex;
        uint index;
        uint initialPosToken;       // 1e18
        uint positionSizeDai;       // 1e18
        uint openPrice;             // PRECISION
        bool buy;
        uint leverage;
        uint tp;                    // PRECISION
        uint sl;                    // PRECISION
    }
    struct TradeInfo{
        uint tokenId;
        uint tokenPriceDai;         // PRECISION
        uint openInterestDai;       // 1e18
        uint tpLastUpdated;
        uint slLastUpdated;
        bool beingMarketClosed;
    }
    struct OpenLimitOrder{
        address trader;
        uint pairIndex;
        uint index;
        uint positionSize;          // 1e18 (DAI or GFARM2)
        uint spreadReductionP;
        bool buy;
        uint leverage;
        uint tp;                    // PRECISION (%)
        uint sl;                    // PRECISION (%)
        uint minPrice;              // PRECISION
        uint maxPrice;              // PRECISION
        uint block;
        uint tokenId;               // index in supportedTokens
    }
    struct PendingMarketOrder{
        Trade trade;
        uint block;
        uint wantedPrice;           // PRECISION
        uint slippageP;             // PRECISION (%)
        uint spreadReductionP;
        uint tokenId;               // index in supportedTokens
    }
    struct PendingNftOrder{
        address nftHolder;
        uint nftId;
        address trader;
        uint pairIndex;
        uint index;
        LimitOrder orderType;
    }
    function PRECISION() external pure returns(uint);
    function gov() external view returns(address);
    function dev() external view returns(address);
    function dai() external view returns(TokenInterfaceV5);
    function token() external view returns(TokenInterfaceV5);
    function linkErc677() external view returns(TokenInterfaceV5);
    function tokenDaiRouter() external view returns(UniswapRouterInterfaceV5);
    function priceAggregator() external view returns(AggregatorInterfaceV6_2);
    function vault() external view returns(VaultInterfaceV5);
    function trading() external view returns(address);
    function callbacks() external view returns(address);
    function handleTokens(address,uint,bool) external;
    function transferDai(address, address, uint) external;
    function transferLinkToAggregator(address, uint, uint) external;
    function unregisterTrade(address, uint, uint) external;
    function unregisterPendingMarketOrder(uint, bool) external;
    function unregisterOpenLimitOrder(address, uint, uint) external;
    function hasOpenLimitOrder(address, uint, uint) external view returns(bool);
    function storePendingMarketOrder(PendingMarketOrder memory, uint, bool) external;
    function storeReferral(address, address) external;
    function openTrades(address, uint, uint) external view returns(Trade memory);
    function openTradesInfo(address, uint, uint) external view returns(TradeInfo memory);
    function updateSl(address, uint, uint, uint) external;
    function updateTp(address, uint, uint, uint) external;
    function getOpenLimitOrder(address, uint, uint) external view returns(OpenLimitOrder memory);
    function spreadReductionsP(uint) external view returns(uint);
    function positionSizeTokenDynamic(uint,uint) external view returns(uint);
    function maxSlP() external view returns(uint);
    function storeOpenLimitOrder(OpenLimitOrder memory) external;
    function reqID_pendingMarketOrder(uint) external view returns(PendingMarketOrder memory);
    function storePendingNftOrder(PendingNftOrder memory, uint) external;
    function updateOpenLimitOrder(OpenLimitOrder calldata) external;
    function firstEmptyTradeIndex(address, uint) external view returns(uint);
    function firstEmptyOpenLimitIndex(address, uint) external view returns(uint);
    function increaseNftRewards(uint, uint) external;
    function nftSuccessTimelock() external view returns(uint);
    function currentPercentProfit(uint,uint,bool,uint) external view returns(int);
    function reqID_pendingNftOrder(uint) external view returns(PendingNftOrder memory);
    function setNftLastSuccess(uint) external;
    function updateTrade(Trade memory) external;
    function nftLastSuccess(uint) external view returns(uint);
    function unregisterPendingNftOrder(uint) external;
    function handleDevGovFees(uint, uint, bool, bool) external returns(uint);
    function distributeLpRewards(uint) external;
    function getReferral(address) external view returns(address);
    function increaseReferralRewards(address, uint) external;
    function storeTrade(Trade memory, TradeInfo memory) external;
    function setLeverageUnlocked(address, uint) external;
    function getLeverageUnlocked(address) external view returns(uint);
    function openLimitOrdersCount(address, uint) external view returns(uint);
    function maxOpenLimitOrdersPerPair() external view returns(uint);
    function openTradesCount(address, uint) external view returns(uint);
    function pendingMarketOpenCount(address, uint) external view returns(uint);
    function pendingMarketCloseCount(address, uint) external view returns(uint);
    function maxTradesPerPair() external view returns(uint);
    function maxTradesPerBlock() external view returns(uint);
    function tradesPerBlock(uint) external view returns(uint);
    function pendingOrderIdsCount(address) external view returns(uint);
    function maxPendingMarketOrders() external view returns(uint);
    function maxGainP() external view returns(uint);
    function defaultLeverageUnlocked() external view returns(uint);
    function openInterestDai(uint, uint) external view returns(uint);
    function getPendingOrderIds(address) external view returns(uint[] memory);
    function traders(address) external view returns(Trader memory);
    function nfts(uint) external view returns(NftInterfaceV5);
}

interface AggregatorInterfaceV6_2{
    enum OrderType { MARKET_OPEN, MARKET_CLOSE, LIMIT_OPEN, LIMIT_CLOSE, UPDATE_SL }
    function pairsStorage() external view returns(PairsStorageInterfaceV6);
    function getPrice(uint,OrderType,uint) external returns(uint);
    function tokenPriceDai() external returns(uint);
    function linkFee(uint,uint) external view returns(uint);
    function tokenDaiReservesLp() external view returns(uint, uint);
    function pendingSlOrders(uint) external view returns(PendingSl memory);
    function storePendingSlOrder(uint orderId, PendingSl calldata p) external;
    function unregisterPendingSlOrder(uint orderId) external;
    struct PendingSl{address trader; uint pairIndex; uint index; uint openPrice; bool buy; uint newSl; }
}

interface NftRewardsInterfaceV6{
    struct TriggeredLimitId{ address trader; uint pairIndex; uint index; StorageInterfaceV5.LimitOrder order; }
    enum OpenLimitOrderType{ LEGACY, REVERSAL, MOMENTUM }
    function storeFirstToTrigger(TriggeredLimitId calldata, address) external;
    function storeTriggerSameBlock(TriggeredLimitId calldata, address) external;
    function unregisterTrigger(TriggeredLimitId calldata) external;
    function distributeNftReward(TriggeredLimitId calldata, uint) external;
    function openLimitOrderTypes(address, uint, uint) external view returns(OpenLimitOrderType);
    function setOpenLimitOrderType(address, uint, uint, OpenLimitOrderType) external;
    function triggered(TriggeredLimitId calldata) external view returns(bool);
    function timedOut(TriggeredLimitId calldata) external view returns(bool);
}

// File: contracts\interfaces\GNSPairInfosInterfaceV6.sol

pragma solidity 0.8.15;

interface GNSPairInfosInterfaceV6{
    function maxNegativePnlOnOpenP() external view returns(uint); // PRECISION (%)

    function storeTradeInitialAccFees(
        address trader,
        uint pairIndex,
        uint index,
        bool long
    ) external;

    function getTradePriceImpact(
        uint openPrice,   // PRECISION
        uint pairIndex,
        bool long,
        uint openInterest // 1e18 (DAI)
    ) external view returns(
        uint priceImpactP,      // PRECISION (%)
        uint priceAfterImpact   // PRECISION
    );

   function getTradeLiquidationPrice(
        address trader,
        uint pairIndex,
        uint index,
        uint openPrice,  // PRECISION
        bool long,
        uint collateral, // 1e18 (DAI)
        uint leverage
    ) external view returns(uint); // PRECISION

    function getTradeValue(
        address trader,
        uint pairIndex,
        uint index,
        bool long,
        uint collateral,   // 1e18 (DAI)
        uint leverage,
        int percentProfit, // PRECISION (%)
        uint closingFee    // 1e18 (DAI)
    ) external returns(uint); // 1e18 (DAI)
}

// File: contracts\interfaces\GNSReferralsInterfaceV6_2.sol

pragma solidity 0.8.15;

interface GNSReferralsInterfaceV6_2{
    function registerPotentialReferrer(address trader, address referral) external;
   	function distributePotentialReward(
        address trader,
        uint volumeDai,
        uint pairOpenFeeP,
        uint tokenPriceDai
    ) external returns(uint);
    function getPercentOfOpenFeeP(address trader) external view returns(uint);
    function getTraderReferrer(address trader) external view returns(address referrer);
}

// File: contracts\Delegatable.sol

pragma solidity 0.8.15;

abstract contract Delegatable {
    mapping (address => address) public delegations;
    address private senderOverride;

    function setDelegate(address delegate) external {
        require(tx.origin == msg.sender, "NO_CONTRACT");

        delegations[msg.sender] = delegate;
    }

    function removeDelegate() external {
        delegations[msg.sender] = address(0);
    }

    function delegatedAction(address trader, bytes calldata call_data) external returns (bytes memory) {
        require(delegations[trader] == msg.sender, "DELEGATE_NOT_APPROVED");

        senderOverride = trader;
        (bool success, bytes memory result) = address(this).delegatecall(call_data);
        if (!success) {
            // Next 5 lines from https://ethereum.stackexchange.com/a/83577 (return the original revert reason)
            if (result.length < 68) revert();
            assembly {
                result := add(result, 0x04)
            }
            revert(abi.decode(result, (string)));
        }

        senderOverride = address(0);

        return result;
    }


    function _msgSender() public view returns (address) {
        if (senderOverride == address(0)) {
            return msg.sender;
        } else {
            return senderOverride;
        }
    }
}

// File: contracts\GNSTradingV6_2.sol

pragma solidity 0.8.15;

contract GNSTradingV6_2 is Delegatable {

    // Contracts (constant)
    StorageInterfaceV5 public immutable storageT;
    NftRewardsInterfaceV6 public immutable nftRewards;
    GNSPairInfosInterfaceV6 public immutable pairInfos;
    GNSReferralsInterfaceV6_2 public immutable referrals;

    // Params (constant)
    uint constant PRECISION = 1e10;
    uint constant MAX_SL_P = 75;  // -75% PNL

    // Params (adjustable)
    uint public maxPosDai;            // 1e18 (eg. 75000 * 1e18)
    uint public limitOrdersTimelock;  // block (eg. 30)
    uint public marketOrdersTimeout;  // block (eg. 30)

    // State
    bool public isPaused;  // Prevent opening new trades
    bool public isDone;    // Prevent any interaction with the contract

    // Events
    event Done(bool done);
    event Paused(bool paused);

    event NumberUpdated(string name, uint value);

    event MarketOrderInitiated(
        uint indexed orderId,
        address indexed trader,
        uint indexed pairIndex,
        bool open
    );

    event OpenLimitPlaced(
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );
    event OpenLimitUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newPrice,
        uint newTp,
        uint newSl
    );
    event OpenLimitCanceled(
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );

    event TpUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newTp
    );
    event SlUpdated(
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newSl
    );
    event SlUpdateInitiated(
        uint indexed orderId,
        address indexed trader,
        uint indexed pairIndex,
        uint index,
        uint newSl
    );

    event NftOrderInitiated(
        uint orderId,
        address indexed nftHolder,
        address indexed trader,
        uint indexed pairIndex
    );
    event NftOrderSameBlock(
        address indexed nftHolder,
        address indexed trader,
        uint indexed pairIndex
    );

    event ChainlinkCallbackTimeout(
        uint indexed orderId,
        StorageInterfaceV5.PendingMarketOrder order
    );
    event CouldNotCloseTrade(
        address indexed trader,
        uint indexed pairIndex,
        uint index
    );

    constructor(
        StorageInterfaceV5 _storageT,
        NftRewardsInterfaceV6 _nftRewards,
        GNSPairInfosInterfaceV6 _pairInfos,
        GNSReferralsInterfaceV6_2 _referrals,
        uint _maxPosDai,
        uint _limitOrdersTimelock,
        uint _marketOrdersTimeout
    ) {
        require(address(_storageT) != address(0)
            && address(_nftRewards) != address(0)
            && address(_pairInfos) != address(0)
            && address(_referrals) != address(0)
            && _maxPosDai > 0
            && _limitOrdersTimelock > 0
            && _marketOrdersTimeout > 0, "WRONG_PARAMS");

        storageT = _storageT;
        nftRewards = _nftRewards;
        pairInfos = _pairInfos;
        referrals = _referrals;

        maxPosDai = _maxPosDai;
        limitOrdersTimelock = _limitOrdersTimelock;
        marketOrdersTimeout = _marketOrdersTimeout;
    }

    // Modifiers
    modifier onlyGov(){
        require(msg.sender == storageT.gov(), "GOV_ONLY");
        _;
    }
    modifier notContract(){
        require(tx.origin == msg.sender);
        _;
    }
    modifier notDone(){
        require(!isDone, "DONE");
        _;
    }

    // Manage params
    function setMaxPosDai(uint value) external onlyGov{
        require(value > 0, "VALUE_0");
        maxPosDai = value;
        
        emit NumberUpdated("maxPosDai", value);
    }
    function setLimitOrdersTimelock(uint value) external onlyGov{
        require(value > 0, "VALUE_0");
        limitOrdersTimelock = value;
        
        emit NumberUpdated("limitOrdersTimelock", value);
    }
    function setMarketOrdersTimeout(uint value) external onlyGov{
        require(value > 0, "VALUE_0");
        marketOrdersTimeout = value;
        
        emit NumberUpdated("marketOrdersTimeout", value);
    }

    // Manage state
    function pause() external onlyGov{
        isPaused = !isPaused;

        emit Paused(isPaused);
    }
    function done() external onlyGov{
        isDone = !isDone;

        emit Done(isDone);
    }

    // Open new trade (MARKET/LIMIT)
    function openTrade(
        StorageInterfaceV5.Trade memory t,
        NftRewardsInterfaceV6.OpenLimitOrderType orderType, // LEGACY => market
        uint spreadReductionId,
        uint slippageP, // for market orders only
        address referrer
    ) external notContract notDone{

        require(!isPaused, "PAUSED");

        AggregatorInterfaceV6_2 aggregator = storageT.priceAggregator();
        PairsStorageInterfaceV6 pairsStored = aggregator.pairsStorage();

        address sender = _msgSender();

        require(storageT.openTradesCount(sender, t.pairIndex)
            + storageT.pendingMarketOpenCount(sender, t.pairIndex)
            + storageT.openLimitOrdersCount(sender, t.pairIndex)
            < storageT.maxTradesPerPair(), 
            "MAX_TRADES_PER_PAIR");

        require(storageT.pendingOrderIdsCount(sender)
            < storageT.maxPendingMarketOrders(), 
            "MAX_PENDING_ORDERS");

        require(t.positionSizeDai <= maxPosDai, "ABOVE_MAX_POS");
        require(t.positionSizeDai * t.leverage
            >= pairsStored.pairMinLevPosDai(t.pairIndex), "BELOW_MIN_POS");

        require(t.leverage > 0 && t.leverage >= pairsStored.pairMinLeverage(t.pairIndex) 
            && t.leverage <= pairsStored.pairMaxLeverage(t.pairIndex), 
            "LEVERAGE_INCORRECT");

        require(spreadReductionId == 0
            || storageT.nfts(spreadReductionId - 1).balanceOf(sender) > 0,
            "NO_CORRESPONDING_NFT_SPREAD_REDUCTION");

        require(t.tp == 0 || (t.buy ?
                t.tp > t.openPrice :
                t.tp < t.openPrice), "WRONG_TP");

        require(t.sl == 0 || (t.buy ?
                t.sl < t.openPrice :
                t.sl > t.openPrice), "WRONG_SL");

        (uint priceImpactP, ) = pairInfos.getTradePriceImpact(
            0,
            t.pairIndex,
            t.buy,
            t.positionSizeDai * t.leverage
        );

        require(priceImpactP * t.leverage
            <= pairInfos.maxNegativePnlOnOpenP(), "PRICE_IMPACT_TOO_HIGH");

        storageT.transferDai(sender, address(storageT), t.positionSizeDai);

        if(orderType != NftRewardsInterfaceV6.OpenLimitOrderType.LEGACY){
            uint index = storageT.firstEmptyOpenLimitIndex(sender, t.pairIndex);

            storageT.storeOpenLimitOrder(
                StorageInterfaceV5.OpenLimitOrder(
                    sender,
                    t.pairIndex,
                    index,
                    t.positionSizeDai,
                    spreadReductionId > 0 ?
                        storageT.spreadReductionsP(spreadReductionId - 1) :
                        0,
                    t.buy,
                    t.leverage,
                    t.tp,
                    t.sl,
                    t.openPrice,
                    t.openPrice,
                    block.number,
                    0
                )
            );

            nftRewards.setOpenLimitOrderType(sender, t.pairIndex, index, orderType);

            emit OpenLimitPlaced(
                sender,
                t.pairIndex,
                index
            );

        }else{
            uint orderId = aggregator.getPrice(
                t.pairIndex, 
                AggregatorInterfaceV6_2.OrderType.MARKET_OPEN, 
                t.positionSizeDai * t.leverage
            );

            storageT.storePendingMarketOrder(
                StorageInterfaceV5.PendingMarketOrder(
                    StorageInterfaceV5.Trade(
                        sender,
                        t.pairIndex,
                        0,
                        0,
                        t.positionSizeDai,
                        0, 
                        t.buy,
                        t.leverage,
                        t.tp,
                        t.sl
                    ),
                    0,
                    t.openPrice,
                    slippageP,
                    spreadReductionId > 0 ?
                        storageT.spreadReductionsP(spreadReductionId - 1) :
                        0,
                    0
                ), orderId, true
            );

            emit MarketOrderInitiated(
                orderId,
                sender,
                t.pairIndex,
                true
            );
        }

        referrals.registerPotentialReferrer(sender, referrer);
    }

    // Close trade (MARKET)
    function closeTradeMarket(
        uint pairIndex,
        uint index
    ) external notContract notDone{

        address sender = _msgSender();

        StorageInterfaceV5.Trade memory t = storageT.openTrades(
            sender, pairIndex, index
        );

        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(
            sender, pairIndex, index
        );

        require(storageT.pendingOrderIdsCount(sender)
            < storageT.maxPendingMarketOrders(), "MAX_PENDING_ORDERS");

        require(!i.beingMarketClosed, "ALREADY_BEING_CLOSED");
        require(t.leverage > 0, "NO_TRADE");

        uint orderId = storageT.priceAggregator().getPrice(
            pairIndex, 
            AggregatorInterfaceV6_2.OrderType.MARKET_CLOSE, 
            t.initialPosToken * i.tokenPriceDai * t.leverage / PRECISION
        );

        storageT.storePendingMarketOrder(
            StorageInterfaceV5.PendingMarketOrder(
                StorageInterfaceV5.Trade(
                    sender, pairIndex, index, 0, 0, 0, false, 0, 0, 0
                ),
                0, 0, 0, 0, 0
            ), orderId, false
        );

        emit MarketOrderInitiated(
            orderId,
            sender,
            pairIndex,
            false
        );
    }

    // Manage limit order (OPEN)
    function updateOpenLimitOrder(
        uint pairIndex, 
        uint index, 
        uint price,  // PRECISION
        uint tp,
        uint sl
    ) external notContract notDone{

        address sender = _msgSender();

        require(storageT.hasOpenLimitOrder(sender, pairIndex, index),
            "NO_LIMIT");

        StorageInterfaceV5.OpenLimitOrder memory o = storageT.getOpenLimitOrder(
            sender, pairIndex, index
        );

        require(block.number - o.block >= limitOrdersTimelock, "LIMIT_TIMELOCK");

        require(tp == 0 || (o.buy ?
            tp > price :
            tp < price), "WRONG_TP");

        require(sl == 0 || (o.buy ?
            sl < price :
            sl > price), "WRONG_SL");

        o.minPrice = price;
        o.maxPrice = price;

        o.tp = tp;
        o.sl = sl;

        storageT.updateOpenLimitOrder(o);

        emit OpenLimitUpdated(
            sender,
            pairIndex,
            index,
            price,
            tp,
            sl
        );
    }

    function cancelOpenLimitOrder(
        uint pairIndex,
        uint index
    ) external notContract notDone{

        address sender = _msgSender();

        require(storageT.hasOpenLimitOrder(sender, pairIndex, index),
            "NO_LIMIT");

        StorageInterfaceV5.OpenLimitOrder memory o = storageT.getOpenLimitOrder(
            sender, pairIndex, index
        );

        require(block.number - o.block >= limitOrdersTimelock, "LIMIT_TIMELOCK");

        storageT.unregisterOpenLimitOrder(sender, pairIndex, index);
        storageT.transferDai(address(storageT), sender, o.positionSize);

        emit OpenLimitCanceled(
            sender,
            pairIndex,
            index
        );
    }

    // Manage limit order (TP/SL)
    function updateTp(
        uint pairIndex,
        uint index,
        uint newTp
    ) external notContract notDone{

        address sender = _msgSender();

        StorageInterfaceV5.Trade memory t = storageT.openTrades(
            sender, pairIndex, index
        );

        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(
            sender, pairIndex, index
        );

        require(t.leverage > 0, "NO_TRADE");
        require(block.number - i.tpLastUpdated >= limitOrdersTimelock,
            "LIMIT_TIMELOCK");

        storageT.updateTp(sender, pairIndex, index, newTp);

        emit TpUpdated(
            sender,
            pairIndex,
            index,
            newTp
        );
    }

    function updateSl(
        uint pairIndex,
        uint index,
        uint newSl
    ) external notContract notDone{

        address sender = _msgSender();

        StorageInterfaceV5.Trade memory t = storageT.openTrades(
            sender, pairIndex, index
        );

        StorageInterfaceV5.TradeInfo memory i = storageT.openTradesInfo(
            sender, pairIndex, index
        );

        require(t.leverage > 0, "NO_TRADE");

        uint maxSlDist = t.openPrice * MAX_SL_P / 100 / t.leverage;

        require(newSl == 0 || (t.buy ? 
            newSl >= t.openPrice - maxSlDist :
            newSl <= t.openPrice + maxSlDist), "SL_TOO_BIG");
        
        require(block.number - i.slLastUpdated >= limitOrdersTimelock,
            "LIMIT_TIMELOCK");

        AggregatorInterfaceV6_2 aggregator = storageT.priceAggregator();

        if(newSl == 0
        || !aggregator.pairsStorage().guaranteedSlEnabled(pairIndex)){

            storageT.updateSl(sender, pairIndex, index, newSl);

            emit SlUpdated(
                sender,
                pairIndex,
                index,
                newSl
            );

        }else{
            uint orderId = aggregator.getPrice(
                pairIndex,
                AggregatorInterfaceV6_2.OrderType.UPDATE_SL, 
                t.initialPosToken * i.tokenPriceDai * t.leverage / PRECISION
            );

            aggregator.storePendingSlOrder(
                orderId, 
                AggregatorInterfaceV6_2.PendingSl(
                    sender, pairIndex, index, t.openPrice, t.buy, newSl
                )
            );
            
            emit SlUpdateInitiated(
                orderId,
                sender,
                pairIndex,
                index,
                newSl
            );
        }
    }

    // Execute limit order
    function executeNftOrder(
        StorageInterfaceV5.LimitOrder orderType, 
        address trader, 
        uint pairIndex, 
        uint index,
        uint nftId, 
        uint nftType
    ) external notContract notDone{

        address sender = _msgSender();

        require(nftType >= 1 && nftType <= 5, "WRONG_NFT_TYPE");
        require(storageT.nfts(nftType - 1).ownerOf(nftId) == sender, "NO_NFT");

        require(block.number >=
            storageT.nftLastSuccess(nftId) + storageT.nftSuccessTimelock(),
            "SUCCESS_TIMELOCK");

        StorageInterfaceV5.Trade memory t;

        if(orderType == StorageInterfaceV5.LimitOrder.OPEN){
            require(storageT.hasOpenLimitOrder(trader, pairIndex, index),
                "NO_LIMIT");

        }else{
            t = storageT.openTrades(trader, pairIndex, index);

            require(t.leverage > 0, "NO_TRADE");

            if(orderType == StorageInterfaceV5.LimitOrder.LIQ){
                uint liqPrice = getTradeLiquidationPrice(t);
                
                require(t.sl == 0 || (t.buy ?
                    liqPrice > t.sl :
                    liqPrice < t.sl), "HAS_SL");

            }else{
                require(orderType != StorageInterfaceV5.LimitOrder.SL || t.sl > 0,
                    "NO_SL");
                require(orderType != StorageInterfaceV5.LimitOrder.TP || t.tp > 0,
                    "NO_TP");
            }
        }

        NftRewardsInterfaceV6.TriggeredLimitId memory triggeredLimitId =
            NftRewardsInterfaceV6.TriggeredLimitId(
                trader, pairIndex, index, orderType
            );

        if(!nftRewards.triggered(triggeredLimitId)
        || nftRewards.timedOut(triggeredLimitId)){
            
            uint leveragedPosDai;

            if(orderType == StorageInterfaceV5.LimitOrder.OPEN){

                StorageInterfaceV5.OpenLimitOrder memory l = storageT.getOpenLimitOrder(
                    trader, pairIndex, index
                );

                leveragedPosDai = l.positionSize * l.leverage;

                (uint priceImpactP, ) = pairInfos.getTradePriceImpact(
                    0,
                    l.pairIndex,
                    l.buy,
                    leveragedPosDai
                );
                
                require(priceImpactP * l.leverage <= pairInfos.maxNegativePnlOnOpenP(),
                    "PRICE_IMPACT_TOO_HIGH");

            }else{
                leveragedPosDai = t.initialPosToken * storageT.openTradesInfo(
                    trader, pairIndex, index
                ).tokenPriceDai * t.leverage / PRECISION;
            }

            storageT.transferLinkToAggregator(sender, pairIndex, leveragedPosDai);

            uint orderId = storageT.priceAggregator().getPrice(
                pairIndex, 
                orderType == StorageInterfaceV5.LimitOrder.OPEN ? 
                    AggregatorInterfaceV6_2.OrderType.LIMIT_OPEN : 
                    AggregatorInterfaceV6_2.OrderType.LIMIT_CLOSE,
                leveragedPosDai
            );

            storageT.storePendingNftOrder(
                StorageInterfaceV5.PendingNftOrder(
                    sender,
                    nftId,
                    trader,
                    pairIndex,
                    index,
                    orderType
                ), orderId
            );

            nftRewards.storeFirstToTrigger(triggeredLimitId, sender);
            
            emit NftOrderInitiated(
                orderId,
                sender,
                trader,
                pairIndex
            );

        }else{
            nftRewards.storeTriggerSameBlock(triggeredLimitId, sender);
            
            emit NftOrderSameBlock(
                sender,
                trader,
                pairIndex
            );
        }
    }
    // Avoid stack too deep error in executeNftOrder
    function getTradeLiquidationPrice(
        StorageInterfaceV5.Trade memory t
    ) private view returns(uint){
        return pairInfos.getTradeLiquidationPrice(
            t.trader,
            t.pairIndex,
            t.index,
            t.openPrice,
            t.buy,
            t.initialPosToken * storageT.openTradesInfo(
                t.trader, t.pairIndex, t.index
            ).tokenPriceDai / PRECISION,
            t.leverage
        );
    }

    // Market timeout
    function openTradeMarketTimeout(uint _order) external notContract notDone{
        address sender = _msgSender();

        StorageInterfaceV5.PendingMarketOrder memory o =
            storageT.reqID_pendingMarketOrder(_order);

        StorageInterfaceV5.Trade memory t = o.trade;

        require(o.block > 0
            && block.number >= o.block + marketOrdersTimeout, "WAIT_TIMEOUT");

        require(t.trader == sender, "NOT_YOUR_ORDER");
        require(t.leverage > 0, "WRONG_MARKET_ORDER_TYPE");

        storageT.unregisterPendingMarketOrder(_order, true);
        storageT.transferDai(address(storageT), sender, t.positionSizeDai);

        emit ChainlinkCallbackTimeout(
            _order,
            o
        );
    }
    
    function closeTradeMarketTimeout(uint _order) external notContract notDone{
        address sender = _msgSender();

        StorageInterfaceV5.PendingMarketOrder memory o =
            storageT.reqID_pendingMarketOrder(_order);

        StorageInterfaceV5.Trade memory t = o.trade;

        require(o.block > 0
            && block.number >= o.block + marketOrdersTimeout, "WAIT_TIMEOUT");

        require(t.trader == sender, "NOT_YOUR_ORDER");
        require(t.leverage == 0, "WRONG_MARKET_ORDER_TYPE");

        storageT.unregisterPendingMarketOrder(_order, false);

        (bool success, ) = address(this).delegatecall(
            abi.encodeWithSignature(
                "closeTradeMarket(uint256,uint256)",
                t.pairIndex,
                t.index
            )
        );

        if(!success){
            emit CouldNotCloseTrade(
                sender,
                t.pairIndex,
                t.index
            );
        }

        emit ChainlinkCallbackTimeout(
            _order,
            o
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract StorageInterfaceV5","name":"_storageT","type":"address"},{"internalType":"contract NftRewardsInterfaceV6","name":"_nftRewards","type":"address"},{"internalType":"contract GNSPairInfosInterfaceV6","name":"_pairInfos","type":"address"},{"internalType":"contract GNSReferralsInterfaceV6_2","name":"_referrals","type":"address"},{"internalType":"uint256","name":"_maxPosDai","type":"uint256"},{"internalType":"uint256","name":"_limitOrdersTimelock","type":"uint256"},{"internalType":"uint256","name":"_marketOrdersTimeout","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"components":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"initialPosToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"internalType":"struct StorageInterfaceV5.Trade","name":"trade","type":"tuple"},{"internalType":"uint256","name":"block","type":"uint256"},{"internalType":"uint256","name":"wantedPrice","type":"uint256"},{"internalType":"uint256","name":"slippageP","type":"uint256"},{"internalType":"uint256","name":"spreadReductionP","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"indexed":false,"internalType":"struct StorageInterfaceV5.PendingMarketOrder","name":"order","type":"tuple"}],"name":"ChainlinkCallbackTimeout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"CouldNotCloseTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"done","type":"bool"}],"name":"Done","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"bool","name":"open","type":"bool"}],"name":"MarketOrderInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"NftOrderInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nftHolder","type":"address"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"NftOrderSameBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NumberUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"OpenLimitCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"OpenLimitPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"OpenLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"SlUpdateInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"SlUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTp","type":"uint256"}],"name":"TpUpdated","type":"event"},{"inputs":[],"name":"_msgSender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"cancelOpenLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"closeTradeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"closeTradeMarketTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"bytes","name":"call_data","type":"bytes"}],"name":"delegatedAction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegations","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"done","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum StorageInterfaceV5.LimitOrder","name":"orderType","type":"uint8"},{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"uint256","name":"nftType","type":"uint256"}],"name":"executeNftOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitOrdersTimelock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketOrdersTimeout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPosDai","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewards","outputs":[{"internalType":"contract NftRewardsInterfaceV6","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"trader","type":"address"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"initialPosToken","type":"uint256"},{"internalType":"uint256","name":"positionSizeDai","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"internalType":"struct StorageInterfaceV5.Trade","name":"t","type":"tuple"},{"internalType":"enum NftRewardsInterfaceV6.OpenLimitOrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"spreadReductionId","type":"uint256"},{"internalType":"uint256","name":"slippageP","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"openTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_order","type":"uint256"}],"name":"openTradeMarketTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pairInfos","outputs":[{"internalType":"contract GNSPairInfosInterfaceV6","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referrals","outputs":[{"internalType":"contract GNSReferralsInterfaceV6_2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLimitOrdersTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMarketOrdersTimeout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxPosDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storageT","outputs":[{"internalType":"contract StorageInterfaceV5","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"sl","type":"uint256"}],"name":"updateOpenLimitOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"newSl","type":"uint256"}],"name":"updateSl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"newTp","type":"uint256"}],"name":"updateTp","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b506040516200597038038062005970833981016040819052620000359162000134565b6001600160a01b038716158015906200005657506001600160a01b03861615155b80156200006b57506001600160a01b03851615155b80156200008057506001600160a01b03841615155b80156200008d5750600083115b80156200009a5750600082115b8015620000a75750600081115b620000e75760405162461bcd60e51b815260206004820152600c60248201526b57524f4e475f504152414d5360a01b604482015260640160405180910390fd5b6001600160a01b0396871660805294861660a05292851660c052931660e052600292909255600391909155600455620001bb565b6001600160a01b03811681146200013157600080fd5b50565b600080600080600080600060e0888a0312156200015057600080fd5b87516200015d816200011b565b602089015190975062000170816200011b565b604089015190965062000183816200011b565b606089015190955062000196816200011b565b809450506080880151925060a0880151915060c0880151905092959891949750929550565b60805160a05160c05160e0516155ad620003c3600039600081816103ce01526122050152600081816101ca01528181611a0901528181611ace015281816132e601528181613355015261466801526000818161026101528181611e77015281816130cc015281816131600152818161374f01526138260152600081816101f10152818161049f0152818161054f015281816106a60152818161076d015281816108cd015281816109f501528181610a6d01528181610b1e01528181610c9d01528181610dc301528181611102015281816111f80152818161129401528181611326015281816113b801528181611487015281816115260152818161180e01528181611b8f01528181611c4001528181611cbb01528181611d3601528181611fc9015281816120a4015281816122b001528181612346015281816123d901528181612478015281816125710152818161269a015281816127f5015281816128ff01528181612abc01528181612bfa01528181612c9001528181612de001528181612e920152818161321001528181613416015281816134e6015281816135550152818161366d01528181613934015281816139e401528181613aaa01528181613b2901528181613c2801528181613cbe01528181613e4d01528181613fc5015281816142b301528181614417015281816144ad015281816145a901526146b601526155ad6000f3fe608060405234801561001057600080fd5b50600436106101845760003560e01c80639a10cc32116100d9578063b9b6573a11610087578063b9b6573a14610367578063be73fb991461037a578063bffe34861461038d578063ca5eb5e1146103b6578063d3dc7539146103c9578063d4a1caa7146103f0578063d8defd151461040357600080fd5b80639a10cc32146102e65780639aa7c0e514610306578063a2a3c0cb14610319578063ae8421e11461032c578063b187bd2614610334578063b81bfa0514610341578063b8ebd5cc1461035457600080fd5b8063410c0b7c11610136578063410c0b7c146102535780635ad9f9931461025c5780638456cb5914610283578063876d3abd1461028b5780638f0622271461029e578063934d1cf4146102c0578063990382cf146102d357600080fd5b80630890d22a14610189578063119df25f146101a55780631346b0ff146101c557806316fff074146101ec578063279a165c14610213578063318a368b1461021c57806336fb8b1514610231575b600080fd5b61019260035481565b6040519081526020015b60405180910390f35b6101ad610416565b6040516001600160a01b03909116815260200161019c565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b61019260025481565b61022f61022a36600461480e565b61043e565b005b61022f33600090815260208190526040902080546001600160a01b0319169055565b61019260045481565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b61022f61076b565b61022f610299366004614849565b61086b565b6005546102b090610100900460ff1681565b604051901515815260200161019c565b61022f6102ce366004614849565b610b1c565b61022f6102e1366004614849565b610c3b565b6102f96102f436600461488a565b610f53565b60405161019c919061496b565b61022f610314366004614a11565b61108e565b61022f610327366004614af0565b61226c565b61022f6127f3565b6005546102b09060ff1681565b61022f61034f366004614849565b6128fd565b61022f610362366004614b12565b612a1f565b61022f610375366004614af0565b6138dc565b61022f610388366004614b6f565b613be4565b6101ad61039b366004614b9b565b6000602081905290815260409020546001600160a01b031681565b61022f6103c4366004614b9b565b614245565b6101ad7f000000000000000000000000000000000000000000000000000000000000000081565b61022f6103fe366004614849565b6142b1565b61022f610411366004614b6f565b6143d3565b6001546000906001600160a01b031661042e57503390565b506001546001600160a01b031690565b32331461044a57600080fd5b600554610100900460ff161561047b5760405162461bcd60e51b815260040161047290614bb8565b60405180910390fd5b6000610485610416565b604051636e6f99cd60e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dcdf339a906104d89084908a908a90600401614bd6565b602060405180830381865afa1580156104f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105199190614c02565b6105355760405162461bcd60e51b815260040161047290614c1f565b604051632e21e28b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b8878a2c906105889085908b908b90600401614bd6565b6101a060405180830381865afa1580156105a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ca9190614c4c565b9050600354816101600151436105e09190614d15565b10156105fe5760405162461bcd60e51b815260040161047290614d2c565b83158061061b57508060a001516106175784841061061b565b8484115b6106375760405162461bcd60e51b815260040161047290614d54565b82158061065457508060a0015161065057848311610654565b8483105b6106705760405162461bcd60e51b815260040161047290614d76565b6101208101859052610140810185905260e081018490526101008101839052604051635bb3b04560e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b767608a906106db908490600401614d98565b600060405180830381600087803b1580156106f557600080fd5b505af1158015610709573d6000803e3d6000fd5b50506040805189815260208101899052908101879052606081018690528992506001600160a01b03851691507f21e15d62c2ece17c1dc11c5fa45dcefdc6f99f199aa111d1363ff242f23e1c5c9060800160405180910390a350505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190614e38565b6001600160a01b0316336001600160a01b03161461081d5760405162461bcd60e51b815260040161047290614e55565b6005805460ff8082161560ff1990921682179092556040519116151581527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd2906020015b60405180910390a1565b32331461087757600080fd5b600554610100900460ff161561089f5760405162461bcd60e51b815260040161047290614bb8565b60006108a9610416565b60405163b66e6b0560e01b8152600481018490529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b66e6b05906024016101e060405180830381865afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109399190614f0a565b8051602082015191925090158015906109635750600454826020015161095f9190614f8d565b4310155b61097f5760405162461bcd60e51b815260040161047290614fa5565b826001600160a01b031681600001516001600160a01b0316146109b45760405162461bcd60e51b815260040161047290614fcb565b60008160e00151116109d85760405162461bcd60e51b815260040161047290614ff3565b604051630195728b60e71b815260048101859052600160248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cab9458090604401600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b50505050608081015160405163373873db60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811692636e70e7b692610aac92918891600401615024565b600060405180830381600087803b158015610ac657600080fd5b505af1158015610ada573d6000803e3d6000fd5b50505050837f3adaa586cdbe84dd24e45bd7dada6da933d7c2d1c7b4e4cd02fce033356decb183604051610b0e91906150f6565b60405180910390a250505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614e38565b6001600160a01b0316336001600160a01b031614610bce5760405162461bcd60e51b815260040161047290614e55565b60008111610bee5760405162461bcd60e51b815260040161047290615105565b600281905560408051818152600991810191909152686d6178506f7344616960b81b606082015260208101829052600080516020615558833981519152906080015b60405180910390a150565b323314610c4757600080fd5b600554610100900460ff1615610c6f5760405162461bcd60e51b815260040161047290614bb8565b6000610c79610416565b60405163b66e6b0560e01b8152600481018490529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b66e6b05906024016101e060405180830381865afa158015610ce5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d099190614f0a565b805160208201519192509015801590610d3357506004548260200151610d2f9190614f8d565b4310155b610d4f5760405162461bcd60e51b815260040161047290614fa5565b826001600160a01b031681600001516001600160a01b031614610d845760405162461bcd60e51b815260040161047290614fcb565b60e081015115610da65760405162461bcd60e51b815260040161047290614ff3565b604051630195728b60e71b815260048101859052600060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cab9458090604401600060405180830381600087803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b505050602082015160408084015190516024810192909252604482015260009150309060640160408051601f198184030181529181526020820180516001600160e01b031663a2a3c0cb60e01b17905251610e7e9190615126565b600060405180830381855af49150503d8060008114610eb9576040519150601f19603f3d011682016040523d82523d6000602084013e610ebe565b606091505b5050905080610f14578160200151846001600160a01b03167f60e497734ddabcd7293fd91739aaf65cf525eb539c97be528125a235a89288d88460400151604051610f0b91815260200190565b60405180910390a35b847f3adaa586cdbe84dd24e45bd7dada6da933d7c2d1c7b4e4cd02fce033356decb184604051610f4491906150f6565b60405180910390a25050505050565b6001600160a01b03838116600090815260208190526040902054606091163314610fb75760405162461bcd60e51b81526020600482015260156024820152741111531151d0551157d393d517d054141493d59151605a1b6044820152606401610472565b600180546001600160a01b0319166001600160a01b03861617905560405160009081903090610fe99087908790615142565b600060405180830381855af49150503d8060008114611024576040519150601f19603f3d011682016040523d82523d6000602084013e611029565b606091505b5091509150816110755760448151101561104257600080fd5b6004810190508080602001905181019061105c9190615152565b60405162461bcd60e51b8152600401610472919061496b565b600180546001600160a01b031916905595945050505050565b32331461109a57600080fd5b600554610100900460ff16156110c25760405162461bcd60e51b815260040161047290614bb8565b60055460ff16156110fe5760405162461bcd60e51b815260206004820152600660248201526514105554d15160d21b6044820152606401610472565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa15801561115e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111829190614e38565b90506000816001600160a01b03166335b03c176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e89190614e38565b905060006111f4610416565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f65d9dbe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611254573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127891906151ff565b6020890151604051634bf3ccad60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916397e7995a916112c9918691600401615218565b602060405180830381865afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906151ff565b60208a0151604051639c8912f160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691639c8912f19161135b918791600401615218565b602060405180830381865afa158015611378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139c91906151ff565b60208b01516040516307218dad60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691631c8636b4916113ed918891600401615218565b602060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e91906151ff565b6114389190614f8d565b6114429190614f8d565b106114855760405162461bcd60e51b815260206004820152601360248201527226a0ac2faa2920a222a9afa822a92fa820a4a960691b6044820152606401610472565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638049fde76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150791906151ff565b60405163f7b3c6fd60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f7b3c6fd90602401602060405180830381865afa15801561156d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159191906151ff565b106115ae5760405162461bcd60e51b815260040161047290615231565b600254886080015111156115f45760405162461bcd60e51b815260206004820152600d60248201526c41424f56455f4d41585f504f5360981b6044820152606401610472565b602088015160405163066c581160e11b815260048101919091526001600160a01b03831690630cd8b02290602401602060405180830381865afa15801561163f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166391906151ff565b8860e001518960800151611677919061525d565b10156116b55760405162461bcd60e51b815260206004820152600d60248201526c42454c4f575f4d494e5f504f5360981b6044820152606401610472565b60008860e0015111801561173b5750602088015160405163059a992d60e41b815260048101919091526001600160a01b038316906359a992d090602401602060405180830381865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173391906151ff565b8860e0015110155b80156117b957506020880151604051630a06da4f60e21b815260048101919091526001600160a01b0383169063281b693c90602401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b191906151ff565b8860e0015111155b6117fa5760405162461bcd60e51b815260206004820152601260248201527113115591549051d157d25390d3d4949150d560721b6044820152606401610472565b85158061190b575060006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663265aa62161183e60018a614d15565b6040518263ffffffff1660e01b815260040161185c91815260200190565b602060405180830381865afa158015611879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189d9190614e38565b6040516370a0823160e01b81526001600160a01b03848116600483015291909116906370a0823190602401602060405180830381865afa1580156118e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190991906151ff565b115b6119655760405162461bcd60e51b815260206004820152602560248201527f4e4f5f434f52524553504f4e44494e475f4e46545f5350524541445f5245445560448201526421aa24a7a760d91b6064820152608401610472565b610100880151158061199957508760c0015161198c578760a0015188610100015110611999565b8760a00151886101000151115b6119b55760405162461bcd60e51b815260040161047290614d54565b61012088015115806119e957508760c001516119dc578760a00151886101200151116119e9565b8760a00151886101200151105b611a055760405162461bcd60e51b815260040161047290614d76565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637ea95f3260008b602001518c60c001518d60e001518e60800151611a56919061525d565b6040516001600160e01b031960e087901b168152600481019490945260248401929092521515604483015260648201526084016040805180830381865afa158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac9919061527c565b5090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380f6cfc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4e91906151ff565b60e08a0151611b5d908361525d565b1115611b7b5760405162461bcd60e51b8152600401610472906152a0565b608089015160405163373873db60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811692636e70e7b692611bcf9287929091600401615024565b600060405180830381600087803b158015611be957600080fd5b505af1158015611bfd573d6000803e3d6000fd5b5060009250611c0a915050565b886002811115611c1c57611c1c6152cf565b14611f3857602089015160405163226a27ad60e11b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916344d44f5a91611c7691879190600401615218565b602060405180830381865afa158015611c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb791906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d3b5fe70604051806101a00160405280866001600160a01b031681526020018d6020015181526020018481526020018d60800151815260200160008c11611d2c576000611dc5565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016633dae10a0611d6660018f614d15565b6040518263ffffffff1660e01b8152600401611d8491815260200190565b602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc591906151ff565b81526020018d60c00151151581526020018d60e0015181526020018d610100015181526020018d610120015181526020018d60a0015181526020018d60a00151815260200143815260200160008152506040518263ffffffff1660e01b8152600401611e319190614d98565b600060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b5050505060208a0151604051630ec5706160e41b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163ec57061091611eb891879186908f906004016152e5565b600060405180830381600087803b158015611ed257600080fd5b505af1158015611ee6573d6000803e3d6000fd5b505050508960200151836001600160a01b03167fdfabd6f206f17b7f2e1f9e0d33c40d30d1e8d7b6a4f520a03fdc1c181105934383604051611f2a91815260200190565b60405180910390a3506121de565b6000846001600160a01b031663fa8dd4988b6020015160008d60e001518e60800151611f64919061525d565b6040518463ffffffff1660e01b8152600401611f8293929190615322565b6020604051808303816000875af1158015611fa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc591906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c76faf786040518060c00160405280604051806101400160405280886001600160a01b031681526020018f60200151815260200160008152602001600081526020018f608001518152602001600081526020018f60c00151151581526020018f60e0015181526020018f610100015181526020018f61012001518152508152602001600081526020018d60a0015181526020018a815260200160008c1161209a576000612133565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016633dae10a06120d460018f614d15565b6040518263ffffffff1660e01b81526004016120f291815260200190565b602060405180830381865afa15801561210f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213391906151ff565b815260200160008152508360016040518463ffffffff1660e01b815260040161215e9392919061534a565b600060405180830381600087803b15801561217857600080fd5b505af115801561218c573d6000803e3d6000fd5b505050508960200151836001600160a01b0316827f3e544118c04e3bb18b669475695cd270ba0e41fb13177483f01c14222de62a8660016040516121d4911515815260200190565b60405180910390a4505b6040516326e2ada160e21b81526001600160a01b03838116600483015286811660248301527f00000000000000000000000000000000000000000000000000000000000000001690639b8ab68490604401600060405180830381600087803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050505050505050505050565b32331461227857600080fd5b600554610100900460ff16156122a05760405162461bcd60e51b815260040161047290614bb8565b60006122aa610416565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a3a80ffe8386866040518463ffffffff1660e01b81526004016122fe93929190614bd6565b61014060405180830381865afa15801561231c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123409190615371565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58487876040518463ffffffff1660e01b815260040161239493929190614bd6565b60c060405180830381865afa1580156123b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d5919061538e565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638049fde76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612435573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245991906151ff565b60405163f7b3c6fd60e01b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f7b3c6fd90602401602060405180830381865afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906151ff565b106125005760405162461bcd60e51b815260040161047290615231565b8060a00151156125495760405162461bcd60e51b81526020600482015260146024820152731053149150511657d091525391d7d0d313d4d15160621b6044820152606401610472565b60008260e001511161256d5760405162461bcd60e51b81526004016104729061540e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f19190614e38565b6001600160a01b031663fa8dd4988760016402540be4008760e0015187602001518960600151612621919061525d565b61262b919061525d565b6126359190615430565b6040518463ffffffff1660e01b815260040161265393929190615322565b6020604051808303816000875af1158015612672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269691906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c76faf786040518060c00160405280604051806101400160405280896001600160a01b031681526020018b81526020018a81526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525081526020016000815260200160008152602001600081526020016000815260200160008152508360006040518463ffffffff1660e01b81526004016127719392919061534a565b600060405180830381600087803b15801561278b57600080fd5b505af115801561279f573d6000803e3d6000fd5b5050505085846001600160a01b0316827f3e544118c04e3bb18b669475695cd270ba0e41fb13177483f01c14222de62a8660006040516127e3911515815260200190565b60405180910390a4505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa158015612851573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128759190614e38565b6001600160a01b0316336001600160a01b0316146128a55760405162461bcd60e51b815260040161047290614e55565b6005805460ff610100808304821615810261ff001990931692909217928390556040517fc3a6f986261de9467c2838c6df8ef74f9107855159205600c0bc7a14cdfd3888936108619390049091161515815260200190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa15801561295b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297f9190614e38565b6001600160a01b0316336001600160a01b0316146129af5760405162461bcd60e51b815260040161047290614e55565b600081116129cf5760405162461bcd60e51b815260040161047290615105565b600481905560408051818152601391810191909152721b585c9ad95d13dc99195c9cd51a5b595bdd5d606a1b60608201526020810182905260008051602061555883398151915290608001610c30565b323314612a2b57600080fd5b600554610100900460ff1615612a535760405162461bcd60e51b815260040161047290614bb8565b6000612a5d610416565b905060018210158015612a71575060058211155b612aae5760405162461bcd60e51b815260206004820152600e60248201526d57524f4e475f4e46545f5459504560901b6044820152606401610472565b6001600160a01b03808216907f00000000000000000000000000000000000000000000000000000000000000001663265aa621612aec600186614d15565b6040518263ffffffff1660e01b8152600401612b0a91815260200190565b602060405180830381865afa158015612b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4b9190614e38565b6001600160a01b0316636352211e856040518263ffffffff1660e01b8152600401612b7891815260200190565b602060405180830381865afa158015612b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb99190614e38565b6001600160a01b031614612bf85760405162461bcd60e51b81526020600482015260066024820152651393d7d3919560d21b6044820152606401610472565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f8d24b486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7a91906151ff565b60405163aa3b7d7760e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063aa3b7d7790602401602060405180830381865afa158015612cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0391906151ff565b612d0d9190614f8d565b431015612d4f5760405162461bcd60e51b815260206004820152601060248201526f535543434553535f54494d454c4f434b60801b6044820152606401610472565b612db060405180610140016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b6003886003811115612dc457612dc46152cf565b03612e7b57604051636e6f99cd60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dcdf339a90612e19908a908a908a90600401614bd6565b602060405180830381865afa158015612e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e5a9190614c02565b612e765760405162461bcd60e51b815260040161047290614c1f565b613076565b6040516351d407ff60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a3a80ffe90612ecb908a908a908a90600401614bd6565b61014060405180830381865afa158015612ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0d9190615371565b905060008160e0015111612f335760405162461bcd60e51b81526004016104729061540e565b6002886003811115612f4757612f476152cf565b03612fc2576000612f5782614664565b905081610120015160001480612f8757508160c00151612f7e578161012001518110612f87565b81610120015181115b612fbc5760405162461bcd60e51b8152602060048201526006602482015265121054d7d4d360d21b6044820152606401610472565b50613076565b6001886003811115612fd657612fd66152cf565b141580612fe857506000816101200151115b61301c5760405162461bcd60e51b81526020600482015260056024820152641393d7d4d360da1b6044820152606401610472565b6000886003811115613030576130306152cf565b14158061304257506000816101000151115b6130765760405162461bcd60e51b815260206004820152600560248201526404e4f5f54560dc1b6044820152606401610472565b60006040518060800160405280896001600160a01b031681526020018881526020018781526020018a60038111156130b0576130b06152cf565b905260405163108c3d4960e11b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321187a929061310190849060040161549d565b602060405180830381865afa15801561311e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131429190614c02565b15806131d65750604051633f1b72bf60e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063fc6dcafc9061319590849060040161549d565b602060405180830381865afa1580156131b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d69190614c02565b1561380f57600060038a60038111156131f1576131f16152cf565b0361340957604051632e21e28b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b8878a2c90613249908d908d908d90600401614bd6565b6101a060405180830381865afa158015613267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328b9190614c4c565b90508060c0015181606001516132a1919061525d565b602082015160a0830151604051633f54af9960e11b81526000600482018190526024820193909352901515604482015260648101839052919350906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637ea95f32906084016040805180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613350919061527c565b5090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380f6cfc26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156133b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133d591906151ff565b60c08301516133e4908361525d565b11156134025760405162461bcd60e51b8152600401610472906152a0565b50506134cf565b6402540be4008360e001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58c8c8c6040518463ffffffff1660e01b815260040161346493929190614bd6565b60c060405180830381865afa158015613481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a5919061538e565b6020015185606001516134b8919061525d565b6134c2919061525d565b6134cc9190615430565b90505b604051633348540360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636690a8069061351f9087908c908690600401614bd6565b600060405180830381600087803b15801561353957600080fd5b505af115801561354d573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d59190614e38565b6001600160a01b031663fa8dd4988a60038e60038111156135f8576135f86152cf565b14613604576003613607565b60025b856040518463ffffffff1660e01b815260040161362693929190615322565b6020604051808303816000875af1158015613645573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366991906151ff565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663817fa1a46040518060c00160405280886001600160a01b031681526020018a81526020018d6001600160a01b031681526020018c81526020018b81526020018e60038111156136e7576136e76152cf565b815250836040518363ffffffff1660e01b81526004016137089291906154ab565b600060405180830381600087803b15801561372257600080fd5b505af1158015613736573d6000803e3d6000fd5b505060405163308f221b60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063c23c886c9150613788908690899060040161550b565b600060405180830381600087803b1580156137a257600080fd5b505af11580156137b6573d6000803e3d6000fd5b50505050888a6001600160a01b0316866001600160a01b03167f6d87222414c5850caf1d385b1e080a771b505825b082a2162d0f4af5ffc86c008460405161380091815260200190565b60405180910390a450506138d1565b6040516346ea285b60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906346ea285b9061385d908490879060040161550b565b600060405180830381600087803b15801561387757600080fd5b505af115801561388b573d6000803e3d6000fd5b5050505086886001600160a01b0316846001600160a01b03167fde7da272dc52e28c3b33c5c74b461da89b05bd790d845e82db2f69bbf08108e760405160405180910390a45b505050505050505050565b3233146138e857600080fd5b600554610100900460ff16156139105760405162461bcd60e51b815260040161047290614bb8565b600061391a610416565b604051636e6f99cd60e11b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063dcdf339a9061396d90849087908790600401614bd6565b602060405180830381865afa15801561398a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ae9190614c02565b6139ca5760405162461bcd60e51b815260040161047290614c1f565b604051632e21e28b60e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b8878a2c90613a1d90859088908890600401614bd6565b6101a060405180830381865afa158015613a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5f9190614c4c565b905060035481610160015143613a759190614d15565b1015613a935760405162461bcd60e51b815260040161047290614d2c565b60405163b4b0f56760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b4b0f56790613ae390859088908890600401614bd6565b600060405180830381600087803b158015613afd57600080fd5b505af1158015613b11573d6000803e3d6000fd5b50505050606081015160405163373873db60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03811692636e70e7b692613b6892918791600401615024565b600060405180830381600087803b158015613b8257600080fd5b505af1158015613b96573d6000803e3d6000fd5b5050505083826001600160a01b03167ff1b38881d7f4b2b12141c5f39c5124545d6112532eb6afbe9630cdbde3ee53e985604051613bd691815260200190565b60405180910390a350505050565b323314613bf057600080fd5b600554610100900460ff1615613c185760405162461bcd60e51b815260040161047290614bb8565b6000613c22610416565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a3a80ffe8387876040518463ffffffff1660e01b8152600401613c7693929190614bd6565b61014060405180830381865afa158015613c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb89190615371565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58488886040518463ffffffff1660e01b8152600401613d0c93929190614bd6565b60c060405180830381865afa158015613d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d4d919061538e565b905060008260e0015111613d735760405162461bcd60e51b81526004016104729061540e565b60008260e001516064604b8560a00151613d8d919061525d565b613d979190615430565b613da19190615430565b9050841580613de057508260c00151613dcc57808360a00151613dc49190614f8d565b851115613de0565b808360a00151613ddc9190614d15565b8510155b613e195760405162461bcd60e51b815260206004820152600a602482015269534c5f544f4f5f42494760b01b6044820152606401610472565b6003546080830151613e2b9043614d15565b1015613e495760405162461bcd60e51b815260040161047290614d2c565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633078fff56040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ecd9190614e38565b9050851580613fa95750806001600160a01b03166335b03c176040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f399190614e38565b6001600160a01b03166324abd3fb896040518263ffffffff1660e01b8152600401613f6691815260200190565b602060405180830381865afa158015613f83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa79190614c02565b155b1561407d5760405163a354418160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a3544181906140009088908c908c908c90600401615531565b600060405180830381600087803b15801561401a57600080fd5b505af115801561402e573d6000803e3d6000fd5b5050604080518a8152602081018a90528b93506001600160a01b03891692507f1fc4a6c7ffe506697979b8ed54dc4135cd1ecd26a2745f70b760a2492222b316910160405180910390a361423b565b6000816001600160a01b031663fa8dd4988a60046402540be4008960e0015189602001518b606001516140b0919061525d565b6140ba919061525d565b6140c49190615430565b6040518463ffffffff1660e01b81526004016140e293929190615322565b6020604051808303816000875af1158015614101573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412591906151ff565b6040805160c080820183526001600160a01b038a81168352602083018e81528385018e815260a0808d015160608701908152948d01511515608087019081529086018f81529651635c109dfd60e11b81526004810189905295518416602487015291516044860152516064850152915160848401529051151560a4830152915160c482015291925083169063b8213bfa9060e401600060405180830381600087803b1580156141d357600080fd5b505af11580156141e7573d6000803e3d6000fd5b5050505088866001600160a01b0316827ffdfffd671d06639f57ee329f42ea52018346eb90ed43679721e81cc12bfa10548b8b604051614231929190918252602082015260400190565b60405180910390a4505b5050505050505050565b3233146142825760405162461bcd60e51b815260206004820152600b60248201526a1393d7d0d3d395149050d560aa1b6044820152606401610472565b33600090815260208190526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166312d43a516040518163ffffffff1660e01b8152600401602060405180830381865afa15801561430f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143339190614e38565b6001600160a01b0316336001600160a01b0316146143635760405162461bcd60e51b815260040161047290614e55565b600081116143835760405162461bcd60e51b815260040161047290615105565b600381905560408051818152601391810191909152726c696d69744f726465727354696d656c6f636b60681b60608201526020810182905260008051602061555883398151915290608001610c30565b3233146143df57600080fd5b600554610100900460ff16156144075760405162461bcd60e51b815260040161047290614bb8565b6000614411610416565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a3a80ffe8387876040518463ffffffff1660e01b815260040161446593929190614bd6565b61014060405180830381865afa158015614483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144a79190615371565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58488886040518463ffffffff1660e01b81526004016144fb93929190614bd6565b60c060405180830381865afa158015614518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061453c919061538e565b905060008260e00151116145625760405162461bcd60e51b81526004016104729061540e565b60035460608201516145749043614d15565b10156145925760405162461bcd60e51b815260040161047290614d2c565b604051637fdb96f360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637fdb96f3906145e49086908a908a908a90600401615531565b600060405180830381600087803b1580156145fe57600080fd5b505af1158015614612573d6000803e3d6000fd5b505060408051888152602081018890528993506001600160a01b03871692507f7e06a81c7a47891ccc7455b5ccb2ed850e32bb655ccda67eb3ebaaeed83242a4910160405180910390a3505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636bc84d598360000151846020015185604001518660a001518760c001516402540be4007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c8ff1d58b600001518c602001518d604001516040518463ffffffff1660e01b815260040161471093929190614bd6565b60c060405180830381865afa15801561472d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614751919061538e565b602001518a60600151614764919061525d565b61476e9190615430565b60e08a8101516040519189901b6001600160e01b03191682526001600160a01b039790971660048201526024810195909552604485019390935260648401919091521515608483015260a482015260c481019190915260e401602060405180830381865afa1580156147e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061480891906151ff565b92915050565b600080600080600060a0868803121561482657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60006020828403121561485b57600080fd5b5035919050565b6001600160a01b038116811461487757600080fd5b50565b803561488581614862565b919050565b60008060006040848603121561489f57600080fd5b83356148aa81614862565b9250602084013567ffffffffffffffff808211156148c757600080fd5b818601915086601f8301126148db57600080fd5b8135818111156148ea57600080fd5b8760208285010111156148fc57600080fd5b6020830194508093505050509250925092565b60005b8381101561492a578181015183820152602001614912565b83811115614939576000848401525b50505050565b6000815180845261495781602086016020860161490f565b601f01601f19169290920160200192915050565b60208152600061497e602083018461493f565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff811182821017156149bf576149bf614985565b60405290565b6040516101a0810167ffffffffffffffff811182821017156149bf576149bf614985565b801515811461487757600080fd5b8035614885816149e9565b80356003811061488557600080fd5b60008060008060008587036101c0811215614a2b57600080fd5b61014080821215614a3b57600080fd5b614a4361499b565b9150614a4e8861487a565b82526020880135602083015260408801356040830152606088013560608301526080880135608083015260a088013560a0830152614a8e60c089016149f7565b60c083015260e088013560e0830152610100808901358184015250610120808901358184015250819650614ac3818901614a02565b9550505061016086013592506101808601359150614ae46101a0870161487a565b90509295509295909350565b60008060408385031215614b0357600080fd5b50508035926020909101359150565b60008060008060008060c08789031215614b2b57600080fd5b863560048110614b3a57600080fd5b95506020870135614b4a81614862565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600060608486031215614b8457600080fd5b505081359360208301359350604090920135919050565b600060208284031215614bad57600080fd5b813561497e81614862565b602080825260049082015263444f4e4560e01b604082015260600190565b6001600160a01b039390931683526020830191909152604082015260600190565b8051614885816149e9565b600060208284031215614c1457600080fd5b815161497e816149e9565b6020808252600890820152671393d7d31253525560c21b604082015260600190565b805161488581614862565b60006101a08284031215614c5f57600080fd5b614c676149c5565b614c7083614c41565b815260208301516020820152604083015160408201526060830151606082015260808301516080820152614ca660a08401614bf7565b60a082015260c0838101519082015260e080840151908201526101008084015190820152610120808401519082015261014080840151908201526101608084015190820152610180928301519281019290925250919050565b634e487b7160e01b600052601160045260246000fd5b600082821015614d2757614d27614cff565b500390565b6020808252600e908201526d4c494d49545f54494d454c4f434b60901b604082015260600190565b602080825260089082015267057524f4e475f54560c41b604082015260600190565b60208082526008908201526715d493d391d7d4d360c21b604082015260600190565b81516001600160a01b031681526101a081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151614de560a084018215159052565b5060c0838101519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018092830151929091019190915290565b600060208284031215614e4a57600080fd5b815161497e81614862565b602080825260089082015267474f565f4f4e4c5960c01b604082015260600190565b60006101408284031215614e8a57600080fd5b614e9261499b565b9050614e9d82614c41565b81526020820151602082015260408201516040820152606082015160608201526080820151608082015260a082015160a0820152614edd60c08301614bf7565b60c082015260e082015160e082015261010080830151818301525061012080830151818301525092915050565b60006101e08284031215614f1d57600080fd5b60405160c0810181811067ffffffffffffffff82111715614f4057614f40614985565b604052614f4d8484614e77565b81526101408301516020820152610160830151604082015261018083015160608201526101a083015160808201526101c09092015160a083015250919050565b60008219821115614fa057614fa0614cff565b500190565b6020808252600c908201526b15d0525517d512535153d55560a21b604082015260600190565b6020808252600e908201526d2727aa2faca7aaa92fa7a92222a960911b604082015260600190565b60208082526017908201527657524f4e475f4d41524b45545f4f524445525f5459504560481b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b805180516001600160a01b031683526020810151602084015260408101516040840152606081015160608401526080810151608084015260a081015160a084015260c081015161509c60c085018215159052565b5060e081810151908401526101008082015190840152610120908101519083015260208101516101408301526040810151610160830152606081015161018083015260808101516101a083015260a001516101c090910152565b6101e081016148088284615048565b602080825260079082015266056414c55455f360cc1b604082015260600190565b6000825161513881846020870161490f565b9190910192915050565b8183823760009101908152919050565b60006020828403121561516457600080fd5b815167ffffffffffffffff8082111561517c57600080fd5b818401915084601f83011261519057600080fd5b8151818111156151a2576151a2614985565b604051601f8201601f19908116603f011681019083821181831017156151ca576151ca614985565b816040528281528760208487010111156151e357600080fd5b6151f483602083016020880161490f565b979650505050505050565b60006020828403121561521157600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b6020808252601290820152714d41585f50454e44494e475f4f524445525360701b604082015260600190565b600081600019048311821515161561527757615277614cff565b500290565b6000806040838503121561528f57600080fd5b505080516020909101519092909150565b6020808252601590820152740a0a492868abe929aa08286a8bea89e9ebe90928e9605b1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b038516815260208101849052604081018390526080810160038310615313576153136152cf565b82606083015295945050505050565b8381526060810160058410615339576153396152cf565b602082019390935260400152919050565b61022081016153598286615048565b836101e0830152821515610200830152949350505050565b6000610140828403121561538457600080fd5b61497e8383614e77565b600060c082840312156153a057600080fd5b60405160c0810181811067ffffffffffffffff821117156153c3576153c3614985565b8060405250825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a0830151615402816149e9565b60a08201529392505050565b6020808252600890820152674e4f5f545241444560c01b604082015260600190565b60008261544d57634e487b7160e01b600052601260045260246000fd5b500490565b60048110615462576154626152cf565b9052565b60018060a01b038151168252602081015160208301526040810151604083015260608101516154986060840182615452565b505050565b608081016148088284615466565b600060e08201905060018060a01b038085511683526020850151602084015280604086015116604084015250606084015160608301526080840151608083015260a08401516154fd60a0840182615452565b508260c08301529392505050565b60a081016155198285615466565b6001600160a01b039290921660809190910152919050565b6001600160a01b039490941684526020840192909252604083015260608201526080019056fe8cf3e35f6221b16e1670a3413180c9484bf5aa71787905909fa82a6a2662e9aba2646970667358221220cbcfbfdc031f4f0ee8229b2cebab7f81322a3712ae5019c1139dd57bc7533da264736f6c634300080f0033000000000000000000000000aee4d11a16b2bc65edd6416fb626eb404a6d65bd0000000000000000000000003470756e5b490a974bc25feeeeb24c11102f5268000000000000000000000000ee7442accc1c27f2c69423576d3b1d25b563e9770000000000000000000000000f9498b1206bf9ffde2a2321fdb56f573a05242500000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e

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

000000000000000000000000aee4d11a16b2bc65edd6416fb626eb404a6d65bd0000000000000000000000003470756e5b490a974bc25feeeeb24c11102f5268000000000000000000000000ee7442accc1c27f2c69423576d3b1d25b563e9770000000000000000000000000f9498b1206bf9ffde2a2321fdb56f573a05242500000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e

-----Decoded View---------------
Arg [0] : _storageT (address): 0xaee4d11a16b2bc65edd6416fb626eb404a6d65bd
Arg [1] : _nftRewards (address): 0x3470756e5b490a974bc25feeeeb24c11102f5268
Arg [2] : _pairInfos (address): 0xee7442accc1c27f2c69423576d3b1d25b563e977
Arg [3] : _referrals (address): 0x0f9498b1206bf9ffde2a2321fdb56f573a052425
Arg [4] : _maxPosDai (uint256): 100000000000000000000000
Arg [5] : _limitOrdersTimelock (uint256): 30
Arg [6] : _marketOrdersTimeout (uint256): 30

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000aee4d11a16b2bc65edd6416fb626eb404a6d65bd
Arg [1] : 0000000000000000000000003470756e5b490a974bc25feeeeb24c11102f5268
Arg [2] : 000000000000000000000000ee7442accc1c27f2c69423576d3b1d25b563e977
Arg [3] : 0000000000000000000000000f9498b1206bf9ffde2a2321fdb56f573a052425
Arg [4] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001e


Deployed ByteCode Sourcemap

14592:21448:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15100:31;;;;;;;;;160:25:1;;;148:2;133:18;15100:31:0;;;;;;;;14315:202;;;:::i;:::-;;;-1:-1:-1;;;;;469:32:1;;;451:51;;439:2;424:18;14315:202:0;305:203:1;14776:50:0;;;;;14669:44;;;;;15034:21;;;;;;25127:1071;;;;;;:::i;:::-;;:::i;:::-;;13503:90;;13561:10;13583:1;13549:23;;;;;;;;;;:36;;-1:-1:-1;;;;;;13549:36:0;;;13503:90;15157:31;;;;;;14720:49;;;;;18987:106;;;:::i;34189:754::-;;;;;;:::i;:::-;;:::i;15288:18::-;;;;;;;;;;;;;;;2130:14:1;;2123:22;2105:41;;2093:2;2078:18;15288::0;1965:187:1;18331:185:0;;;;;;:::i;:::-;;:::i;34955:1082::-;;;;;;:::i;:::-;;:::i;13601:704::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19242:4486::-;;;;;;:::i;:::-;;:::i;23765:1320::-;;;;;;:::i;:::-;;:::i;19099:97::-;;;:::i;15230:20::-;;;;;;;;;18743:215;;;;;;:::i;:::-;;:::i;29659:3967::-;;;;;;:::i;:::-;;:::i;26206:736::-;;;;;;:::i;:::-;;:::i;27745:1878::-;;;;;;:::i;:::-;;:::i;13241:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;13241:47:0;;;13334:161;;;;;;:::i;:::-;;:::i;14833:52::-;;;;;18522:215;;;;;;:::i;:::-;;:::i;26985:752::-;;;;;;:::i;:::-;;:::i;14315:202::-;14382:14;;14358:7;;-1:-1:-1;;;;;14382:14:0;14378:132;;-1:-1:-1;14434:10:0;;14315:202::o;14378:132::-;-1:-1:-1;14484:14:0;;-1:-1:-1;;;;;14484:14:0;;14315:202::o;25127:1071::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;;;;;;;;;25324:14:::2;25341:12;:10;:12::i;:::-;25374:52;::::0;-1:-1:-1;;;25374:52:0;;25324:29;;-1:-1:-1;;;;;;25374:8:0::2;:26;::::0;::::2;::::0;:52:::2;::::0;25324:29;;25409:9;;25420:5;;25374:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25366:86;;;;-1:-1:-1::0;;;25366:86:0::2;;;;;;;:::i;:::-;25510:76;::::0;-1:-1:-1;;;25510:76:0;;25465:42:::2;::::0;-1:-1:-1;;;;;25510:8:0::2;:26;::::0;::::2;::::0;:76:::2;::::0;25551:6;;25559:9;;25570:5;;25510:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25465:121;;25633:19;;25622:1;:7;;;25607:12;:22;;;;:::i;:::-;:45;;25599:72;;;;-1:-1:-1::0;;;25599:72:0::2;;;;;;;:::i;:::-;25692:7:::0;;;:70:::2;;;25704:1;:5;;;:57;;25756:5;25751:2;:10;25704:57;;;25730:5;25725:2;:10;25704:57;25684:91;;;;-1:-1:-1::0;;;25684:91:0::2;;;;;;;:::i;:::-;25796:7:::0;;;:70:::2;;;25808:1;:5;;;:57;;25860:5;25855:2;:10;25808:57;;;25834:5;25829:2;:10;25808:57;25788:91;;;;-1:-1:-1::0;;;25788:91:0::2;;;;;;;:::i;:::-;25892:10;::::0;::::2;:18:::0;;;25921:10:::2;::::0;::::2;:18:::0;;;25952:4:::2;::::0;::::2;:9:::0;;;25972:4:::2;::::0;::::2;:9:::0;;;-1:-1:-1;25994:32:0;-1:-1:-1;;;25994:32:0;;-1:-1:-1;;;;;25994:8:0::2;:29;::::0;::::2;::::0;:32:::2;::::0;25892:1;;25994:32:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;26044:146:0::2;::::0;;13450:25:1;;;13506:2;13491:18;;13484:34;;;13534:18;;;13527:34;;;13592:2;13577:18;;13570:34;;;26096:9:0;;-1:-1:-1;;;;;;26044:146:0;::::2;::::0;-1:-1:-1;26044:146:0::2;::::0;13437:3:1;13422:19;26044:146:0::2;;;;;;;25311:887;;25127:1071:::0;;;;;:::o;18987:106::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;19043:8:::1;::::0;;::::1;::::0;;::::1;19042:9;-1:-1:-1::0;;19031:20:0;;::::1;::::0;::::1;::::0;;;19069:16:::1;::::0;19076:8;;2130:14:1;2123:22;2105:41;;19069:16:0::1;::::0;2093:2:1;2078:18;19069:16:0::1;;;;;;;;18987:106::o:0;34189:754::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;34273:14:::2;34290:12;:10;:12::i;:::-;34377:41;::::0;-1:-1:-1;;;34377:41:0;;::::2;::::0;::::2;160:25:1::0;;;34273:29:0;;-1:-1:-1;34315:46:0::2;::::0;-1:-1:-1;;;;;34377:8:0::2;:33;::::0;::::2;::::0;133:18:1;;34377:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34467:7:::0;;34495::::2;::::0;::::2;::::0;34315:103;;-1:-1:-1;34467:7:0;34495:11;;;;:73:::2;;;34549:19;;34539:1;:7;;;:29;;;;:::i;:::-;34523:12;:45;;34495:73;34487:98;;;;-1:-1:-1::0;;;34487:98:0::2;;;;;;;:::i;:::-;34618:6;-1:-1:-1::0;;;;;34606:18:0::2;:1;:8;;;-1:-1:-1::0;;;;;34606:18:0::2;;34598:45;;;;-1:-1:-1::0;;;34598:45:0::2;;;;;;;:::i;:::-;34675:1;34662;:10;;;:14;34654:50;;;;-1:-1:-1::0;;;34654:50:0::2;;;;;;;:::i;:::-;34717:51;::::0;-1:-1:-1;;;34717:51:0;;::::2;::::0;::::2;17195:25:1::0;;;34763:4:0::2;17236:18:1::0;;;17229:50;34717:8:0::2;-1:-1:-1::0;;;;;34717:37:0::2;::::0;::::2;::::0;17168:18:1;;34717:51:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;34827:17:0::2;::::0;::::2;::::0;34779:66:::2;::::0;-1:-1:-1;;;34779:66:0;;:8:::2;-1:-1:-1::0;;;;;34779:20:0;::::2;::::0;::::2;::::0;:66:::2;::::0;:8;34819:6;;34779:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;34902:6;34863:72;34923:1;34863:72;;;;;;:::i;:::-;;;;;;;;34262:681;;;34189:754:::0;:::o;18331:185::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;18408:1:::1;18400:5;:9;18392:29;;;;-1:-1:-1::0;;;18392:29:0::1;;;;;;;:::i;:::-;18432:9;:17:::0;;;18475:33:::1;::::0;;19507:21:1;;;19564:1;19544:18;;;19537:29;;;;-1:-1:-1;;;19597:2:1;19582:18;;19575:39;19681:4;19666:20;;19659:36;;;-1:-1:-1;;;;;;;;;;;18475:33:0;19646:3:1;19631:19;18475:33:0::1;;;;;;;;18331:185:::0;:::o;34955:1082::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;35040:14:::2;35057:12;:10;:12::i;:::-;35144:41;::::0;-1:-1:-1;;;35144:41:0;;::::2;::::0;::::2;160:25:1::0;;;35040:29:0;;-1:-1:-1;35082:46:0::2;::::0;-1:-1:-1;;;;;35144:8:0::2;:33;::::0;::::2;::::0;133:18:1;;35144:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35234:7:::0;;35262::::2;::::0;::::2;::::0;35082:103;;-1:-1:-1;35234:7:0;35262:11;;;;:73:::2;;;35316:19;;35306:1;:7;;;:29;;;;:::i;:::-;35290:12;:45;;35262:73;35254:98;;;;-1:-1:-1::0;;;35254:98:0::2;;;;;;;:::i;:::-;35385:6;-1:-1:-1::0;;;;;35373:18:0::2;:1;:8;;;-1:-1:-1::0;;;;;35373:18:0::2;;35365:45;;;;-1:-1:-1::0;;;35365:45:0::2;;;;;;;:::i;:::-;35429:10;::::0;::::2;::::0;:15;35421:51:::2;;;;-1:-1:-1::0;;;35421:51:0::2;;;;;;;:::i;:::-;35485:52;::::0;-1:-1:-1;;;35485:52:0;;::::2;::::0;::::2;17195:25:1::0;;;35531:5:0::2;17236:18:1::0;;;17229:50;35485:8:0::2;-1:-1:-1::0;;;;;35485:37:0::2;::::0;::::2;::::0;17168:18:1;;35485:52:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;35706:11:0::2;::::0;::::2;::::0;35736:7:::2;::::0;;::::2;::::0;35610:148;;::::2;::::0;::::2;19880:25:1::0;;;;19921:18;;;19914:34;35551:12:0::2;::::0;-1:-1:-1;35577:4:0::2;::::0;19853:18:1;;35610:148:0::2;::::0;;-1:-1:-1;;35610:148:0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;35610:148:0::2;-1:-1:-1::0;;;35610:148:0::2;::::0;;35569:200;::::2;::::0;35610:148;35569:200:::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35550:219;;;35786:7;35782:158;;35876:1;:11;;;35851:6;-1:-1:-1::0;;;;;35814:114:0::2;;35906:1;:7;;;35814:114;;;;160:25:1::0;;148:2;133:18;;14:177;35814:114:0::2;;;;;;;;35782:158;35996:6;35957:72;36017:1;35957:72;;;;;;:::i;:::-;;;;;;;;35029:1008;;;;34955:1082:::0;:::o;13601:704::-;-1:-1:-1;;;;;13719:19:0;;;:11;:19;;;;;;;;;;;13686:12;;13719:19;13742:10;13719:33;13711:67;;;;-1:-1:-1;;;13711:67:0;;20440:2:1;13711:67:0;;;20422:21:1;20479:2;20459:18;;;20452:30;-1:-1:-1;;;20498:18:1;;;20491:51;20559:18;;13711:67:0;20238:345:1;13711:67:0;13791:14;:23;;-1:-1:-1;;;;;;13791:23:0;-1:-1:-1;;;;;13791:23:0;;;;;13863:37;;-1:-1:-1;;;;13871:4:0;;13863:37;;13890:9;;;;13863:37;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13825:75;;;;13916:7;13911:321;;14073:2;14057:6;:13;:18;14053:32;;;14077:8;;;14053:32;14150:4;14142:6;14138:17;14128:27;;14202:6;14191:28;;;;;;;;;;;;:::i;:::-;14184:36;;-1:-1:-1;;;14184:36:0;;;;;;;;:::i;13911:321::-;14244:14;:27;;-1:-1:-1;;;;;;14244:27:0;;;14291:6;13601:704;-1:-1:-1;;;;;13601:704:0:o;19242:4486::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;19554:8:::2;::::0;::::2;;19553:9;19545:28;;;::::0;-1:-1:-1;;;19545:28:0;;22179:2:1;19545:28:0::2;::::0;::::2;22161:21:1::0;22218:1;22198:18;;;22191:29;-1:-1:-1;;;22236:18:1;;;22229:36;22282:18;;19545:28:0::2;21977:329:1::0;19545:28:0::2;19586:34;19623:8;-1:-1:-1::0;;;;;19623:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19586:63;;19660:35;19698:10;-1:-1:-1::0;;;;;19698:23:0::2;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19660:63;;19736:14;19753:12;:10;:12::i;:::-;19736:29;;19981:8;-1:-1:-1::0;;;;;19981:25:0::2;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19953:11;::::0;::::2;::::0;19915:50:::2;::::0;-1:-1:-1;;;19915:50:0;;-1:-1:-1;;;;;19915:8:0::2;:29;::::0;::::2;::::0;:50:::2;::::0;19945:6;;19915:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19887:11;::::0;::::2;::::0;19847:52:::2;::::0;-1:-1:-1;;;19847:52:0;;-1:-1:-1;;;;;19847:8:0::2;:31;::::0;::::2;::::0;:52:::2;::::0;19879:6;;19847:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19819:11;::::0;::::2;::::0;19786:45:::2;::::0;-1:-1:-1;;;19786:45:0;;-1:-1:-1;;;;;19786:8:0::2;:24;::::0;::::2;::::0;:45:::2;::::0;19811:6;;19786:45:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:113;;;;:::i;:::-;:179;;;;:::i;:::-;:222;19778:268;;;::::0;-1:-1:-1;;;19778:268:0;;23555:2:1;19778:268:0::2;::::0;::::2;23537:21:1::0;23594:2;23574:18;;;23567:30;-1:-1:-1;;;23613:18:1;;;23606:49;23672:18;;19778:268:0::2;23353:343:1::0;19778:268:0::2;20120:8;-1:-1:-1::0;;;;;20120:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20067:37;::::0;-1:-1:-1;;;20067:37:0;;-1:-1:-1;;;;;469:32:1;;;20067:37:0::2;::::0;::::2;451:51:1::0;20067:8:0::2;:29;::::0;::::2;::::0;424:18:1;;20067:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;20059:131;;;;-1:-1:-1::0;;;20059:131:0::2;;;;;;;:::i;:::-;20232:9;;20211:1;:17;;;:30;;20203:56;;;::::0;-1:-1:-1;;;20203:56:0;;24250:2:1;20203:56:0::2;::::0;::::2;24232:21:1::0;24289:2;24269:18;;;24262:30;-1:-1:-1;;;24308:18:1;;;24301:43;24361:18;;20203:56:0::2;24048:337:1::0;20203:56:0::2;20354:11;::::0;::::2;::::0;20325:41:::2;::::0;-1:-1:-1;;;20325:41:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;20325:28:0;::::2;::::0;::::2;::::0;133:18:1;;20325:41:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20298:1;:10;;;20278:1;:17;;;:30;;;;:::i;:::-;:88;;20270:114;;;::::0;-1:-1:-1;;;20270:114:0;;24765:2:1;20270:114:0::2;::::0;::::2;24747:21:1::0;24804:2;24784:18;;;24777:30;-1:-1:-1;;;24823:18:1;;;24816:43;24876:18;;20270:114:0::2;24563:337:1::0;20270:114:0::2;20418:1;20405;:10;;;:14;:72;;;;-1:-1:-1::0;20465:11:0::2;::::0;::::2;::::0;20437:40:::2;::::0;-1:-1:-1;;;20437:40:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;20437:27:0;::::2;::::0;::::2;::::0;133:18:1;;20437:40:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20423:1;:10;;;:54;;20405:72;:144;;;;-1:-1:-1::0;20537:11:0::2;::::0;::::2;::::0;20509:40:::2;::::0;-1:-1:-1;;;20509:40:0;;::::2;::::0;::::2;160:25:1::0;;;;-1:-1:-1;;;;;20509:27:0;::::2;::::0;::::2;::::0;133:18:1;;20509:40:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20495:1;:10;;;:54;;20405:144;20397:189;;;::::0;-1:-1:-1;;;20397:189:0;;25107:2:1;20397:189:0::2;::::0;::::2;25089:21:1::0;25146:2;25126:18;;;25119:30;-1:-1:-1;;;25165:18:1;;;25158:48;25223:18;;20397:189:0::2;24905:342:1::0;20397:189:0::2;20607:22:::0;;;:97:::2;;-1:-1:-1::0;20703:1:0::2;-1:-1:-1::0;;;;;20646:8:0::2;:13;;20660:21;20680:1;20660:17:::0;:21:::2;:::i;:::-;20646:36;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;20646:36:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;::::0;-1:-1:-1;;;20646:54:0;;-1:-1:-1;;;;;469:32:1;;;20646:54:0::2;::::0;::::2;451:51:1::0;20646:46:0;;;::::2;::::0;::::2;::::0;424:18:1;;20646:54:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;20607:97;20599:160;;;::::0;-1:-1:-1;;;20599:160:0;;25732:2:1;20599:160:0::2;::::0;::::2;25714:21:1::0;25771:2;25751:18;;;25744:30;25810:34;25790:18;;;25783:62;-1:-1:-1;;;25861:18:1;;;25854:35;25906:19;;20599:160:0::2;25530:401:1::0;20599:160:0::2;20780:4;::::0;::::2;::::0;:9;;:96:::2;;;20794:1;:5;;;:81;;20864:1;:11;;;20857:1;:4;;;:18;20794:81;;;20826:1;:11;;;20819:1;:4;;;:18;20794:81;20772:117;;;;-1:-1:-1::0;;;20772:117:0::2;;;;;;;:::i;:::-;20910:4;::::0;::::2;::::0;:9;;:96:::2;;;20924:1;:5;;;:81;;20994:1;:11;;;20987:1;:4;;;:18;20924:81;;;20956:1;:11;;;20949:1;:4;;;:18;20924:81;20902:117;;;;-1:-1:-1::0;;;20902:117:0::2;;;;;;;:::i;:::-;21033:17;21056:9;-1:-1:-1::0;;;;;21056:29:0::2;;21100:1;21116;:11;;;21142:1;:5;;;21182:1;:10;;;21162:1;:17;;;:30;;;;:::i;:::-;21056:147;::::0;-1:-1:-1;;;;;;21056:147:0::2;::::0;;;;;;::::2;::::0;::::2;26169:25:1::0;;;;26210:18;;;26203:34;;;;26280:14;26273:22;26253:18;;;26246:50;26312:18;;;26305:34;26141:19;;21056:147:0::2;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21032:171;;;21266:9;-1:-1:-1::0;;;;;21266:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21239:10;::::0;::::2;::::0;21224:25:::2;::::0;:12;:25:::2;:::i;:::-;:75;;21216:109;;;;-1:-1:-1::0;;;21216:109:0::2;;;;;;;:::i;:::-;21386:17;::::0;::::2;::::0;21338:66:::2;::::0;-1:-1:-1;;;21338:66:0;;:8:::2;-1:-1:-1::0;;;;;21338:20:0;::::2;::::0;::::2;::::0;:66:::2;::::0;21359:6;;21338:8;;:66:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;21433:47:0::2;::::0;-1:-1:-1;21420:60:0::2;::::0;-1:-1:-1;;21420:60:0;::::2;:9;:60;;;;;;;;:::i;:::-;;21417:2238;;21551:11;::::0;::::2;::::0;21509:54:::2;::::0;-1:-1:-1;;;21509:54:0;;21496:10:::2;::::0;-1:-1:-1;;;;;21509:8:0::2;:33;::::0;::::2;::::0;:54:::2;::::0;21543:6;;21551:11;21509:54:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21496:67;;21580:8;-1:-1:-1::0;;;;;21580:28:0::2;;21627:575;;;;;;;;21683:6;-1:-1:-1::0;;;;;21627:575:0::2;;;;;21712:1;:11;;;21627:575;;;;21746:5;21627:575;;;;21774:1;:17;;;21627:575;;;;21834:1;21814:17;:21;:127;;21940:1;21814:127;;;-1:-1:-1::0;;;;;21863:8:0::2;:26;;21890:21;21910:1;21890:17:::0;:21:::2;:::i;:::-;21863:49;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;21863:49:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21627:575;;;;21964:1;:5;;;21627:575;;;;;;21992:1;:10;;;21627:575;;;;22025:1;:4;;;21627:575;;;;22052:1;:4;;;21627:575;;;;22079:1;:11;;;21627:575;;;;22113:1;:11;;;21627:575;;;;22147:12;21627:575;;;;22182:1;21627:575;;::::0;21580:637:::2;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;22275:11:0::2;::::0;::::2;::::0;22234:71:::2;::::0;-1:-1:-1;;;22234:71:0;;:10:::2;-1:-1:-1::0;;;;;22234:32:0::2;::::0;::::2;::::0;:71:::2;::::0;22267:6;;22288:5;;22295:9;;22234:71:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;22386:1;:11;;;22361:6;-1:-1:-1::0;;;;;22327:109:0::2;;22416:5;22327:109;;;;160:25:1::0;;148:2;133:18;;14:177;22327:109:0::2;;;;;;;;21481:969;21417:2238;;;22469:12;22484:10;-1:-1:-1::0;;;;;22484:19:0::2;;22522:1;:11;;;22553:45;22638:1;:10;;;22618:1;:17;;;:30;;;;:::i;:::-;22484:179;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22469:194;;22680:8;-1:-1:-1::0;;;;;22680:32:0::2;;22731:721;;;;;;;;22791:378;;;;;;;;22842:6;-1:-1:-1::0;;;;;22791:378:0::2;;;;;22875:1;:11;;;22791:378;;;;22913:1;22791:378;;;;22941:1;22791:378;;;;22969:1;:17;;;22791:378;;;;23013:1;22791:378;;;;23042:1;:5;;;22791:378;;;;;;23074:1;:10;;;22791:378;;;;23111:1;:4;;;22791:378;;;;23142:1;:4;;;22791:378;;::::0;22731:721:::2;;;;23192:1;22731:721;;;;23216:1;:11;;;22731:721;;;;23250:9;22731:721;;;;23302:1;23282:17;:21;:127;;23408:1;23282:127;;;-1:-1:-1::0;;;;;23331:8:0::2;:26;;23358:21;23378:1;23358:17:::0;:21:::2;:::i;:::-;23331:49;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;23331:49:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22731:721;;;;23432:1;22731:721;;::::0;23454:7:::2;23463:4;22680:802;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;23594:1;:11;;;23569:6;-1:-1:-1::0;;;;;23504:139:0::2;23543:7;23504:139;23624:4;23504:139;;;;2130:14:1::0;2123:22;2105:41;;2093:2;2078:18;;1965:187;23504:139:0::2;;;;;;;;22454:1201;21417:2238;23667:53;::::0;-1:-1:-1;;;23667:53:0;;-1:-1:-1;;;;;28638:15:1;;;23667:53:0::2;::::0;::::2;28620:34:1::0;28690:15;;;28670:18;;;28663:43;23667:9:0::2;:35;::::0;::::2;::::0;28555:18:1;;23667:53:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;19532:4196;;;;19242:4486:::0;;;;;:::o;23765:1320::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;23885:14:::2;23902:12;:10;:12::i;:::-;23885:29;;23927:33;23963:8;-1:-1:-1::0;;;;;23963:19:0::2;;23997:6;24005:9;24016:5;23963:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23927:105;;24045:37;24085:8;-1:-1:-1::0;;;;;24085:23:0::2;;24123:6;24131:9;24142:5;24085:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24045:113;;24232:8;-1:-1:-1::0;;;;;24232:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24179:37;::::0;-1:-1:-1;;;24179:37:0;;-1:-1:-1;;;;;469:32:1;;;24179:37:0::2;::::0;::::2;451:51:1::0;24179:8:0::2;:29;::::0;::::2;::::0;424:18:1;;24179:37:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;24171:117;;;;-1:-1:-1::0;;;24171:117:0::2;;;;;;;:::i;:::-;24310:1;:19;;;24309:20;24301:53;;;::::0;-1:-1:-1;;;24301:53:0;;29982:2:1;24301:53:0::2;::::0;::::2;29964:21:1::0;30021:2;30001:18;;;29994:30;-1:-1:-1;;;30040:18:1;;;30033:50;30100:18;;24301:53:0::2;29780:344:1::0;24301:53:0::2;24386:1;24373;:10;;;:14;24365:35;;;;-1:-1:-1::0;;;24365:35:0::2;;;;;;;:::i;:::-;24413:12;24428:8;-1:-1:-1::0;;;;;24428:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24428:35:0::2;;24478:9;24503:46;14946:4;24603:1;:10;;;24585:1;:15;;;24565:1;:17;;;:35;;;;:::i;:::-;:48;;;;:::i;:::-;:60;;;;:::i;:::-;24428:208;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24413:223;;24649:8;-1:-1:-1::0;;;;;24649:32:0::2;;24696:218;;;;;;;;24752:115;;;;;;;;24799:6;-1:-1:-1::0;;;;;24752:115:0::2;;;;;24807:9;24752:115;;;;24818:5;24752:115;;;;24825:1;24752:115;;;;24828:1;24752:115;;;;24831:1;24752:115;;;;24834:5;24752:115;;;;;;24841:1;24752:115;;;;24844:1;24752:115;;;;24847:1;24752:115;;::::0;24696:218:::2;;;;24886:1;24696:218;;;;24889:1;24696:218;;;;24892:1;24696:218;;;;24895:1;24696:218;;;;24898:1;24696:218;;::::0;24916:7:::2;24925:5;24649:292;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;25037:9;25016:6;-1:-1:-1::0;;;;;24959:118:0::2;24994:7;24959:118;25061:5;24959:118;;;;2130:14:1::0;2123:22;2105:41;;2093:2;2078:18;;1965:187;24959:118:0::2;;;;;;;;23872:1213;;;;23765:1320:::0;;:::o;19099:97::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;19152:6:::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;19151:7;19142:16:::0;::::1;-1:-1:-1::0;;19142:16:0;;::::1;::::0;;;::::1;::::0;;;;19176:12:::1;::::0;::::1;::::0;::::1;::::0;19181:6;::::1;::::0;;::::1;2130:14:1::0;2123:22;2105:41;;2093:2;2078:18;;1965:187;18743:215:0;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;18830:1:::1;18822:5;:9;18814:29;;;;-1:-1:-1::0;;;18814:29:0::1;;;;;;;:::i;:::-;18854:19;:27:::0;;;18907:43:::1;::::0;;30899:21:1;;;30956:2;30936:18;;;30929:30;;;;-1:-1:-1;;;30990:2:1;30975:18;;30968:49;31084:4;31069:20;;31062:36;;;-1:-1:-1;;;;;;;;;;;18907:43:0;31049:3:1;31034:19;18907:43:0::1;30687:417:1::0;29659:3967:0;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;29901:14:::2;29918:12;:10;:12::i;:::-;29901:29;;29962:1;29951:7;:12;;:28;;;;;29978:1;29967:7;:12;;29951:28;29943:55;;;::::0;-1:-1:-1;;;29943:55:0;;31311:2:1;29943:55:0::2;::::0;::::2;31293:21:1::0;31350:2;31330:18;;;31323:30;-1:-1:-1;;;31369:18:1;;;31362:44;31423:18;;29943:55:0::2;31109:338:1::0;29943:55:0::2;-1:-1:-1::0;;;;;30017:51:0;;::::2;::::0;:8:::2;:13;;30031:11;30041:1;30031:7:::0;:11:::2;:::i;:::-;30017:26;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;30017:26:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30017:34:0::2;;30052:5;30017:41;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;30017:41:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30017:51:0::2;;30009:70;;;::::0;-1:-1:-1;;;30009:70:0;;31654:2:1;30009:70:0::2;::::0;::::2;31636:21:1::0;31693:1;31673:18;;;31666:29;-1:-1:-1;;;31711:18:1;;;31704:36;31757:18;;30009:70:0::2;31452:329:1::0;30009:70:0::2;30162:8;-1:-1:-1::0;;;;;30162:27:0::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30129:30;::::0;-1:-1:-1;;;30129:30:0;;::::2;::::0;::::2;160:25:1::0;;;30129:8:0::2;-1:-1:-1::0;;;;;30129:23:0::2;::::0;::::2;::::0;133:18:1;;30129:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;:::-;30100:12;:91;;30092:133;;;::::0;-1:-1:-1;;;30092:133:0;;31988:2:1;30092:133:0::2;::::0;::::2;31970:21:1::0;32027:2;32007:18;;;32000:30;-1:-1:-1;;;32046:18:1;;;32039:46;32102:18;;30092:133:0::2;31786:340:1::0;30092:133:0::2;30238:33;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30238:33:0::2;30300:34;30287:9;:47;;;;;;;;:::i;:::-;::::0;30284:852:::2;;30358:52;::::0;-1:-1:-1;;;30358:52:0;;-1:-1:-1;;;;;30358:8:0::2;:26;::::0;::::2;::::0;:52:::2;::::0;30385:6;;30393:9;;30404:5;;30358:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30350:90;;;;-1:-1:-1::0;;;30350:90:0::2;;;;;;;:::i;:::-;30284:852;;;30477:45;::::0;-1:-1:-1;;;30477:45:0;;-1:-1:-1;;;;;30477:8:0::2;:19;::::0;::::2;::::0;:45:::2;::::0;30497:6;;30505:9;;30516:5;;30477:45:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30473:49;;30560:1;30547;:10;;;:14;30539:35;;;;-1:-1:-1::0;;;30539:35:0::2;;;;;;;:::i;:::-;30607:33;30594:9;:46;;;;;;;;:::i;:::-;::::0;30591:534:::2;;30660:13;30676:27;30701:1;30676:24;:27::i;:::-;30660:43;;30748:1;:4;;;30756:1;30748:9;:98;;;;30762:1;:5;;;:83;;30841:1;:4;;;30830:8;:15;30762:83;;;30802:1;:4;;;30791:8;:15;30762:83;30740:117;;;::::0;-1:-1:-1;;;30740:117:0;;32333:2:1;30740:117:0::2;::::0;::::2;32315:21:1::0;32372:1;32352:18;;;32345:29;-1:-1:-1;;;32390:18:1;;;32383:36;32436:18;;30740:117:0::2;32131:329:1::0;30740:117:0::2;30641:234;30591:534;;;30919:32;30906:9;:45;;;;;;;;:::i;:::-;;;:57;;;;30962:1;30955;:4;;;:8;30906:57;30898:96;;;::::0;-1:-1:-1;;;30898:96:0;;32667:2:1;30898:96:0::2;::::0;::::2;32649:21:1::0;32706:1;32686:18;;;32679:29;-1:-1:-1;;;32724:18:1;;;32717:35;32769:18;;30898:96:0::2;32465:328:1::0;30898:96:0::2;31034:32;31021:9;:45;;;;;;;;:::i;:::-;;;:57;;;;31077:1;31070;:4;;;:8;31021:57;31013:96;;;::::0;-1:-1:-1;;;31013:96:0;;33000:2:1;31013:96:0::2;::::0;::::2;32982:21:1::0;33039:1;33019:18;;;33012:29;-1:-1:-1;;;33057:18:1;;;33050:35;33102:18;;31013:96:0::2;32798:328:1::0;31013:96:0::2;31148:62;31226:107;;;;;;;;31283:6;-1:-1:-1::0;;;;;31226:107:0::2;;;;;31291:9;31226:107;;;;31302:5;31226:107;;;;31309:9;31226:107;;;;;;;;:::i;:::-;::::0;;31350:38:::2;::::0;-1:-1:-1;;;31350:38:0;;31148:185;;-1:-1:-1;;;;;;31350:10:0::2;:20;::::0;::::2;::::0;:38:::2;::::0;31148:185;;31350:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31349:39;:89;;;-1:-1:-1::0;31401:37:0::2;::::0;-1:-1:-1;;;31401:37:0;;-1:-1:-1;;;;;31401:10:0::2;:19;::::0;::::2;::::0;:37:::2;::::0;31421:16;;31401:37:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31346:2273;;;31468:20;31521:34;31508:9;:47;;;;;;;;:::i;:::-;::::0;31505:869:::2;;31622:92;::::0;-1:-1:-1;;;31622:92:0;;31577:42:::2;::::0;-1:-1:-1;;;;;31622:8:0::2;:26;::::0;::::2;::::0;:92:::2;::::0;31671:6;;31679:9;;31690:5;;31622:92:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31577:137;;31770:1;:10;;;31753:1;:14;;;:27;;;;:::i;:::-;31901:11;::::0;::::2;::::0;31935:5:::2;::::0;::::2;::::0;31825:172:::2;::::0;-1:-1:-1;;;31825:172:0;;31802:17:::2;31825:172;::::0;::::2;26169:25:1::0;;;26210:18;;;26203:34;;;;26280:14;;26273:22;26253:18;;;26246:50;26312:18;;;26305:34;;;31735:45:0;;-1:-1:-1;31802:17:0;-1:-1:-1;;;;;31825:9:0::2;:29;::::0;::::2;::::0;26141:19:1;;31825:172:0::2;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31801:196;;;32071:9;-1:-1:-1::0;;;;;32071:31:0::2;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32057:10;::::0;::::2;::::0;32042:25:::2;::::0;:12;:25:::2;:::i;:::-;:62;;32034:117;;;;-1:-1:-1::0;;;32034:117:0::2;;;;;;;:::i;:::-;31556:613;;31505:869;;;14946:4;32336:1;:10;;;32230:8;-1:-1:-1::0;;;;;32230:23:0::2;;32276:6;32284:9;32295:5;32230:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:103;;;32210:1;:17;;;:123;;;;:::i;:::-;:136;;;;:::i;:::-;:148;;;;:::i;:::-;32192:166;;31505:869;32390:69;::::0;-1:-1:-1;;;32390:69:0;;-1:-1:-1;;;;;32390:8:0::2;:33;::::0;::::2;::::0;:69:::2;::::0;32424:6;;32432:9;;32443:15;;32390:69:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32476:12;32491:8;-1:-1:-1::0;;;;;32491:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32491:35:0::2;;32545:9:::0;32587:34:::2;32574:9;:47;;;;;;;;:::i;:::-;;:186;;32715:45;32574:186;;;32646:44;32574:186;32779:15;32491:318;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32476:333;;32826:8;-1:-1:-1::0;;;;;32826:29:0::2;;32874:231;;;;;;;;32931:6;-1:-1:-1::0;;;;;32874:231:0::2;;;;;32960:5;32874:231;;;;32988:6;-1:-1:-1::0;;;;;32874:231:0::2;;;;;33017:9;32874:231;;;;33049:5;32874:231;;;;33077:9;32874:231;;;;;;;;:::i;:::-;;;::::0;33107:7:::2;32826:303;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;33146:56:0::2;::::0;-1:-1:-1;;;33146:56:0;;-1:-1:-1;;;;;33146:10:0::2;:30;::::0;-1:-1:-1;33146:30:0::2;::::0;-1:-1:-1;33146:56:0::2;::::0;33177:16;;33195:6;;33146:56:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;33348:9;33323:6;-1:-1:-1::0;;;;;33236:136:0::2;33298:6;-1:-1:-1::0;;;;;33236:136:0::2;;33272:7;33236:136;;;;160:25:1::0;;148:2;133:18;;14:177;33236:136:0::2;;;;;;;;31439:1947;;31346:2273;;;33405:58;::::0;-1:-1:-1;;;33405:58:0;;-1:-1:-1;;;;;33405:10:0::2;:32;::::0;::::2;::::0;:58:::2;::::0;33438:16;;33456:6;;33405:58:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;33583:9;33558:6;-1:-1:-1::0;;;;;33497:110:0::2;33533:6;-1:-1:-1::0;;;;;33497:110:0::2;;;;;;;;;;;31346:2273;29888:3738;;;29659:3967:::0;;;;;;:::o;26206:736::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;26330:14:::2;26347:12;:10;:12::i;:::-;26380:52;::::0;-1:-1:-1;;;26380:52:0;;26330:29;;-1:-1:-1;;;;;;26380:8:0::2;:26;::::0;::::2;::::0;:52:::2;::::0;26330:29;;26415:9;;26426:5;;26380:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26372:86;;;;-1:-1:-1::0;;;26372:86:0::2;;;;;;;:::i;:::-;26516:76;::::0;-1:-1:-1;;;26516:76:0;;26471:42:::2;::::0;-1:-1:-1;;;;;26516:8:0::2;:26;::::0;::::2;::::0;:76:::2;::::0;26557:6;;26565:9;;26576:5;;26516:76:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26471:121;;26639:19;;26628:1;:7;;;26613:12;:22;;;;:::i;:::-;:45;;26605:72;;;;-1:-1:-1::0;;;26605:72:0::2;;;;;;;:::i;:::-;26690:59;::::0;-1:-1:-1;;;26690:59:0;;-1:-1:-1;;;;;26690:8:0::2;:33;::::0;::::2;::::0;:59:::2;::::0;26724:6;;26732:9;;26743:5;;26690:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;26808:14:0::2;::::0;::::2;::::0;26760:63:::2;::::0;-1:-1:-1;;;26760:63:0;;:8:::2;-1:-1:-1::0;;;;;26760:20:0;::::2;::::0;::::2;::::0;:63:::2;::::0;:8;26800:6;;26760:63:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;26894:9;26873:6;-1:-1:-1::0;;;;;26841:93:0::2;;26918:5;26841:93;;;;160:25:1::0;;148:2;133:18;;14:177;26841:93:0::2;;;;;;;;26317:625;;26206:736:::0;;:::o;27745:1878::-;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;27878:14:::2;27895:12;:10;:12::i;:::-;27878:29;;27920:33;27956:8;-1:-1:-1::0;;;;;27956:19:0::2;;27990:6;27998:9;28009:5;27956:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27920:105;;28038:37;28078:8;-1:-1:-1::0;;;;;28078:23:0::2;;28116:6;28124:9;28135:5;28078:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28038:113;;28185:1;28172;:10;;;:14;28164:35;;;;-1:-1:-1::0;;;28164:35:0::2;;;;;;;:::i;:::-;28212:14;28260:1;:10;;;28254:3;14982:2;28229:1;:11;;;:22;;;;:::i;:::-;:28;;;;:::i;:::-;:41;;;;:::i;:::-;28212:58:::0;-1:-1:-1;28291:10:0;;;:118:::2;;;28306:1;:5;;;:102;;28399:9;28385:1;:11;;;:23;;;;:::i;:::-;28376:5;:32;;28306:102;;;28351:9;28337:1;:11;;;:23;;;;:::i;:::-;28328:5;:32;;28306:102;28283:141;;;::::0;-1:-1:-1;;;28283:141:0;;35250:2:1;28283:141:0::2;::::0;::::2;35232:21:1::0;35289:2;35269:18;;;35262:30;-1:-1:-1;;;35308:18:1;;;35301:40;35358:18;;28283:141:0::2;35048:334:1::0;28283:141:0::2;28487:19;::::0;28468:15:::2;::::0;::::2;::::0;28453:30:::2;::::0;:12:::2;:30;:::i;:::-;:53;;28445:93;;;;-1:-1:-1::0;;;28445:93:0::2;;;;;;;:::i;:::-;28551:34;28588:8;-1:-1:-1::0;;;;;28588:24:0::2;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28551:63:::0;-1:-1:-1;28630:10:0;;;:80:::2;;;28654:10;-1:-1:-1::0;;;;;28654:23:0::2;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28654:45:0::2;;28700:9;28654:56;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;28654:56:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28653:57;28630:80;28627:989;;;28728:50;::::0;-1:-1:-1;;;28728:50:0;;-1:-1:-1;;;;;28728:8:0::2;:17;::::0;::::2;::::0;:50:::2;::::0;28746:6;;28754:9;;28765:5;;28772;;28728:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;28800:125:0::2;::::0;;19880:25:1;;;19936:2;19921:18;;19914:34;;;28853:9:0;;-1:-1:-1;;;;;;28800:125:0;::::2;::::0;-1:-1:-1;28800:125:0::2;::::0;19853:18:1;28800:125:0::2;;;;;;;28627:989;;;28958:12;28973:10;-1:-1:-1::0;;;;;28973:19:0::2;;29011:9;29039:43;14946:4;29140:1;:10;;;29122:1;:15;;;29102:1;:17;;;:35;;;;:::i;:::-;:48;;;;:::i;:::-;:60;;;;:::i;:::-;28973:204;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29270:126;::::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;29270:126:0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;29352:11:::2;::::0;;::::2;::::0;29270:126;;;;;;29365:5;;::::2;::::0;29270:126:::2;;::::0;;;;;;;;;;;;29194:217;;-1:-1:-1;;;29194:217:0;;::::2;::::0;::::2;36036:25:1::0;;;36101:13;;36097:39;;36077:18;;;36070:67;36173:22;;36153:18;;;36146:50;36232:22;36212:18;;;36205:50;36292:22;;36271:19;;;36264:51;36366:23;;36359:31;36352:39;36331:19;;;36324:68;36429:23;;36408:19;;;36401:52;28958:219:0;;-1:-1:-1;29194:30:0;::::2;::::0;::::2;::::0;36008:19:1;;29194:217:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;29532:9;29507:6;-1:-1:-1::0;;;;;29445:159:0::2;29481:7;29445:159;29560:5;29584;29445:159;;;;;;19880:25:1::0;;;19936:2;19921:18;;19914:34;19868:2;19853:18;;19706:248;29445:159:0::2;;;;;;;;28943:673;28627:989;27865:1758;;;;;27745:1878:::0;;;:::o;13334:161::-;13401:9;13414:10;13401:23;13393:47;;;;-1:-1:-1;;;13393:47:0;;36666:2:1;13393:47:0;;;36648:21:1;36705:2;36685:18;;;36678:30;-1:-1:-1;;;36724:18:1;;;36717:41;36775:18;;13393:47:0;36464:335:1;13393:47:0;13465:10;13453:11;:23;;;;;;;;;;:34;;-1:-1:-1;;;;;;13453:34:0;-1:-1:-1;;;;;13453:34:0;;;;;;;;;;13334:161::o;18522:215::-;18084:8;-1:-1:-1;;;;;18084:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18070:28:0;:10;-1:-1:-1;;;;;18070:28:0;;18062:49;;;;-1:-1:-1;;;18062:49:0;;;;;;;:::i;:::-;18609:1:::1;18601:5;:9;18593:29;;;;-1:-1:-1::0;;;18593:29:0::1;;;;;;;:::i;:::-;18633:19;:27:::0;;;18686:43:::1;::::0;;37016:21:1;;;37073:2;37053:18;;;37046:30;;;;-1:-1:-1;;;37107:2:1;37092:18;;37085:49;37201:4;37186:20;;37179:36;;;-1:-1:-1;;;;;;;;;;;18686:43:0;37166:3:1;37151:19;18686:43:0::1;36804:417:1::0;26985:752:0;18178:9;18191:10;18178:23;18170:32;;;;;;18266:6:::1;::::0;::::1;::::0;::::1;;;18265:7;18257:24;;;;-1:-1:-1::0;;;18257:24:0::1;;;;;;;:::i;:::-;27118:14:::2;27135:12;:10;:12::i;:::-;27118:29;;27160:33;27196:8;-1:-1:-1::0;;;;;27196:19:0::2;;27230:6;27238:9;27249:5;27196:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27160:105;;27278:37;27318:8;-1:-1:-1::0;;;;;27318:23:0::2;;27356:6;27364:9;27375:5;27318:73;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27278:113;;27425:1;27412;:10;;;:14;27404:35;;;;-1:-1:-1::0;;;27404:35:0::2;;;;;;;:::i;:::-;27492:19;::::0;27473:15:::2;::::0;::::2;::::0;27458:30:::2;::::0;:12:::2;:30;:::i;:::-;:53;;27450:93;;;;-1:-1:-1::0;;;27450:93:0::2;;;;;;;:::i;:::-;27556:50;::::0;-1:-1:-1;;;27556:50:0;;-1:-1:-1;;;;;27556:8:0::2;:17;::::0;::::2;::::0;:50:::2;::::0;27574:6;;27582:9;;27593:5;;27600;;27556:50:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;27624:105:0::2;::::0;;19880:25:1;;;19936:2;19921:18;;19914:34;;;27669:9:0;;-1:-1:-1;;;;;;27624:105:0;::::2;::::0;-1:-1:-1;27624:105:0::2;::::0;19853:18:1;27624:105:0::2;;;;;;;27105:632;;;26985:752:::0;;;:::o;33686:472::-;33792:4;33815:9;-1:-1:-1;;;;;33815:34:0;;33864:1;:8;;;33887:1;:11;;;33913:1;:7;;;33935:1;:11;;;33961:1;:5;;;14946:4;34001:8;-1:-1:-1;;;;;34001:23:0;;34043:1;:8;;;34053:1;:11;;;34066:1;:7;;;34001:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:101;;;33981:1;:17;;;:121;;;;:::i;:::-;:133;;;;:::i;:::-;34129:10;;;;;33815:335;;;;;;-1:-1:-1;;;;;;33815:335:0;;;-1:-1:-1;;;;;37553:32:1;;;;33815:335:0;;;37535:51:1;37602:18;;;37595:34;;;;37645:18;;;37638:34;;;;37688:18;;;37681:34;;;;37759:14;37752:22;37731:19;;;37724:51;37791:19;;;37784:35;37835:19;;;37828:35;;;;37507:19;;33815:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33808:342;33686:472;-1:-1:-1;;33686:472:0:o;987:454:1:-;1082:6;1090;1098;1106;1114;1167:3;1155:9;1146:7;1142:23;1138:33;1135:53;;;1184:1;1181;1174:12;1135:53;-1:-1:-1;;1207:23:1;;;1277:2;1262:18;;1249:32;;-1:-1:-1;1328:2:1;1313:18;;1300:32;;1379:2;1364:18;;1351:32;;-1:-1:-1;1430:3:1;1415:19;1402:33;;-1:-1:-1;987:454:1;-1:-1:-1;987:454:1:o;1684:180::-;1743:6;1796:2;1784:9;1775:7;1771:23;1767:32;1764:52;;;1812:1;1809;1802:12;1764:52;-1:-1:-1;1835:23:1;;1684:180;-1:-1:-1;1684:180:1:o;2157:131::-;-1:-1:-1;;;;;2232:31:1;;2222:42;;2212:70;;2278:1;2275;2268:12;2212:70;2157:131;:::o;2293:134::-;2361:20;;2390:31;2361:20;2390:31;:::i;:::-;2293:134;;;:::o;2432:726::-;2511:6;2519;2527;2580:2;2568:9;2559:7;2555:23;2551:32;2548:52;;;2596:1;2593;2586:12;2548:52;2635:9;2622:23;2654:31;2679:5;2654:31;:::i;:::-;2704:5;-1:-1:-1;2760:2:1;2745:18;;2732:32;2783:18;2813:14;;;2810:34;;;2840:1;2837;2830:12;2810:34;2878:6;2867:9;2863:22;2853:32;;2923:7;2916:4;2912:2;2908:13;2904:27;2894:55;;2945:1;2942;2935:12;2894:55;2985:2;2972:16;3011:2;3003:6;3000:14;2997:34;;;3027:1;3024;3017:12;2997:34;3072:7;3067:2;3058:6;3054:2;3050:15;3046:24;3043:37;3040:57;;;3093:1;3090;3083:12;3040:57;3124:2;3120;3116:11;3106:21;;3146:6;3136:16;;;;;2432:726;;;;;:::o;3163:258::-;3235:1;3245:113;3259:6;3256:1;3253:13;3245:113;;;3335:11;;;3329:18;3316:11;;;3309:39;3281:2;3274:10;3245:113;;;3376:6;3373:1;3370:13;3367:48;;;3411:1;3402:6;3397:3;3393:16;3386:27;3367:48;;3163:258;;;:::o;3426:257::-;3467:3;3505:5;3499:12;3532:6;3527:3;3520:19;3548:63;3604:6;3597:4;3592:3;3588:14;3581:4;3574:5;3570:16;3548:63;:::i;:::-;3665:2;3644:15;-1:-1:-1;;3640:29:1;3631:39;;;;3672:4;3627:50;;3426:257;-1:-1:-1;;3426:257:1:o;3688:217::-;3835:2;3824:9;3817:21;3798:4;3855:44;3895:2;3884:9;3880:18;3872:6;3855:44;:::i;:::-;3847:52;3688:217;-1:-1:-1;;;3688:217:1:o;3910:127::-;3971:10;3966:3;3962:20;3959:1;3952:31;4002:4;3999:1;3992:15;4026:4;4023:1;4016:15;4042:255;4114:2;4108:9;4156:6;4144:19;;4193:18;4178:34;;4214:22;;;4175:62;4172:88;;;4240:18;;:::i;:::-;4276:2;4269:22;4042:255;:::o;4302:247::-;4369:2;4363:9;4411:3;4399:16;;4445:18;4430:34;;4466:22;;;4427:62;4424:88;;;4492:18;;:::i;4554:118::-;4640:5;4633:13;4626:21;4619:5;4616:32;4606:60;;4662:1;4659;4652:12;4677:128;4742:20;;4771:28;4742:20;4771:28;:::i;4810:159::-;4894:20;;4943:1;4933:12;;4923:40;;4959:1;4956;4949:12;4974:1333;5113:6;5121;5129;5137;5145;5189:9;5180:7;5176:23;5219:3;5215:2;5211:12;5208:32;;;5236:1;5233;5226:12;5208:32;5259:6;5285:2;5281;5277:11;5274:31;;;5301:1;5298;5291:12;5274:31;5327:22;;:::i;:::-;5314:35;;5372:29;5391:9;5372:29;:::i;:::-;5365:5;5358:44;5462:2;5451:9;5447:18;5434:32;5429:2;5422:5;5418:14;5411:56;5527:2;5516:9;5512:18;5499:32;5494:2;5487:5;5483:14;5476:56;5592:2;5581:9;5577:18;5564:32;5559:2;5552:5;5548:14;5541:56;5658:3;5647:9;5643:19;5630:33;5624:3;5617:5;5613:15;5606:58;5725:3;5714:9;5710:19;5697:33;5691:3;5684:5;5680:15;5673:58;5764:36;5795:3;5784:9;5780:19;5764:36;:::i;:::-;5758:3;5751:5;5747:15;5740:61;5862:3;5851:9;5847:19;5834:33;5828:3;5821:5;5817:15;5810:58;5887:3;5950:2;5939:9;5935:18;5922:32;5917:2;5910:5;5906:14;5899:56;;5974:3;6037:2;6026:9;6022:18;6009:32;6004:2;5997:5;5993:14;5986:56;;6061:5;6051:15;;6085:54;6135:2;6124:9;6120:18;6085:54;:::i;:::-;6075:64;;;;6186:3;6175:9;6171:19;6158:33;6148:43;;6238:3;6227:9;6223:19;6210:33;6200:43;;6262:39;6296:3;6285:9;6281:19;6262:39;:::i;:::-;6252:49;;4974:1333;;;;;;;;:::o;6312:248::-;6380:6;6388;6441:2;6429:9;6420:7;6416:23;6412:32;6409:52;;;6457:1;6454;6447:12;6409:52;-1:-1:-1;;6480:23:1;;;6550:2;6535:18;;;6522:32;;-1:-1:-1;6312:248:1:o;6565:686::-;6683:6;6691;6699;6707;6715;6723;6776:3;6764:9;6755:7;6751:23;6747:33;6744:53;;;6793:1;6790;6783:12;6744:53;6832:9;6819:23;6871:1;6864:5;6861:12;6851:40;;6887:1;6884;6877:12;6851:40;6910:5;-1:-1:-1;6967:2:1;6952:18;;6939:32;6980:33;6939:32;6980:33;:::i;:::-;6565:686;;7032:7;;-1:-1:-1;;;;7086:2:1;7071:18;;7058:32;;7137:2;7122:18;;7109:32;;7188:3;7173:19;;7160:33;;-1:-1:-1;7240:3:1;7225:19;;;7212:33;;-1:-1:-1;6565:686:1:o;7256:316::-;7333:6;7341;7349;7402:2;7390:9;7381:7;7377:23;7373:32;7370:52;;;7418:1;7415;7408:12;7370:52;-1:-1:-1;;7441:23:1;;;7511:2;7496:18;;7483:32;;-1:-1:-1;7562:2:1;7547:18;;;7534:32;;7256:316;-1:-1:-1;7256:316:1:o;7577:247::-;7636:6;7689:2;7677:9;7668:7;7664:23;7660:32;7657:52;;;7705:1;7702;7695:12;7657:52;7744:9;7731:23;7763:31;7788:5;7763:31;:::i;8071:327::-;8273:2;8255:21;;;8312:1;8292:18;;;8285:29;-1:-1:-1;;;8345:2:1;8330:18;;8323:34;8389:2;8374:18;;8071:327::o;8403:345::-;-1:-1:-1;;;;;8623:32:1;;;;8605:51;;8687:2;8672:18;;8665:34;;;;8730:2;8715:18;;8708:34;8593:2;8578:18;;8403:345::o;8753:132::-;8829:13;;8851:28;8829:13;8851:28;:::i;8890:245::-;8957:6;9010:2;8998:9;8989:7;8985:23;8981:32;8978:52;;;9026:1;9023;9016:12;8978:52;9058:9;9052:16;9077:28;9099:5;9077:28;:::i;9140:331::-;9342:2;9324:21;;;9381:1;9361:18;;;9354:29;-1:-1:-1;;;9414:2:1;9399:18;;9392:38;9462:2;9447:18;;9140:331::o;9476:138::-;9555:13;;9577:31;9555:13;9577:31;:::i;9619:1143::-;9720:6;9773:3;9761:9;9752:7;9748:23;9744:33;9741:53;;;9790:1;9787;9780:12;9741:53;9816:17;;:::i;:::-;9856:40;9886:9;9856:40;:::i;:::-;9849:5;9842:55;9950:2;9939:9;9935:18;9929:25;9924:2;9917:5;9913:14;9906:49;10008:2;9997:9;9993:18;9987:25;9982:2;9975:5;9971:14;9964:49;10066:2;10055:9;10051:18;10045:25;10040:2;10033:5;10029:14;10022:49;10125:3;10114:9;10110:19;10104:26;10098:3;10091:5;10087:15;10080:51;10164:47;10206:3;10195:9;10191:19;10164:47;:::i;:::-;10158:3;10147:15;;10140:72;10266:3;10251:19;;;10245:26;10228:15;;;10221:51;10326:3;10311:19;;;10305:26;10288:15;;;10281:51;10351:3;10392:18;;;10386:25;10370:14;;;10363:49;10431:3;10472:18;;;10466:25;10450:14;;;10443:49;10511:3;10552:18;;;10546:25;10530:14;;;10523:49;10591:3;10632:18;;;10626:25;10610:14;;;10603:49;10671:3;10712:18;;;10706:25;10690:14;;;10683:49;;;;-1:-1:-1;10151:5:1;9619:1143;-1:-1:-1;9619:1143:1:o;10767:127::-;10828:10;10823:3;10819:20;10816:1;10809:31;10859:4;10856:1;10849:15;10883:4;10880:1;10873:15;10899:125;10939:4;10967:1;10964;10961:8;10958:34;;;10972:18;;:::i;:::-;-1:-1:-1;11009:9:1;;10899:125::o;11029:338::-;11231:2;11213:21;;;11270:2;11250:18;;;11243:30;-1:-1:-1;;;11304:2:1;11289:18;;11282:44;11358:2;11343:18;;11029:338::o;11372:331::-;11574:2;11556:21;;;11613:1;11593:18;;;11586:29;-1:-1:-1;;;11646:2:1;11631:18;;11624:38;11694:2;11679:18;;11372:331::o;11708:::-;11910:2;11892:21;;;11949:1;11929:18;;;11922:29;-1:-1:-1;;;11982:2:1;11967:18;;11960:38;12030:2;12015:18;;11708:331::o;12044:1170::-;12272:13;;-1:-1:-1;;;;;262:31:1;250:44;;12240:3;12225:19;;12353:4;12345:6;12341:17;12335:24;12328:4;12317:9;12313:20;12306:54;12416:4;12408:6;12404:17;12398:24;12391:4;12380:9;12376:20;12369:54;12479:4;12471:6;12467:17;12461:24;12454:4;12443:9;12439:20;12432:54;12542:4;12534:6;12530:17;12524:24;12517:4;12506:9;12502:20;12495:54;12596:4;12588:6;12584:17;12578:24;12611:51;12656:4;12645:9;12641:20;12627:12;1939:13;1932:21;1920:34;;1869:91;12611:51;-1:-1:-1;12718:4:1;12706:17;;;12700:24;12678:20;;;12671:54;12781:4;12769:17;;;12763:24;12741:20;;;12734:54;12807:6;12855:15;;;12849:22;12829:18;;;12822:50;12891:6;12939:15;;;12933:22;12913:18;;;12906:50;12975:6;13023:15;;;13017:22;12997:18;;;12990:50;13059:6;13107:15;;;13101:22;13081:18;;;13074:50;13143:6;13191:15;;;13185:22;13165:18;;;;13158:50;;;;12044:1170;:::o;13615:251::-;13685:6;13738:2;13726:9;13717:7;13713:23;13709:32;13706:52;;;13754:1;13751;13744:12;13706:52;13786:9;13780:16;13805:31;13830:5;13805:31;:::i;13871:331::-;14073:2;14055:21;;;14112:1;14092:18;;;14085:29;-1:-1:-1;;;14145:2:1;14130:18;;14123:38;14193:2;14178:18;;13871:331::o;14207:840::-;14270:5;14318:6;14306:9;14301:3;14297:19;14293:32;14290:52;;;14338:1;14335;14328:12;14290:52;14360:22;;:::i;:::-;14351:31;;14405:40;14435:9;14405:40;:::i;:::-;14398:5;14391:55;14499:2;14488:9;14484:18;14478:25;14473:2;14466:5;14462:14;14455:49;14557:2;14546:9;14542:18;14536:25;14531:2;14524:5;14520:14;14513:49;14615:2;14604:9;14600:18;14594:25;14589:2;14582:5;14578:14;14571:49;14674:3;14663:9;14659:19;14653:26;14647:3;14640:5;14636:15;14629:51;14734:3;14723:9;14719:19;14713:26;14707:3;14700:5;14696:15;14689:51;14773:47;14815:3;14804:9;14800:19;14773:47;:::i;:::-;14767:3;14760:5;14756:15;14749:72;14875:3;14864:9;14860:19;14854:26;14848:3;14841:5;14837:15;14830:51;14900:3;14956:2;14945:9;14941:18;14935:25;14930:2;14923:5;14919:14;14912:49;;14980:3;15036:2;15025:9;15021:18;15015:25;15010:2;15003:5;14999:14;14992:49;;14207:840;;;;:::o;15052:801::-;15157:6;15210:3;15198:9;15189:7;15185:23;15181:33;15178:53;;;15227:1;15224;15217:12;15178:53;15260:2;15254:9;15302:4;15294:6;15290:17;15373:6;15361:10;15358:22;15337:18;15325:10;15322:34;15319:62;15316:88;;;15384:18;;:::i;:::-;15420:2;15413:22;15459:54;15505:7;15494:9;15459:54;:::i;:::-;15444:70;;15570:3;15555:19;;15549:26;15542:4;15530:17;;15523:53;15630:3;15615:19;;15609:26;15604:2;15592:15;;15585:51;15692:3;15677:19;;15671:26;15664:4;15652:17;;15645:53;15754:3;15739:19;;15733:26;15726:4;15714:17;;15707:53;15816:3;15801:19;;;15795:26;15788:4;15776:17;;15769:53;-1:-1:-1;15451:6:1;15052:801;-1:-1:-1;15052:801:1:o;15858:128::-;15898:3;15929:1;15925:6;15922:1;15919:13;15916:39;;;15935:18;;:::i;:::-;-1:-1:-1;15971:9:1;;15858:128::o;15991:336::-;16193:2;16175:21;;;16232:2;16212:18;;;16205:30;-1:-1:-1;;;16266:2:1;16251:18;;16244:42;16318:2;16303:18;;15991:336::o;16332:338::-;16534:2;16516:21;;;16573:2;16553:18;;;16546:30;-1:-1:-1;;;16607:2:1;16592:18;;16585:44;16661:2;16646:18;;16332:338::o;16675:347::-;16877:2;16859:21;;;16916:2;16896:18;;;16889:30;-1:-1:-1;;;16950:2:1;16935:18;;16928:53;17013:2;16998:18;;16675:347::o;17290:375::-;-1:-1:-1;;;;;17548:15:1;;;17530:34;;17600:15;;;;17595:2;17580:18;;17573:43;17647:2;17632:18;;17625:34;;;;17480:2;17465:18;;17290:375::o;17670:1002::-;17752:12;;17792:9;;-1:-1:-1;;;;;262:31:1;250:44;;17853:4;17849:2;17845:13;17839:20;17832:4;17827:3;17823:14;17816:44;17906:4;17902:2;17898:13;17892:20;17885:4;17880:3;17876:14;17869:44;17959:4;17955:2;17951:13;17945:20;17938:4;17933:3;17929:14;17922:44;18012:4;18008:2;18004:13;17998:20;17991:4;17986:3;17982:14;17975:44;18065:4;18061:2;18057:13;18051:20;18044:4;18039:3;18035:14;18028:44;18115:4;18111:2;18107:13;18101:20;18130:45;18169:4;18164:3;18160:14;18146:12;1939:13;1932:21;1920:34;;1869:91;18130:45;-1:-1:-1;18221:4:1;18213:13;;;18207:20;18191:14;;;18184:44;18247:6;18289:11;;;18283:18;18269:12;;;18262:40;18321:6;18363:11;;;18357:18;18343:12;;;18336:40;18427:4;18416:16;;18410:23;18401:6;18392:16;;18385:49;18485:4;18474:16;;18468:23;18459:6;18450:16;;18443:49;18543:4;18532:16;;18526:23;18517:6;18508:16;;18501:49;18601:4;18590:16;;18584:23;18575:6;18566:16;;18559:49;18659:4;18648:16;18642:23;18633:6;18624:16;;;18617:49;17670:1002::o;18677:278::-;18881:3;18866:19;;18894:55;18870:9;18931:6;18894:55;:::i;18960:330::-;19162:2;19144:21;;;19201:1;19181:18;;;19174:29;-1:-1:-1;;;19234:2:1;19219:18;;19212:37;19281:2;19266:18;;18960:330::o;19959:274::-;20088:3;20126:6;20120:13;20142:53;20188:6;20183:3;20176:4;20168:6;20164:17;20142:53;:::i;:::-;20211:16;;;;;19959:274;-1:-1:-1;;19959:274:1:o;20588:271::-;20771:6;20763;20758:3;20745:33;20727:3;20797:16;;20822:13;;;20797:16;20588:271;-1:-1:-1;20588:271:1:o;20864:884::-;20944:6;20997:2;20985:9;20976:7;20972:23;20968:32;20965:52;;;21013:1;21010;21003:12;20965:52;21046:9;21040:16;21075:18;21116:2;21108:6;21105:14;21102:34;;;21132:1;21129;21122:12;21102:34;21170:6;21159:9;21155:22;21145:32;;21215:7;21208:4;21204:2;21200:13;21196:27;21186:55;;21237:1;21234;21227:12;21186:55;21266:2;21260:9;21288:2;21284;21281:10;21278:36;;;21294:18;;:::i;:::-;21369:2;21363:9;21337:2;21423:13;;-1:-1:-1;;21419:22:1;;;21443:2;21415:31;21411:40;21399:53;;;21467:18;;;21487:22;;;21464:46;21461:72;;;21513:18;;:::i;:::-;21553:10;21549:2;21542:22;21588:2;21580:6;21573:18;21628:7;21623:2;21618;21614;21610:11;21606:20;21603:33;21600:53;;;21649:1;21646;21639:12;21600:53;21662:55;21714:2;21709;21701:6;21697:15;21692:2;21688;21684:11;21662:55;:::i;:::-;21736:6;20864:884;-1:-1:-1;;;;;;;20864:884:1:o;22885:184::-;22955:6;23008:2;22996:9;22987:7;22983:23;22979:32;22976:52;;;23024:1;23021;23014:12;22976:52;-1:-1:-1;23047:16:1;;22885:184;-1:-1:-1;22885:184:1:o;23074:274::-;-1:-1:-1;;;;;23266:32:1;;;;23248:51;;23330:2;23315:18;;23308:34;23236:2;23221:18;;23074:274::o;23701:342::-;23903:2;23885:21;;;23942:2;23922:18;;;23915:30;-1:-1:-1;;;23976:2:1;23961:18;;23954:48;24034:2;24019:18;;23701:342::o;24390:168::-;24430:7;24496:1;24492;24488:6;24484:14;24481:1;24478:21;24473:1;24466:9;24459:17;24455:45;24452:71;;;24503:18;;:::i;:::-;-1:-1:-1;24543:9:1;;24390:168::o;26350:245::-;26429:6;26437;26490:2;26478:9;26469:7;26465:23;26461:32;26458:52;;;26506:1;26503;26496:12;26458:52;-1:-1:-1;;26529:16:1;;26585:2;26570:18;;;26564:25;26529:16;;26564:25;;-1:-1:-1;26350:245:1:o;26600:345::-;26802:2;26784:21;;;26841:2;26821:18;;;26814:30;-1:-1:-1;;;26875:2:1;26860:18;;26853:51;26936:2;26921:18;;26600:345::o;26950:127::-;27011:10;27006:3;27002:20;26999:1;26992:31;27042:4;27039:1;27032:15;27066:4;27063:1;27056:15;27082:493;-1:-1:-1;;;;;27351:32:1;;27333:51;;27415:2;27400:18;;27393:34;;;27458:2;27443:18;;27436:34;;;27320:3;27305:19;;27500:1;27489:13;;27479:47;;27506:18;;:::i;:::-;27562:6;27557:2;27546:9;27542:18;27535:34;27082:493;;;;;;;:::o;27580:386::-;27793:25;;;27781:2;27766:18;;27848:1;27837:13;;27827:47;;27854:18;;:::i;:::-;27905:2;27890:18;;27883:34;;;;27948:2;27933:18;27926:34;27580:386;;-1:-1:-1;27580:386:1:o;27971:432::-;28225:3;28210:19;;28238:55;28214:9;28275:6;28238:55;:::i;:::-;28330:6;28324:3;28313:9;28309:19;28302:35;28388:6;28381:14;28374:22;28368:3;28357:9;28353:19;28346:51;27971:432;;;;;;:::o;28717:245::-;28809:6;28862:3;28850:9;28841:7;28837:23;28833:33;28830:53;;;28879:1;28876;28869:12;28830:53;28902:54;28948:7;28937:9;28902:54;:::i;28967:808::-;29063:6;29116:3;29104:9;29095:7;29091:23;29087:33;29084:53;;;29133:1;29130;29123:12;29084:53;29166:2;29160:9;29208:3;29200:6;29196:16;29278:6;29266:10;29263:22;29242:18;29230:10;29227:34;29224:62;29221:88;;;29289:18;;:::i;:::-;29329:10;29325:2;29318:22;;29370:9;29364:16;29356:6;29349:32;29435:2;29424:9;29420:18;29414:25;29409:2;29401:6;29397:15;29390:50;29494:2;29483:9;29479:18;29473:25;29468:2;29460:6;29456:15;29449:50;29553:2;29542:9;29538:18;29532:25;29527:2;29519:6;29515:15;29508:50;29613:3;29602:9;29598:19;29592:26;29586:3;29578:6;29574:16;29567:52;29662:3;29651:9;29647:19;29641:26;29676:28;29698:5;29676:28;:::i;:::-;29732:3;29720:16;;29713:31;29724:6;28967:808;-1:-1:-1;;;28967:808:1:o;30129:331::-;30331:2;30313:21;;;30370:1;30350:18;;;30343:29;-1:-1:-1;;;30403:2:1;30388:18;;30381:38;30451:2;30436:18;;30129:331::o;30465:217::-;30505:1;30531;30521:132;;30575:10;30570:3;30566:20;30563:1;30556:31;30610:4;30607:1;30600:15;30638:4;30635:1;30628:15;30521:132;-1:-1:-1;30667:9:1;;30465:217::o;33131:141::-;33213:1;33206:5;33203:12;33193:46;;33219:18;;:::i;:::-;33248;;33131:141::o;33277:356::-;33394:1;33390;33385:3;33381:11;33377:19;33369:5;33363:12;33359:38;33354:3;33347:51;33447:4;33440:5;33436:16;33430:23;33423:4;33418:3;33414:14;33407:47;33503:4;33496:5;33492:16;33486:23;33479:4;33474:3;33470:14;33463:47;33556:4;33549:5;33545:16;33539:23;33571:56;33621:4;33616:3;33612:14;33598:12;33571:56;:::i;:::-;;33277:356;;:::o;33638:272::-;33838:3;33823:19;;33851:53;33827:9;33886:6;33851:53;:::i;33915:753::-;34099:4;34141:3;34130:9;34126:19;34118:27;;34181:1;34177;34172:3;34168:11;34164:19;34229:2;34220:6;34214:13;34210:22;34199:9;34192:41;34289:4;34281:6;34277:17;34271:24;34264:4;34253:9;34249:20;34242:54;34364:2;34356:4;34348:6;34344:17;34338:24;34334:33;34327:4;34316:9;34312:20;34305:63;;34424:4;34416:6;34412:17;34406:24;34399:4;34388:9;34384:20;34377:54;34487:4;34479:6;34475:17;34469:24;34462:4;34451:9;34447:20;34440:54;34541:4;34533:6;34529:17;34523:24;34556:62;34612:4;34601:9;34597:20;34583:12;34556:62;:::i;:::-;;34655:6;34649:3;34638:9;34634:19;34627:35;33915:753;;;;;:::o;34673:370::-;34901:3;34886:19;;34914:53;34890:9;34949:6;34914:53;:::i;:::-;-1:-1:-1;;;;;35004:32:1;;;;34998:3;34983:19;;;;34976:61;34673:370;;-1:-1:-1;34673:370:1:o;35387:417::-;-1:-1:-1;;;;;35636:32:1;;;;35618:51;;35700:2;35685:18;;35678:34;;;;35743:2;35728:18;;35721:34;35786:2;35771:18;;35764:34;35605:3;35590:19;;35387:417::o

Swarm Source

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