ETH Price: $2,689.64 (-1.66%)

Contract

0x23684eda66652da77E817812BfF0D375976DE3e0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create Book85872682019-09-20 16:23:491974 days ago1568996629IN
0x23684eda...5976DE3e0
0.03 ETH0.0364168820
Create Book85837252019-09-20 3:17:411975 days ago1568949461IN
0x23684eda...5976DE3e0
0.02 ETH0.0491627827

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
85872682019-09-20 16:23:491974 days ago1568996629
0x23684eda...5976DE3e0
0.03 ETH
85872682019-09-20 16:23:491974 days ago1568996629
0x23684eda...5976DE3e0
 Contract Creation0 ETH
85837252019-09-20 3:17:411975 days ago1568949461
0x23684eda...5976DE3e0
0.02 ETH
85837252019-09-20 3:17:411975 days ago1568949461
0x23684eda...5976DE3e0
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AssetSwap

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-09-20
*/

// File: browser/Oracle.sol

pragma solidity ^0.5.11;

contract Oracle {

    /** Contract Constructor
    * @param ethPrice the starting price of ETH in USD, represented as 150000000 = 150.00 USD
    * @dev The message sender is assigned as the contract administrator
    */
    constructor (uint ethPrice) public {
        admins[msg.sender] = true;
        addAsset("ETHUSD", ethPrice);
    }
    Asset[] public assets;
    uint[8][] private prices;
    mapping(address => bool) public admins;
    mapping(address => bool) public readers;
    //  This prevents the Oracle from sneaking in an unexpected settlement price, especially a rapid succession of them
    // it is 20 hours to accomodate a situation where there is an exogenous circumstance preventing the update, eg, network problems
    uint public constant UPDATE_TIME_MIN = 0 hours;
    // this gives time for players to cure their margins, burn
    uint public constant SETTLE_TIME_MIN1 = 0 days;    // 1 day
    // this prevents addition of new prices before settlements are completed
    uint public constant SETTLE_TIME_MIN2 = 46 hours;   // 46
    // this allows the oracle to rectify honest errors that might accidentally be posted
    uint public constant EDIT_TIME_MAX = 30 minutes;  // 90 min

    struct Asset {
        bytes32 name;
        uint8 currentDay;
        uint lastUpdateTime;
        uint lastSettleTime;
        bool isFinalDay;
    }

    event PriceUpdated(
        uint indexed id,
        bytes32 indexed name,
        uint price,
        uint timestamp,
        uint8 dayNumber,
        bool isCorrection
    );

        modifier onlyAdmin()
    {
        require(admins[msg.sender]);
        _;
    }

    /** Grant administrator priviledges to a user,
    * mainly intended for when the admin wants to switch accounts, ie, paired with a removal
    * @param newAdmin the address to promote
    */
    function addAdmin(address newAdmin)
        public
        onlyAdmin
    {
        admins[newAdmin] = true;
    }

    /** Add a new asset tracked by the Oracle
    * @param _name the hexadecimal version of the simple name
    * plaintext name of the asset, eg, SPXUSD = 0x5350585553440000000000000000000000000000000000000000000000000000
    * @param _startPrice the starting price of the asset in USD * 10^2, eg 1200 = $12.00
    * @dev this should usually be called on a Settlement Day
    * @return id the newly assigned ID of the asset
    */
    function addAsset(bytes32 _name, uint _startPrice)
        public
        returns (uint _assetID)
    {
        require (admins[msg.sender] || msg.sender == address(this));
        // Fill the asset struct
        Asset memory asset;
        asset.name = _name;
        asset.currentDay = 0;
        asset.lastUpdateTime = now;
        asset.lastSettleTime = now - 5 days;
        assets.push(asset);
        uint[8] memory _prices;
        _prices[0] = _startPrice;
        prices.push(_prices);
        return assets.length - 1;
    }
    /** Quickly fix an erroneous price
    * @param _assetID the id of the asset to change
    * @param _newPrice the new price to change to
    * @dev this must be called within 30 minutes of the lates price update occurence
    */

    function editPrice(uint _assetID, uint _newPrice)
        public
        onlyAdmin
    {
        Asset storage asset = assets[_assetID];
        require(now < asset.lastUpdateTime + EDIT_TIME_MAX);
        prices[_assetID][asset.currentDay] = _newPrice;
        emit PriceUpdated(_assetID, asset.name, _newPrice, now, asset.currentDay, true);
    }

    /** Grant an address permision to access private information about the assets
    * @param newReader the address of the account to grant reading priviledges,
    * any new contract the Oracle services would thus need the Oracle's permission
    * @dev this allows the reader to use the getCurrentPricesFunction
    */
    function addReader(address newReader)
        public
        onlyAdmin
    {
        readers[newReader] = true;
    }

    /** Return the entire current price array for a given asset
    * @param _assetID the asset id of the desired asset
    * @return _priceHist the price array for the asset
    * @dev only the admin and addresses granted readership may call this function
    */
    function getPrices(uint _assetID)
        public
        view
        returns (uint[8] memory _priceHist)
    {
        require (admins[msg.sender] || readers[msg.sender]);
        _priceHist = prices[_assetID];
    }

    /** Return the current prices array for a given asset
     * excepting the last one. This is useful for users trying to calculate their PNL, as holidays can make
     * inferences about the settlement or start date ambiguous. Anyone trying to use this contract as an oracle, however,
     * would have a day lag
    * @param _assetID the asset id of the desired asset
    * @return _priceHist the price array for the asset excluding the most recent observation
    * @dev only the admin and addresses granted readership may call this function
    */
    function getStalePrices(uint _assetID)
        public
        view
        returns (uint[8] memory _priceHist)
    {
        _priceHist = prices[_assetID];
        _priceHist[assets[_assetID].currentDay]=0;
    }

    /** Return only the latest prices
    * @param _assetID the asset id of the desired asset
    * @return _price the latest price of the given asset
    * @dev only the admin or a designated reader may call this function
    */
    function getCurrentPrice(uint _assetID)
        public
        view
        returns (uint _price)
    {
        require (admins[msg.sender] || readers[msg.sender]);
        _price =  prices[_assetID][assets[_assetID].currentDay];
    }

    /** Get the timestamp of the last price update time
    * @param _assetID the asset id of the desired asset
    * @return timestamp the price update timestamp
    */
    function getLastUpdateTime(uint _assetID)
        public
        view
        returns (uint timestamp)
    {
        timestamp = assets[_assetID].lastUpdateTime;
    }

    /** Get the timestamp of the last settle update time
    * @param _assetID the asset id of the desired asset
    * @return timestamp the settle timestamp
    * this is useful for knowing when to run the WeeklyReturns function, and that settlement is soon
    */
    function getLastSettleTime(uint _assetID)
        public
        view
        returns (uint timestamp)
    {
        timestamp = assets[_assetID].lastSettleTime;
    }

    /**
    * @param _assetID the asset id of the desired asset
    * pulls the day relevant for new AssetSwap takes
    */
    function getStartDay(uint _assetID)
        public
        view
        returns (uint8 _startDay)
    {
        if (assets[_assetID].isFinalDay) _startDay = 7;
        else if (assets[_assetID].currentDay == 7) _startDay = 1;
        else _startDay = assets[_assetID].currentDay + 1;
    }

     /** Show if the current day is the final price update before settle
    * @param _assetID the asset id of the desired asset
    * @return true if it is the final day, false otherwise
    * This makes sure the oracle cannot sneak it a settlement unaware, as when flagged false a user knows that a
    * settlement cannot occur for at least 2 days. When set to false it lets a user know the next price update will be a
    * settlement price and they need to potentially cure or cancel
    */
    function isFinalDay(uint _assetID)
        public
        view
        returns (bool)
    {
        return assets[_assetID].isFinalDay;
    }

    /** Show if the last price update was a settle price update
    * @param _assetID the asset id of the desired asset
    * @return true if the last update was a settle, false otherwise
    * This tells LPs they need to settle their books, and that all parties must  cure their margin if needed
    */
    function isSettleDay(uint _assetID)
        public
        view
        returns (bool)
    {
        return (assets[_assetID].currentDay == 7);
    }

    /** Remove administrator priviledges from a user
    * @param toRemove the address to demote
    * @notice you may not remove yourself. This allows the oracle to deprecate old addresses
    */
    function removeAdmin(address toRemove)
        public
        onlyAdmin
    {
        require(toRemove != msg.sender);
        admins[toRemove] = false;
    }

     /** Publishes an asset price. Does not initiate a settlement.
    * @param _assetID the ID of the asset to update
    * @param _price the current price of the asset * 10^2
    * @param finalDayStatus true if this is the last intraweek price update (the next will be a settle)
    * @dev this can only be called after the required time has elapsed since the most recent price update
    * @dev if finalDayStatus is true this function cannot be called again until after settle
    */
    function setIntraWeekPrice(uint _assetID, uint _price, bool finalDayStatus)
        public
        onlyAdmin
    {
        Asset storage asset = assets[_assetID];
        // Prevent a quick succession of price updates
        require(now > asset.lastUpdateTime + UPDATE_TIME_MIN);
        // the price update follawing the isFinalDay=true must be a settlement price
        require(!asset.isFinalDay);
        if (asset.currentDay == 7) {
            require(now > asset.lastSettleTime + SETTLE_TIME_MIN2,
                "Sufficient time must pass after settlement update.");
             asset.currentDay = 1;
             uint[8] memory newPrices;
             // the start price for each week is the settlement price of the prior week
             newPrices[0] = prices[_assetID][7];
             newPrices[1] = _price;
             prices[_assetID] = newPrices;
        } else {
            asset.currentDay = asset.currentDay + 1;
            prices[_assetID][asset.currentDay] = _price;
            asset.isFinalDay = finalDayStatus;
        }
        asset.lastUpdateTime = now;
        emit PriceUpdated(_assetID, asset.name, _price, now, asset.currentDay, false);
    }

    /** Publishes an asset price. Does not initiate a settlement.
    * @param _assetID the ID of the asset to update
    * @param _price the current price of the asset * 10^2
    * @dev this can only be called after the required time has elapsed since the most recent price update
    * @dev if finalDayStatus is true this function cannot be called again until after settle
    */
    function setSettlePrice(uint _assetID, uint _price)
        public
        onlyAdmin
    {
        Asset storage asset = assets[_assetID];
        // Prevent price update too early
        require(now > asset.lastUpdateTime + UPDATE_TIME_MIN);
        // can only be set when the last update signalled as such
        require(asset.isFinalDay);
        // need at least 5 days between settlements
        require(now > asset.lastSettleTime + SETTLE_TIME_MIN1,
            "Sufficient time must pass between weekly price updates.");
            // settlement prices are set to slot 7 in the prices array
             asset.currentDay = 7;
             prices[_assetID][7] = _price;
             asset.lastSettleTime = now;
             asset.isFinalDay = false;
        asset.lastUpdateTime = now;
        emit PriceUpdated(_assetID, asset.name, _price, now, 7, false);

    }

}

// File: browser/Book.sol


pragma solidity ^0.5.11;

contract Book {

    /** Sets up a new Book for an LP.
    * @notice each LP should have only one book
    * @dev the minumum take size is established here and never changes
    * @param user the address of the LP the new book should belong to
    * @param admin gives the AssetSwap contract the right to read and write to this contract
    * @param minBalance the minimum balance size in finney
    */
     constructor(address user, address  admin, uint minBalance)
        public
    {
        assetSwap = AssetSwap(admin);
        lp = user;
        minRM = minBalance * 1 finney;
        lastBookSettleTime = now - 7 days;
    }

    address public lp;
    AssetSwap public assetSwap;
    bool public bookDefaulted;
    uint public settleNum;
    uint public LPMargin;
    uint public LPLongMargin;    // total RM of all subks where lp is long
    uint public LPShortMargin;   // total RM of all subks where lp is short
    uint public LPRequiredMargin;   // ajusted by take, reset at settle
    uint public lastBookSettleTime;
    uint public minRM;
    uint public debitAcct;
    uint internal constant BURN_DEF_FEE = 2; // burn and default fee, applied as RM/BURN_DEF_FEE
    //  after 9 days without an Oracle settlement, all players can redeem their contracts
    //  after one player executes the invactiveOracle function, which uses this constant, the book is in default allowing
    // anyone to redeem their subcontracts and withdraw their margin
    uint internal constant ORACLE_MAX_ABSENCE = 1 days;
    // as long and short settlements are executed separately, prevents the oracle
    // from settling either side twice on settlement day
    uint internal constant NO_DOUBLE_SETTLES = 1 days;
    // settlement uses gas, and so this max prevents the accumulation of so many subcontracts the Book could never settle
    uint internal constant MAX_SUBCONTRACTS = 225;
    uint internal constant CLOSE_FEE = 200;
    uint internal constant LP_MAX_SETTLE = 0 days;
    bytes32[] public shortTakerContracts; // note this implies the lp is long
    bytes32[] public longTakerContracts;  // and here the  lp is short
    mapping(bytes32 => Subcontract) public subcontracts;
    address payable internal constant BURN_ADDRESS = address(0xdead);  // address payable

    struct Subcontract {
        uint index;
		address taker;
		uint takerMargin;   // in wei
		uint reqMargin;     // in wei
        uint8 startDay;     // 0 for initial price on settlement, 1 for day after, etc, though 7 implies settlement day
        bool takerCloseDisc;
		bool LPSide;        // true for LP long, taker Short
		bool isCancelled;
		bool takerBurned;
		bool LPBurned;
		bool takerDefaulted;
        bool isActive;
	}


    modifier onlyAdmin()
    {
        require(msg.sender == address(assetSwap));
        _;
    }

    /** Allow the LP to change the minimum take size in their book
    * @param _min the minimum take size in ETH for the book
    */
    function adjustMinRM(uint _min)
        public
        onlyAdmin
    {
        minRM = _min * 1 finney;
    }

    /** Allow the OracleSwap admin to cancel any  subcontract
    * @param subkID the subcontract to cancel
    */
    function adminCancel(bytes32 subkID)
        public
        payable
        onlyAdmin
    {
        Subcontract storage k = subcontracts[subkID];
        k.isCancelled = true;
    }

    /** Allow the OracleSwap admin to cancel any  subcontract
    */
    function adminStop()
        public
        payable
        onlyAdmin
    {
        bookDefaulted = true;
        LPRequiredMargin = 0;
    }

    /** Function to send balances back to the Assetswap contract
    * @param amount the amount in wei to send
    * @param recipient the address to credit the balance to
    */
    function balanceSend(uint amount, address recipient)
        internal
    {
        assetSwap.balanceTransfer.value(amount)(recipient);
    }

    /** Burn a subcontract
    * @param subkID the subcontract id
    * @param sender who called the function in AssetSwap
    * @param amount the message value
    */
    function bookBurn( bytes32 subkID, address sender, uint amount)
        public
        payable
        onlyAdmin
        returns (uint)
    {
        Subcontract storage k = subcontracts[subkID];
        require(sender == lp || sender == k.taker, "must by party to his subcontract");
        // cost to burn
		uint burnFee = k.reqMargin / BURN_DEF_FEE;
		require (amount >= burnFee);
		if (sender == lp)
		    k.LPBurned = true;
		else
		    k.takerBurned = true;
		return burnFee;
    }

     /** Cancel a subcontract
    * @param lastOracleSettleTime the last settle price timestamp
    * @param subkID the subcontract id
    */
    function bookCancel(uint lastOracleSettleTime, bytes32 subkID, address sender)
        public
        payable
        onlyAdmin
    {
        Subcontract storage k = subcontracts[subkID];
        require(lastOracleSettleTime < lastBookSettleTime, "Cannot do during settle period");
		require(sender == k.taker || sender == lp, "Canceller not LP or taker");
        require(!k.isCancelled, "Subcontract already cancelled");
        uint fee;
        fee =(k.reqMargin * CLOSE_FEE)/1e4 ;
        if (k.takerCloseDisc || (sender == lp))
           fee = 3 * fee / 2;
		require(msg.value >= fee, "Insufficient cancel fee");
        k.isCancelled = true;
        balanceSend(msg.value - fee, sender);
        balanceSend(fee, assetSwap.feeAddress());
    }

    /** Deposit ETH into the LP margin
    * @notice the message value is directly deposited
    */
    function fundLPMargin()
        public
        payable
    {
        LPMargin = add(LPMargin,msg.value);
    }

    /** Deposit ETH into a taker's margin
    * @param subkID the id of the subcontract to deposit into
    * @notice the message value is directly deposited.
    */
    function fundTakerMargin(bytes32 subkID)
        public
        payable
    {
        Subcontract storage k = subcontracts[subkID];
        require (k.reqMargin > 0);
        k.takerMargin= add(k.takerMargin,msg.value);
    }

    /** This function returns the stored values of a subcontract
    * @param subkID the subcontract id
    * @return takerMargin the takers actual margin balance
    * @return reqMargin the required margin for both parties for the subcontract
    * @return startDay the integer value corresponding to the index (day) for retrieving prices
    * @return LPSide, the side of the contract in terms of the LP, eg, true implies lp is long, taker is short
    * @return takerCloseFee, as these depend on the size of the LP book when taken relative to the AssetSwap's Global_size_discout
    * that distinguishes between large and small lps for this assetswap, where larger LP books have half the closing fee that
    * small LP books have
    *
    */
        function getSubkData(bytes32 subkID)
        public
        view
        returns (uint _takerMargin, uint _reqMargin,
          bool _lpside, bool isCancelled, bool isActive, uint8 _startDay)
    {
        Subcontract storage k = subcontracts[subkID];
        _takerMargin = k.takerMargin;
        _reqMargin = k.reqMargin;
        _lpside = k.LPSide;
        isCancelled = k.isCancelled;
        isActive = k.isActive;
        _startDay = k.startDay;
    }


    /** This function returns the stored values of a subcontract
    *
    */

      function getSubkDetail(bytes32 subkID)
        public
        view
        returns (bool closeDisc, bool takerBurned, bool LPBurned, bool takerDefaulted)
    {
        Subcontract storage k = subcontracts[subkID];
        closeDisc = k.takerCloseDisc;
        takerBurned = k.takerBurned;
        LPBurned = k.LPBurned;
        takerDefaulted = k.takerDefaulted;
    }


    /** if the Oracle neglects the OracleContract, any player can set the book into default by executing this function
     * then all players can redeem their subcontracts
     *
     */

     function inactiveOracle()
        public
        {
          require(now > (lastBookSettleTime + ORACLE_MAX_ABSENCE));

          bookDefaulted = true;
          LPRequiredMargin = 0;
        }

    /** if the book was not settled, the LP is held accountable
     * the first counterparty to execute this function will then get a bonus credit of their RM from the LP
     * if the LP's total margin is zero, they will get whatever is there
     * after the book is in default all players can redeem their subcontracts
     * After a book is in default, this cannot be executed
     */

    function inactiveLP(uint _lastOracleSettleTime, bytes32 subkID)
        public
    {
          require(_lastOracleSettleTime > lastBookSettleTime);
          require( now > (_lastOracleSettleTime + LP_MAX_SETTLE));
          require(!bookDefaulted);
          Subcontract storage k = subcontracts[subkID];
          uint LPfee = min(LPMargin,k.reqMargin);
          uint defPay = subzero(LPRequiredMargin/2,LPfee);
          LPMargin = subzero(LPMargin,add(LPfee,defPay));
          k.takerMargin = add(k.takerMargin,LPfee);
          bookDefaulted = true;
          LPRequiredMargin = 0;
    }
    /** Refund the balances and remove from storage a subcontract that has been defaulted, cancelled,
    * burned, or expired.
    * @param subkID the id of the subcontract
    * this is done separately from settlement because it requires a modest amount of gas
    * and would otherwise severely reduce the number of potential long and short contracts
    */
    function redeemSubcontract(bytes32 subkID)
        public
        onlyAdmin
    {
        Subcontract storage k = subcontracts[subkID];
        require(!k.isActive || bookDefaulted);
        uint tMargin = k.takerMargin;
        if (k.takerDefaulted) {
            uint defPay = k.reqMargin / BURN_DEF_FEE;
            tMargin = subzero(tMargin,defPay);
        BURN_ADDRESS.transfer(defPay);
        }
        k.takerMargin = 0;
        balanceSend(tMargin, k.taker);
        uint index = k.index;
        if (k.LPSide) {
            Subcontract storage lastShort = subcontracts[shortTakerContracts[shortTakerContracts.length - 1]];
            lastShort.index = index;
            shortTakerContracts[index] = shortTakerContracts[shortTakerContracts.length - 1];
            shortTakerContracts.pop();
        } else {
            Subcontract storage lastLong = subcontracts[longTakerContracts[longTakerContracts.length - 1]];
            lastLong.index = index;
            longTakerContracts[index] = longTakerContracts[longTakerContracts.length - 1];
            longTakerContracts.pop();
        }
        Subcontract memory blank;
        subcontracts[subkID] = blank;
    }

    /** Settle the taker long sukcontracts
    * @param takerLongRets the returns for a long contract for a taker for each potential startDay
    * */
  function settleLong(int[8] memory takerLongRets, uint topLoop)
        public
        onlyAdmin
    {
        // long settle can only be done once at settlement
       require(settleNum < longTakerContracts.length);
       // settlement can only be done at least 5 days since the last settlement
       require(now > lastBookSettleTime + NO_DOUBLE_SETTLES);
       topLoop = min(longTakerContracts.length, topLoop);
        LPRequiredMargin = add(LPLongMargin,LPShortMargin);
         for (settleNum; settleNum < topLoop; settleNum++) {
             settleSubcontract(longTakerContracts[settleNum], takerLongRets);
        }
    }

    /** Settle the taker long sukcontracts
    * @param takerShortRets the returns for a long contract for a taker for each potential startDay
    * */
 function settleShort(int[8] memory takerShortRets, uint topLoop)
        public
        onlyAdmin
    {
        require(settleNum >= longTakerContracts.length);
        topLoop = min(shortTakerContracts.length, topLoop);
        for (uint i = settleNum - longTakerContracts.length; i < topLoop; i++) {
             settleSubcontract(shortTakerContracts[i], takerShortRets);
        }
        settleNum = topLoop + longTakerContracts.length;
        
        if (settleNum == longTakerContracts.length + shortTakerContracts.length) {
            LPMargin = subzero(LPMargin,debitAcct);
            if (LPShortMargin > LPLongMargin) LPRequiredMargin = subzero(LPShortMargin,LPLongMargin);
                else LPRequiredMargin = subzero(LPLongMargin,LPShortMargin);
            debitAcct = 0;
            lastBookSettleTime = now;
            settleNum = 0;
            if (LPMargin < LPRequiredMargin) {
                bookDefaulted = true;
                uint defPay = min(LPMargin, LPRequiredMargin/BURN_DEF_FEE);
                LPMargin = subzero(LPMargin,defPay);
            }
        }
    }

     function MarginCheck()
        public
        view
        returns (uint playerMargin, uint bookETH)
    {
        playerMargin = 0;

            for (uint i = 0; i < longTakerContracts.length; i++) {
             Subcontract storage k = subcontracts[longTakerContracts[i]];
             playerMargin = playerMargin + k.takerMargin ;
            }
             for (uint i = 0; i < shortTakerContracts.length; i++) {
             Subcontract storage k = subcontracts[shortTakerContracts[i]];
             playerMargin = playerMargin + k.takerMargin ;
            }

            playerMargin  = playerMargin + LPMargin;
            bookETH = address(this).balance;


    }

      /** Internal fn to settle an individual subcontract
    * @param subkID the id of the subcontract
    * @param subkRets the taker returns for a contract of that position for each day of the week
    */


    function settleSubcontract(bytes32 subkID, int[8] memory subkRets)
     internal
    {
        Subcontract storage k = subcontracts[subkID];
        // Don't settle terminated contracts or just starting subcontracts
        if (k.isActive && (k.startDay != 7)) {

            uint absolutePNL;

            bool lpprof;
            if (subkRets[k.startDay] < 0) {
                lpprof = true;
                absolutePNL = uint(-1 * subkRets[k.startDay]) * k.reqMargin / 1 finney;
            }
            else {
                absolutePNL = uint(subkRets[k.startDay]) * k.reqMargin / 1 finney;
            }
            absolutePNL = min(k.reqMargin,absolutePNL);
            if (lpprof) {
                k.takerMargin = subzero(k.takerMargin,absolutePNL);
                if (!k.takerBurned) LPMargin = add(LPMargin,absolutePNL);
            } else {
                if (absolutePNL>LPMargin) debitAcct = add(debitAcct,subzero(absolutePNL,LPMargin));
                LPMargin = subzero(LPMargin,absolutePNL);
                if (!k.LPBurned) k.takerMargin = add(k.takerMargin,absolutePNL);
            }
            if (k.LPBurned || k.takerBurned || k.isCancelled) {
                if (k.LPSide) LPLongMargin = subzero(LPLongMargin,k.reqMargin);
                else LPShortMargin = subzero(LPShortMargin,k.reqMargin);
                k.isActive = false;
            } else if (k.takerMargin < k.reqMargin)
            {
                if (k.LPSide) LPLongMargin = subzero(LPLongMargin,k.reqMargin);
                else LPShortMargin = subzero(LPShortMargin,k.reqMargin);
                k.isActive = false;
                k.takerDefaulted = true;
            }
        }
        k.startDay = 0;
    }


      /** Create a new Taker long subcontract of the given parameters
    * @param taker the address of the party on the other side of the contract
    * @param amount the amount in ETH to create the subcontract for
    * @param sizeDiscCut is level below which the taker pays a double closeing fee r
    * @param startDay is the first day of the initial week used to get the starting price
    * @param lastOracleSettleTime makes sure takes do not happen in settlement period
    * @return subkID the id of the newly created subcontract
	*/
	 function take(address taker, uint amount, uint sizeDiscCut, uint8 startDay, uint lastOracleSettleTime, bool takerLong)
        public
        payable
        onlyAdmin
        returns (bytes32 subkID)
    {
        require(amount * 1 finney >= minRM, "must be greater than book min");
        require(lastOracleSettleTime < lastBookSettleTime, "Cannot do during settle period");
        Subcontract memory order;
        order.reqMargin = amount * 1 finney;
        order.takerMargin = msg.value;
        order.taker = taker;
        order.isActive = true;
        order.startDay = startDay;
        if (!takerLong) order.LPSide = true;
        if (takerLong) {
            require(longTakerContracts.length < MAX_SUBCONTRACTS, "bookMaxedOut");
            subkID = keccak256(abi.encodePacked(lp, now, longTakerContracts.length));  // need to add now
            order.index = longTakerContracts.length;
            longTakerContracts.push(subkID);
            LPShortMargin = add(LPShortMargin,order.reqMargin);
            if (subzero(LPShortMargin,LPLongMargin) > LPRequiredMargin)
                LPRequiredMargin = subzero(LPShortMargin,LPLongMargin);
            } else {
            require(shortTakerContracts.length < MAX_SUBCONTRACTS, "bookMaxedOut");
            subkID = keccak256(abi.encodePacked(shortTakerContracts.length,lp, now));  // need to add now
            order.index = shortTakerContracts.length;
            shortTakerContracts.push(subkID);
            LPLongMargin = add(LPLongMargin,order.reqMargin);
             if (subzero(LPLongMargin,LPShortMargin) > LPRequiredMargin)
            LPRequiredMargin = subzero(LPLongMargin,LPShortMargin);
             }
        if (add(LPLongMargin,LPShortMargin) >= sizeDiscCut) order.takerCloseDisc = true;
        subcontracts[subkID] = order;
        return subkID;
    }


     /** Withdraw margin from the LP margin
    * @param amount the amount of margin to move
    * @param lastOracleSettleTime timestamp of the last oracle setlement time
    * @notice reverts if during the settle period
    */
    function withdrawalLP(uint amount, uint lastOracleSettleTime)
        public
        onlyAdmin
    {
        if (bookDefaulted) {
            require (LPMargin >= amount, "Cannot withdraw more than the margin");
        } else {
            require (LPMargin >= add(LPRequiredMargin,amount),"Cannot to w/d more than excess margin");
            require(lastOracleSettleTime < lastBookSettleTime, "Cannot do during settle period");
        }
        LPMargin = subzero(LPMargin,amount);
        balanceSend(amount, lp);
    }

    /** Allow a taker to withdraw margin
    * @param subkID the subcontract id
    * @param lastOracleSettleTime the block timestamp of the last oracle settle price
    * @param sender who sent this message to AssetSwap
    * @notice reverts during settle period
    */
    function withdrawalTaker(bytes32 subkID, uint amount, uint lastOracleSettleTime, address sender)
        public
        onlyAdmin
    {
        require(lastOracleSettleTime < lastBookSettleTime, "Cannot do during settle period");
        Subcontract storage k = subcontracts[subkID];
        require(k.takerMargin >= add(k.reqMargin,amount),"must have sufficient margin");
        require(sender == k.taker, "Must be taker to call this function");
        k.takerMargin = subzero(k.takerMargin,amount);
        balanceSend(amount, k.taker);
    }


    /** Utility function to find the minimum of two unsigned values
    * @notice returns the first parameter if they are equal
    */
    function min(uint a, uint b)
        internal
        pure
        returns (uint)
    {
        if (a <= b)
            return a;
        else
            return b;
    }


    function subzero(uint _a, uint _b)
        internal
        pure
        returns (uint)
    {
        if (_b >= _a)
            return 0;
        else
            return _a - _b;
    }

    function add(uint _a, uint _b)
        internal
        pure
        returns (uint)
        {
        uint c = _a + _b;
        assert(c >= _a);
        return c;
        }

}

// File: browser/AssetSwap.sol

pragma solidity ^0.5.11;



contract AssetSwap {

    /** Sets up a new SwapMarket contract
    * The creator can administrate the contract, including transferring this contract to someone else
    * Admin functions include executing th eWeekly Returns function used at settlement, and also adjusting target and basis RatesUpdated
    * adjusting for DaylightSavings (so takers cannot take during the 4 PM hour)
    *  other changes are basically for faciilitating an efficient shut down: pausing new takers, cancelling existing contracts.
    * None of these variables can be altered once created
    */

    constructor (address priceOracle)
        public
    {
        admins[msg.sender] = true;
        feeAddress = msg.sender;
        oracle = Oracle(priceOracle);
    }

    Oracle public oracle;

    bool public _isDST;  // Daylight savings dummy, is 1 if summer
    bool public _isFreeMargin; // used in intraWeek LP RM adjustment
    int public _LongRate; // in hundredths of a %
    int public _ShortRate; // in hundredths of a %
    uint public GLOBAL_SIZE_DISC; // set by Oracle to incent Takers towards the larger LPs
    uint public GLOBAL_RM_MIN;   // avoids nuisance accounts of trivial size
    int public constant TOP_BASIS = 200; //Basis rate is capped on low and high end to prevent Oracle shenanigans
    uint public constant MIN_SETTLE_TIME = 0 hours;  // requires at least 24 hours to pass after Oracle settlement update until book settlement can occur
    uint public constant NO_TAKE_HOUR = 1;  // no takes from 4-5 PM NYC time
    uint public constant TOP_TARGET = 100;  // caps Target rate to prevent Oracle mischief
    uint public constant ASSET_ID = 1; // this contract's asset ID, used for referencing price array in Oracle contract
    uint public constant _leverageRatio = 1000; // this translates to 10x leverage
    uint public _lastWeeklyReturnsTime;
    int[8] private takerLongReturns;
    int[8] private takerShortReturns;
    mapping(address => address) public _books;  // LP eth address to book contract address
    mapping(address => uint) public _withdrawBalances;  // how ETH is ultimately withdrawn
    mapping(address => bool) public admins;  // gives user right to key functions
    address payable public feeAddress;   // address for oracle fees PAYABLE!!
    address payable constant constant BURN_ADDRESS = address(0xdead);  // address payable


    event subkTracker(
        address indexed e_lp,
        address indexed e_taker,
        bytes32 e_subkID,
        bool e_open);
    event BurnHist(
        address e_lp,
        bytes32 e_subkID,
        address e_sender,
        uint e_time);
    event RatesUpdated(
        uint e_target,
        int e_basis);
    event LPNewBook(
        address e_lp,
        address e_lpBook);
    event SizeDiscUpdated(
        uint e_minLPGrossForDisc);


    modifier onlyAdmin()
    {
        require(admins[msg.sender], "admin only");
        _;
    }

    /** Grant administrator priviledges to a user
    * @param newAdmin the address to promote
    */
    function addAdmin(address newAdmin)
        public
        onlyAdmin
    {
        admins[newAdmin] = true;
    }

    /* hour of day is used for cutting off when takers can take, when LPs can withdraw.
    Time is based on New York City, USA ET, which has daylight savings, so this is needed
    */
     function adjDST(bool _isDaylightSav)
        public
        onlyAdmin
    {
       _isDST = _isDaylightSav;
    }

     /* This parameter puts a floor on the size of subcontracts, and can be used
     to prevent new takes by setting it at absurdly high levels
    */
     function adjRMMin(uint _RMMin)
        public
        onlyAdmin
    {
       GLOBAL_RM_MIN = _RMMin;
    }

       /* this prevents edge cases where an LP might not have enough RM to cover
       its liabilities. It should only be invoked when there is a price change
       implying PNLs greater than the RM intraweek, and should be reset to false at
       the subsequent settlement update
    */
     function adjisFreeMargin(bool _freeMargin)
        public
        onlyAdmin
    {
       _isFreeMargin = _freeMargin;
    }

     /** Allow the LP to change the minimum take size in their book
    * @param _min the minimum take size in ETH for the book
    */
    function adjustMinRM(uint _min)
        public
    {
        require (_books[msg.sender] != address(0), "User must have a book");
        require (_min > GLOBAL_RM_MIN);
        Book b = Book(_books[msg.sender]);
        b.adjustMinRM(_min);
    }

    /* the Oracle/admin may cancel all outstanding contracts, say if the contract was being deprecated.
    Such a cancel generates no fees, and just terminates the subcontracts at the next settlement
    */
    function adminCancel(address _lp, bytes32 subkID)
        public
        onlyAdmin
    {
        Book b = Book(_books[_lp]);
        b.adminCancel(subkID);
    }

       /* the Oracle/admin may cancel all outstanding contracts, say if the contract was being deprecated.
    Such a cancel generates no fees, and just terminates the subcontracts at the next settlement
    */
    function adminKill(address _lp)
        public
        onlyAdmin
    {
        Book b = Book(_books[_lp]);
        b.adminStop();
    }

      /** Credit a users balance with the message value
    * @param recipient the user to get balance
    * @dev used by the Book when it needs to give players value
    */
    function balanceTransfer(address recipient)
        public
        payable
    {
        _withdrawBalances[recipient] = add(_withdrawBalances[recipient],msg.value);
    }

    /** Change the address that can withdraw the collected fees
    * @param newAddress the new address to change to
    */
    function changeFeeAddress(address payable newAddress)
        public
        onlyAdmin
    {
        feeAddress = newAddress;
    }

    /** Allow the LP to create a new book
     * @param _min is the minimum take size in ETH
     * @return newBook the address of the lp book
    */
        function createBook(uint _min)
        public
        payable
        returns (address newBook)
    {
        require (_books[msg.sender] == address(0), "User must not have a preexisting book");
        require (msg.value >= _min * 2 finney, "Must prep for 2-sided book");
        _books[msg.sender] = address(new Book(msg.sender, address(this), _min));
        Book b = Book(_books[msg.sender]);
        b.fundLPMargin.value(msg.value)();
        emit LPNewBook(msg.sender, _books[msg.sender]);
        return _books[msg.sender];
    }

        /**
    * @param _lp the lp who owns the book
    * @return book the address of the lp book
    * @return lpMargin the lp's current margin
    * @return totalLong the total RM of all long contracts the LP is engaged in
    * @return totalShort the total RM of all short contracts the LP is engaged in
    * @return lpRM the margin required for the LP
    * @return numLongTakerKs the number of taker long subcontracts that the lp has in their book
    * @return numShortTakerKs the number of taker short subcontracts that the lp has in their book
    * @return bookMinimum the minimum size in wei to make a subcontract with this book
    * @return bookDefaulted if the book is defaulted
    * @return settle1done to tell LP they can now run settlement on their shorts
    */
    function getBookData(address _lp)
        public
        view
        returns (address _book,
            uint _lpMargin,
            uint _totalLpLong,
            uint _totalLpShort,
            uint _lpRM,
            uint _bookMinimum,
            uint _lastBookSettleTime,
            uint _settleNum,
            bool _bookDefaulted
            )
    {
            _book = _books[_lp];
            Book b = Book(_book);
            _lpMargin = b.LPMargin();
            _totalLpLong = b.LPLongMargin();
            _totalLpShort = b.LPShortMargin();
            _lpRM = b.LPRequiredMargin();
            _bookMinimum = b.minRM();
            _lastBookSettleTime = b.lastBookSettleTime();
            _settleNum = b.settleNum();
            _bookDefaulted = b.bookDefaulted();
    }

    /** Function to easily get specific take information about a subcontract
    * @param _lp the address of the lp with the subcontract
    * @param subkID the id of the subcontract
    * @return takerMargin the taker's margin
    * @return reqMargin the required margin of the subcontract
    * @return startDay the day of the week the contract was started on
    * @return lpSide the LP's side for the contract
    * @return takerCloseDiscount if the takers close fee will be lowered
    */


    function getSubcontractData(address _lp, bytes32 subkID)
        public
        view
        returns (
            uint _takerMargin,
            uint _reqMargin,
            bool _lpSide,
            bool _isCancelled,
            bool _isActive,
            uint8 _startDay)
    {
        address book = _books[_lp];
        if (book != address(0)) {
            Book b = Book(book);
            (_takerMargin, _reqMargin, _lpSide, _isCancelled, _isActive, _startDay) = b.getSubkData(subkID);
        }
    }

      /** Function to get specific status information about a subcontract
    * @param _lp the address of the lp with the subcontract
    * @param subkID the id of the subcontract
    * @return isCancelled the status of if the subcontract is cancelled
    * @return takerBurned the status of if the subcontract is burned by taker
    * @return lpBurned the status of if the subcontract is burned by LP
    * @return takerDefaulted the status of if the taker Defaulted, and so the contract is dead and the taker should redeem it to get whatever marginis remaiing
    * @return isActive if the subcontract is redeemable or is involved in settlement
    */

    function getSubcontractStatus(address _lp, bytes32 subkID)
        public
        view
        returns (
            bool _closeDisc,
            bool _takerBurned,
            bool _lpBurned,
            bool _takerDefaulted)
    {
        address book = _books[_lp];
        if (book != address(0)) {
            Book b = Book(book);
            (_closeDisc, _takerBurned, _lpBurned, _takerDefaulted) = b.getSubkDetail(subkID);
        }
    }

     function getBookBalance(address _lp)
        public
        view
        returns (
            uint playerMargin,
            uint bookETH
            )
    {
        address book = _books[_lp];
        if (book != address(0)) {
            Book b = Book(book);
            (playerMargin, bookETH) = b.MarginCheck();
        }
    }



    /** Function to get specific status information about a subcontract


    function getSubcontractStatus(address _lp, bytes32 subkID)
        public
        view
        returns (
            bool isCancelled,
            bool takerBurned,
            bool lpBurned,
            bool takerDefaulted,
            bool isActive)
    {
        address book = _books[_lp];
        if (book != address(0)) {
            Book b = Book(book);
            (isCancelled, takerBurned, lpBurned, takerDefaulted, isActive) = b.getSubkStatus(subkID);
        }
    }
    */

     /** Adds value to the lp's margin for their whole book
    * @param _lp the address of the lp to add margin to
    */
    function lpFund(address _lp)
        public
        payable
    {
        require(msg.sender == _lp);
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        b.fundLPMargin.value(msg.value)();
    }

    /** Burn a specific subcontract at a cost
    * @param _lp the address of the LP with the subcontract
    * @param subkID the id of the subcontract to burn
    */
    function burn(address _lp, bytes32 subkID)
        public
        payable
    {
        Book b = Book(_books[_lp]);
        uint fee = b.bookBurn(subkID, msg.sender, msg.value);
        if (msg.value > fee) {
            BURN_ADDRESS.transfer(fee);
            _withdrawBalances[msg.sender] = add(_withdrawBalances[msg.sender],msg.value - fee);
            emit BurnHist(_lp, subkID, msg.sender, now);
         }
    }

    /** Sets the contract to terminate at the end of the week
    * @param _lp the address of the lp with the subcontract
    * @param subkID the id of the subcontract to cancel
    */
    function cancel(address _lp, bytes32 subkID)
        public
        payable
    {
        Book b = Book(_books[_lp]);
        uint lastSettleTime = oracle.getLastSettleTime(ASSET_ID);
        b.bookCancel.value(msg.value)(lastSettleTime, subkID, msg.sender);
    }
    /** sets the LP book into default after 9 days of no Oracle settlement price
    * @param _lp the address of the lp with the subcontract
    */
    function inactiveOracle(address _lp)
        public
    {
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        b.inactiveOracle();
    }
    /** sets the LP book into default if  of no Oracle settlement price
    * @param _lp the address of the lp with the subcontract
    */
     function inactiveLP(address _lp, bytes32 subkID)
        public
    {
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        uint lastSettleTime = oracle.getLastSettleTime(ASSET_ID);
        b.inactiveLP(lastSettleTime, subkID);
    }
    /** Refund the balances and remove from storage a subcontract that has been defaulted, cancelled,
    * burned, or expired.
    * @param _lp is the AssetSwap contracts identifier of the LP's book
    * @param subkID the id of the subcontract with the LP's book contract
    */

    function redeem(address _lp, bytes32 subkID)
        public
    {
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        b.redeemSubcontract(subkID);
        emit subkTracker(_lp, msg.sender, subkID, false);
    }

    /** Remove administrator priviledges from a user
    * @param toRemove the address to demote
    * @notice you may not remove yourself
    */
    function removeAdmin(address toRemove)
        public
        onlyAdmin
    {
        require(toRemove != msg.sender, "You may not remove yourself as an admin.");
        admins[toRemove] = false;
    }

      function setSizeDiscCut(uint sizeDiscCut)
        public
        onlyAdmin
    {
        // sets the cutoff that determines takers pay 2x to close
        GLOBAL_SIZE_DISC = sizeDiscCut * 1 finney;
        emit SizeDiscUpdated(sizeDiscCut);
    }

     /** Adjust the Long and Short rates for all contracts
    * @param target the new target rate in hundredths of a percent
    * @param basis the new basis rate in hundredths of a percent
    * @dev the "long rate" is target - basis, the "short rate" is target + basis
    * @dev the new rates won't go into effect until the following week after WeeklyReturns is called
    */

    function setRates(uint target, int basis)
        public
        onlyAdmin
    {
        // target between 0 and 1 % per week
        // basis between -2 and 2 % per week
        // not allowed on Settlement Day, which is tthe 24 hours from settlement price update to the next price update
        require(target <= TOP_TARGET, "Target must be between 0 and 1%");
        require(-TOP_BASIS <= basis && basis <= TOP_BASIS, "Basis must be between -2 and 2%");
        require(!oracle.isSettleDay(ASSET_ID));
        _LongRate = int(target) + basis;
        _ShortRate = int(target) - basis;
        emit RatesUpdated(target, basis);
    }

    /** Settle subcontracts for this lp
    * @param _lp the lp to settle
    * must be done twice. first with the bool set to true (long takers), then with the bool set to false (short takers)
    */

    function settle(address _lp, bool _settleLong, uint _topLoop)
        public
    {
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        // can only be run on settlement day, if missed all subcontracts can redeem
         require(oracle.isSettleDay(ASSET_ID));
        uint _lastSettle = oracle.getLastSettleTime(ASSET_ID);
        // must use WeeklyReturns that used recent Settlement prices
        require(_lastWeeklyReturnsTime > _lastSettle);
         // must wait at least 24 hours from the Oracle update
        require (now > _lastSettle + MIN_SETTLE_TIME, "Give players more time");
        if (_settleLong) b.settleLong(takerLongReturns, _topLoop); else b.settleShort(takerShortReturns, _topLoop);
    }

    /** Adds value to the taker's margin
    * @param _lp the address of the lp with the subcontract
    * @param subkID the id of the subcontract to add margin to
    */
    function takerFund(address _lp, bytes32 subkID)
        public
        payable
    {
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        b.fundTakerMargin.value(msg.value)(subkID);
    }

    /** Take a new subcontract with an LP
    * @param _lp the LP to take from
    * @param amount the amount IN finney to set the RM of the subcontract
    */
    function take(address _lp, uint amount, bool isTakerLong)
        public
        payable
    {
        require(msg.value >= amount * (1 finney), "Insuffient ETH for this RM"); // allow only whole number amounts
        require(hourOfDay() != NO_TAKE_HOUR, "Cannot take during 4 PM ET hour");  // cannot take from 4-5 PM ET   16
        require(amount > GLOBAL_RM_MIN);
        Book book = Book(_books[_lp]);
        uint lpLong = book.LPLongMargin();
        uint lpShort = book.LPShortMargin();
        uint freeMargin = 0;
        uint8 startDay = oracle.getStartDay(ASSET_ID);
        uint lastOracleSettleTime = oracle.getLastSettleTime(ASSET_ID);
        if (_isFreeMargin) {
        if (isTakerLong) freeMargin = subzero(lpLong,lpShort);
        else freeMargin = subzero(lpShort,lpLong);
        }
        require(amount * 1 finney <= subzero(book.LPMargin(),book.LPRequiredMargin())/2 + freeMargin, "RM to large for this LP on this side");
        bytes32 newsubkID = book.take.value(msg.value)(msg.sender, amount, GLOBAL_SIZE_DISC, startDay, lastOracleSettleTime, isTakerLong);
        emit subkTracker(_lp, msg.sender, newsubkID,true);
    }


//    Upon the Oracle Settlement Update, the weekly returns are calculated so that LPs can settle their _books
//    There is a minimum amount of time between the Oracle Contract update and the calculation of the Weekly Returns to give players
//    time to burn their PNLs if the Oracle applies fraudulent prices
    function weeklyReturns()
        public
        onlyAdmin
    {
        // only compute returns after settle price posted
       require(oracle.isSettleDay(ASSET_ID));

        uint[8] memory assetPrice  = oracle.getPrices(ASSET_ID);
        uint[8] memory ethPrice = oracle.getPrices(0);

        for (uint i = 0; i < 7; i++)
        {
            if (assetPrice[i] == 0 || ethPrice[i] == 0) continue;
            int assetReturn = int((assetPrice[7] * (1 finney)) / assetPrice[i] ) - 1 finney;
            takerLongReturns[i] = assetReturn - ((1 finney) * int(_LongRate))/1e4;
            takerShortReturns[i] = (-1 * assetReturn) - ((1 finney) * int(_ShortRate))/1e4;
            takerLongReturns[i] = (takerLongReturns[i] * int(_leverageRatio * ethPrice[i]))/int(ethPrice[7] * 100);
            takerShortReturns[i] = (takerShortReturns[i] * int(_leverageRatio * ethPrice[i]))/int(ethPrice[7] * 100);
        }
         _lastWeeklyReturnsTime = now;

    }



    /** Moves value out of the lp margin into the withdraw balance
    * @param amount the amount to move in wei
    */
    function withdrawalLP(uint amount)
        public
    {
        require(_books[msg.sender] != address(0));
        Book b = Book(_books[msg.sender]);
        uint lastOracleSettleTime= oracle.getLastSettleTime(ASSET_ID);
        // Will revert if during settle period, oraclesettle after last Book settle time
        b.withdrawalLP(amount, lastOracleSettleTime);
    }

    /** Moves value out of the taker margin into the withdraw balance
    * @param amount the amount to move in wei
    * @param _lp the lp with the subcontract to move balance from the taker margin
    * @param subkID the id of the subcontract
    */
    function withdrawalTaker(uint amount, address _lp, bytes32 subkID)
        public
    {
        require(_books[_lp] != address(0));
        Book b = Book(_books[_lp]);
        uint lastOracleSettleTime = oracle.getLastSettleTime(ASSET_ID);
        // will revert if during settle period
        b.withdrawalTaker(subkID, amount, lastOracleSettleTime, msg.sender);
    }

    /** Sends the owed balance to a user stored on this contract to an external address
    */
    function withdrawBalance()
        public
    {
        uint amount = _withdrawBalances[msg.sender];
        _withdrawBalances[msg.sender] = 0;
        msg.sender.transfer(amount);
    }

    /** we do not want users taking in the 16 hour (4 PM) because there is a slight delay in between when
    *  the price is recorded and poosted, so we do not want takers to exploit this option
    *  @return hour1 of NYC time
     */
    function hourOfDay()
        public
        view
        returns(uint hour1)
    {
        hour1= (now  % 86400) / 3600 - 5;
        if (_isDST) hour1=hour1 + 1;
    }
    /**
     * truncated subtraction, where result <0 is set to 0
    */

    function subzero(uint _a, uint _b)
        internal
        pure
        returns (uint)
    {
        if (_b >= _a) {
        return 0;
    }
        return _a - _b;
    }
    /**
    * adding and protecting against overflow errors
    */

    function add(uint _a, uint _b)
        internal
        pure
        returns (uint)
    {
        uint c = _a + _b;
        assert(c >= _a);
        return c;
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"_leverageRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"takerFund","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"getSubcontractData","outputs":[{"internalType":"uint256","name":"_takerMargin","type":"uint256"},{"internalType":"uint256","name":"_reqMargin","type":"uint256"},{"internalType":"bool","name":"_lpSide","type":"bool"},{"internalType":"bool","name":"_isCancelled","type":"bool"},{"internalType":"bool","name":"_isActive","type":"bool"},{"internalType":"uint8","name":"_startDay","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"getBookBalance","outputs":[{"internalType":"uint256","name":"playerMargin","type":"uint256"},{"internalType":"uint256","name":"bookETH","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"changeFeeAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_isDaylightSav","type":"bool"}],"name":"adjDST","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_SETTLE_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bool","name":"_settleLong","type":"bool"},{"internalType":"uint256","name":"_topLoop","type":"uint256"}],"name":"settle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawalLP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"sizeDiscCut","type":"uint256"}],"name":"setSizeDiscCut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_withdrawBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"burn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_books","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"adjustMinRM","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"inactiveLP","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_ShortRate","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hourOfDay","outputs":[{"internalType":"uint256","name":"hour1","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_LongRate","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"adminCancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"balanceTransfer","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"GLOBAL_SIZE_DISC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"withdrawalTaker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NO_TAKE_HOUR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ASSET_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"cancel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"inactiveOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"int256","name":"basis","type":"int256"}],"name":"setRates","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"lpFund","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"_isFreeMargin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"createBook","outputs":[{"internalType":"address","name":"newBook","type":"address"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"_isDST","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOP_TARGET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isTakerLong","type":"bool"}],"name":"take","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_freeMargin","type":"bool"}],"name":"adjisFreeMargin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"adminKill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"_lastWeeklyReturnsTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOP_BASIS","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_RMMin","type":"uint256"}],"name":"adjRMMin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"getSubcontractStatus","outputs":[{"internalType":"bool","name":"_closeDisc","type":"bool"},{"internalType":"bool","name":"_takerBurned","type":"bool"},{"internalType":"bool","name":"_lpBurned","type":"bool"},{"internalType":"bool","name":"_takerDefaulted","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GLOBAL_RM_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"weeklyReturns","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"getBookData","outputs":[{"internalType":"address","name":"_book","type":"address"},{"internalType":"uint256","name":"_lpMargin","type":"uint256"},{"internalType":"uint256","name":"_totalLpLong","type":"uint256"},{"internalType":"uint256","name":"_totalLpShort","type":"uint256"},{"internalType":"uint256","name":"_lpRM","type":"uint256"},{"internalType":"uint256","name":"_bookMinimum","type":"uint256"},{"internalType":"uint256","name":"_lastBookSettleTime","type":"uint256"},{"internalType":"uint256","name":"_settleNum","type":"uint256"},{"internalType":"bool","name":"_bookDefaulted","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"priceOracle","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"e_lp","type":"address"},{"indexed":true,"internalType":"address","name":"e_taker","type":"address"},{"indexed":false,"internalType":"bytes32","name":"e_subkID","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"e_open","type":"bool"}],"name":"subkTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"e_lp","type":"address"},{"indexed":false,"internalType":"bytes32","name":"e_subkID","type":"bytes32"},{"indexed":false,"internalType":"address","name":"e_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"e_time","type":"uint256"}],"name":"BurnHist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"e_target","type":"uint256"},{"indexed":false,"internalType":"int256","name":"e_basis","type":"int256"}],"name":"RatesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"e_lp","type":"address"},{"indexed":false,"internalType":"address","name":"e_lpBook","type":"address"}],"name":"LPNewBook","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"e_minLPGrossForDisc","type":"uint256"}],"name":"SizeDiscUpdated","type":"event"}]

608060405234801561001057600080fd5b506040516150953803806150958339818101604052602081101561003357600080fd5b5051336000818152601860205260408120805460ff19166001179055601980546001600160a01b0319908116909317905580546001600160a01b039093169290911691909117905561500b8061008a6000396000f3fe6080604052600436106102ae5760003560e01c80637f21f9e711610175578063c736332a116100dc578063d3fdf56111610095578063e92e32f91161006f578063e92e32f914610a03578063fa9f8c6714610a66578063fe6b6dbb14610a7b578063ffd9881b14610a90576102ae565b8063d3fdf561146109af578063d4b9f355146109c4578063e7ac13a3146109d9576102ae565b8063c736332a146108b9578063c85c8925146108ce578063c88e5eb914610907578063ca1e455d1461091c578063ce80d3f714610950578063cf655b4c1461097c576102ae565b80639e2ed6861161012e5780639e2ed686146107d2578063af24608d146107fe578063b3c7e6c714610831578063b74bf3e814610861578063b8deb92514610887578063b9ac67671461089c576102ae565b80637f21f9e71461070a57806387bd2bbc1461074357806393a05d7d1461076957806394d5a19d1461077e5780639b161a11146107bd5780639ceb21ae146107bd576102ae565b8063534cad8b1161021957806361867419116101d2578063618674191461064a578063631a7dd01461068357806370480275146106985780637345b10b146106cb5780637ca71aea146106e05780637dc0d1d0146106f5576102ae565b8063534cad8b1461054f578063547e9a9414610579578063588f0b01146105ac5780635f5d0d3e146105d85780635fd8c7101461060b5780636127e69714610620576102ae565b8063412753581161026b578063412753581461042b578063417145901461045c578063429b62e514610488578063474b6582146104cf5780635322e534146104e457806353251c2514610525576102ae565b80630230b814146102b35780630ea37a5c146102da5780631785f53c146103085780631978de2b1461033b57806322dae590146103ac578063285e1406146103f8575b600080fd5b3480156102bf57600080fd5b506102c8610b16565b60408051918252519081900360200190f35b610306600480360360408110156102f057600080fd5b506001600160a01b038135169060200135610b1c565b005b34801561031457600080fd5b506103066004803603602081101561032b57600080fd5b50356001600160a01b0316610bb7565b34801561034757600080fd5b506103746004803603604081101561035e57600080fd5b506001600160a01b038135169060200135610c71565b6040805196875260208701959095529215158585015290151560608501521515608084015260ff1660a0830152519081900360c00190f35b3480156103b857600080fd5b506103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610d4a565b6040805192835260208301919091528051918290030190f35b34801561040457600080fd5b506103066004803603602081101561041b57600080fd5b50356001600160a01b0316610dec565b34801561043757600080fd5b50610440610e5f565b604080516001600160a01b039092168252519081900360200190f35b34801561046857600080fd5b506103066004803603602081101561047f57600080fd5b50351515610e6e565b34801561049457600080fd5b506104bb600480360360208110156104ab57600080fd5b50356001600160a01b0316610edd565b604080519115158252519081900360200190f35b3480156104db57600080fd5b506102c8610ef2565b3480156104f057600080fd5b506103066004803603606081101561050757600080fd5b506001600160a01b0381351690602081013515159060400135610ef7565b34801561053157600080fd5b506103066004803603602081101561054857600080fd5b5035611196565b34801561055b57600080fd5b506103066004803603602081101561057257600080fd5b50356112b0565b34801561058557600080fd5b506102c86004803603602081101561059c57600080fd5b50356001600160a01b0316611344565b610306600480360360408110156105c257600080fd5b506001600160a01b038135169060200135611356565b3480156105e457600080fd5b50610440600480360360208110156105fb57600080fd5b50356001600160a01b03166114a8565b34801561061757600080fd5b506103066114c3565b34801561062c57600080fd5b506103066004803603602081101561064357600080fd5b5035611508565b34801561065657600080fd5b506103066004803603604081101561066d57600080fd5b506001600160a01b0381351690602001356115ea565b34801561068f57600080fd5b506102c86116e7565b3480156106a457600080fd5b50610306600480360360208110156106bb57600080fd5b50356001600160a01b03166116ed565b3480156106d757600080fd5b506102c8611762565b3480156106ec57600080fd5b506102c861178a565b34801561070157600080fd5b50610440611790565b34801561071657600080fd5b506103066004803603604081101561072d57600080fd5b506001600160a01b03813516906020013561179f565b6103066004803603602081101561075957600080fd5b50356001600160a01b0316611847565b34801561077557600080fd5b506102c8611886565b34801561078a57600080fd5b50610306600480360360608110156107a157600080fd5b508035906001600160a01b03602082013516906040013561188c565b3480156107c957600080fd5b506102c8611996565b610306600480360360408110156107e857600080fd5b506001600160a01b03813516906020013561199b565b34801561080a57600080fd5b506103066004803603602081101561082157600080fd5b50356001600160a01b0316611a7b565b34801561083d57600080fd5b506103066004803603604081101561085457600080fd5b5080359060200135611aef565b6103066004803603602081101561087757600080fd5b50356001600160a01b0316611cc7565b34801561089357600080fd5b506104bb611d52565b610440600480360360208110156108b257600080fd5b5035611d62565b3480156108c557600080fd5b506104bb611f51565b3480156108da57600080fd5b50610306600480360360408110156108f157600080fd5b506001600160a01b038135169060200135611f61565b34801561091357600080fd5b506102c8612041565b6103066004803603606081101561093257600080fd5b506001600160a01b0381351690602081013590604001351515612046565b34801561095c57600080fd5b506103066004803603602081101561097357600080fd5b50351515612554565b34801561098857600080fd5b506103066004803603602081101561099f57600080fd5b50356001600160a01b03166125c3565b3480156109bb57600080fd5b506102c8612664565b3480156109d057600080fd5b506102c861266a565b3480156109e557600080fd5b50610306600480360360208110156109fc57600080fd5b503561266f565b348015610a0f57600080fd5b50610a3c60048036036040811015610a2657600080fd5b506001600160a01b0381351690602001356126c5565b60408051941515855292151560208501529015158383015215156060830152519081900360800190f35b348015610a7257600080fd5b506102c861278a565b348015610a8757600080fd5b50610306612790565b348015610a9c57600080fd5b50610ac360048036036020811015610ab357600080fd5b50356001600160a01b0316612ae4565b604080516001600160a01b03909a168a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6103e881565b6001600160a01b0382811660009081526016602052604090205416610b4057600080fd5b6001600160a01b038083166000908152601660205260408082205481516392ef178560e01b815260048101869052915193169283926392ef17859234926024808301939282900301818588803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b5050505050505050565b3360009081526018602052604090205460ff16610c08576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b038116331415610c505760405162461bcd60e51b8152600401808060200182810382526028815260200180614f8b6028913960400191505060405180910390fd5b6001600160a01b03166000908152601860205260409020805460ff19169055565b6001600160a01b03808316600090815260166020526040812054909182918291829182918291168015610d3f576000819050806001600160a01b031663c692a7308a6040518263ffffffff1660e01b81526004018082815260200191505060c06040518083038186803b158015610ce757600080fd5b505afa158015610cfb573d6000803e3d6000fd5b505050506040513d60c0811015610d1157600080fd5b508051602082015160408301516060840151608085015160a090950151939c50919a50985096509094509250505b509295509295509295565b6001600160a01b0380821660009081526016602052604081205490918291168015610de6576000819050806001600160a01b031663e084b9ed6040518163ffffffff1660e01b8152600401604080518083038186803b158015610dac57600080fd5b505afa158015610dc0573d6000803e3d6000fd5b505050506040513d6040811015610dd657600080fd5b5080516020909101519094509250505b50915091565b3360009081526018602052604090205460ff16610e3d576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6019546001600160a01b031681565b3360009081526018602052604090205460ff16610ebf576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b60008054911515600160a01b0260ff60a01b19909216919091179055565b60186020526000908152604090205460ff1681565b600081565b6001600160a01b0383811660009081526016602052604090205416610f1b57600080fd5b6001600160a01b038084166000908152601660209081526040808320549254815163ae9308b760e01b815260016004820152915193851694169263ae9308b792602480840193919291829003018186803b158015610f7857600080fd5b505afa158015610f8c573d6000803e3d6000fd5b505050506040513d6020811015610fa257600080fd5b5051610fad57600080fd5b600080546040805162891b6560e51b81526001600482015290516001600160a01b03909216916311236ca091602480820192602092909190829003018186803b158015610ff957600080fd5b505afa15801561100d573d6000803e3d6000fd5b505050506040513d602081101561102357600080fd5b5051600554909150811061103657600080fd5b428110611083576040805162461bcd60e51b81526020600482015260166024820152754769766520706c6179657273206d6f72652074696d6560501b604482015290519081900360640190fd5b831561110e57604051630fa5f8ff60e21b81526001600160a01b03831690633e97e3fc90600690869060048101906101040183825b8154815260200190600101908083116110b857505082815260200192505050600060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b5050505061118f565b604051631e29e92760e21b81526001600160a01b038316906378a7a49c90600e90869060048101906101040183825b81548152602001906001019080831161113d57505082815260200192505050600060405180830381600087803b15801561117657600080fd5b505af115801561118a573d6000803e3d6000fd5b505050505b5050505050565b336000908152601660205260409020546001600160a01b03166111b857600080fd5b336000908152601660209081526040808320548354825162891b6560e51b81526001600482015292516001600160a01b03928316959491909216926311236ca09260248083019392829003018186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d602081101561123e57600080fd5b505160408051633b20878b60e21b8152600481018690526024810183905290519192506001600160a01b0384169163ec821e2c9160448082019260009290919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b50505050505050565b3360009081526018602052604090205460ff16611301576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b66038d7ea4c6800081026003556040805182815290517f028a9cf2f7ae9ad48c9ea8c048047dbc0eb967ce6eac494e423859578b1413be9181900360200190a150565b60176020526000908152604090205481565b6001600160a01b0380831660009081526016602090815260408083205481516302e9957d60e01b815260048101879052336024820152346044820152915194169384926302e9957d926064808201939182900301818787803b1580156113bb57600080fd5b505af11580156113cf573d6000803e3d6000fd5b505050506040513d60208110156113e557600080fd5b50519050348110156114a25760405161dead9082156108fc029083906000818181858888f19350505050158015611420573d6000803e3d6000fd5b503360009081526017602052604090205461143e9034839003612e98565b336000818152601760209081526040918290209390935580516001600160a01b038816815292830186905282810191909152426060830152517f53e95741f975a89642a68aaf1407e6a03f4dd08d162e255f9fe3c44d9f3b7b6b9181900360800190a15b50505050565b6016602052600090815260409020546001600160a01b031681565b33600081815260176020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015611504573d6000803e3d6000fd5b5050565b336000908152601660205260409020546001600160a01b031661156a576040805162461bcd60e51b815260206004820152601560248201527455736572206d7573742068617665206120626f6f6b60581b604482015290519081900360640190fd5b600454811161157857600080fd5b33600090815260166020526040808220548151636127e69760e01b81526004810185905291516001600160a01b03909116928392636127e697926024808301939282900301818387803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b505050505050565b6001600160a01b038281166000908152601660205260409020541661160e57600080fd5b6001600160a01b038083166000908152601660209081526040808320548354825162891b6560e51b81526001600482015292519186169516926311236ca09260248082019391829003018186803b15801561166857600080fd5b505afa15801561167c573d6000803e3d6000fd5b505050506040513d602081101561169257600080fd5b505160408051631ae1bee960e11b8152600481018390526024810186905290519192506001600160a01b038416916335c37dd29160448082019260009290919082900301818387803b158015610b9957600080fd5b60025481565b3360009081526018602052604090205460ff1661173e576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03166000908152601860205260409020805460ff19166001179055565b600054610e10620151804206046004190190600160a01b900460ff1615611787576001015b90565b60015481565b6000546001600160a01b031681565b3360009081526018602052604090205460ff166117f0576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03808316600090815260166020526040808220548151630fe8d2c560e11b81526004810186905291519316928392631fd1a58a926024808201939182900301818387803b15801561129357600080fd5b6001600160a01b03811660009081526017602052604090205461186a9034612e98565b6001600160a01b03909116600090815260176020526040902055565b60035481565b6001600160a01b03828116600090815260166020526040902054166118b057600080fd5b6001600160a01b038083166000908152601660209081526040808320548354825162891b6560e51b81526001600482015292519186169516926311236ca09260248082019391829003018186803b15801561190a57600080fd5b505afa15801561191e573d6000803e3d6000fd5b505050506040513d602081101561193457600080fd5b505160408051634d382d9b60e01b815260048101869052602481018890526044810183905233606482015290519192506001600160a01b03841691634d382d9b9160848082019260009290919082900301818387803b15801561117657600080fd5b600181565b6001600160a01b038083166000908152601660209081526040808320548354825162891b6560e51b81526001600482015292519186169516926311236ca09260248082019391829003018186803b1580156119f557600080fd5b505afa158015611a09573d6000803e3d6000fd5b505050506040513d6020811015611a1f57600080fd5b50516040805163c96e44a760e01b8152600481018390526024810186905233604482015290519192506001600160a01b0384169163c96e44a7913491606480830192600092919082900301818588803b15801561117657600080fd5b6001600160a01b0381811660009081526016602052604090205416611a9f57600080fd5b6001600160a01b0380821660009081526016602052604080822054815163185f438f60e01b81529151931692839263185f438f926004808201939182900301818387803b1580156115ce57600080fd5b3360009081526018602052604090205460ff16611b40576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6064821115611b96576040805162461bcd60e51b815260206004820152601f60248201527f546172676574206d757374206265206265747765656e203020616e6420312500604482015290519081900360640190fd5b60c7198112801590611ba9575060c88113155b611bfa576040805162461bcd60e51b815260206004820152601f60248201527f4261736973206d757374206265206265747765656e202d3220616e6420322500604482015290519081900360640190fd5b6000546040805163ae9308b760e01b81526001600482015290516001600160a01b039092169163ae9308b791602480820192602092909190829003018186803b158015611c4657600080fd5b505afa158015611c5a573d6000803e3d6000fd5b505050506040513d6020811015611c7057600080fd5b505115611c7c57600080fd5b818101600155808203600255604080518381526020810183905281517fc5a7850ec831f07acac6f5775a3da3ec1fbe0a19185e7678634dbfe87888e501929181900390910190a15050565b336001600160a01b03821614611cdc57600080fd5b6001600160a01b0381811660009081526016602052604090205416611d0057600080fd5b6001600160a01b0380821660009081526016602052604080822054815163705aedad60e01b81529151931692839263705aedad9234926004808301939282900301818588803b15801561129357600080fd5b600054600160a81b900460ff1681565b336000908152601660205260408120546001600160a01b031615611db75760405162461bcd60e51b8152600401808060200182810382526025815260200180614f666025913960400191505060405180910390fd5b8166071afd498d000002341015611e15576040805162461bcd60e51b815260206004820152601a60248201527f4d757374207072657020666f7220322d736964656420626f6f6b000000000000604482015290519081900360640190fd5b333083604051611e2490612ec7565b6001600160a01b039384168152919092166020820152604080820192909252905190819003606001906000f080158015611e62573d6000803e3d6000fd5b503360009081526016602052604080822080546001600160a01b0319166001600160a01b039485161790819055815163705aedad60e01b81529151931692839263705aedad9234926004808301939282900301818588803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b5050336000818152601660209081526040918290205482519384526001600160a01b03169083015280517f154a3febc7352b7a16989452e69bce933ff107f46528b680800f75b0d64b826d9550918290030192509050a15050336000908152601660205260409020546001600160a01b0316919050565b600054600160a01b900460ff1681565b6001600160a01b0382811660009081526016602052604090205416611f8557600080fd5b6001600160a01b0380831660009081526016602052604080822054815163d11fdf3f60e01b8152600481018690529151931692839263d11fdf3f926024808201939182900301818387803b158015611fdc57600080fd5b505af1158015611ff0573d6000803e3d6000fd5b5050604080518581526000602082015281513394506001600160a01b03881693507f76b03a073b20b808539d3243fcc427c64d992a6d4487d1c3488170dec33da2d9929181900390910190a3505050565b606481565b8166038d7ea4c68000023410156120a4576040805162461bcd60e51b815260206004820152601a60248201527f496e7375666669656e742045544820666f72207468697320524d000000000000604482015290519081900360640190fd5b60016120ae611762565b1415612101576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742074616b6520647572696e67203420504d20455420686f757200604482015290519081900360640190fd5b600454821161210f57600080fd5b6001600160a01b0380841660009081526016602090815260408083205481516304d1c11160e21b81529151941693849263134704449260048082019391829003018186803b15801561216057600080fd5b505afa158015612174573d6000803e3d6000fd5b505050506040513d602081101561218a57600080fd5b505160408051636de590c360e11b815290519192506000916001600160a01b0385169163dbcb2186916004808301926020929190829003018186803b1580156121d257600080fd5b505afa1580156121e6573d6000803e3d6000fd5b505050506040513d60208110156121fc57600080fd5b50516000805460408051632c1fad0760e01b8152600160048201529051939450919283926001600160a01b0390921691632c1fad07916024808301926020929190829003018186803b15801561225157600080fd5b505afa158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b5051600080546040805162891b6560e51b815260016004820152905193945091926001600160a01b03909116916311236ca0916024808301926020929190829003018186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d60208110156122f757600080fd5b5051600054909150600160a81b900460ff16156123325786156123255761231e8585612eb0565b9250612332565b61232f8486612eb0565b92505b82600261240e886001600160a01b0316639fa8f86e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561237157600080fd5b505afa158015612385573d6000803e3d6000fd5b505050506040513d602081101561239b57600080fd5b505160408051635691112f60e11b815290516001600160a01b038c169163ad22225e916004808301926020929190829003018186803b1580156123dd57600080fd5b505afa1580156123f1573d6000803e3d6000fd5b505050506040513d602081101561240757600080fd5b5051612eb0565b8161241557fe5b04018866038d7ea4c6800002111561245e5760405162461bcd60e51b8152600401808060200182810382526024815260200180614fb36024913960400191505060405180910390fd5b60035460408051638224039160e01b8152336004820152602481018b9052604481019290925260ff841660648301526084820183905288151560a4830152516000916001600160a01b03891691638224039191349160c480830192602092919082900301818588803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b50505050506040513d60208110156124fe57600080fd5b50516040805182815260016020820152815192935033926001600160a01b038e16927f76b03a073b20b808539d3243fcc427c64d992a6d4487d1c3488170dec33da2d9928290030190a350505050505050505050565b3360009081526018602052604090205460ff166125a5576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526018602052604090205460ff16612614576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03808216600090815260166020526040808220548151639e673fbd60e01b815291519316928392639e673fbd926004808201939182900301818387803b1580156115ce57600080fd5b60055481565b60c881565b3360009081526018602052604090205460ff166126c0576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b600455565b6001600160a01b038083166000908152601660205260408120549091829182918291168015612780576000819050806001600160a01b031663e0e0e21b886040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b15801561273757600080fd5b505afa15801561274b573d6000803e3d6000fd5b505050506040513d608081101561276157600080fd5b5080516020820151604083015160609093015191985096509094509250505b5092959194509250565b60045481565b3360009081526018602052604090205460ff166127e1576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6000546040805163ae9308b760e01b81526001600482015290516001600160a01b039092169163ae9308b791602480820192602092909190829003018186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d602081101561285757600080fd5b505161286257600080fd5b61286a612ed4565b600054604080516348a494ab60e11b81526001600482015290516001600160a01b039092169163914929569160248082019261010092909190829003018186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101008110156128f157600080fd5b5090506128fc612ed4565b60008054604080516348a494ab60e11b81526004810193909352516001600160a01b0390911691639149295691602480830192610100929190829003018186803b15801561294957600080fd5b505afa15801561295d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061010081101561298357600080fd5b50905060005b6007811015612adb5782816008811061299e57fe5b602002015115806129bd57508181600881106129b657fe5b6020020151155b156129c757612ad3565b600066038d7ea4c680008483600881106129dd57fe5b602002015160e086015166038d7ea4c6800002816129f757fe5b0403905061271060015466038d7ea4c680000281612a1157fe5b05810360068360088110612a2157fe5b01556002546127109066038d7ea4c680000205816000190203600e8360088110612a4757fe5b015560e0830151606402838360088110612a5d57fe5b60200201516103e80260068460088110612a7357fe5b01540281612a7d57fe5b0560068360088110612a8b57fe5b015560e0830151606402838360088110612aa157fe5b60200201516103e802600e8460088110612ab757fe5b01540281612ac157fe5b05600e8360088110612acf57fe5b0155505b600101612989565b50504260055550565b6001600160a01b038082166000908152601660209081526040808320548151634fd47c3760e11b8152915194169383928392839283928392839283928b928392639fa8f86e92600480840193919291829003018186803b158015612b4757600080fd5b505afa158015612b5b573d6000803e3d6000fd5b505050506040513d6020811015612b7157600080fd5b5051604080516304d1c11160e21b81529051919a506001600160a01b03831691631347044491600480820192602092909190829003018186803b158015612bb757600080fd5b505afa158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b505160408051636de590c360e11b815290519199506001600160a01b0383169163dbcb218691600480820192602092909190829003018186803b158015612c2757600080fd5b505afa158015612c3b573d6000803e3d6000fd5b505050506040513d6020811015612c5157600080fd5b505160408051635691112f60e11b815290519198506001600160a01b0383169163ad22225e91600480820192602092909190829003018186803b158015612c9757600080fd5b505afa158015612cab573d6000803e3d6000fd5b505050506040513d6020811015612cc157600080fd5b50516040805163056b7b7360e01b815290519197506001600160a01b0383169163056b7b7391600480820192602092909190829003018186803b158015612d0757600080fd5b505afa158015612d1b573d6000803e3d6000fd5b505050506040513d6020811015612d3157600080fd5b505160408051637ce6d97b60e11b815290519196506001600160a01b0383169163f9cdb2f691600480820192602092909190829003018186803b158015612d7757600080fd5b505afa158015612d8b573d6000803e3d6000fd5b505050506040513d6020811015612da157600080fd5b5051604080516315acdf7560e01b815290519195506001600160a01b038316916315acdf7591600480820192602092909190829003018186803b158015612de757600080fd5b505afa158015612dfb573d6000803e3d6000fd5b505050506040513d6020811015612e1157600080fd5b5051604080516345b2a12960e01b815290519194506001600160a01b038316916345b2a12991600480820192602092909190829003018186803b158015612e5757600080fd5b505afa158015612e6b573d6000803e3d6000fd5b505050506040513d6020811015612e8157600080fd5b5051999b989a509698959794965092949193909250565b600082820183811015612ea757fe5b90505b92915050565b6000828210612ec157506000612eaa565b50900390565b61207280612ef483390190565b604051806101000160405280600890602082028038833950919291505056fe608060405234801561001057600080fd5b506040516120723803806120728339818101604052606081101561003357600080fd5b5080516020820151604090920151600180546001600160a01b039485166001600160a01b0319918216179091556000805494909316931692909217905566038d7ea4c680000260085562093a7f194201600755611fdd806100956000396000f3fe6080604052600436106101e35760003560e01c806378a7a49c11610102578063c96e44a711610095578063e0e0e21b11610064578063e0e0e21b146106f0578063ec821e2c14610744578063f67dcd2214610774578063f9cdb2f61461079e576101e3565b8063c96e44a714610651578063d11fdf3f14610683578063dbcb2186146106ad578063e084b9ed146106c2576101e3565b80639fa8f86e116100d15780639fa8f86e146105b0578063ad22225e146105c5578063b769c441146105da578063c692a730146105ef576101e3565b806378a7a49c146104df578063822403911461054257806392ef17851461058b5780639e673fbd146105a8576101e3565b8063313c06a01161017a5780634d382d9b116101495780634d382d9b1461043e5780636127e69714610483578063705aedad146104ad57806370c2ccaa146104b5576101e3565b8063313c06a01461035157806335c37dd2146103825780633e97e3fc146103b257806345b2a12914610415576101e3565b8063185f438f116101b6578063185f438f1461026b5780631b7d25eb146102825780631d95807c146102975780631fd1a58a14610334576101e3565b806302e9957d146101e8578063056b7b731461022c578063134704441461024157806315acdf7514610256575b600080fd5b61021a600480360360608110156101fe57600080fd5b508035906001600160a01b0360208201351690604001356107b3565b60408051918252519081900360200190f35b34801561023857600080fd5b5061021a6108c9565b34801561024d57600080fd5b5061021a6108cf565b34801561026257600080fd5b5061021a6108d5565b34801561027757600080fd5b506102806108db565b005b34801561028e57600080fd5b5061021a610908565b3480156102a357600080fd5b506102c1600480360360208110156102ba57600080fd5b503561090e565b604080519c8d526001600160a01b03909b1660208d01528b8b019990995260608b019790975260ff90951660808a015292151560a089015290151560c0880152151560e0870152151561010086015215156101208501521515610140840152151561016083015251908190036101800190f35b6102806004803603602081101561034a57600080fd5b503561098f565b34801561035d57600080fd5b506103666109ca565b604080516001600160a01b039092168252519081900360200190f35b34801561038e57600080fd5b50610280600480360360408110156103a557600080fd5b50803590602001356109d9565b3480156103be57600080fd5b5061028060048036036101208110156103d657600080fd5b8101908080610100019060088060200260405190810160405280929190826008602002808284376000920191909152509194505090359150610a979050565b34801561042157600080fd5b5061042a610b31565b604080519115158252519081900360200190f35b34801561044a57600080fd5b506102806004803603608081101561046157600080fd5b50803590602081013590604081013590606001356001600160a01b0316610b41565b34801561048f57600080fd5b50610280600480360360208110156104a657600080fd5b5035610c92565b610280610cb7565b3480156104c157600080fd5b5061021a600480360360208110156104d857600080fd5b5035610cc8565b3480156104eb57600080fd5b50610280600480360361012081101561050357600080fd5b8101908080610100019060088060200260405190810160405280929190826008602002808284376000920191909152509194505090359150610ce69050565b61021a600480360360c081101561055857600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a001351515610e0e565b610280600480360360208110156105a157600080fd5b5035611283565b6102806112b6565b3480156105bc57600080fd5b5061021a6112cd565b3480156105d157600080fd5b5061021a6112d3565b3480156105e657600080fd5b506103666112d9565b3480156105fb57600080fd5b506106196004803603602081101561061257600080fd5b50356112e8565b6040805196875260208701959095529215158585015290151560608501521515608084015260ff1660a0830152519081900360c00190f35b6102806004803603606081101561066757600080fd5b50803590602081013590604001356001600160a01b031661132d565b34801561068f57600080fd5b50610280600480360360208110156106a657600080fd5b50356115ba565b3480156106b957600080fd5b5061021a611952565b3480156106ce57600080fd5b506106d7611958565b6040805192835260208301919091528051918290030190f35b3480156106fc57600080fd5b5061071a6004803603602081101561071357600080fd5b5035611a01565b60408051941515855292151560208501529015158383015215156060830152519081900360800190f35b34801561075057600080fd5b506102806004803603604081101561076757600080fd5b5080359060200135611a3e565b34801561078057600080fd5b5061021a6004803603602081101561079757600080fd5b5035611b63565b3480156107aa57600080fd5b5061021a611b70565b6001546000906001600160a01b031633146107cd57600080fd5b6000848152600c6020526040812090546001600160a01b0385811691161480610805575060018101546001600160a01b038581169116145b610856576040805162461bcd60e51b815260206004820181905260248201527f6d75737420627920706172747920746f2068697320737562636f6e7472616374604482015290519081900360640190fd5b6000600282600301548161086657fe5b0490508084101561087657600080fd5b6000546001600160a01b03868116911614156108a85760048201805465ff00000000001916600160281b1790556108c0565b60048201805464ff0000000019166401000000001790555b95945050505050565b60085481565b60045481565b60025481565b620151806007540142116108ee57600080fd5b6001805460ff60a01b1916600160a01b1790556000600655565b60095481565b600c602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b039092169290919060ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691600160281b8104821691600160301b8204811691600160381b9004168c565b6001546001600160a01b031633146109a657600080fd5b6000908152600c60205260409020600401805463ff00000019166301000000179055565b6000546001600160a01b031681565b60075482116109e757600080fd5b4282106109f357600080fd5b600154600160a01b900460ff1615610a0a57600080fd5b6000818152600c602052604081206003805490820154919291610a2d9190611b76565b90506000610a47600260065481610a4057fe5b0483611b8f565b9050610a5e600354610a598484611ba9565b611b8f565b6003556002830154610a709083611ba9565b60029093019290925550506001805460ff60a01b1916600160a01b17905550506000600655565b6001546001600160a01b03163314610aae57600080fd5b600b5460025410610abe57600080fd5b62015180600754014211610ad157600080fd5b600b54610ade9082611b76565b9050610aee600454600554611ba9565b6006555b806002541015610b2d57610b1f600b60025481548110610b0e57fe5b906000526020600020015483611bbf565b600280546001019055610af2565b5050565b600154600160a01b900460ff1681565b6001546001600160a01b03163314610b5857600080fd5b6007548210610b9c576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b6000848152600c602052604090206003810154610bb99085611ba9565b81600201541015610c11576040805162461bcd60e51b815260206004820152601b60248201527f6d75737420686176652073756666696369656e74206d617267696e0000000000604482015290519081900360640190fd5b60018101546001600160a01b03838116911614610c5f5760405162461bcd60e51b8152600401808060200182810382526023815260200180611f426023913960400191505060405180910390fd5b610c6d816002015485611b8f565b60028201556001810154610c8b9085906001600160a01b0316611e4a565b5050505050565b6001546001600160a01b03163314610ca957600080fd5b66038d7ea4c6800002600855565b610cc360035434611ba9565b600355565b600a8181548110610cd557fe5b600091825260209091200154905081565b6001546001600160a01b03163314610cfd57600080fd5b600b546002541015610d0e57600080fd5b600a54610d1b9082611b76565b600b5460025491925090035b81811015610d5857610d50600a8281548110610d3f57fe5b906000526020600020015484611bbf565b600101610d27565b50600b548181016002819055600a549091011415610b2d57610d7e600354600954611b8f565b6003556004546005541115610da357610d9b600554600454611b8f565b600655610db5565b610db1600454600554611b8f565b6006555b60006009819055426007556002556006546003541015610b2d576001805460ff60a01b1916600160a01b179055600354600654600091610df89160029004611b76565b9050610e0660035482611b8f565b600355505050565b6001546000906001600160a01b03163314610e2857600080fd5b6008548666038d7ea4c68000021015610e88576040805162461bcd60e51b815260206004820152601d60248201527f6d7573742062652067726561746572207468616e20626f6f6b206d696e000000604482015290519081900360640190fd5b6007548310610ecc576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b610ed4611eb8565b66038d7ea4c68000870260608201523460408201526001600160a01b0388166020820152600161016082015260ff8516608082015282610f1657600160c08201525b821561102b57600b5460e111610f62576040805162461bcd60e51b815260206004820152600c60248201526b189bdbdad3585e195913dd5d60a21b604482015290519081900360640190fd5b60008054600b8054604080516bffffffffffffffffffffffff19606095861b1660208083019190915242603483015260548083018590528351808403909101815260749092019092528051910120818652600182018355919093527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990920182905560055490830151919350610ff791611ba9565b60058190555060065461100e600554600454611b8f565b111561102657611022600554600454611b8f565b6006555b611134565b600a5460e111611071576040805162461bcd60e51b815260206004820152600c60248201526b189bdbdad3585e195913dd5d60a21b604482015290519081900360640190fd5b600a8054600080546040805160208082018690526bffffffffffffffffffffffff19606094851b1682840152426054808401919091528351808403909101815260749092019092528051910120838652600184018555939091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a89091018290556004549083015191935061110591611ba9565b60048190555060065461111c600454600554611b8f565b111561113457611130600454600554611b8f565b6006555b85611143600454600554611ba9565b1061115057600160a08201525b6000828152600c602090815260409182902083518155908301516001820180546001600160a01b0319166001600160a01b039092169190911790559082015160028201556060820151600382015560808201516004909101805460a084015160c085015160e0860151610100808801516101208901516101408a0151610160909a015160ff1990971660ff9099169890981761ff0019169415159091029390931762ff0000191662010000921515929092029190911763ff00000019166301000000911515919091021764ff000000001916640100000000911515919091021765ff00000000001916600160281b931515939093029290921766ff0000000000001916600160301b931515939093029290921760ff60381b1916600160381b911515919091021790559695505050505050565b6000818152600c60205260409020600381015461129f57600080fd5b6112ad816002015434611ba9565b60029091015550565b6001546001600160a01b031633146108ee57600080fd5b60035481565b60065481565b6001546001600160a01b031681565b6000908152600c6020526040902060028101546003820154600490920154909260ff62010000830481169263010000008104821692600160381b820483169290911690565b6001546001600160a01b0316331461134457600080fd5b6000828152600c602052604090206007548410611396576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b60018101546001600160a01b03838116911614806113c157506000546001600160a01b038381169116145b611412576040805162461bcd60e51b815260206004820152601960248201527f43616e63656c6c6572206e6f74204c50206f722074616b657200000000000000604482015290519081900360640190fd5b60048101546301000000900460ff1615611473576040805162461bcd60e51b815260206004820152601d60248201527f537562636f6e747261637420616c72656164792063616e63656c6c6564000000604482015290519081900360640190fd5b600061271060c88360030154028161148757fe5b60048401549190049150610100900460ff16806114b157506000546001600160a01b038481169116145b156114c0576002600382020490505b80341015611515576040805162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e742063616e63656c20666565000000000000000000604482015290519081900360640190fd5b60048201805463ff000000191663010000001790556115373482900384611e4a565b610c8b81600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b15801561158957600080fd5b505afa15801561159d573d6000803e3d6000fd5b505050506040513d60208110156115b357600080fd5b5051611e4a565b6001546001600160a01b031633146115d157600080fd5b6000818152600c602052604090206004810154600160381b900460ff1615806116035750600154600160a01b900460ff165b61160c57600080fd5b60028101546004820154600160301b900460ff1615611677576000600283600301548161163557fe5b0490506116428282611b8f565b60405190925061dead9082156108fc029083906000818181858888f19350505050158015611674573d6000803e3d6000fd5b50505b6000600283015560018201546116979082906001600160a01b0316611e4a565b8154600483015462010000900460ff1615611746576000600c6000600a6001600a8054905003815481106116c757fe5b600091825260208083209091015483528201929092526040019020828155600a80549192509060001981019081106116fb57fe5b9060005260206000200154600a838154811061171357fe5b600091825260209091200155600a80548061172a57fe5b60019003818190600052602060002001600090559055506117dc565b6000600c6000600b6001600b80549050038154811061176157fe5b600091825260208083209091015483528201929092526040019020828155600b805491925090600019810190811061179557fe5b9060005260206000200154600b83815481106117ad57fe5b600091825260209091200155600b8054806117c457fe5b60019003818190600052602060002001600090559055505b6117e4611eb8565b80600c60008781526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360ff16021790555060a08201518160040160016101000a81548160ff02191690831515021790555060c08201518160040160026101000a81548160ff02191690831515021790555060e08201518160040160036101000a81548160ff0219169083151502179055506101008201518160040160046101000a81548160ff0219169083151502179055506101208201518160040160056101000a81548160ff0219169083151502179055506101408201518160040160066101000a81548160ff0219169083151502179055506101608201518160040160076101000a81548160ff0219169083151502179055509050505050505050565b60055481565b600080805b600b548110156119a7576000600c6000600b848154811061197a57fe5b6000918252602080832090910154835282019290925260400190206002015493909301925060010161195d565b5060005b600a548110156119f5576000600c6000600a84815481106119c857fe5b600091825260208083209091015483528201929092526040019020600201549390930192506001016119ab565b50506003540190303190565b6000908152600c602052604090206004015460ff61010082048116926401000000008304821692600160281b8104831692600160301b9091041690565b6001546001600160a01b03163314611a5557600080fd5b600154600160a01b900460ff1615611aad57816003541015611aa85760405162461bcd60e51b8152600401808060200182810382526024815260200180611f656024913960400191505060405180910390fd5b611b3d565b611ab960065483611ba9565b6003541015611af95760405162461bcd60e51b8152600401808060200182810382526025815260200180611f1d6025913960400191505060405180910390fd5b6007548110611b3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b611b4960035483611b8f565b600355600054610b2d9083906001600160a01b0316611e4a565b600b8181548110610cd557fe5b60075481565b6000818311611b86575081611b89565b50805b92915050565b6000828210611ba057506000611b89565b50808203611b89565b600082820183811015611bb857fe5b9392505050565b6000828152600c602052604090206004810154600160381b900460ff168015611bf05750600481015460ff16600714155b15611e3b57600481015460009081908190859060ff1660088110611c1057fe5b60200201511215611c5a57506003820154600483015460019166038d7ea4c6800091869060ff1660088110611c4157fe5b6020020151600019020281611c5257fe5b049150611c8e565b6003830154600484015466038d7ea4c680009190869060ff1660088110611c7d57fe5b60200201510281611c8a57fe5b0491505b611c9c836003015483611b76565b91508015611ce057611cb2836002015483611b8f565b60028401556004830154640100000000900460ff16611cdb57611cd760035483611ba9565b6003555b611d3b565b600354821115611d0557611d01600954611cfc84600354611b8f565b611ba9565b6009555b611d1160035483611b8f565b6003556004830154600160281b900460ff16611d3b57611d35836002015483611ba9565b60028401555b6004830154600160281b900460ff1680611d6157506004830154640100000000900460ff165b80611d77575060048301546301000000900460ff165b15611dcf57600483015462010000900460ff1615611da757611d9f6004548460030154611b8f565b600455611dbb565b611db76005548460030154611b8f565b6005555b60048301805460ff60381b19169055611e38565b826003015483600201541015611e3857600483015462010000900460ff1615611e0a57611e026004548460030154611b8f565b600455611e1e565b611e1a6005548460030154611b8f565b6005555b60048301805467ffff0000000000001916600160301b1790555b50505b600401805460ff191690555050565b600154604080516321ef4aef60e21b81526001600160a01b038481166004830152915191909216916387bd2bbc91859160248082019260009290919082900301818588803b158015611e9b57600080fd5b505af1158015611eaf573d6000803e3d6000fd5b50505050505050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091529056fe43616e6e6f7420746f20772f64206d6f7265207468616e20657863657373206d617267696e4d7573742062652074616b657220746f2063616c6c20746869732066756e6374696f6e43616e6e6f74207769746864726177206d6f7265207468616e20746865206d617267696e43616e6e6f7420646f20647572696e6720736574746c6520706572696f640000a265627a7a7231582029dd122158c4e0fba1d0be1fcfdac686332fe4d43128215b8c5e3861cee6f09564736f6c634300050b003255736572206d757374206e6f7420686176652061207072656578697374696e6720626f6f6b596f75206d6179206e6f742072656d6f766520796f757273656c6620617320616e2061646d696e2e524d20746f206c6172676520666f722074686973204c50206f6e20746869732073696465a265627a7a7231582078b6dd0016fcb2e0c48936fb09697ec12b7c9e8f3257ee1010a5da2c5218d01764736f6c634300050b00320000000000000000000000001bbc92bdf7ce2ba8e2cad9c5cecdbb2eb5a8d968

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80637f21f9e711610175578063c736332a116100dc578063d3fdf56111610095578063e92e32f91161006f578063e92e32f914610a03578063fa9f8c6714610a66578063fe6b6dbb14610a7b578063ffd9881b14610a90576102ae565b8063d3fdf561146109af578063d4b9f355146109c4578063e7ac13a3146109d9576102ae565b8063c736332a146108b9578063c85c8925146108ce578063c88e5eb914610907578063ca1e455d1461091c578063ce80d3f714610950578063cf655b4c1461097c576102ae565b80639e2ed6861161012e5780639e2ed686146107d2578063af24608d146107fe578063b3c7e6c714610831578063b74bf3e814610861578063b8deb92514610887578063b9ac67671461089c576102ae565b80637f21f9e71461070a57806387bd2bbc1461074357806393a05d7d1461076957806394d5a19d1461077e5780639b161a11146107bd5780639ceb21ae146107bd576102ae565b8063534cad8b1161021957806361867419116101d2578063618674191461064a578063631a7dd01461068357806370480275146106985780637345b10b146106cb5780637ca71aea146106e05780637dc0d1d0146106f5576102ae565b8063534cad8b1461054f578063547e9a9414610579578063588f0b01146105ac5780635f5d0d3e146105d85780635fd8c7101461060b5780636127e69714610620576102ae565b8063412753581161026b578063412753581461042b578063417145901461045c578063429b62e514610488578063474b6582146104cf5780635322e534146104e457806353251c2514610525576102ae565b80630230b814146102b35780630ea37a5c146102da5780631785f53c146103085780631978de2b1461033b57806322dae590146103ac578063285e1406146103f8575b600080fd5b3480156102bf57600080fd5b506102c8610b16565b60408051918252519081900360200190f35b610306600480360360408110156102f057600080fd5b506001600160a01b038135169060200135610b1c565b005b34801561031457600080fd5b506103066004803603602081101561032b57600080fd5b50356001600160a01b0316610bb7565b34801561034757600080fd5b506103746004803603604081101561035e57600080fd5b506001600160a01b038135169060200135610c71565b6040805196875260208701959095529215158585015290151560608501521515608084015260ff1660a0830152519081900360c00190f35b3480156103b857600080fd5b506103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610d4a565b6040805192835260208301919091528051918290030190f35b34801561040457600080fd5b506103066004803603602081101561041b57600080fd5b50356001600160a01b0316610dec565b34801561043757600080fd5b50610440610e5f565b604080516001600160a01b039092168252519081900360200190f35b34801561046857600080fd5b506103066004803603602081101561047f57600080fd5b50351515610e6e565b34801561049457600080fd5b506104bb600480360360208110156104ab57600080fd5b50356001600160a01b0316610edd565b604080519115158252519081900360200190f35b3480156104db57600080fd5b506102c8610ef2565b3480156104f057600080fd5b506103066004803603606081101561050757600080fd5b506001600160a01b0381351690602081013515159060400135610ef7565b34801561053157600080fd5b506103066004803603602081101561054857600080fd5b5035611196565b34801561055b57600080fd5b506103066004803603602081101561057257600080fd5b50356112b0565b34801561058557600080fd5b506102c86004803603602081101561059c57600080fd5b50356001600160a01b0316611344565b610306600480360360408110156105c257600080fd5b506001600160a01b038135169060200135611356565b3480156105e457600080fd5b50610440600480360360208110156105fb57600080fd5b50356001600160a01b03166114a8565b34801561061757600080fd5b506103066114c3565b34801561062c57600080fd5b506103066004803603602081101561064357600080fd5b5035611508565b34801561065657600080fd5b506103066004803603604081101561066d57600080fd5b506001600160a01b0381351690602001356115ea565b34801561068f57600080fd5b506102c86116e7565b3480156106a457600080fd5b50610306600480360360208110156106bb57600080fd5b50356001600160a01b03166116ed565b3480156106d757600080fd5b506102c8611762565b3480156106ec57600080fd5b506102c861178a565b34801561070157600080fd5b50610440611790565b34801561071657600080fd5b506103066004803603604081101561072d57600080fd5b506001600160a01b03813516906020013561179f565b6103066004803603602081101561075957600080fd5b50356001600160a01b0316611847565b34801561077557600080fd5b506102c8611886565b34801561078a57600080fd5b50610306600480360360608110156107a157600080fd5b508035906001600160a01b03602082013516906040013561188c565b3480156107c957600080fd5b506102c8611996565b610306600480360360408110156107e857600080fd5b506001600160a01b03813516906020013561199b565b34801561080a57600080fd5b506103066004803603602081101561082157600080fd5b50356001600160a01b0316611a7b565b34801561083d57600080fd5b506103066004803603604081101561085457600080fd5b5080359060200135611aef565b6103066004803603602081101561087757600080fd5b50356001600160a01b0316611cc7565b34801561089357600080fd5b506104bb611d52565b610440600480360360208110156108b257600080fd5b5035611d62565b3480156108c557600080fd5b506104bb611f51565b3480156108da57600080fd5b50610306600480360360408110156108f157600080fd5b506001600160a01b038135169060200135611f61565b34801561091357600080fd5b506102c8612041565b6103066004803603606081101561093257600080fd5b506001600160a01b0381351690602081013590604001351515612046565b34801561095c57600080fd5b506103066004803603602081101561097357600080fd5b50351515612554565b34801561098857600080fd5b506103066004803603602081101561099f57600080fd5b50356001600160a01b03166125c3565b3480156109bb57600080fd5b506102c8612664565b3480156109d057600080fd5b506102c861266a565b3480156109e557600080fd5b50610306600480360360208110156109fc57600080fd5b503561266f565b348015610a0f57600080fd5b50610a3c60048036036040811015610a2657600080fd5b506001600160a01b0381351690602001356126c5565b60408051941515855292151560208501529015158383015215156060830152519081900360800190f35b348015610a7257600080fd5b506102c861278a565b348015610a8757600080fd5b50610306612790565b348015610a9c57600080fd5b50610ac360048036036020811015610ab357600080fd5b50356001600160a01b0316612ae4565b604080516001600160a01b03909a168a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6103e881565b6001600160a01b0382811660009081526016602052604090205416610b4057600080fd5b6001600160a01b038083166000908152601660205260408082205481516392ef178560e01b815260048101869052915193169283926392ef17859234926024808301939282900301818588803b158015610b9957600080fd5b505af1158015610bad573d6000803e3d6000fd5b5050505050505050565b3360009081526018602052604090205460ff16610c08576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b038116331415610c505760405162461bcd60e51b8152600401808060200182810382526028815260200180614f8b6028913960400191505060405180910390fd5b6001600160a01b03166000908152601860205260409020805460ff19169055565b6001600160a01b03808316600090815260166020526040812054909182918291829182918291168015610d3f576000819050806001600160a01b031663c692a7308a6040518263ffffffff1660e01b81526004018082815260200191505060c06040518083038186803b158015610ce757600080fd5b505afa158015610cfb573d6000803e3d6000fd5b505050506040513d60c0811015610d1157600080fd5b508051602082015160408301516060840151608085015160a090950151939c50919a50985096509094509250505b509295509295509295565b6001600160a01b0380821660009081526016602052604081205490918291168015610de6576000819050806001600160a01b031663e084b9ed6040518163ffffffff1660e01b8152600401604080518083038186803b158015610dac57600080fd5b505afa158015610dc0573d6000803e3d6000fd5b505050506040513d6040811015610dd657600080fd5b5080516020909101519094509250505b50915091565b3360009081526018602052604090205460ff16610e3d576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b601980546001600160a01b0319166001600160a01b0392909216919091179055565b6019546001600160a01b031681565b3360009081526018602052604090205460ff16610ebf576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b60008054911515600160a01b0260ff60a01b19909216919091179055565b60186020526000908152604090205460ff1681565b600081565b6001600160a01b0383811660009081526016602052604090205416610f1b57600080fd5b6001600160a01b038084166000908152601660209081526040808320549254815163ae9308b760e01b815260016004820152915193851694169263ae9308b792602480840193919291829003018186803b158015610f7857600080fd5b505afa158015610f8c573d6000803e3d6000fd5b505050506040513d6020811015610fa257600080fd5b5051610fad57600080fd5b600080546040805162891b6560e51b81526001600482015290516001600160a01b03909216916311236ca091602480820192602092909190829003018186803b158015610ff957600080fd5b505afa15801561100d573d6000803e3d6000fd5b505050506040513d602081101561102357600080fd5b5051600554909150811061103657600080fd5b428110611083576040805162461bcd60e51b81526020600482015260166024820152754769766520706c6179657273206d6f72652074696d6560501b604482015290519081900360640190fd5b831561110e57604051630fa5f8ff60e21b81526001600160a01b03831690633e97e3fc90600690869060048101906101040183825b8154815260200190600101908083116110b857505082815260200192505050600060405180830381600087803b1580156110f157600080fd5b505af1158015611105573d6000803e3d6000fd5b5050505061118f565b604051631e29e92760e21b81526001600160a01b038316906378a7a49c90600e90869060048101906101040183825b81548152602001906001019080831161113d57505082815260200192505050600060405180830381600087803b15801561117657600080fd5b505af115801561118a573d6000803e3d6000fd5b505050505b5050505050565b336000908152601660205260409020546001600160a01b03166111b857600080fd5b336000908152601660209081526040808320548354825162891b6560e51b81526001600482015292516001600160a01b03928316959491909216926311236ca09260248083019392829003018186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d602081101561123e57600080fd5b505160408051633b20878b60e21b8152600481018690526024810183905290519192506001600160a01b0384169163ec821e2c9160448082019260009290919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b50505050505050565b3360009081526018602052604090205460ff16611301576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b66038d7ea4c6800081026003556040805182815290517f028a9cf2f7ae9ad48c9ea8c048047dbc0eb967ce6eac494e423859578b1413be9181900360200190a150565b60176020526000908152604090205481565b6001600160a01b0380831660009081526016602090815260408083205481516302e9957d60e01b815260048101879052336024820152346044820152915194169384926302e9957d926064808201939182900301818787803b1580156113bb57600080fd5b505af11580156113cf573d6000803e3d6000fd5b505050506040513d60208110156113e557600080fd5b50519050348110156114a25760405161dead9082156108fc029083906000818181858888f19350505050158015611420573d6000803e3d6000fd5b503360009081526017602052604090205461143e9034839003612e98565b336000818152601760209081526040918290209390935580516001600160a01b038816815292830186905282810191909152426060830152517f53e95741f975a89642a68aaf1407e6a03f4dd08d162e255f9fe3c44d9f3b7b6b9181900360800190a15b50505050565b6016602052600090815260409020546001600160a01b031681565b33600081815260176020526040808220805490839055905190929183156108fc02918491818181858888f19350505050158015611504573d6000803e3d6000fd5b5050565b336000908152601660205260409020546001600160a01b031661156a576040805162461bcd60e51b815260206004820152601560248201527455736572206d7573742068617665206120626f6f6b60581b604482015290519081900360640190fd5b600454811161157857600080fd5b33600090815260166020526040808220548151636127e69760e01b81526004810185905291516001600160a01b03909116928392636127e697926024808301939282900301818387803b1580156115ce57600080fd5b505af11580156115e2573d6000803e3d6000fd5b505050505050565b6001600160a01b038281166000908152601660205260409020541661160e57600080fd5b6001600160a01b038083166000908152601660209081526040808320548354825162891b6560e51b81526001600482015292519186169516926311236ca09260248082019391829003018186803b15801561166857600080fd5b505afa15801561167c573d6000803e3d6000fd5b505050506040513d602081101561169257600080fd5b505160408051631ae1bee960e11b8152600481018390526024810186905290519192506001600160a01b038416916335c37dd29160448082019260009290919082900301818387803b158015610b9957600080fd5b60025481565b3360009081526018602052604090205460ff1661173e576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03166000908152601860205260409020805460ff19166001179055565b600054610e10620151804206046004190190600160a01b900460ff1615611787576001015b90565b60015481565b6000546001600160a01b031681565b3360009081526018602052604090205460ff166117f0576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03808316600090815260166020526040808220548151630fe8d2c560e11b81526004810186905291519316928392631fd1a58a926024808201939182900301818387803b15801561129357600080fd5b6001600160a01b03811660009081526017602052604090205461186a9034612e98565b6001600160a01b03909116600090815260176020526040902055565b60035481565b6001600160a01b03828116600090815260166020526040902054166118b057600080fd5b6001600160a01b038083166000908152601660209081526040808320548354825162891b6560e51b81526001600482015292519186169516926311236ca09260248082019391829003018186803b15801561190a57600080fd5b505afa15801561191e573d6000803e3d6000fd5b505050506040513d602081101561193457600080fd5b505160408051634d382d9b60e01b815260048101869052602481018890526044810183905233606482015290519192506001600160a01b03841691634d382d9b9160848082019260009290919082900301818387803b15801561117657600080fd5b600181565b6001600160a01b038083166000908152601660209081526040808320548354825162891b6560e51b81526001600482015292519186169516926311236ca09260248082019391829003018186803b1580156119f557600080fd5b505afa158015611a09573d6000803e3d6000fd5b505050506040513d6020811015611a1f57600080fd5b50516040805163c96e44a760e01b8152600481018390526024810186905233604482015290519192506001600160a01b0384169163c96e44a7913491606480830192600092919082900301818588803b15801561117657600080fd5b6001600160a01b0381811660009081526016602052604090205416611a9f57600080fd5b6001600160a01b0380821660009081526016602052604080822054815163185f438f60e01b81529151931692839263185f438f926004808201939182900301818387803b1580156115ce57600080fd5b3360009081526018602052604090205460ff16611b40576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6064821115611b96576040805162461bcd60e51b815260206004820152601f60248201527f546172676574206d757374206265206265747765656e203020616e6420312500604482015290519081900360640190fd5b60c7198112801590611ba9575060c88113155b611bfa576040805162461bcd60e51b815260206004820152601f60248201527f4261736973206d757374206265206265747765656e202d3220616e6420322500604482015290519081900360640190fd5b6000546040805163ae9308b760e01b81526001600482015290516001600160a01b039092169163ae9308b791602480820192602092909190829003018186803b158015611c4657600080fd5b505afa158015611c5a573d6000803e3d6000fd5b505050506040513d6020811015611c7057600080fd5b505115611c7c57600080fd5b818101600155808203600255604080518381526020810183905281517fc5a7850ec831f07acac6f5775a3da3ec1fbe0a19185e7678634dbfe87888e501929181900390910190a15050565b336001600160a01b03821614611cdc57600080fd5b6001600160a01b0381811660009081526016602052604090205416611d0057600080fd5b6001600160a01b0380821660009081526016602052604080822054815163705aedad60e01b81529151931692839263705aedad9234926004808301939282900301818588803b15801561129357600080fd5b600054600160a81b900460ff1681565b336000908152601660205260408120546001600160a01b031615611db75760405162461bcd60e51b8152600401808060200182810382526025815260200180614f666025913960400191505060405180910390fd5b8166071afd498d000002341015611e15576040805162461bcd60e51b815260206004820152601a60248201527f4d757374207072657020666f7220322d736964656420626f6f6b000000000000604482015290519081900360640190fd5b333083604051611e2490612ec7565b6001600160a01b039384168152919092166020820152604080820192909252905190819003606001906000f080158015611e62573d6000803e3d6000fd5b503360009081526016602052604080822080546001600160a01b0319166001600160a01b039485161790819055815163705aedad60e01b81529151931692839263705aedad9234926004808301939282900301818588803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b5050336000818152601660209081526040918290205482519384526001600160a01b03169083015280517f154a3febc7352b7a16989452e69bce933ff107f46528b680800f75b0d64b826d9550918290030192509050a15050336000908152601660205260409020546001600160a01b0316919050565b600054600160a01b900460ff1681565b6001600160a01b0382811660009081526016602052604090205416611f8557600080fd5b6001600160a01b0380831660009081526016602052604080822054815163d11fdf3f60e01b8152600481018690529151931692839263d11fdf3f926024808201939182900301818387803b158015611fdc57600080fd5b505af1158015611ff0573d6000803e3d6000fd5b5050604080518581526000602082015281513394506001600160a01b03881693507f76b03a073b20b808539d3243fcc427c64d992a6d4487d1c3488170dec33da2d9929181900390910190a3505050565b606481565b8166038d7ea4c68000023410156120a4576040805162461bcd60e51b815260206004820152601a60248201527f496e7375666669656e742045544820666f72207468697320524d000000000000604482015290519081900360640190fd5b60016120ae611762565b1415612101576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742074616b6520647572696e67203420504d20455420686f757200604482015290519081900360640190fd5b600454821161210f57600080fd5b6001600160a01b0380841660009081526016602090815260408083205481516304d1c11160e21b81529151941693849263134704449260048082019391829003018186803b15801561216057600080fd5b505afa158015612174573d6000803e3d6000fd5b505050506040513d602081101561218a57600080fd5b505160408051636de590c360e11b815290519192506000916001600160a01b0385169163dbcb2186916004808301926020929190829003018186803b1580156121d257600080fd5b505afa1580156121e6573d6000803e3d6000fd5b505050506040513d60208110156121fc57600080fd5b50516000805460408051632c1fad0760e01b8152600160048201529051939450919283926001600160a01b0390921691632c1fad07916024808301926020929190829003018186803b15801561225157600080fd5b505afa158015612265573d6000803e3d6000fd5b505050506040513d602081101561227b57600080fd5b5051600080546040805162891b6560e51b815260016004820152905193945091926001600160a01b03909116916311236ca0916024808301926020929190829003018186803b1580156122cd57600080fd5b505afa1580156122e1573d6000803e3d6000fd5b505050506040513d60208110156122f757600080fd5b5051600054909150600160a81b900460ff16156123325786156123255761231e8585612eb0565b9250612332565b61232f8486612eb0565b92505b82600261240e886001600160a01b0316639fa8f86e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561237157600080fd5b505afa158015612385573d6000803e3d6000fd5b505050506040513d602081101561239b57600080fd5b505160408051635691112f60e11b815290516001600160a01b038c169163ad22225e916004808301926020929190829003018186803b1580156123dd57600080fd5b505afa1580156123f1573d6000803e3d6000fd5b505050506040513d602081101561240757600080fd5b5051612eb0565b8161241557fe5b04018866038d7ea4c6800002111561245e5760405162461bcd60e51b8152600401808060200182810382526024815260200180614fb36024913960400191505060405180910390fd5b60035460408051638224039160e01b8152336004820152602481018b9052604481019290925260ff841660648301526084820183905288151560a4830152516000916001600160a01b03891691638224039191349160c480830192602092919082900301818588803b1580156124d357600080fd5b505af11580156124e7573d6000803e3d6000fd5b50505050506040513d60208110156124fe57600080fd5b50516040805182815260016020820152815192935033926001600160a01b038e16927f76b03a073b20b808539d3243fcc427c64d992a6d4487d1c3488170dec33da2d9928290030190a350505050505050505050565b3360009081526018602052604090205460ff166125a5576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b60008054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526018602052604090205460ff16612614576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03808216600090815260166020526040808220548151639e673fbd60e01b815291519316928392639e673fbd926004808201939182900301818387803b1580156115ce57600080fd5b60055481565b60c881565b3360009081526018602052604090205460ff166126c0576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b600455565b6001600160a01b038083166000908152601660205260408120549091829182918291168015612780576000819050806001600160a01b031663e0e0e21b886040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b15801561273757600080fd5b505afa15801561274b573d6000803e3d6000fd5b505050506040513d608081101561276157600080fd5b5080516020820151604083015160609093015191985096509094509250505b5092959194509250565b60045481565b3360009081526018602052604090205460ff166127e1576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6000546040805163ae9308b760e01b81526001600482015290516001600160a01b039092169163ae9308b791602480820192602092909190829003018186803b15801561282d57600080fd5b505afa158015612841573d6000803e3d6000fd5b505050506040513d602081101561285757600080fd5b505161286257600080fd5b61286a612ed4565b600054604080516348a494ab60e11b81526001600482015290516001600160a01b039092169163914929569160248082019261010092909190829003018186803b1580156128b757600080fd5b505afa1580156128cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101008110156128f157600080fd5b5090506128fc612ed4565b60008054604080516348a494ab60e11b81526004810193909352516001600160a01b0390911691639149295691602480830192610100929190829003018186803b15801561294957600080fd5b505afa15801561295d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061010081101561298357600080fd5b50905060005b6007811015612adb5782816008811061299e57fe5b602002015115806129bd57508181600881106129b657fe5b6020020151155b156129c757612ad3565b600066038d7ea4c680008483600881106129dd57fe5b602002015160e086015166038d7ea4c6800002816129f757fe5b0403905061271060015466038d7ea4c680000281612a1157fe5b05810360068360088110612a2157fe5b01556002546127109066038d7ea4c680000205816000190203600e8360088110612a4757fe5b015560e0830151606402838360088110612a5d57fe5b60200201516103e80260068460088110612a7357fe5b01540281612a7d57fe5b0560068360088110612a8b57fe5b015560e0830151606402838360088110612aa157fe5b60200201516103e802600e8460088110612ab757fe5b01540281612ac157fe5b05600e8360088110612acf57fe5b0155505b600101612989565b50504260055550565b6001600160a01b038082166000908152601660209081526040808320548151634fd47c3760e11b8152915194169383928392839283928392839283928b928392639fa8f86e92600480840193919291829003018186803b158015612b4757600080fd5b505afa158015612b5b573d6000803e3d6000fd5b505050506040513d6020811015612b7157600080fd5b5051604080516304d1c11160e21b81529051919a506001600160a01b03831691631347044491600480820192602092909190829003018186803b158015612bb757600080fd5b505afa158015612bcb573d6000803e3d6000fd5b505050506040513d6020811015612be157600080fd5b505160408051636de590c360e11b815290519199506001600160a01b0383169163dbcb218691600480820192602092909190829003018186803b158015612c2757600080fd5b505afa158015612c3b573d6000803e3d6000fd5b505050506040513d6020811015612c5157600080fd5b505160408051635691112f60e11b815290519198506001600160a01b0383169163ad22225e91600480820192602092909190829003018186803b158015612c9757600080fd5b505afa158015612cab573d6000803e3d6000fd5b505050506040513d6020811015612cc157600080fd5b50516040805163056b7b7360e01b815290519197506001600160a01b0383169163056b7b7391600480820192602092909190829003018186803b158015612d0757600080fd5b505afa158015612d1b573d6000803e3d6000fd5b505050506040513d6020811015612d3157600080fd5b505160408051637ce6d97b60e11b815290519196506001600160a01b0383169163f9cdb2f691600480820192602092909190829003018186803b158015612d7757600080fd5b505afa158015612d8b573d6000803e3d6000fd5b505050506040513d6020811015612da157600080fd5b5051604080516315acdf7560e01b815290519195506001600160a01b038316916315acdf7591600480820192602092909190829003018186803b158015612de757600080fd5b505afa158015612dfb573d6000803e3d6000fd5b505050506040513d6020811015612e1157600080fd5b5051604080516345b2a12960e01b815290519194506001600160a01b038316916345b2a12991600480820192602092909190829003018186803b158015612e5757600080fd5b505afa158015612e6b573d6000803e3d6000fd5b505050506040513d6020811015612e8157600080fd5b5051999b989a509698959794965092949193909250565b600082820183811015612ea757fe5b90505b92915050565b6000828210612ec157506000612eaa565b50900390565b61207280612ef483390190565b604051806101000160405280600890602082028038833950919291505056fe608060405234801561001057600080fd5b506040516120723803806120728339818101604052606081101561003357600080fd5b5080516020820151604090920151600180546001600160a01b039485166001600160a01b0319918216179091556000805494909316931692909217905566038d7ea4c680000260085562093a7f194201600755611fdd806100956000396000f3fe6080604052600436106101e35760003560e01c806378a7a49c11610102578063c96e44a711610095578063e0e0e21b11610064578063e0e0e21b146106f0578063ec821e2c14610744578063f67dcd2214610774578063f9cdb2f61461079e576101e3565b8063c96e44a714610651578063d11fdf3f14610683578063dbcb2186146106ad578063e084b9ed146106c2576101e3565b80639fa8f86e116100d15780639fa8f86e146105b0578063ad22225e146105c5578063b769c441146105da578063c692a730146105ef576101e3565b806378a7a49c146104df578063822403911461054257806392ef17851461058b5780639e673fbd146105a8576101e3565b8063313c06a01161017a5780634d382d9b116101495780634d382d9b1461043e5780636127e69714610483578063705aedad146104ad57806370c2ccaa146104b5576101e3565b8063313c06a01461035157806335c37dd2146103825780633e97e3fc146103b257806345b2a12914610415576101e3565b8063185f438f116101b6578063185f438f1461026b5780631b7d25eb146102825780631d95807c146102975780631fd1a58a14610334576101e3565b806302e9957d146101e8578063056b7b731461022c578063134704441461024157806315acdf7514610256575b600080fd5b61021a600480360360608110156101fe57600080fd5b508035906001600160a01b0360208201351690604001356107b3565b60408051918252519081900360200190f35b34801561023857600080fd5b5061021a6108c9565b34801561024d57600080fd5b5061021a6108cf565b34801561026257600080fd5b5061021a6108d5565b34801561027757600080fd5b506102806108db565b005b34801561028e57600080fd5b5061021a610908565b3480156102a357600080fd5b506102c1600480360360208110156102ba57600080fd5b503561090e565b604080519c8d526001600160a01b03909b1660208d01528b8b019990995260608b019790975260ff90951660808a015292151560a089015290151560c0880152151560e0870152151561010086015215156101208501521515610140840152151561016083015251908190036101800190f35b6102806004803603602081101561034a57600080fd5b503561098f565b34801561035d57600080fd5b506103666109ca565b604080516001600160a01b039092168252519081900360200190f35b34801561038e57600080fd5b50610280600480360360408110156103a557600080fd5b50803590602001356109d9565b3480156103be57600080fd5b5061028060048036036101208110156103d657600080fd5b8101908080610100019060088060200260405190810160405280929190826008602002808284376000920191909152509194505090359150610a979050565b34801561042157600080fd5b5061042a610b31565b604080519115158252519081900360200190f35b34801561044a57600080fd5b506102806004803603608081101561046157600080fd5b50803590602081013590604081013590606001356001600160a01b0316610b41565b34801561048f57600080fd5b50610280600480360360208110156104a657600080fd5b5035610c92565b610280610cb7565b3480156104c157600080fd5b5061021a600480360360208110156104d857600080fd5b5035610cc8565b3480156104eb57600080fd5b50610280600480360361012081101561050357600080fd5b8101908080610100019060088060200260405190810160405280929190826008602002808284376000920191909152509194505090359150610ce69050565b61021a600480360360c081101561055857600080fd5b506001600160a01b038135169060208101359060408101359060ff6060820135169060808101359060a001351515610e0e565b610280600480360360208110156105a157600080fd5b5035611283565b6102806112b6565b3480156105bc57600080fd5b5061021a6112cd565b3480156105d157600080fd5b5061021a6112d3565b3480156105e657600080fd5b506103666112d9565b3480156105fb57600080fd5b506106196004803603602081101561061257600080fd5b50356112e8565b6040805196875260208701959095529215158585015290151560608501521515608084015260ff1660a0830152519081900360c00190f35b6102806004803603606081101561066757600080fd5b50803590602081013590604001356001600160a01b031661132d565b34801561068f57600080fd5b50610280600480360360208110156106a657600080fd5b50356115ba565b3480156106b957600080fd5b5061021a611952565b3480156106ce57600080fd5b506106d7611958565b6040805192835260208301919091528051918290030190f35b3480156106fc57600080fd5b5061071a6004803603602081101561071357600080fd5b5035611a01565b60408051941515855292151560208501529015158383015215156060830152519081900360800190f35b34801561075057600080fd5b506102806004803603604081101561076757600080fd5b5080359060200135611a3e565b34801561078057600080fd5b5061021a6004803603602081101561079757600080fd5b5035611b63565b3480156107aa57600080fd5b5061021a611b70565b6001546000906001600160a01b031633146107cd57600080fd5b6000848152600c6020526040812090546001600160a01b0385811691161480610805575060018101546001600160a01b038581169116145b610856576040805162461bcd60e51b815260206004820181905260248201527f6d75737420627920706172747920746f2068697320737562636f6e7472616374604482015290519081900360640190fd5b6000600282600301548161086657fe5b0490508084101561087657600080fd5b6000546001600160a01b03868116911614156108a85760048201805465ff00000000001916600160281b1790556108c0565b60048201805464ff0000000019166401000000001790555b95945050505050565b60085481565b60045481565b60025481565b620151806007540142116108ee57600080fd5b6001805460ff60a01b1916600160a01b1790556000600655565b60095481565b600c602052600090815260409020805460018201546002830154600384015460049094015492936001600160a01b039092169290919060ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691600160281b8104821691600160301b8204811691600160381b9004168c565b6001546001600160a01b031633146109a657600080fd5b6000908152600c60205260409020600401805463ff00000019166301000000179055565b6000546001600160a01b031681565b60075482116109e757600080fd5b4282106109f357600080fd5b600154600160a01b900460ff1615610a0a57600080fd5b6000818152600c602052604081206003805490820154919291610a2d9190611b76565b90506000610a47600260065481610a4057fe5b0483611b8f565b9050610a5e600354610a598484611ba9565b611b8f565b6003556002830154610a709083611ba9565b60029093019290925550506001805460ff60a01b1916600160a01b17905550506000600655565b6001546001600160a01b03163314610aae57600080fd5b600b5460025410610abe57600080fd5b62015180600754014211610ad157600080fd5b600b54610ade9082611b76565b9050610aee600454600554611ba9565b6006555b806002541015610b2d57610b1f600b60025481548110610b0e57fe5b906000526020600020015483611bbf565b600280546001019055610af2565b5050565b600154600160a01b900460ff1681565b6001546001600160a01b03163314610b5857600080fd5b6007548210610b9c576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b6000848152600c602052604090206003810154610bb99085611ba9565b81600201541015610c11576040805162461bcd60e51b815260206004820152601b60248201527f6d75737420686176652073756666696369656e74206d617267696e0000000000604482015290519081900360640190fd5b60018101546001600160a01b03838116911614610c5f5760405162461bcd60e51b8152600401808060200182810382526023815260200180611f426023913960400191505060405180910390fd5b610c6d816002015485611b8f565b60028201556001810154610c8b9085906001600160a01b0316611e4a565b5050505050565b6001546001600160a01b03163314610ca957600080fd5b66038d7ea4c6800002600855565b610cc360035434611ba9565b600355565b600a8181548110610cd557fe5b600091825260209091200154905081565b6001546001600160a01b03163314610cfd57600080fd5b600b546002541015610d0e57600080fd5b600a54610d1b9082611b76565b600b5460025491925090035b81811015610d5857610d50600a8281548110610d3f57fe5b906000526020600020015484611bbf565b600101610d27565b50600b548181016002819055600a549091011415610b2d57610d7e600354600954611b8f565b6003556004546005541115610da357610d9b600554600454611b8f565b600655610db5565b610db1600454600554611b8f565b6006555b60006009819055426007556002556006546003541015610b2d576001805460ff60a01b1916600160a01b179055600354600654600091610df89160029004611b76565b9050610e0660035482611b8f565b600355505050565b6001546000906001600160a01b03163314610e2857600080fd5b6008548666038d7ea4c68000021015610e88576040805162461bcd60e51b815260206004820152601d60248201527f6d7573742062652067726561746572207468616e20626f6f6b206d696e000000604482015290519081900360640190fd5b6007548310610ecc576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b610ed4611eb8565b66038d7ea4c68000870260608201523460408201526001600160a01b0388166020820152600161016082015260ff8516608082015282610f1657600160c08201525b821561102b57600b5460e111610f62576040805162461bcd60e51b815260206004820152600c60248201526b189bdbdad3585e195913dd5d60a21b604482015290519081900360640190fd5b60008054600b8054604080516bffffffffffffffffffffffff19606095861b1660208083019190915242603483015260548083018590528351808403909101815260749092019092528051910120818652600182018355919093527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990920182905560055490830151919350610ff791611ba9565b60058190555060065461100e600554600454611b8f565b111561102657611022600554600454611b8f565b6006555b611134565b600a5460e111611071576040805162461bcd60e51b815260206004820152600c60248201526b189bdbdad3585e195913dd5d60a21b604482015290519081900360640190fd5b600a8054600080546040805160208082018690526bffffffffffffffffffffffff19606094851b1682840152426054808401919091528351808403909101815260749092019092528051910120838652600184018555939091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a89091018290556004549083015191935061110591611ba9565b60048190555060065461111c600454600554611b8f565b111561113457611130600454600554611b8f565b6006555b85611143600454600554611ba9565b1061115057600160a08201525b6000828152600c602090815260409182902083518155908301516001820180546001600160a01b0319166001600160a01b039092169190911790559082015160028201556060820151600382015560808201516004909101805460a084015160c085015160e0860151610100808801516101208901516101408a0151610160909a015160ff1990971660ff9099169890981761ff0019169415159091029390931762ff0000191662010000921515929092029190911763ff00000019166301000000911515919091021764ff000000001916640100000000911515919091021765ff00000000001916600160281b931515939093029290921766ff0000000000001916600160301b931515939093029290921760ff60381b1916600160381b911515919091021790559695505050505050565b6000818152600c60205260409020600381015461129f57600080fd5b6112ad816002015434611ba9565b60029091015550565b6001546001600160a01b031633146108ee57600080fd5b60035481565b60065481565b6001546001600160a01b031681565b6000908152600c6020526040902060028101546003820154600490920154909260ff62010000830481169263010000008104821692600160381b820483169290911690565b6001546001600160a01b0316331461134457600080fd5b6000828152600c602052604090206007548410611396576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b60018101546001600160a01b03838116911614806113c157506000546001600160a01b038381169116145b611412576040805162461bcd60e51b815260206004820152601960248201527f43616e63656c6c6572206e6f74204c50206f722074616b657200000000000000604482015290519081900360640190fd5b60048101546301000000900460ff1615611473576040805162461bcd60e51b815260206004820152601d60248201527f537562636f6e747261637420616c72656164792063616e63656c6c6564000000604482015290519081900360640190fd5b600061271060c88360030154028161148757fe5b60048401549190049150610100900460ff16806114b157506000546001600160a01b038481169116145b156114c0576002600382020490505b80341015611515576040805162461bcd60e51b815260206004820152601760248201527f496e73756666696369656e742063616e63656c20666565000000000000000000604482015290519081900360640190fd5b60048201805463ff000000191663010000001790556115373482900384611e4a565b610c8b81600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b15801561158957600080fd5b505afa15801561159d573d6000803e3d6000fd5b505050506040513d60208110156115b357600080fd5b5051611e4a565b6001546001600160a01b031633146115d157600080fd5b6000818152600c602052604090206004810154600160381b900460ff1615806116035750600154600160a01b900460ff165b61160c57600080fd5b60028101546004820154600160301b900460ff1615611677576000600283600301548161163557fe5b0490506116428282611b8f565b60405190925061dead9082156108fc029083906000818181858888f19350505050158015611674573d6000803e3d6000fd5b50505b6000600283015560018201546116979082906001600160a01b0316611e4a565b8154600483015462010000900460ff1615611746576000600c6000600a6001600a8054905003815481106116c757fe5b600091825260208083209091015483528201929092526040019020828155600a80549192509060001981019081106116fb57fe5b9060005260206000200154600a838154811061171357fe5b600091825260209091200155600a80548061172a57fe5b60019003818190600052602060002001600090559055506117dc565b6000600c6000600b6001600b80549050038154811061176157fe5b600091825260208083209091015483528201929092526040019020828155600b805491925090600019810190811061179557fe5b9060005260206000200154600b83815481106117ad57fe5b600091825260209091200155600b8054806117c457fe5b60019003818190600052602060002001600090559055505b6117e4611eb8565b80600c60008781526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360ff16021790555060a08201518160040160016101000a81548160ff02191690831515021790555060c08201518160040160026101000a81548160ff02191690831515021790555060e08201518160040160036101000a81548160ff0219169083151502179055506101008201518160040160046101000a81548160ff0219169083151502179055506101208201518160040160056101000a81548160ff0219169083151502179055506101408201518160040160066101000a81548160ff0219169083151502179055506101608201518160040160076101000a81548160ff0219169083151502179055509050505050505050565b60055481565b600080805b600b548110156119a7576000600c6000600b848154811061197a57fe5b6000918252602080832090910154835282019290925260400190206002015493909301925060010161195d565b5060005b600a548110156119f5576000600c6000600a84815481106119c857fe5b600091825260208083209091015483528201929092526040019020600201549390930192506001016119ab565b50506003540190303190565b6000908152600c602052604090206004015460ff61010082048116926401000000008304821692600160281b8104831692600160301b9091041690565b6001546001600160a01b03163314611a5557600080fd5b600154600160a01b900460ff1615611aad57816003541015611aa85760405162461bcd60e51b8152600401808060200182810382526024815260200180611f656024913960400191505060405180910390fd5b611b3d565b611ab960065483611ba9565b6003541015611af95760405162461bcd60e51b8152600401808060200182810382526025815260200180611f1d6025913960400191505060405180910390fd5b6007548110611b3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020611f89833981519152604482015290519081900360640190fd5b611b4960035483611b8f565b600355600054610b2d9083906001600160a01b0316611e4a565b600b8181548110610cd557fe5b60075481565b6000818311611b86575081611b89565b50805b92915050565b6000828210611ba057506000611b89565b50808203611b89565b600082820183811015611bb857fe5b9392505050565b6000828152600c602052604090206004810154600160381b900460ff168015611bf05750600481015460ff16600714155b15611e3b57600481015460009081908190859060ff1660088110611c1057fe5b60200201511215611c5a57506003820154600483015460019166038d7ea4c6800091869060ff1660088110611c4157fe5b6020020151600019020281611c5257fe5b049150611c8e565b6003830154600484015466038d7ea4c680009190869060ff1660088110611c7d57fe5b60200201510281611c8a57fe5b0491505b611c9c836003015483611b76565b91508015611ce057611cb2836002015483611b8f565b60028401556004830154640100000000900460ff16611cdb57611cd760035483611ba9565b6003555b611d3b565b600354821115611d0557611d01600954611cfc84600354611b8f565b611ba9565b6009555b611d1160035483611b8f565b6003556004830154600160281b900460ff16611d3b57611d35836002015483611ba9565b60028401555b6004830154600160281b900460ff1680611d6157506004830154640100000000900460ff165b80611d77575060048301546301000000900460ff165b15611dcf57600483015462010000900460ff1615611da757611d9f6004548460030154611b8f565b600455611dbb565b611db76005548460030154611b8f565b6005555b60048301805460ff60381b19169055611e38565b826003015483600201541015611e3857600483015462010000900460ff1615611e0a57611e026004548460030154611b8f565b600455611e1e565b611e1a6005548460030154611b8f565b6005555b60048301805467ffff0000000000001916600160301b1790555b50505b600401805460ff191690555050565b600154604080516321ef4aef60e21b81526001600160a01b038481166004830152915191909216916387bd2bbc91859160248082019260009290919082900301818588803b158015611e9b57600080fd5b505af1158015611eaf573d6000803e3d6000fd5b50505050505050565b6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081018290526101608101919091529056fe43616e6e6f7420746f20772f64206d6f7265207468616e20657863657373206d617267696e4d7573742062652074616b657220746f2063616c6c20746869732066756e6374696f6e43616e6e6f74207769746864726177206d6f7265207468616e20746865206d617267696e43616e6e6f7420646f20647572696e6720736574746c6520706572696f640000a265627a7a7231582029dd122158c4e0fba1d0be1fcfdac686332fe4d43128215b8c5e3861cee6f09564736f6c634300050b003255736572206d757374206e6f7420686176652061207072656578697374696e6720626f6f6b596f75206d6179206e6f742072656d6f766520796f757273656c6620617320616e2061646d696e2e524d20746f206c6172676520666f722074686973204c50206f6e20746869732073696465a265627a7a7231582078b6dd0016fcb2e0c48936fb09697ec12b7c9e8f3257ee1010a5da2c5218d01764736f6c634300050b0032

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

0000000000000000000000001bBC92bDF7cE2bA8E2cAd9c5cEcDBB2eb5a8D968

-----Decoded View---------------
Arg [0] : priceOracle (address): 0x1bBC92bDF7cE2bA8E2cAd9c5cEcDBB2eb5a8D968

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001bBC92bDF7cE2bA8E2cAd9c5cEcDBB2eb5a8D968


Deployed Bytecode Sourcemap

32286:22326:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34059:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34059:42:0;;;:::i;:::-;;;;;;;;;;;;;;;;49339:229;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49339:229:0;;;;;;;;:::i;:::-;;46664:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46664:208:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46664:208:0;-1:-1:-1;;;;;46664:208:0;;:::i;41152:526::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41152:526:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41152:526:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42819:345;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42819:345:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42819:345:0;-1:-1:-1;;;;;42819:345:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38172:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38172:136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38172:136:0;-1:-1:-1;;;;;38172:136:0;;:::i;34528:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34528:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;34528:33:0;;;;;;;;;;;;;;35701:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35701:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35701:118:0;;;;:::i;34445:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34445:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34445:38:0;-1:-1:-1;;;;;34445:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;33613:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33613:46:0;;;:::i;48396:760::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48396:760:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;48396:760:0;;;;;;;;;;;;;;;:::i;52354:377::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52354:377:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52354:377:0;;:::i;46882:253::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46882:253:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46882:253:0;;:::i;34353:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34353:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34353:49:0;-1:-1:-1;;;;;34353:49:0;;:::i;44305:429::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44305:429:0;;;;;;;;:::i;34261:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34261:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34261:41:0;-1:-1:-1;;;;;34261:41:0;;:::i;53478:192::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53478:192:0;;;:::i;36673:254::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36673:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36673:254:0;;:::i;45685:274::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45685:274:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45685:274:0;;;;;;;;:::i;33276:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33276:21:0;;;:::i;35386:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35386:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35386:118:0;-1:-1:-1;;;;;35386:118:0;;:::i;53919:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53919:174:0;;;:::i;33225:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33225:20:0;;;:::i;33058:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33058:20:0;;;:::i;37146:167::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37146:167:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37146:167:0;;;;;;;;:::i;37862:175::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37862:175:0;-1:-1:-1;;;;;37862:175:0;;:::i;33328:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33328:28:0;;;:::i;52996:377::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52996:377:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52996:377:0;;;-1:-1:-1;;;;;52996:377:0;;;;;;;;;;:::i;33768:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33768:37:0;;;:::i;44931:271::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;44931:271:0;;;;;;;;:::i;45359:177::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45359:177:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45359:177:0;-1:-1:-1;;;;;45359:177:0;;:::i;47531:650::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47531:650:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47531:650:0;;;;;;;:::i;43888:238::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43888:238:0;-1:-1:-1;;;;;43888:238:0;;:::i;33155:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33155:25:0;;;:::i;38474:548::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38474:548:0;;:::i;33087:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33087:18:0;;;:::i;46253:253::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46253:253:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46253:253:0;;;;;;;;:::i;33846:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33846:37:0;;;:::i;49740:1171::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49740:1171:0;;;;;;;;;;;;;;;:::i;36399:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36399:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36399:128:0;;;;:::i;37535:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37535:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37535:141:0;-1:-1:-1;;;;;37535:141:0;;:::i;34143:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34143:34:0;;;:::i;33498:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33498:35:0;;;:::i;35983:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35983:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35983:111:0;;:::i;42351:459::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42351:459:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42351:459:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33420:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33420:25:0;;;:::i;51238:981::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51238:981:0;;;:::i;39826:811::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39826:811:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39826:811:0;-1:-1:-1;;;;;39826:811:0;;:::i;:::-;;;;-1:-1:-1;;;;;39826:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34059:42;34097:4;34059:42;:::o;49339:229::-;-1:-1:-1;;;;;49444:11:0;;;49467:1;49444:11;;;:6;:11;;;;;;;49436:34;;;;;;-1:-1:-1;;;;;49495:11:0;;;49481:6;49495:11;;;:6;:11;;;;;;;49518:42;;-1:-1:-1;;;49518:42:0;;;;;;;;;;49495:11;;;;;49518:17;;49542:9;;49518:42;;;;;49481:6;49518:42;;;;;49542:9;49495:11;49518:42;;;5:2:-1;;;;30:1;27;20:12;5:2;49518:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49518:42:0;;;;;49339:229;;;:::o;46664:208::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46762:22:0;;46774:10;46762:22;;46754:75;;;;-1:-1:-1;;;46754:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46840:16:0;46859:5;46840:16;;;:6;:16;;;;;:24;;-1:-1:-1;;46840:24:0;;;46664:208::o;41152:526::-;-1:-1:-1;;;;;41469:11:0;;;41271:17;41469:11;;;:6;:11;;;;;;41271:17;;;;;;;;;;;;41469:11;41495:18;;41491:180;;41530:6;41544:4;41530:19;;41638:1;-1:-1:-1;;;;;41638:13:0;;41652:6;41638:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41638:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41638:21:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;41638:21:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41638:21:0;;-1:-1:-1;41638:21:0;-1:-1:-1;41638:21:0;-1:-1:-1;41638:21:0;;-1:-1:-1;41638:21:0;-1:-1:-1;;41491:180:0;41152:526;;;;;;;;;:::o;42819:345::-;-1:-1:-1;;;;;43009:11:0;;;42918:17;43009:11;;;:6;:11;;;;;;42918:17;;;;43009:11;43035:18;;43031:126;;43070:6;43084:4;43070:19;;43130:1;-1:-1:-1;;;;;43130:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43130:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43130:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43130:15:0;;;;;;;;;-1:-1:-1;43130:15:0;-1:-1:-1;;43031:126:0;42819:345;;;;:::o;38172:136::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;38277:10;:23;;-1:-1:-1;;;;;;38277:23:0;-1:-1:-1;;;;;38277:23:0;;;;;;;;;;38172:136::o;34528:33::-;;;-1:-1:-1;;;;;34528:33:0;;:::o;35701:118::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;35788:6;:23;;;;;-1:-1:-1;;;35788:23:0;-1:-1:-1;;;;35788:23:0;;;;;;;;;35701:118::o;34445:38::-;;;;;;;;;;;;;;;:::o;33613:46::-;33652:7;33613:46;:::o;48396:760::-;-1:-1:-1;;;;;48498:11:0;;;48521:1;48498:11;;;:6;:11;;;;;;;48490:34;;;;;;-1:-1:-1;;;;;48549:11:0;;;48535:6;48549:11;;;:6;:11;;;;;;;;;48666:6;;:28;;-1:-1:-1;;;48666:28:0;;48549:11;48666:28;;;;;;48549:11;;;;48666:6;;:18;;:28;;;;;48549:11;;48666:28;;;;;;:6;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;48666:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48666:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48666:28:0;48658:37;;;;;;48706:16;48725:6;;:34;;;-1:-1:-1;;;48725:34:0;;:6;:34;;;;;;-1:-1:-1;;;;;48725:6:0;;;;:24;;:34;;;;;;;;;;;;;;;:6;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;48725:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48725:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48725:34:0;48848:22;;48725:34;;-1:-1:-1;48848:36:0;-1:-1:-1;48840:45:0;;;;;;48969:3;:35;-1:-1:-1;48960:71:0;;;;;-1:-1:-1;;;48960:71:0;;;;;;;;;;;;-1:-1:-1;;;48960:71:0;;;;;;;;;;;;;;;49046:11;49042:106;;;49059:40;;-1:-1:-1;;;49059:40:0;;-1:-1:-1;;;;;49059:12:0;;;;;49072:16;;49090:8;;49059:40;;;;;;49072:16;49059:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49059:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49059:40:0;;;;49042:106;;;49106:42;;-1:-1:-1;;;49106:42:0;;-1:-1:-1;;;;;49106:13:0;;;;;49120:17;;49139:8;;49106:42;;;;;;49120:17;49106:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49106:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49106:42:0;;;;49042:106;48396:760;;;;;:::o;52354:377::-;52436:10;52459:1;52429:18;;;:6;:18;;;;;;-1:-1:-1;;;;;52429:18:0;52421:41;;;;;;52494:10;52473:6;52487:18;;;:6;:18;;;;;;;;;52544:6;;:34;;-1:-1:-1;;;52544:34:0;;52487:18;52544:34;;;;;;-1:-1:-1;;;;;52487:18:0;;;;52473:6;52544;;;;;:24;;:34;;;;;52487:18;52544:34;;;;;:6;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;52544:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52544:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52544:34:0;52679:44;;;-1:-1:-1;;;52679:44:0;;;;;;;;;;;;;;;;52544:34;;-1:-1:-1;;;;;;52679:14:0;;;;;:44;;;;;-1:-1:-1;;52679:44:0;;;;;;;;-1:-1:-1;52679:14:0;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;52679:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52679:44:0;;;;52354:377;;;:::o;46882:253::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;47075:8;47061:22;;47042:16;:41;47099:28;;;;;;;;;;;;;;;;;46882:253;:::o;34353:49::-;;;;;;;;;;;;;:::o;44305:429::-;-1:-1:-1;;;;;44411:11:0;;;44397:6;44411:11;;;:6;:11;;;;;;;;;44445:41;;-1:-1:-1;;;44445:41:0;;;;;;;;44464:10;44445:41;;;;44476:9;44445:41;;;;;;44411:11;;;;;44445:10;;:41;;;;;;;;;;;44397:6;44411:11;44445:41;;;5:2:-1;;;;30:1;27;20:12;5:2;44445:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44445:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44445:41:0;;-1:-1:-1;44501:9:0;:15;-1:-1:-1;44497:230:0;;;44533:26;;34664:6;;44533:26;;;;;44555:3;;44533:26;;;;44555:3;34664:6;44533:26;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;44628:10:0;44610:29;;;;:17;:29;;;;;;44606:50;;44640:9;:15;;;44606:3;:50::i;:::-;44592:10;44574:29;;;;:17;:29;;;;;;;;;:82;;;;44676:38;;-1:-1:-1;;;;;44676:38:0;;;;;;;;;;;;;;;;;44710:3;44676:38;;;;;;;;;;;;;;44497:230;44305:429;;;;:::o;34261:41::-;;;;;;;;;;;;-1:-1:-1;;;;;34261:41:0;;:::o;53478:192::-;53569:10;53537:11;53551:29;;;:17;:29;;;;;;;;53591:33;;;;53635:27;;53551:29;;53569:10;53635:27;;;;;53551:29;;53635:27;53537:11;53635:27;53551:29;53569:10;53635:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53635:27:0;53478:192;:::o;36673:254::-;36753:10;36776:1;36746:18;;;:6;:18;;;;;;-1:-1:-1;;;;;36746:18:0;36737:67;;;;;-1:-1:-1;;;36737:67:0;;;;;;;;;;;;-1:-1:-1;;;36737:67:0;;;;;;;;;;;;;;;36831:13;;36824:4;:20;36815:30;;;;;;36877:10;36856:6;36870:18;;;:6;:18;;;;;;;36900:19;;-1:-1:-1;;;36900:19:0;;;;;;;;;;-1:-1:-1;;;;;36870:18:0;;;;;;36900:13;;:19;;;;;36856:6;36900:19;;;;;36856:6;36870:18;36900:19;;;5:2:-1;;;;30:1;27;20:12;5:2;36900:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36900:19:0;;;;36673:254;;:::o;45685:274::-;-1:-1:-1;;;;;45774:11:0;;;45797:1;45774:11;;;:6;:11;;;;;;;45766:34;;;;;;-1:-1:-1;;;;;45825:11:0;;;45811:6;45825:11;;;:6;:11;;;;;;;;;45870:6;;:34;;-1:-1:-1;;;45870:34:0;;45825:11;45870:34;;;;;;45825:11;;;;45870:6;;:24;;:34;;;;;;;;;;;:6;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;45870:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45870:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45870:34:0;45915:36;;;-1:-1:-1;;;45915:36:0;;;;;;;;;;;;;;;;45870:34;;-1:-1:-1;;;;;;45915:12:0;;;;;:36;;;;;-1:-1:-1;;45915:36:0;;;;;;;;-1:-1:-1;45915:12:0;:36;;;5:2:-1;;;;30:1;27;20:12;33276:21:0;;;;:::o;35386:118::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35473:16:0;;;;;:6;:16;;;;;:23;;-1:-1:-1;;35473:23:0;35492:4;35473:23;;;35386:118::o;53919:174::-;53987:10;54062:6;54039:4;54030:5;54023:3;:12;54022:21;-1:-1:-1;;54022:25:0;;-1:-1:-1;;;54062:6:0;;;;54058:27;;;54084:1;54076:9;54058:27;53919:174;:::o;33225:20::-;;;;:::o;33058:::-;;;-1:-1:-1;;;;;33058:20:0;;:::o;37146:167::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37261:11:0;;;37247:6;37261:11;;;:6;:11;;;;;;;37284:21;;-1:-1:-1;;;37284:21:0;;;;;;;;;;37261:11;;;;;37284:13;;:21;;;;;;;;;;;37247:6;37261:11;37284:21;;;5:2:-1;;;;30:1;27;20:12;37862:175:0;-1:-1:-1;;;;;37990:28:0;;;;;;:17;:28;;;;;;37986:43;;38019:9;37986:3;:43::i;:::-;-1:-1:-1;;;;;37955:28:0;;;;;;;:17;:28;;;;;:74;37862:175::o;33328:28::-;;;;:::o;52996:377::-;-1:-1:-1;;;;;53103:11:0;;;53126:1;53103:11;;;:6;:11;;;;;;;53095:34;;;;;;-1:-1:-1;;;;;53154:11:0;;;53140:6;53154:11;;;:6;:11;;;;;;;;;53205:6;;:34;;-1:-1:-1;;;53205:34:0;;53154:11;53205:34;;;;;;53154:11;;;;53205:6;;:24;;:34;;;;;;;;;;;:6;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;53205:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53205:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53205:34:0;53298:67;;;-1:-1:-1;;;53298:67:0;;;;;;;;;;;;;;;;;;;;53354:10;53298:67;;;;;;53205:34;;-1:-1:-1;;;;;;53298:17:0;;;;;:67;;;;;-1:-1:-1;;53298:67:0;;;;;;;;-1:-1:-1;53298:17:0;:67;;;5:2:-1;;;;30:1;27;20:12;33768:37:0;33804:1;33768:37;:::o;44931:271::-;-1:-1:-1;;;;;45039:11:0;;;45025:6;45039:11;;;:6;:11;;;;;;;;;45084:6;;:34;;-1:-1:-1;;;45084:34:0;;45039:11;45084:34;;;;;;45039:11;;;;45084:6;;:24;;:34;;;;;;;;;;;:6;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;45084:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45084:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45084:34:0;45129:65;;;-1:-1:-1;;;45129:65:0;;;;;;;;;;;;;;45183:10;45129:65;;;;;;45084:34;;-1:-1:-1;;;;;;45129:12:0;;;;;45148:9;;45129:65;;;;;-1:-1:-1;;45129:65:0;;;;;;;45148:9;45129:12;:65;;;5:2:-1;;;;30:1;27;20:12;45359:177:0;-1:-1:-1;;;;;45436:11:0;;;45459:1;45436:11;;;:6;:11;;;;;;;45428:34;;;;;;-1:-1:-1;;;;;45487:11:0;;;45473:6;45487:11;;;:6;:11;;;;;;;45510:18;;-1:-1:-1;;;45510:18:0;;;;45487:11;;;;;45510:16;;:18;;;;;;;;;;;45473:6;45487:11;45510:18;;;5:2:-1;;;;30:1;27;20:12;47531:650:0;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;33880:3;47844:6;:20;;47836:64;;;;;-1:-1:-1;;;47836:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47919:19:0;-1:-1:-1;47919:19:0;;;:41;;;33530:3;47942:5;:18;;47919:41;47911:85;;;;;-1:-1:-1;;;47911:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48016:6;;:28;;;-1:-1:-1;;;48016:28:0;;:6;:28;;;;;;-1:-1:-1;;;;;48016:6:0;;;;:18;;:28;;;;;;;;;;;;;;;:6;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;48016:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48016:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48016:28:0;48015:29;48007:38;;;;;;48068:19;;;48056:9;:31;48111:19;;;48098:10;:32;48146:27;;;;;;;;;;;;;;;;;;;;;;;;;47531:650;;:::o;43888:238::-;43974:10;-1:-1:-1;;;;;43974:17:0;;;43966:26;;;;;;-1:-1:-1;;;;;44011:11:0;;;44034:1;44011:11;;;:6;:11;;;;;;;44003:34;;;;;;-1:-1:-1;;;;;44062:11:0;;;44048:6;44062:11;;;:6;:11;;;;;;;44085:33;;-1:-1:-1;;;44085:33:0;;;;44062:11;;;;;44085:14;;44106:9;;44085:33;;;;;44048:6;44085:33;;;;;44106:9;44062:11;44085:33;;;5:2:-1;;;;30:1;27;20:12;33155:25:0;;;-1:-1:-1;;;33155:25:0;;;;;:::o;38474:548::-;38605:10;38556:15;38598:18;;;:6;:18;;;;;;-1:-1:-1;;;;;38598:18:0;:32;38589:83;;;;-1:-1:-1;;;38589:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38705:4;38712:8;38705:15;38692:9;:28;;38683:68;;;;;-1:-1:-1;;;38683:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38800:10;38820:4;38827;38791:41;;;;;:::i;:::-;-1:-1:-1;;;;;38791:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38791:41:0;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;38769:10:0;38762:18;;;;:6;:18;;;;;;:71;;-1:-1:-1;;;;;;38762:71:0;-1:-1:-1;;;;;38762:71:0;;;;;;;;38888:33;;-1:-1:-1;;;38888:33:0;;;;38858:18;;;;;38888:14;;38909:9;;38888:33;;;;;38762:18;38888:33;;;;;38909:9;38858:18;38888:33;;;5:2:-1;;;;30:1;27;20:12;5:2;38888:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38947:10:0;38959:18;;;;:6;:18;;;;;;;;;;38937:41;;;;;-1:-1:-1;;;;;38959:18:0;38937:41;;;;;;;;-1:-1:-1;38937:41:0;;;;;;-1:-1:-1;38937:41:0;-1:-1:-1;38937:41:0;-1:-1:-1;;39003:10:0;38996:18;;;;:6;:18;;;;;;-1:-1:-1;;;;;38996:18:0;38474:548;;;:::o;33087:18::-;;;-1:-1:-1;;;33087:18:0;;;;;:::o;46253:253::-;-1:-1:-1;;;;;46338:11:0;;;46361:1;46338:11;;;:6;:11;;;;;;;46330:34;;;;;;-1:-1:-1;;;;;46389:11:0;;;46375:6;46389:11;;;:6;:11;;;;;;;46412:27;;-1:-1:-1;;;46412:27:0;;;;;;;;;;46389:11;;;;;46412:19;;:27;;;;;;;;;;;46375:6;46389:11;46412:27;;;5:2:-1;;;;30:1;27;20:12;5:2;46412:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;46455:43:0;;;;;;46492:5;46455:43;;;;;;46472:10;;-1:-1:-1;;;;;;46455:43:0;;;-1:-1:-1;46455:43:0;;;;;;;;;;;46253:253;;;:::o;33846:37::-;33880:3;33846:37;:::o;49740:1171::-;49868:6;49878:8;49868:19;49855:9;:32;;49847:71;;;;;-1:-1:-1;;;49847:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33804:1;49972:11;:9;:11::i;:::-;:27;;49964:71;;;;;-1:-1:-1;;;49964:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50099:13;;50090:6;:22;50082:31;;;;;;-1:-1:-1;;;;;50141:11:0;;;50124:9;50141:11;;;:6;:11;;;;;;;;;50178:19;;-1:-1:-1;;;50178:19:0;;;;50141:11;;;;;50178:17;;:19;;;;;;;;;;;50141:11;50178:19;;;5:2:-1;;;;30:1;27;20:12;5:2;50178:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50178:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50178:19:0;50223:20;;;-1:-1:-1;;;50223:20:0;;;;50178:19;;-1:-1:-1;50208:12:0;;-1:-1:-1;;;;;50223:18:0;;;;;:20;;;;;50178:19;;50223:20;;;;;;;:18;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;50223:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50223:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50223:20:0;50254:15;50301:6;;:28;;;-1:-1:-1;;;50301:28:0;;:6;:28;;;;;;50223:20;;-1:-1:-1;50254:15:0;;;;-1:-1:-1;;;;;50301:6:0;;;;:18;;:28;;;;;50223:20;;50301:28;;;;;;;:6;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;50301:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50301:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50301:28:0;50340:25;50368:6;;:34;;;-1:-1:-1;;;50368:34:0;;:6;:34;;;;;;50301:28;;-1:-1:-1;50340:25:0;;-1:-1:-1;;;;;50368:6:0;;;;:24;;:34;;;;;50301:28;;50368:34;;;;;;;:6;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;50368:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50368:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50368:34:0;50417:13;;50368:34;;-1:-1:-1;;;;50417:13:0;;;;50413:147;;;50447:11;50443:105;;;50473:23;50481:6;50488:7;50473;:23::i;:::-;50460:36;;50443:105;;;50525:23;50533:7;50541:6;50525:7;:23::i;:::-;50512:36;;50443:105;50652:10;50648:1;50599:48;50607:4;-1:-1:-1;;;;;50607:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50607:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50607:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50607:15:0;50623:23;;;-1:-1:-1;;;50623:23:0;;;;-1:-1:-1;;;;;50623:21:0;;;;;:23;;;;;50607:15;;50623:23;;;;;;;:21;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;50623:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50623:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50623:23:0;50599:7;:48::i;:::-;:50;;;;;;:63;50578:6;50587:8;50578:17;:84;;50570:133;;;;-1:-1:-1;;;50570:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50781:16;;50734:109;;;-1:-1:-1;;;50734:109:0;;50761:10;50734:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50714:17;;-1:-1:-1;;;;;50734:9:0;;;;;50750;;50734:109;;;;;;;;;;;;;;50750:9;50734;:109;;;5:2:-1;;;;30:1;27;20:12;5:2;50734:109:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50734:109:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50734:109:0;50859:44;;;;;;50898:4;50734:109;50859:44;;;;;50734:109;;-1:-1:-1;50876:10:0;;-1:-1:-1;;;;;50859:44:0;;;;;;;;;;;49740:1171;;;;;;;;;;:::o;36399:128::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;36492:13;:27;;;;;-1:-1:-1;;;36492:27:0;-1:-1:-1;;;;36492:27:0;;;;;;;;;36399:128::o;37535:141::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37632:11:0;;;37618:6;37632:11;;;:6;:11;;;;;;;37655:13;;-1:-1:-1;;;37655:13:0;;;;37632:11;;;;;37655;;:13;;;;;;;;;;;37618:6;37632:11;37655:13;;;5:2:-1;;;;30:1;27;20:12;34143:34:0;;;;:::o;33498:35::-;33530:3;33498:35;:::o;35983:111::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;36064:13;:22;35983:111::o;42351:459::-;-1:-1:-1;;;;;42616:11:0;;;42472:15;42616:11;;;:6;:11;;;;;;42472:15;;;;;;;;42616:11;42642:18;;42638:165;;42677:6;42691:4;42677:19;;42768:1;-1:-1:-1;;;;;42768:15:0;;42784:6;42768:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42768:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42768:23:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;42768:23:0;;;;;;;;;;;;;;;;;-1:-1:-1;42768:23:0;-1:-1:-1;42768:23:0;;-1:-1:-1;42768:23:0;-1:-1:-1;;42638:165:0;42351:459;;;;;;;;:::o;33420:25::-;;;;:::o;51238:981::-;35227:10;35220:18;;;;:6;:18;;;;;;;;35212:41;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;-1:-1:-1;;;35212:41:0;;;;;;;;;;;;;;;51380:6;;:28;;;-1:-1:-1;;;51380:28:0;;:6;:28;;;;;;-1:-1:-1;;;;;51380:6:0;;;;:18;;:28;;;;;;;;;;;;;;;:6;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;51380:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51380:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51380:28:0;51372:37;;;;;;51422:25;;:::i;:::-;51451:6;;:26;;;-1:-1:-1;;;51451:26:0;;:6;:26;;;;;;-1:-1:-1;;;;;51451:6:0;;;;:16;;:26;;;;;:6;;:26;;;;;;;;:6;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;51451:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51451:26:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;51451:26:0;-1:-1:-1;51488:23:0;;:::i;:::-;51514:6;;;:19;;;-1:-1:-1;;;51514:19:0;;;;;;;;;;-1:-1:-1;;;;;51514:6:0;;;;:16;;:19;;;;;:6;;:19;;;;;;;:6;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;51514:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51514:19:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;51514:19:0;-1:-1:-1;51551:6:0;51546:624;51567:1;51563;:5;51546:624;;;51603:10;51614:1;51603:13;;;;;;;;;;;:18;;:38;;;51625:8;51634:1;51625:11;;;;;;;;;;;:16;51603:38;51599:52;;;51643:8;;51599:52;51666:15;51737:8;51719:10;51730:1;51719:13;;;;;;;;;;;51689;;;;51706:8;51689:26;51719:13;51688:44;;;;;51684:61;51666:79;;51826:3;51814:9;;51798:8;51797:27;51796:33;;;;;;51782:11;:47;51760:16;51777:1;51760:19;;;;;;;;:69;51906:10;;51919:3;;51890:8;51889:28;51888:34;51873:11;-1:-1:-1;;51868:16:0;51867:55;51844:17;51862:1;51844:20;;;;;;;;:78;52021:11;;;;52035:3;52021:17;:8;52012:1;52003:11;;;;;;;;;;;34097:4;51986:28;51960:16;51977:1;51960:19;;;;;;;;;:55;51959:80;;;;;;51937:16;51954:1;51937:19;;;;;;;;:102;52140:11;;;;52154:3;52140:17;:8;52131:1;52122:11;;;;;;;;;;;34097:4;52105:28;52078:17;52096:1;52078:20;;;;;;;;;:56;52077:81;;;;;;52054:17;52072:1;52054:20;;;;;;;;:104;-1:-1:-1;51546:624:0;51570:3;;51546:624;;;-1:-1:-1;;52206:3:0;52181:22;:28;-1:-1:-1;51238:981:0:o;39826:811::-;-1:-1:-1;;;;;40219:11:0;;;39908:13;40219:11;;;:6;:11;;;;;;;;;40292:12;;-1:-1:-1;;;40292:12:0;;;;40219:11;;;39908:13;;;;;;;;;;;;;;40219:11;;;;40292:10;;:12;;;;;40219:11;;40292:12;;;;;;40219:11;40292:12;;;5:2:-1;;;;30:1;27;20:12;5:2;40292:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40292:12:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40292:12:0;40334:16;;;-1:-1:-1;;;40334:16:0;;;;40292:12;;-1:-1:-1;;;;;;40334:14:0;;;;;:16;;;;;40292:12;;40334:16;;;;;;;;:14;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;40334:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40334:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40334:16:0;40381:17;;;-1:-1:-1;;;40381:17:0;;;;40334:16;;-1:-1:-1;;;;;;40381:15:0;;;;;:17;;;;;40334:16;;40381:17;;;;;;;;:15;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;40381:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40381:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40381:17:0;40421:20;;;-1:-1:-1;;;40421:20:0;;;;40381:17;;-1:-1:-1;;;;;;40421:18:0;;;;;:20;;;;;40381:17;;40421:20;;;;;;;;:18;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;40421:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40421:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40421:20:0;40471:9;;;-1:-1:-1;;;40471:9:0;;;;40421:20;;-1:-1:-1;;;;;;40471:7:0;;;;;:9;;;;;40421:20;;40471:9;;;;;;;;:7;:9;;;5:2:-1;;;;30:1;27;20:12;5:2;40471:9:0;;;;8::-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40471:9:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40471:9:0;40517:22;;;-1:-1:-1;;;40517:22:0;;;;40471:9;;-1:-1:-1;;;;;;40517:20:0;;;;;:22;;;;;40471:9;;40517:22;;;;;;;;:20;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;40517:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40517:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40517:22:0;40567:13;;;-1:-1:-1;;;40567:13:0;;;;40517:22;;-1:-1:-1;;;;;;40567:11:0;;;;;:13;;;;;40517:22;;40567:13;;;;;;;;:11;:13;;;5:2:-1;;;;30:1;27;20:12;5:2;40567:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40567:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40567:13:0;40612:17;;;-1:-1:-1;;;40612:17:0;;;;40567:13;;-1:-1:-1;;;;;;40612:15:0;;;;;:17;;;;;40567:13;;40612:17;;;;;;;;:15;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;40612:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40612:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40612:17:0;39826:811;;;;-1:-1:-1;39826:811:0;;;;;;-1:-1:-1;39826:811:0;;;;;;-1:-1:-1;39826:811:0:o;54435:172::-;54516:4;54547:7;;;54572;;;;54565:15;;;;54598:1;-1:-1:-1;54435:172:0;;;;;:::o;54177:180::-;54262:4;54294:2;54288;:8;54284:41;;-1:-1:-1;54316:1:0;54309:8;;54284:41;-1:-1:-1;54342:7:0;;;54177:180::o;32286:22326::-;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;32286:22326:0;;;-1:-1:-1;;32286:22326:0:o

Swarm Source

bzzr://78b6dd0016fcb2e0c48936fb09697ec12b7c9e8f3257ee1010a5da2c5218d017

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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