ETH Price: $2,124.50 (-2.60%)

Contract

0xc1b7f22d0bc15EDFeD4FcCDE5dCdd3CeeFa9717a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

ContractCreator

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Method Block
From
To
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CompFarmingSummaryV3

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2021-06-10
*/

pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

contract StringUtil {
    function compareStrings(string memory a, string memory b) internal pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

    function append(string memory a, string memory b) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b));
    }

    function append2(string memory a, string memory b, string memory c) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b, c));
    }

    function append3(string memory a, string memory b, string memory c, string memory d) internal pure returns (string memory) {
        return string(abi.encodePacked(a, b, c, d));
    }

    function bool2str(bool b) internal pure returns(string memory){
        if(b) return "true";

        return "false";
    }

    function address2str(address x) internal pure returns (string memory) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
            bytes1 hi = bytes1(uint8(b) / 16);
            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
            s[2*i] = char(hi);
            s[2*i+1] = char(lo);
        }
        return string(s);
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    function char(bytes1 b) internal pure returns (bytes1 c) {
        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
        else return bytes1(uint8(b) + 0x57);
    }
}

contract Constants {
    uint internal constant oneMantissa = 10**18;

    enum LoopControl {
        NONE,
        CONTINUE,
        BREAK
    }
}

contract CompoundAddresses {
      address internal constant cDAIAddr = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;
      address internal constant cETHAddr = 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5;
      address internal constant cUSDCAddr = 0x39AA39c021dfbaE8faC545936693aC917d5E7563;
      address internal constant cUSDTAddr = 0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9;
      address internal constant cWBTCAddr = 0xC11b1268C1A384e55C48c2391d8d480264A3A7F4;
      address internal constant cWBTC2Addr = 0xccF4429DB6322D5C611ee964527D42E5d685DD6a; //migrated at block number 12069867
      address internal constant cCOMPAddr = 0x70e36f6BF80a52b3B46b3aF8e106CC0ed743E8e4;
      address internal constant cSAIAddr = 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC;
      address internal constant compAddr = 0xc00e94Cb662C3520282E6f5717214004A7f26888;

      address internal constant compoundLensAddr = 0xd513d22422a3062Bd342Ae374b4b9c20E0a9a074;
      address internal constant comptrollerAddr = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B;
      address internal constant uniswapAnchoredViewAddr = 0x922018674c12a7F0D394ebEEf9B58F186CdE13c1;

      function getCWBTCAddr(uint blockNumber) public pure returns(address){
          if(blockNumber >= 12069867){
              return cWBTC2Addr;
          }

          return cWBTCAddr;
      }
}

contract ERC20Addresses {
      address internal constant usdtAddr = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
}

contract UniswapV2Addresses {
      address internal constant uniswapV2Router02Address = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
      address internal constant wETHAddr = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
}

contract ERC20 {

    uint8 public decimals;

    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function balanceOf(address owner) external view returns (uint);
    function transfer(address dst, uint amount) external returns (bool);
    function symbol() external view returns (string memory);

}

contract USDT_ERC20 {
    function approve(address spender, uint value) external;
}

contract Comptroller {
    struct Market {
           bool isListed;
           uint collateralFactorMantissa;
           bool isComped;
    }

    mapping(address => Market) public markets;
    mapping(address => uint) public compAccrued;


    uint public closeFactorMantissa;
    uint public liquidationIncentiveMantissa;
    address public oracle;
    function getAccountLiquidity(address account) public view returns (uint, uint, uint);
    function getAssetsIn(address account) external view returns (address[] memory);
    function compSpeeds(address cTokenAddress) external view returns(uint);
    function getAllMarkets() public view returns (CToken[] memory);


}

contract CToken is ERC20{
    address public underlying;
    uint public totalBorrows;
    uint public totalReserves;
    
    function mint(uint mintAmount) external returns (uint);
    function redeem(uint redeemTokens) external returns (uint);
    function exchangeRateStored() public view returns (uint);
    function balanceOfUnderlying(address owner) external returns (uint);
    function borrowBalanceStored(address account) public view returns (uint);
    function getCash() external view returns (uint);
    function totalBorrowsCurrent() external view returns (uint);
    function borrowRatePerBlock() external view returns (uint);
    function supplyRatePerBlock() external view returns (uint);
    function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint);
}

contract PriceOracle {
    function getUnderlyingPrice(CToken cToken) public view returns (uint);
}

contract UniswapAnchoredView {
    function price(string memory symbol) public view returns (uint);
}

contract CErc20 is CToken {
    address public underlying;
    function liquidateBorrow(address borrower, uint repayAmount, CToken cTokenCollateral) external returns (uint);
}

contract CompoundLens {

    struct CompBalanceMetadataExt{
            uint balance;
            uint votes;
            address delegate;
            uint allocated;
    }

    function getCompBalanceMetadataExt(Comp comp, ComptrollerLensInterface comptroller, address account) external returns (CompBalanceMetadataExt memory);

}

contract Comp {

}

interface ComptrollerLensInterface {

}

contract ERC20ErrorReporter {
    enum ERC20Error {
        NO_ERROR,
        TRANSFER_FROM_FAILED,
        APPROVE_FAILED,
        TRANSFER_FAILED
    }

    event fail(uint err);
}

contract ERC20Methods is ERC20ErrorReporter, ERC20Addresses{

    function getDecimals(address token) internal view returns(uint decimals){
        if(token == address(0)){
            return 18;
        }

        return ERC20(token).decimals();
    }

    function transferIn(address token, address from, address to, uint amount) internal returns(ERC20Error){

        if(!ERC20(token).transferFrom(from, to, amount)){
             emit fail(uint(ERC20Error.TRANSFER_FROM_FAILED));
             return ERC20Error.TRANSFER_FROM_FAILED;
        }

        return ERC20Error.NO_ERROR;
    }

    function transferOut(address token, address to, uint amount) internal returns(ERC20Error){
        ERC20 erc20 = ERC20(token);

        if(!erc20.approve(to, amount)){
             emit fail(uint(ERC20Error.APPROVE_FAILED));
             return ERC20Error.APPROVE_FAILED;
        }

        if(!erc20.transfer(to, amount)){
             emit fail(uint(ERC20Error.TRANSFER_FAILED));
             return ERC20Error.TRANSFER_FAILED;
        }

        return ERC20Error.NO_ERROR;
    }

    //works with ETH and ERC20
    function balanceOf(address tokenAddr, address accAddr) internal view returns(uint){
        //for ETH
        if(tokenAddr == address(0)){
            return accAddr.balance;
        }

        return ERC20(tokenAddr).balanceOf(accAddr);
    }

    //works with standard and non-standard ERC20
    function approve(address tokenAddr, address spender, uint256 amount) internal returns(bool){
        if(tokenAddr == usdtAddr){
             USDT_ERC20(usdtAddr).approve(spender, 0);
             USDT_ERC20(usdtAddr).approve(spender, amount);
             return true;
        }

        return ERC20(tokenAddr).approve(spender, amount);
    }
}

contract CompoundMethodsErrorReporter {
    enum CompoundMethodsError {
        NO_ERROR,
        Liquidation_Failed,
        APPROVE_FAILED,
        Redeem_Failed
    }

    event fail(uint err);
    event fail(uint err, uint detail);
}

contract CompoundMethods is CompoundMethodsErrorReporter, ERC20Methods, CompoundAddresses, UniswapV2Addresses, Constants, StringUtil{
      using SafeMath for uint;

      function cmp_redeemUnderlying(address cToken, uint amount) internal returns(CompoundMethodsError err){
          uint error_redeem = CToken(cToken).redeem(amount);
          if(error_redeem != 0){
              emit fail(uint(CompoundMethodsError.Redeem_Failed), error_redeem);
              return CompoundMethodsError.Redeem_Failed;
          }

          return CompoundMethodsError.NO_ERROR;
      }

      function cmp_liquidateBorrow(address cTokenBorrowed, address underlyingBorrowed, address borrower, uint repayAmount, CToken cTokenCollateral) internal returns(CompoundMethodsError err){
          //approve USDT won't work
          if(!approve(underlyingBorrowed, cTokenBorrowed, repayAmount)){
              emit fail(uint(CompoundMethodsError.APPROVE_FAILED));
              return CompoundMethodsError.APPROVE_FAILED;
          }

          //liquidate
          uint err_liquidateBorrow = CErc20(cTokenBorrowed).liquidateBorrow(borrower, repayAmount, cTokenCollateral);
          if(err_liquidateBorrow != 0){
              emit fail(uint(CompoundMethodsError.APPROVE_FAILED), err_liquidateBorrow);
              return CompoundMethodsError.APPROVE_FAILED;
          }

          return CompoundMethodsError.NO_ERROR;
      }

      function cmp_getUnderlyingAddr(address cTokenAddr) internal view returns(address underlyingAddr) {
          if(cTokenAddr == cETHAddr){
              return address(0);
          }

          underlyingAddr = CToken(cTokenAddr).underlying();

          return underlyingAddr;
      }


      function cmp_underlyingValueInUSD(uint underlyingBalance, address cTokenAddr) internal view returns(uint valueInUSD){

          uint underlyingDecimals = cmp_getUnderlyingDecimals(cTokenAddr);
          valueInUSD = cmp_getUnderlyingPriceInUSD(cTokenAddr).mul(underlyingBalance).div(10**underlyingDecimals);

          return valueInUSD;
      }

      function cmp_getUnderlyingPriceInUSD(address cTokenAddr) internal view returns (uint priceInUSD){

            address oracleAddr = Comptroller(comptrollerAddr).oracle();

            if(cTokenAddr == cUSDCAddr || cTokenAddr == cUSDTAddr){
                priceInUSD = oneMantissa;
                return priceInUSD;
            }

            if(cTokenAddr == cWBTC2Addr || cTokenAddr == cWBTCAddr){
                priceInUSD = PriceOracle(oracleAddr).getUnderlyingPrice(CToken(cTokenAddr)).div(10**10);
                return priceInUSD;
            }

            priceInUSD = PriceOracle(oracleAddr).getUnderlyingPrice(CToken(cTokenAddr));
            return priceInUSD;
      }

      function cmp_getPriceInUSDByUnderlyingAddr(address underlyingAddr) internal view returns(uint underlyingPriceInUSD){
          string memory symbol = ERC20(underlyingAddr).symbol();
          if(compareStrings(symbol, "wBTC")){
              symbol = "BTC";
          }

          return cmp_getPriceBySymbol(symbol).mul(10**12);
      }

      function cmp_getPriceBySymbol(string memory symbol) internal view returns(uint priceInUSDMantissa6){
          return UniswapAnchoredView(uniswapAnchoredViewAddr).price(symbol);
      }

      function cmp_getUnderlyingSymbol(address cTokenAddr) internal view returns(string memory getUnderlyingSymbol){
          if(cTokenAddr == cETHAddr) return "ETH";

          if(cTokenAddr == cSAIAddr) return "SAI";

          return ERC20(CToken(cTokenAddr).underlying()).symbol();
      }

      function cmp_getUnderlyingDecimals(address cTokenAddr) internal view returns(uint decimals){
          if(cTokenAddr == cETHAddr){
               decimals = 18;
               return decimals;
          }

          address underlyingAddr = cmp_getUnderlyingAddr(cTokenAddr);
          decimals = ERC20(underlyingAddr).decimals();
          return decimals;
      }

      //not tested
      function cmp_getTotalSupplyInUSD(address cTokenAddr) internal view returns(uint totalSupplyInUSD){
          return cmp_underlyingValueInUSD(cmp_getTotalSupply(cTokenAddr), cTokenAddr);
      }

      function cmp_getTotalSupply(address cTokenAddr) internal view returns(uint totalSupply){
          CToken cToken = CToken(cTokenAddr);
          uint cash = cToken.getCash();
          uint totalBorrow = cToken.totalBorrows();
          uint totalReserves = cToken.totalReserves();

          return cash.add(totalBorrow).sub(totalReserves);
      }

      function cmp_getCompDistSpeedPerBlock(address cTokenAddr) internal view returns(uint compDistSpeedPerBlock){
          Comptroller comptroller = Comptroller(comptrollerAddr);
          return comptroller.compSpeeds(cTokenAddr);
      }


      function cmp_getCompDistAmount(address cTokenAddr, uint numberOfBlocks) internal view returns(uint compDistAmount){
          return cmp_getCompDistSpeedPerBlock(cTokenAddr).mul(numberOfBlocks);
      }

      function cmp_getCurrentCTokenAddrList() internal view returns(address[] memory cTokenAddrList){
            Comptroller comptroller = Comptroller(comptrollerAddr);
            CToken[] memory allMarkets = comptroller.getAllMarkets();

            cTokenAddrList = new address[](cmp_getNumberOfCurrentCTokens(allMarkets));

            CToken eachCToken;
            uint index;
            for(uint i = 0; i < allMarkets.length; i++){
                eachCToken = allMarkets[i];

                if(!cmp_isCurrentCToken(address(eachCToken))) continue;

                cTokenAddrList[index] = address(eachCToken);
                index++;
            }

            return cTokenAddrList;
      }

      function cmp_getCurrentCTokenSymbolList() internal view returns(string[] memory cTokenSymbolList){
            Comptroller comptroller = Comptroller(comptrollerAddr);
            CToken[] memory allMarkets = comptroller.getAllMarkets();

            cTokenSymbolList = new string[](cmp_getNumberOfCurrentCTokens(allMarkets));

            CToken eachCToken;
            uint index;
            for(uint i = 0; i < allMarkets.length; i++){
                eachCToken = allMarkets[i];

                if(!cmp_isCurrentCToken(address(eachCToken))) continue;

                cTokenSymbolList[index] = eachCToken.symbol();
                index++;
            }

            return cTokenSymbolList;
      }



      function cmp_isCurrentCToken(address cTokenAddr) internal view returns(bool){
          bool isListed;
          bool isComped;

          Comptroller comptroller = Comptroller(comptrollerAddr);
          (isListed, , isComped) = comptroller.markets(cTokenAddr);

          if(isListed && isComped) return true;

          return false;
      }

      function cmp_getNumberOfCurrentCTokens(CToken[] memory allMarkets) internal view returns(uint numberOfCurrentCTokens){

          for(uint i = 0; i < allMarkets.length; i++){
              if(cmp_isCurrentCToken(address(allMarkets[i]))) numberOfCurrentCTokens++;
          }

          return numberOfCurrentCTokens;
      }

      function cmp_getPercentageOfStakeOnSupplyMantissa(address acc, address cTokenAddr) internal view returns(uint percentageOfStakeOnSupplyMantissa){

          uint supplyByTheAcc = cmp_getUnderlyingBalanceOfAnAcc(acc, cTokenAddr);

          return cmp_calPercentageOfStakeOnSupplyMantissa(cTokenAddr, supplyByTheAcc);
      }

      function cmp_calPercentageOfStakeOnSupplyMantissa(address cTokenAddr, uint supplyByTheAcc) internal view returns(uint percentageOfStakeOnSupplyMantissa){
          uint totalSupply = cmp_getTotalSupply(cTokenAddr);

          return supplyByTheAcc.mul(oneMantissa).div(totalSupply);
      }

      function cmp_getPercentageOfStakeOnBorrowMantissa(address acc, address cTokenAddr) internal view returns(uint percentageOfStakeOnBorrowMantissa){

          uint err;
          uint borrowByTheAcc;

          (err, ,borrowByTheAcc, ) = CToken(cTokenAddr).getAccountSnapshot(acc);

          if(err != 0){
              return 0;
          }

          return cmp_calPercentageOfStakeOnBorrowMantissa(cTokenAddr, borrowByTheAcc);
      }

      function cmp_calPercentageOfStakeOnBorrowMantissa(address cTokenAddr, uint borrowByTheAcc) internal view returns(uint percentageOfStakeOnBorrowMantissa){

          uint totalBorrow = CToken(cTokenAddr).totalBorrows();

          return borrowByTheAcc.mul(oneMantissa).div(totalBorrow);
      }

      function cmp_getUnderlyingBalanceOfAnAcc(address acc, address cTokenAddr) internal view returns(uint underlyingBalanceOfAnAcc){
          CToken cToken = CToken(cTokenAddr);
          return cToken.balanceOf(acc).mul(cToken.exchangeRateStored()).div(oneMantissa);
      }

      function cmp_getBorrowedTokenList(address acc) internal view returns(address[] memory borrowedCTokenList){
          CToken[] memory allMarkets = Comptroller(comptrollerAddr).getAllMarkets();

          uint length;
          for(uint i = 0; i < allMarkets.length; i++){
//require(false, uint2str(CToken(cDAIAddr).borrowBalanceStored(acc)));
              if(allMarkets[i].borrowBalanceStored(acc) == 0) continue;

              length++;
          }

          borrowedCTokenList = new address[](length);

          uint index;
          for(uint i = 0; i < allMarkets.length; i++){
              if(allMarkets[i].borrowBalanceStored(acc) == 0) continue;

              borrowedCTokenList[index] = address(allMarkets[i]);
              index++;
          }

          return borrowedCTokenList;
      }

      function cmp_getCollateralFactorMantissa(address cTokenAddr) internal view returns(uint collateralFactorMantissa){
          bool isListed;

          (isListed, collateralFactorMantissa, ) = Comptroller(comptrollerAddr).markets(cTokenAddr);

          if(!isListed) return 0;

          return collateralFactorMantissa;
      }



}

contract ArrayUtil {
      
      function quickSortDESC(string[] memory keys, uint[] memory values) internal pure returns (string[] memory, uint[] memory){

            string[] memory keysPlus = new string[](keys.length + 1);
            uint[] memory valuesPlus = new uint[](values.length + 1);

            for(uint i = 0; i < keys.length; i++){
                keysPlus[i] = keys[i];
                valuesPlus[i] = values[i];
            }

            (keysPlus, valuesPlus) = quickSort(keysPlus, valuesPlus, 0, keysPlus.length - 1);

            string[] memory keys_desc = new string[](keys.length);
            uint[] memory values_desc = new uint[](values.length);
            for(uint i = 0; i < keys.length; i++){
                keys_desc[keys.length - 1 - i] = keysPlus[i + 1];
                values_desc[keys.length - 1 - i] = valuesPlus[i + 1];
            }

            return (keys_desc, values_desc);
      }

      function quickSort(string[] memory keys, uint[] memory values, uint left, uint right) internal pure returns (string[] memory, uint[] memory){
            uint i = left;
            uint j = right;
            uint pivot = values[left + (right - left) / 2];
            while (i <= j) {
                while (values[i] < pivot) i++;
                while (pivot < values[j]) j--;
                if (i <= j) {
                    (keys[i], keys[j]) = (keys[j], keys[i]);
                    (values[i], values[j]) = (values[j], values[i]);
                    i++;
                    j--;
                }
            }
            if (left < j)
                quickSort(keys, values, left, j);

            if (i < right)
                quickSort(keys, values, i, right);

                return (keys, values);
      }
}

contract Logging is StringUtil{

    function debug(string memory name, string[] memory values) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr;

        for(uint i = 0; i < values.length; i++){
            valueStr = append(valueStr, values[i]);
            valueStr = append(valueStr, ", ");
        }

        require(false, append(log_name, valueStr));
    }

    function debug(string memory name, address[] memory values) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr;

        for(uint i = 0; i < values.length; i++){
            valueStr = append(valueStr, address2str(values[i]));
            valueStr = append(valueStr, ", ");
        }

        require(false, append(log_name, valueStr));
    }

    function debug(string memory name, uint[] memory values) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr;

        for(uint i = 0; i < values.length; i++){
            valueStr = append(valueStr, uint2str(values[i]));
            valueStr = append(valueStr, ", ");
        }

        require(false, append(log_name, valueStr));
    }

    function debug(string memory name, string memory value) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr = value;

        require(false, append(log_name, valueStr));
    }

    function debug(string memory name, address value) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr = address2str(value);

        require(false, append(log_name, valueStr));
    }

    function debug(string memory name, uint value) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr = uint2str(value);

        require(false, append(log_name, valueStr));
    }

    function debug(string memory name, bool value) internal pure{
        string memory log_name = append(name, ": ");
        string memory valueStr = bool2str(value);

        require(false, append(log_name, valueStr));
    }



    event log(string name, address value);
    event log(string name, uint value);
    event log(string name, string value);
    event log(string name, bool value);
    event log(string name, uint[] value);
    event log(string name, address[] value);

}

contract CompFarmingSummaryV3Model is CompoundMethods, ArrayUtil{
    uint256 constant public MAX_INT_NUMBER = 115792089237316195423570985008687907853269984665640564039457584007913129639935;

    enum LiquidationRiskRanking{
        ZERO_RISK,
        INTEREST_RISK_ONLY,
        PRICE_MOVEMENT_RISK
    }

    struct CompProfile{
         uint balance;
         uint yetToClaimed;
    }

    struct AccountInterestProfile{
        CTokenInterest[] supplyInterests;
        CTokenInterest[] borrowInterests;

        uint totalInterestInUSD_;
        bool isPositiveInterest_;
    }

    struct CTokenInterest{
        address cTokenAddr;
        uint interestRateMantissa;
        uint balance;
        uint numberOfBlocks;

        string underlyingSymbol_;
        uint interestInUSD_;
    }

    struct AccountProfile{
        SupplyAsset[] suppliedAssets;
        BorrowAsset[] borrowedAssets;

        uint totalSuppliedInUSD_;
        uint totalBorrowedInUSD_;
        uint totalSuppliedInUsdAsCollateral_;
        uint borrowLimitPCTMantissa_;
        uint accountCapital_;

        uint[] borrowLimitPCTLineItemMantissaList;
    }

    struct SupplyAsset{
        Asset asset;

        uint collateralFactorMantissa_;
        uint suppliedInUsdAsCollateral_;
    }

    struct BorrowAsset{
        Asset asset;
    }

    struct Asset{
        address cTokenAddr;
        uint amount;

        string underlyingSymbol_;
        uint underlyingDecimals_;
        uint valueInUSD_;
        uint compSpeed_;
    }

    function createCTokenInterest(address cTokenAddr, uint interestRateMantissa, uint balance, uint numberOfBlocks) internal view returns(CTokenInterest memory cTokenInterest){
        cTokenInterest.cTokenAddr = cTokenAddr;
        cTokenInterest.interestRateMantissa = interestRateMantissa;
        cTokenInterest.balance = balance;
        cTokenInterest.numberOfBlocks = numberOfBlocks;

        refreshCTokenInterest(cTokenInterest);

        return cTokenInterest;
    }

    function refreshCTokenInterest(CTokenInterest memory cTokenInterest) internal view{
        cTokenInterest.underlyingSymbol_ = cmp_getUnderlyingSymbol(cTokenInterest.cTokenAddr);
        cTokenInterest.interestInUSD_ = cmp_underlyingValueInUSD(cTokenInterest.balance.mul(cTokenInterest.interestRateMantissa), cTokenInterest.cTokenAddr).mul(cTokenInterest.numberOfBlocks).div(oneMantissa);
    }

    function createAccountInterestProfile(CTokenInterest[] memory supplyInterests, CTokenInterest[] memory borrowInterests) internal pure returns(AccountInterestProfile memory accountInterestProfile){
        accountInterestProfile.supplyInterests = supplyInterests;
        accountInterestProfile.borrowInterests = borrowInterests;

        refreshAccountInterestProfile(accountInterestProfile);

        return accountInterestProfile;
    }

    function refreshAccountInterestProfile(AccountInterestProfile memory accountInterestProfile) internal pure {
        uint totalSupplyInterestInUSD;
        uint totalBorrowInterestInUSD;

        for(uint i = 0; i < accountInterestProfile.supplyInterests.length; i++){
            totalSupplyInterestInUSD += accountInterestProfile.supplyInterests[i].interestInUSD_;
        }

        for(uint i = 0; i < accountInterestProfile.borrowInterests.length; i++){
            totalBorrowInterestInUSD += accountInterestProfile.borrowInterests[i].interestInUSD_;
        }

        if(totalSupplyInterestInUSD > totalBorrowInterestInUSD){
            accountInterestProfile.totalInterestInUSD_ = totalSupplyInterestInUSD.sub(totalBorrowInterestInUSD);
            accountInterestProfile.isPositiveInterest_ = true;
        }

        if(totalSupplyInterestInUSD <= totalBorrowInterestInUSD){
            accountInterestProfile.totalInterestInUSD_ = totalBorrowInterestInUSD.sub(totalSupplyInterestInUSD);
            accountInterestProfile.isPositiveInterest_ = false;
        }
    }

    function createSupplyAsset(address cTokenAddr, uint amount) internal view returns(SupplyAsset memory supplyAsset){
        Asset memory asset = createAsset(cTokenAddr, amount);
        supplyAsset.asset = asset;

        refreshSupplyAsset(supplyAsset);

        return supplyAsset;
    }

    function createBorrowAsset(address cTokenAddr, uint amount) internal view returns(BorrowAsset memory borrowAsset){
        Asset memory asset = createAsset(cTokenAddr, amount);
        borrowAsset.asset = asset;

        return borrowAsset;
    }

    function updateSupplyAssetAmount(SupplyAsset memory supplyAsset, uint newAmount) internal view{
        supplyAsset.asset.amount = newAmount;

        refreshAsset(supplyAsset.asset);
        refreshSupplyAsset(supplyAsset);
    }

    function updateBorrowAssetAmount(BorrowAsset memory borrowAsset, uint newAmount) internal view{
        borrowAsset.asset.amount = newAmount;

        refreshAsset(borrowAsset.asset);
    }

    function refreshSupplyAsset(SupplyAsset memory supplyAsset) internal view{
        supplyAsset.collateralFactorMantissa_ = cmp_getCollateralFactorMantissa(supplyAsset.asset.cTokenAddr);
        supplyAsset.suppliedInUsdAsCollateral_ = supplyAsset.asset.valueInUSD_.mul(supplyAsset.collateralFactorMantissa_).div(oneMantissa);
    }

    function createAsset(address cTokenAddr, uint amount) internal view returns(Asset memory asset){
        updateAsset(asset, cTokenAddr, amount);

        return asset;
    }

    function updateAsset(Asset memory asset, address cTokenAddr, uint amount) internal view{
        asset.cTokenAddr = cTokenAddr;
        asset.amount = amount;

        refreshAsset(asset);
    }

    function refreshAsset(Asset memory asset) internal view{
        asset.underlyingSymbol_ = cmp_getUnderlyingSymbol(asset.cTokenAddr);
        asset.underlyingDecimals_ = cmp_getUnderlyingDecimals(asset.cTokenAddr);
        asset.valueInUSD_ = cmp_underlyingValueInUSD(asset.amount, asset.cTokenAddr);
        asset.compSpeed_ = cmp_getCompDistSpeedPerBlock(asset.cTokenAddr);
    }

    function createAccountProfile(SupplyAsset[] memory suppliedAssets, BorrowAsset[] memory borrowedAssets) internal pure returns(AccountProfile memory accountProfile){
        accountProfile.suppliedAssets = suppliedAssets;
        accountProfile.borrowedAssets = borrowedAssets;

        refreshAccountProfile(accountProfile);
    }

    function refreshAccountProfile(AccountProfile memory accountProfile) internal pure{
        accountProfile.totalSuppliedInUSD_ = calTotalSuppliedInUSD(accountProfile.suppliedAssets);
        accountProfile.totalBorrowedInUSD_ = calTotalBorrowedInUSD(accountProfile.borrowedAssets);
        accountProfile.totalSuppliedInUsdAsCollateral_ = calTotalSuppliedInUsdAsCollateral(accountProfile.suppliedAssets);
        accountProfile.accountCapital_ = calAccountCapital(accountProfile.totalSuppliedInUSD_, accountProfile.totalBorrowedInUSD_);
        accountProfile.borrowLimitPCTMantissa_ = calBorrowLimitPCTMantissa(accountProfile.totalSuppliedInUsdAsCollateral_, accountProfile.totalBorrowedInUSD_);
        accountProfile.borrowLimitPCTLineItemMantissaList = calBorrowLimitPCTLineItemMantissaList(accountProfile.suppliedAssets, accountProfile.borrowedAssets);
    }

    function calTotalSuppliedInUSD(SupplyAsset[] memory suppliedAssets) internal pure returns(uint totalSuppliedInUSD){
        for(uint i = 0; i < suppliedAssets.length; i++){
            totalSuppliedInUSD += suppliedAssets[i].asset.valueInUSD_;
        }

        return totalSuppliedInUSD;
    }

    function calTotalBorrowedInUSD(BorrowAsset[] memory borrowedAssets) internal pure returns(uint totalBorrowedInUSD){
        for(uint i = 0; i < borrowedAssets.length; i++){
            totalBorrowedInUSD += borrowedAssets[i].asset.valueInUSD_;
        }

        return totalBorrowedInUSD;
    }

    function calTotalSuppliedInUsdAsCollateral(SupplyAsset[] memory suppliedAssets) internal pure returns(uint totalSuppliedInUsdAsCollateral){
        for(uint i = 0; i < suppliedAssets.length; i++){
            totalSuppliedInUsdAsCollateral += suppliedAssets[i].suppliedInUsdAsCollateral_;
        }

        return totalSuppliedInUsdAsCollateral;
    }

    function calBorrowLimitPCTMantissa(uint totalSuppliedInUsdAsCollateral, uint totalBorrowedInUSD) internal pure returns(uint borrowLimitPCTMantissa){
        if(totalSuppliedInUsdAsCollateral == 0) return oneMantissa;

        return totalBorrowedInUSD.mul(oneMantissa).div(totalSuppliedInUsdAsCollateral);
    }

    function calBorrowLimitPCTLineItemMantissaList(SupplyAsset[] memory suppliedAssets, BorrowAsset[] memory borrowedAssets) internal pure returns(uint[] memory borrowLimitPCTLineItemMantissaList){

        borrowLimitPCTLineItemMantissaList = new uint[](suppliedAssets.length);

        bool _hasFound;
        BorrowAsset memory _borrowedAsset;

        for(uint i = 0; i < suppliedAssets.length; i++){
            (_hasFound, _borrowedAsset) = findBorrowedAssetBycTokenAddr(suppliedAssets[i].asset.cTokenAddr, borrowedAssets);

            if(suppliedAssets[i].suppliedInUsdAsCollateral_ == 0){
                borrowLimitPCTLineItemMantissaList[i] = MAX_INT_NUMBER;
            }

            if(!_hasFound){
                borrowLimitPCTLineItemMantissaList[i] = 0;
                continue;
            }

            if(suppliedAssets[i].suppliedInUsdAsCollateral_ != 0){
                borrowLimitPCTLineItemMantissaList[i] = _borrowedAsset.asset.valueInUSD_.mul(oneMantissa).div(suppliedAssets[i].suppliedInUsdAsCollateral_);
            }

        }

        return borrowLimitPCTLineItemMantissaList;
    }

    function calAccountCapital(uint totalSuppliedInUSD, uint totalBorrowedInUSD) internal pure returns(uint accountCapital){
        if(totalSuppliedInUSD > totalBorrowedInUSD){
            return totalSuppliedInUSD.sub(totalBorrowedInUSD);
        }

        return 0;
    }

    function findBorrowedAssetBycTokenAddr(address cTokenAddr, BorrowAsset[] memory borrowedAssets) internal pure returns(bool hasFound, BorrowAsset memory borrowAsset){
        for(uint i = 0; i < borrowedAssets.length; i++){
            if(borrowedAssets[i].asset.cTokenAddr == cTokenAddr) return (true, borrowedAssets[i]);
        }

        return (false, borrowAsset);
    }

    function addSuppliedAsset(AccountProfile memory accountProfile, SupplyAsset memory supplyAsset) internal view{

        for(uint i = 0; i < accountProfile.suppliedAssets.length; i++){
            if(accountProfile.suppliedAssets[i].asset.cTokenAddr != supplyAsset.asset.cTokenAddr) continue;

            updateSupplyAssetAmount(accountProfile.suppliedAssets[i], accountProfile.suppliedAssets[i].asset.amount.add(supplyAsset.asset.amount));
            refreshAccountProfile(accountProfile);

            return;
        }

        //if not matching existing supplyAsset found
        uint length = accountProfile.suppliedAssets.length.add(1);
        SupplyAsset[] memory newSupplyAsset = new SupplyAsset[](length);

        for(uint i = 0; i < accountProfile.suppliedAssets.length; i++){
            newSupplyAsset[i] = accountProfile.suppliedAssets[i];
        }

        newSupplyAsset[length-1] = supplyAsset;
        accountProfile.suppliedAssets = newSupplyAsset;

        refreshAccountProfile(accountProfile);
    }

    function addBorrowAsset(AccountProfile memory accountProfile, BorrowAsset memory borrowAsset) internal view{
        for(uint i = 0; i < accountProfile.borrowedAssets.length; i++){
            if(accountProfile.borrowedAssets[i].asset.cTokenAddr != borrowAsset.asset.cTokenAddr) continue;

            updateBorrowAssetAmount(accountProfile.borrowedAssets[i], accountProfile.borrowedAssets[i].asset.amount.add(borrowAsset.asset.amount));
            refreshAccountProfile(accountProfile);

            return;
        }

        uint length = accountProfile.borrowedAssets.length.add(1);
        BorrowAsset[] memory newBorrowAssets = new BorrowAsset[](length);

        for(uint i = 0; i < accountProfile.borrowedAssets.length; i++){
            newBorrowAssets[i] = accountProfile.borrowedAssets[i];
        }

        newBorrowAssets[length-1] = borrowAsset;

        accountProfile.borrowedAssets = newBorrowAssets;
        refreshAccountProfile(accountProfile);

    }

    function findSuppliedAsset(address cTokenAddr, SupplyAsset[] memory supplyAssets) internal pure returns(bool hasFound, SupplyAsset memory supplyAsset){
        for(uint i = 0; i < supplyAssets.length; i++){
            if(cTokenAddr == supplyAssets[i].asset.cTokenAddr){
                return (true, supplyAssets[i]);
            }
        }

        return (false, supplyAsset);
    }

    function findBorrowAsset(address cTokenAddr, BorrowAsset[] memory borrowAssets) internal pure returns(bool hasFound, BorrowAsset memory borrowAsset){
        for(uint i = 0; i < borrowAssets.length; i++){
            if(cTokenAddr == borrowAssets[i].asset.cTokenAddr){
                return (true, borrowAssets[i]);
            }
        }

        return (false, borrowAsset);
    }

    function removeEmptySupplyAsset(SupplyAsset[] memory supplyAssets) internal pure returns(SupplyAsset[] memory newSupplyAssets){
        uint length;

        for(uint i = 0; i < supplyAssets.length; i++){
            if(supplyAssets[i].asset.valueInUSD_ == 0) continue;

            length++;
        }

        newSupplyAssets = new SupplyAsset[](length);
        uint index;

        for(uint i = 0; i < supplyAssets.length; i++){
            if(supplyAssets[i].asset.valueInUSD_ == 0) continue;

            newSupplyAssets[index] = supplyAssets[i];
            index++;
        }

        return newSupplyAssets;
    }

    function removeEmptyBorrowAsset(BorrowAsset[] memory borrowAssets) internal pure returns(BorrowAsset[] memory newBorrowAssets){
        uint length;

        for(uint i = 0; i < borrowAssets.length; i++){
            if(borrowAssets[i].asset.valueInUSD_ == 0) continue;

            length++;
        }

        newBorrowAssets = new BorrowAsset[](length);
        uint index;

        for(uint i = 0; i < borrowAssets.length; i++){
            if(borrowAssets[i].asset.valueInUSD_ == 0) continue;

            newBorrowAssets[index] = borrowAssets[i];
            index++;
        }

        return newBorrowAssets;
    }


}

contract CompFarmingSummaryV3 is CompFarmingSummaryV3Model{

    string constant public version = "v3";
    uint constant internal n80PCTMantissa = 800000000000000000;
    uint constant internal n1PCTMantissa = 10000000000000000;

    uint constant internal borrowLimitPCTDelta = 50000000000000000;

    function getCompProfile(address acc) external returns(CompProfile memory compProfile){
        return getCompProfileInternal(acc);
    }

    function getCOMPPriceInUSD() public view returns(uint compPriceInUSD){
        return cmp_getUnderlyingPriceInUSD(cCOMPAddr);
    }
    //bulk testing required
    function getTotalCompReceivable(address acc, uint numberOfBlocks) public view returns(uint totalCompReceivable){
        return getTotalCompReceivableInternal(acc, numberOfBlocks);
    }

    function getTotalCompReceivablByAP(AccountProfile memory accountProfile, uint numberOfBlocks) public view returns(uint compReceivable){
        return getTotalCompReceivableInternal(accountProfile, numberOfBlocks);
    }
    //bulk testing done
    function getAccountProfile(address acc) external view returns(AccountProfile memory accountProfile){
        return getAccountProfileInternal(acc);
    }

    function getAccountInterestProfile(address acc, uint numberOfBlocks) external view returns(AccountInterestProfile memory accountInterestProfile){
        return getAccountInterestProfileInternal(acc, numberOfBlocks);
    }

    function getFarmingAccountProfileByAP(AccountProfile memory accountProfile, uint targetedBorrowLimitPCTMantissa) public view returns(bool isValidated, AccountProfile memory farmingAccountProfile){
        return getFarmingAccountProfileInternal(accountProfile, targetedBorrowLimitPCTMantissa);
    }

    function getAccountInterestProfileByAP(AccountProfile memory accountProfile, uint numberOfBlocks) public view returns(AccountInterestProfile memory accountInterestProfile){
        return getAccountInterestProfileInternal(accountProfile, numberOfBlocks);
    }
    //bulk testing done
    function getLiquidationRiskRanking(address acc) external view returns(LiquidationRiskRanking liquidationRiskRanking){
        return getLiquidationRiskRankingInternal(acc);
    }

    function getLiquidationRiskRankingByAP(AccountProfile memory accountProfile) public view returns(LiquidationRiskRanking liquidationRiskRanking){
        return getLiquidationRiskRankingInternal(accountProfile);
    }

    function getMaxInterestAccountProfileByAP(AccountProfile memory accountProfile) public view returns(bool isValidated, AccountProfile memory maxInterestAccountProfile){
        return getMaxInterestAccountProfileInternal(accountProfile);
    }

    //internal functions below
    function getTotalCompReceivableInternal(address acc, uint numberOfBlocks) internal view returns(uint compReceivable){
        return getTotalCompReceivableInternal(getAccountProfileInternal(acc), numberOfBlocks);
    }

    function getCompReceivableOfCToken(uint supplyByTheAcc, uint borrowByTheAcc, address cTokenAddr, uint numberOfBlocks) internal view returns(uint compReceivableByCToken){

        uint compDistAmount = cmp_getCompDistAmount(cTokenAddr, numberOfBlocks);
        uint percentageOfStakeOnSupplyMantissa = cmp_calPercentageOfStakeOnSupplyMantissa(cTokenAddr, supplyByTheAcc);
        uint percentageOfStakeOnBorrowMantissa = cmp_calPercentageOfStakeOnBorrowMantissa(cTokenAddr, borrowByTheAcc);
        uint decimals = cmp_getUnderlyingDecimals(cCOMPAddr);

        //formula: compDistAmount * (stakeSupplied + stakeBorrowed)
        compReceivableByCToken = compDistAmount.mul(percentageOfStakeOnSupplyMantissa.add(percentageOfStakeOnBorrowMantissa)).div(10**decimals);

        return compReceivableByCToken;
    }


    function getTotalCompReceivableInternal(AccountProfile memory accountProfile, uint numberOfBlocks) internal view returns(uint compReceivable){
        SupplyAsset[] memory suppliedAssets = accountProfile.suppliedAssets;
        BorrowAsset[] memory borrowedAssets = accountProfile.borrowedAssets;

        for(uint i = 0; i < suppliedAssets.length; i++){
            compReceivable += getCompReceivableOfCToken(suppliedAssets[i].asset.amount, 0, suppliedAssets[i].asset.cTokenAddr, numberOfBlocks);
        }

        for(uint i = 0; i < borrowedAssets.length; i++){
            compReceivable += getCompReceivableOfCToken(0, borrowedAssets[i].asset.amount, borrowedAssets[i].asset.cTokenAddr, numberOfBlocks);
        }

        return compReceivable;
    }

    function getCompProfileInternal(address acc) internal returns(CompProfile memory compProfile){

        compProfile.balance = ERC20(compAddr).balanceOf(acc);

        CompoundLens compoundLens = CompoundLens(compoundLensAddr);
        compProfile.yetToClaimed = compoundLens.getCompBalanceMetadataExt(Comp(compAddr), ComptrollerLensInterface(comptrollerAddr), acc).allocated;

    }

    function getAccountProfileInternal(address acc) internal view returns(AccountProfile memory accountProfile){

        SupplyAsset[] memory suppliedAssets = getSuppliedAssets(acc);
        BorrowAsset[] memory borrowedAssets = getBorrowedAssets(acc);

        return createAccountProfile(suppliedAssets, borrowedAssets);
    }

    function getSuppliedAssets(address acc) internal view returns(SupplyAsset[] memory suppliedAssets){
        address[] memory suppliedCTokenAddrList = Comptroller(comptrollerAddr).getAssetsIn(acc);
        suppliedAssets = new SupplyAsset[](suppliedCTokenAddrList.length);

        for(uint i = 0; i < suppliedCTokenAddrList.length; i++){
            //filter out cSAI
            //if(suppliedCTokenAddrList[i] == 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC) continue;
            suppliedAssets[i] = createSupplyAsset(suppliedCTokenAddrList[i], cmp_getUnderlyingBalanceOfAnAcc(acc, suppliedCTokenAddrList[i]));
        }

        suppliedAssets = removeEmptySupplyAsset(suppliedAssets);

        return suppliedAssets;
    }

    function getBorrowedAssets(address acc) internal view returns(BorrowAsset[] memory borrowedAssets){
        address[] memory borrowedCTokenList = cmp_getBorrowedTokenList(acc);

        borrowedAssets = new BorrowAsset[](borrowedCTokenList.length);

        for(uint i = 0; i < borrowedCTokenList.length; i++){
            borrowedAssets[i] = createBorrowAsset(borrowedCTokenList[i], CToken(borrowedCTokenList[i]).borrowBalanceStored(acc));
        }

        borrowedAssets = removeEmptyBorrowAsset(borrowedAssets);

        return borrowedAssets;
    }


    function getFarmingAccountProfileInternal(AccountProfile memory accountProfile, uint targetedBorrowLimitPCTMantissa) internal view returns(bool isValidated, AccountProfile memory farmingAccountProfile){
        //liquidation risk ranking needs to be lower or equials to 2
        if(uint(getLiquidationRiskRankingInternal(accountProfile)) > 1) return (false, farmingAccountProfile);

        //each supplied asset, run borrowANDsupplym check util borrowLimitsPCTPerAsset hits 80%withDelta
        SupplyAsset[] memory suppliedAssets = accountProfile.suppliedAssets;

        for(uint i = 0; i < suppliedAssets.length; i++){

              if(suppliedAssets[i].collateralFactorMantissa_ == 0) continue;

              uint maxBorrowAmount;
              BorrowAsset memory moreBorrowAsset;
              SupplyAsset memory moreSupplyAsset;

              while(accountProfile.borrowLimitPCTLineItemMantissaList[i] <= targetedBorrowLimitPCTMantissa.sub(n1PCTMantissa)){
                  maxBorrowAmount = suppliedAssets[i].asset.amount.mul(suppliedAssets[i].collateralFactorMantissa_).mul(targetedBorrowLimitPCTMantissa.sub(accountProfile.borrowLimitPCTLineItemMantissaList[i])).div(oneMantissa).div(oneMantissa);
                  moreBorrowAsset = createBorrowAsset(suppliedAssets[i].asset.cTokenAddr, maxBorrowAmount);
                  moreSupplyAsset = createSupplyAsset(suppliedAssets[i].asset.cTokenAddr, maxBorrowAmount);

                  addBorrowAsset(accountProfile, moreBorrowAsset);
                  addSuppliedAsset(accountProfile, moreSupplyAsset);

              }
        }

        return (true, accountProfile);
    }

    function getAccountInterestProfileInternal(address acc, uint numberOfBlocks) internal view returns(AccountInterestProfile memory accountInterestProfile){
        return getAccountInterestProfileInternal(getAccountProfileInternal(acc), numberOfBlocks);
    }

    function getAccountInterestProfileInternal(AccountProfile memory accountProfile, uint numberOfBlocks) internal view returns(AccountInterestProfile memory accountInterestProfile){
        return createAccountInterestProfile(getSupplyInterests(accountProfile.suppliedAssets, numberOfBlocks), getBorrowInterests(accountProfile.borrowedAssets, numberOfBlocks));
    }

    function getSupplyInterests(SupplyAsset[] memory supplyAssets, uint numberOfBlocks) internal view returns(CTokenInterest[] memory supplyInterests){
        supplyInterests = new CTokenInterest[](supplyAssets.length);

        address cTokenAddr;
        uint interestRateMantissa;
        uint balance;
        for(uint i = 0; i < supplyAssets.length; i++){
            cTokenAddr = supplyAssets[i].asset.cTokenAddr;
            interestRateMantissa = CToken(cTokenAddr).supplyRatePerBlock();
            balance = supplyAssets[i].asset.amount;

            supplyInterests[i] = createCTokenInterest(cTokenAddr, interestRateMantissa, balance, numberOfBlocks);
        }

        return supplyInterests;
    }

    function getBorrowInterests(BorrowAsset[] memory borrowedAssets, uint numberOfBlocks) internal view returns(CTokenInterest[] memory borrowInterests){
        borrowInterests = new CTokenInterest[](borrowedAssets.length);

        address cTokenAddr;
        uint interestRateMantissa;
        uint balance;
        for(uint i = 0; i < borrowedAssets.length; i++){
            cTokenAddr = borrowedAssets[i].asset.cTokenAddr;
            interestRateMantissa = CToken(cTokenAddr).borrowRatePerBlock();
            balance = borrowedAssets[i].asset.amount;

            borrowInterests[i] = createCTokenInterest(cTokenAddr, interestRateMantissa, balance, numberOfBlocks);
        }

        return borrowInterests;
    }

    function getLiquidationRiskRankingInternal(AccountProfile memory accountProfile) internal view returns(LiquidationRiskRanking liquidationRiskRanking){
        //find all the supplied asset
        //find all the matching asset
        //find calBorrowLimitPCTLineItemMantissaList
        //check to see if any borrowed asset outside from supplied asset, acceptable asset require valueInUSD over 1
        //check to see if any borrowed asset with underlying supplied of 0 collateral factor

        //get account interest profile


        liquidationRiskRanking = LiquidationRiskRanking.ZERO_RISK;
///
        if(!getAccountInterestProfileInternal(accountProfile, 1).isPositiveInterest_){
            liquidationRiskRanking = LiquidationRiskRanking.INTEREST_RISK_ONLY;
        }

        for(uint i = 0; i < accountProfile.borrowLimitPCTLineItemMantissaList.length; i++){
            if(accountProfile.borrowLimitPCTLineItemMantissaList[i] == MAX_INT_NUMBER) continue;

            if(accountProfile.borrowLimitPCTLineItemMantissaList[i] > oneMantissa) {
                liquidationRiskRanking = LiquidationRiskRanking.PRICE_MOVEMENT_RISK;
                break;
            }

        }

        bool hasFound;
        SupplyAsset memory suppliedAsset;
        for(uint i = 0; i < accountProfile.borrowedAssets.length; i++){
            if(accountProfile.borrowedAssets[i].asset.valueInUSD_ < oneMantissa) continue;  //filter small value asset(asset USD value less than 1 USD)

            (hasFound, suppliedAsset) = findSuppliedAsset(accountProfile.borrowedAssets[i].asset.cTokenAddr, accountProfile.suppliedAssets);

            if(!hasFound){
                liquidationRiskRanking = LiquidationRiskRanking.PRICE_MOVEMENT_RISK;
                break;
            }

            if(suppliedAsset.collateralFactorMantissa_ == 0){
                liquidationRiskRanking = LiquidationRiskRanking.PRICE_MOVEMENT_RISK;
                break;
            }
        }

        return liquidationRiskRanking;
    }

    function getLiquidationRiskRankingInternal(address acc) internal view returns(LiquidationRiskRanking liquidationRiskRanking){
        return getLiquidationRiskRankingInternal(getAccountProfileInternal(acc));
    }

    function getMaxInterestAccountProfileInternal(AccountProfile memory accountProfile) internal view returns(bool isValidated, AccountProfile memory maxInterestAccountProfile){
        if(uint(getLiquidationRiskRankingInternal(accountProfile)) > 1) return (false, maxInterestAccountProfile);

        SupplyAsset[] memory newSupplyAssets = new SupplyAsset[](accountProfile.suppliedAssets.length);

        address cTokenAddr;
        uint amount;
        bool hasFound;
        BorrowAsset memory borrowedAsset;
        for(uint i = 0; i < accountProfile.suppliedAssets.length; i++){
            cTokenAddr = accountProfile.suppliedAssets[i].asset.cTokenAddr;

            (hasFound, borrowedAsset) = findBorrowAsset(cTokenAddr, accountProfile.borrowedAssets);
            if(!hasFound){
                amount = accountProfile.suppliedAssets[i].asset.amount;
            }

            amount = accountProfile.suppliedAssets[i].asset.amount.sub(borrowedAsset.asset.amount);

            newSupplyAssets[i] = createSupplyAsset(cTokenAddr, amount);
        }

        BorrowAsset[] memory borrowedAssets;

        return (true, createAccountProfile(newSupplyAssets, borrowedAssets));
    }



}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"err","type":"uint256"}],"name":"fail","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"err","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"fail","type":"event"},{"constant":true,"inputs":[],"name":"MAX_INT_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getAccountInterestProfile","outputs":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"supplyInterests","type":"tuple[]"},{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"borrowInterests","type":"tuple[]"},{"internalType":"uint256","name":"totalInterestInUSD_","type":"uint256"},{"internalType":"bool","name":"isPositiveInterest_","type":"bool"}],"internalType":"struct CompFarmingSummaryV3Model.AccountInterestProfile","name":"accountInterestProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getAccountInterestProfileByAP","outputs":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"supplyInterests","type":"tuple[]"},{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"borrowInterests","type":"tuple[]"},{"internalType":"uint256","name":"totalInterestInUSD_","type":"uint256"},{"internalType":"bool","name":"isPositiveInterest_","type":"bool"}],"internalType":"struct CompFarmingSummaryV3Model.AccountInterestProfile","name":"accountInterestProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"getAccountProfile","outputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCOMPPriceInUSD","outputs":[{"internalType":"uint256","name":"compPriceInUSD","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getCWBTCAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"getCompProfile","outputs":[{"components":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"yetToClaimed","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CompProfile","name":"compProfile","type":"tuple"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"},{"internalType":"uint256","name":"targetedBorrowLimitPCTMantissa","type":"uint256"}],"name":"getFarmingAccountProfileByAP","outputs":[{"internalType":"bool","name":"isValidated","type":"bool"},{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"farmingAccountProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"getLiquidationRiskRanking","outputs":[{"internalType":"enum CompFarmingSummaryV3Model.LiquidationRiskRanking","name":"liquidationRiskRanking","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"}],"name":"getLiquidationRiskRankingByAP","outputs":[{"internalType":"enum CompFarmingSummaryV3Model.LiquidationRiskRanking","name":"liquidationRiskRanking","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"}],"name":"getMaxInterestAccountProfileByAP","outputs":[{"internalType":"bool","name":"isValidated","type":"bool"},{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"maxInterestAccountProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getTotalCompReceivablByAP","outputs":[{"internalType":"uint256","name":"compReceivable","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getTotalCompReceivable","outputs":[{"internalType":"uint256","name":"totalCompReceivable","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b506149df806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063bee42a951161008c578063f690a1f611610066578063f690a1f6146102ac578063fa57b27d146102dc578063fcdf209b1461030d578063fe7c5f4b1461033d576100ea565b8063bee42a951461021b578063cbe3b1be1461024b578063e9bf882a1461027b576100ea565b806354fd4d50116100c857806354fd4d501461017f57806359883d791461019d5780635d2a23f8146101bb5780638ab8e35b146101eb576100ea565b806307dc96dd146100ef5780633d44b4561461011f5780634874cf8f1461014f575b600080fd5b61010960048036036101049190810190613da8565b61035b565b604051610116919061441f565b60405180910390f35b61013960048036036101349190810190613d2b565b6103a0565b6040516101469190614558565b60405180910390f35b61016960048036036101649190810190613b4a565b6103b4565b604051610176919061453d565b60405180910390f35b6101876103cc565b60405161019491906144d7565b60405180910390f35b6101a5610405565b6040516101b29190614558565b60405180910390f35b6101d560048036036101d09190810190613b4a565b610429565b6040516101e291906144bc565b60405180910390f35b61020560048036036102009190810190613b9c565b61043b565b6040516102129190614558565b60405180910390f35b61023560048036036102309190810190613b9c565b61044f565b60405161024291906144f9565b60405180910390f35b61026560048036036102609190810190613b4a565b610469565b604051610272919061451b565b60405180910390f35b61029560048036036102909190810190613d2b565b610481565b6040516102a392919061443a565b60405180910390f35b6102c660048036036102c19190810190613cea565b6104a0565b6040516102d391906144bc565b60405180910390f35b6102f660048036036102f19190810190613cea565b6104b2565b60405161030492919061443a565b60405180910390f35b61032760048036036103229190810190613d2b565b6104ce565b60405161033491906144f9565b60405180910390f35b6103456104e8565b6040516103529190614558565b60405180910390f35b600062b82beb82106103835773ccf4429db6322d5c611ee964527d42e5d685dd6a905061039b565b73c11b1268c1a384e55c48c2391d8d480264a3a7f490505b919050565b60006103ac838361050c565b905092915050565b6103bc613267565b6103c5826105f3565b9050919050565b6040518060400160405280600281526020017f763300000000000000000000000000000000000000000000000000000000000081525081565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600061043482610784565b9050919050565b6000610447838361079e565b905092915050565b610457613281565b61046183836107ba565b905092915050565b6104716132ab565b61047a826107dc565b9050919050565b600061048b6132ab565b6104958484610811565b915091509250929050565b60006104ab82610a09565b9050919050565b60006104bc6132ab565b6104c583610b7f565b91509150915091565b6104d6613281565b6104e08383610cfe565b905092915050565b60006105077370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4610d32565b905090565b600060608360000151905060608460200151905060008090505b82518110156105835761057283828151811061053e57fe5b60200260200101516000015160200151600085848151811061055c57fe5b6020026020010151600001516000015188611041565b840193508080600101915050610526565b5060008090505b81518110156105e7576105d660008383815181106105a457fe5b602002602001015160000151602001518484815181106105c057fe5b6020026020010151600001516000015188611041565b84019350808060010191505061058a565b50829250505092915050565b6105fb613267565b73c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610648919061441f565b60206040518083038186803b15801561066057600080fd5b505afa158015610674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106989190810190613dd1565b816000018181525050600073d513d22422a3062bd342ae374b4b9c20e0a9a07490508073ffffffffffffffffffffffffffffffffffffffff16631ea6374173c00e94cb662c3520282e6f5717214004a7f26888733d9819210a31b4961b30ef54be2aed79b9c9cd3b866040518463ffffffff1660e01b815260040161071f93929190614485565b608060405180830381600087803b15801561073957600080fd5b505af115801561074d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107719190810190613d7f565b6060015182602001818152505050919050565b6000610797610792836107dc565b610a09565b9050919050565b60006107b26107ac846107dc565b8361050c565b905092915050565b6107c2613281565b6107d46107ce846107dc565b83610cfe565b905092915050565b6107e46132ab565b60606107ef836110d8565b905060606107fc8461123e565b9050610808828261138a565b92505050919050565b600061081b6132ab565b600161082685610a09565b600281111561083157fe5b11156108435760008191509150610a02565b60608460000151905060008090505b81518110156109f857600082828151811061086957fe5b6020026020010151602001511415610880576109eb565b600061088a6132f0565b610892613309565b5b6108ad662386f26fc10000896113b390919063ffffffff16565b8960e0015185815181106108bd57fe5b6020026020010151116109e75761097e670de0b6b3a7640000610970670de0b6b3a764000061096261090f8e60e001518a815181106108f857fe5b60200260200101518e6113b390919063ffffffff16565b6109548b8b8151811061091e57fe5b6020026020010151602001518c8c8151811061093657fe5b602002602001015160000151602001516113ca90919063ffffffff16565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b6113fe90919063ffffffff16565b92506109a585858151811061098f57fe5b6020026020010151600001516000015184611412565b91506109cc8585815181106109b657fe5b6020026020010151600001516000015184611441565b90506109d88983611479565b6109e28982611642565b610893565b5050505b8080600101915050610852565b5060018592509250505b9250929050565b6000809050610a19826001610cfe565b60600151610a2657600190505b60008090505b8260e0015151811015610abb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360e001518281518110610a6a57fe5b60200260200101511415610a7d57610aae565b670de0b6b3a76400008360e001518281518110610a9657fe5b60200260200101511115610aad5760029150610abb565b5b8080600101915050610a2c565b506000610ac6613309565b60008090505b846020015151811015610b7457670de0b6b3a764000085602001518281518110610af257fe5b602002602001015160000151608001511015610b0d57610b67565b610b3a85602001518281518110610b2057fe5b60200260200101516000015160000151866000015161180b565b809350819450505082610b505760029350610b74565b600082602001511415610b665760029350610b74565b5b8080600101915050610acc565b508292505050919050565b6000610b896132ab565b6001610b9484610a09565b6002811115610b9f57fe5b1115610bb15760008191509150610cf9565b6060836000015151604051908082528060200260200182016040528015610bf257816020015b610bdf613330565b815260200190600190039081610bd75790505b5090506000806000610c026132f0565b60008090505b886000015151811015610cdf5788600001518181518110610c2557fe5b602002602001015160000151600001519450610c45858a602001516118b3565b809350819450505082610c755788600001518181518110610c6257fe5b6020026020010151600001516020015193505b610caf8260000151602001518a600001518381518110610c9157fe5b602002602001015160000151602001516113b390919063ffffffff16565b9350610cbb8585611441565b868281518110610cc757fe5b60200260200101819052508080600101915050610c08565b5060606001610cee878361138a565b975097505050505050505b915091565b610d06613281565b610d2a610d1784600001518461195b565b610d25856020015185611aa8565b611bf5565b905092915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8f57600080fd5b505afa158015610da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dc79190810190613b73565b90507339aa39c021dfbae8fac545936693ac917d5e756373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e56575073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610e6f57670de0b6b3a764000091508191505061103c565b73ccf4429db6322d5c611ee964527d42e5d685dd6a73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610efc575073c11b1268c1a384e55c48c2391d8d480264a3a7f473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610fac57610fa16402540be4008273ffffffffffffffffffffffffffffffffffffffff1663fc57d4df866040518263ffffffff1660e01b8152600401610f43919061446a565b60206040518083038186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f939190810190613dd1565b6113fe90919063ffffffff16565b91508191505061103c565b8073ffffffffffffffffffffffffffffffffffffffff1663fc57d4df846040518263ffffffff1660e01b8152600401610fe5919061446a565b60206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190613dd1565b9150819150505b919050565b60008061104e8484611c21565b9050600061105c8588611c46565b9050600061106a8688611c8a565b9050600061108b7370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4611d43565b90506110c781600a0a6110b96110aa8587611e3390919063ffffffff16565b876113ca90919063ffffffff16565b6113fe90919063ffffffff16565b945084945050505050949350505050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663abfceffc846040518263ffffffff1660e01b8152600401611128919061441f565b60006040518083038186803b15801561114057600080fd5b505afa158015611154573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061117d9190810190613bd8565b905080516040519080825280602002602001820160405280156111ba57816020015b6111a7613330565b81526020019060019003908161119f5790505b50915060008090505b8151811015611229576112058282815181106111db57fe5b6020026020010151611200868585815181106111f357fe5b6020026020010151611e4d565b611441565b83828151811061121157fe5b602002602001018190525080806001019150506111c3565b5061123382611f8e565b915081915050919050565b60608061124a836120a4565b9050805160405190808252806020026020018201604052801561128757816020015b611274613357565b81526020019060019003908161126c5790505b50915060008090505b8151811015611375576113518282815181106112a857fe5b60200260200101518383815181106112bc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b81526004016112fc919061441f565b60206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061134c9190810190613dd1565b611412565b83828151811061135d57fe5b60200260200101819052508080600101915050611290565b5061137f82612379565b915081915050919050565b6113926132ab565b8281600001819052508181602001819052506113ad8161248f565b92915050565b6000828211156113bf57fe5b818303905092915050565b6000808314156113dd57600090506113f8565b8183029050818382816113ec57fe5b04146113f457fe5b8090505b92915050565b600081838161140957fe5b04905092915050565b61141a6132f0565b611422613370565b61142c8484612524565b90508082600001819052508191505092915050565b611449613309565b611451613370565b61145b8484612524565b905080826000018190525061146f82612540565b8191505092915050565b60008090505b8260200151518110156115615781600001516000015173ffffffffffffffffffffffffffffffffffffffff16836020015182815181106114bb57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146114eb57611554565b611545836020015182815181106114fe57fe5b60200260200101516115408460000151602001518660200151858151811061152257fe5b60200260200101516000015160200151611e3390919063ffffffff16565b61259f565b61154e8361248f565b5061163e565b808060010191505061147f565b50600061157d6001846020015151611e3390919063ffffffff16565b90506060816040519080825280602002602001820160405280156115bb57816020015b6115a8613357565b8152602001906001900390816115a05790505b50905060008090505b84602001515181101561160d57846020015181815181106115e157fe5b60200260200101518282815181106115f557fe5b602002602001018190525080806001019150506115c4565b508281600184038151811061161e57fe5b602002602001018190525080846020018190525061163b8461248f565b50505b5050565b60008090505b82600001515181101561172a5781600001516000015173ffffffffffffffffffffffffffffffffffffffff168360000151828151811061168457fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146116b45761171d565b61170e836000015182815181106116c757fe5b6020026020010151611709846000015160200151866000015185815181106116eb57fe5b60200260200101516000015160200151611e3390919063ffffffff16565b6125be565b6117178361248f565b50611807565b8080600101915050611648565b5060006117466001846000015151611e3390919063ffffffff16565b905060608160405190808252806020026020018201604052801561178457816020015b611771613330565b8152602001906001900390816117695790505b50905060008090505b8460000151518110156117d657846000015181815181106117aa57fe5b60200260200101518282815181106117be57fe5b6020026020010181905250808060010191505061178d565b50828160018403815181106117e757fe5b60200260200101819052508084600001819052506118048461248f565b50505b5050565b6000611815613309565b60008090505b83518110156118a35783818151811061183057fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561189657600184828151811061188157fe5b602002602001015180905092509250506118ac565b808060010191505061181b565b50600081915091505b9250929050565b60006118bd6132f0565b60008090505b835181101561194b578381815181106118d857fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561193e57600184828151811061192957fe5b60200260200101518090509250925050611954565b80806001019150506118c3565b50600081915091505b9250929050565b6060825160405190808252806020026020018201604052801561199857816020015b6119856133bc565b81526020019060019003908161197d5790505b509050600080600080600090505b8651811015611a9b578681815181106119bb57fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a4b9190810190613dd1565b9250868181518110611a5957fe5b602002602001015160000151602001519150611a77848484896125e6565b858281518110611a8357fe5b602002602001018190525080806001019150506119a6565b5083935050505092915050565b60608251604051908082528060200260200182016040528015611ae557816020015b611ad26133bc565b815260200190600190039081611aca5790505b509050600080600080600090505b8651811015611be857868181518110611b0857fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6057600080fd5b505afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b989190810190613dd1565b9250868181518110611ba657fe5b602002602001015160000151602001519150611bc4848484896125e6565b858281518110611bd057fe5b60200260200101819052508080600101915050611af3565b5083935050505092915050565b611bfd613281565b828160000181905250818160200181905250611c1881612658565b80905092915050565b6000611c3e82611c308561274d565b6113ca90919063ffffffff16565b905092915050565b600080611c52846127f8565b9050611c8181611c73670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d0b9190810190613dd1565b9050611d3a81611d2c670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d995760129050809050611e2e565b6000611da4836129b4565b90508073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611dec57600080fd5b505afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e249190810190613dfa565b60ff169150819150505b919050565b6000818301905082811015611e4457fe5b80905092915050565b600080829050611f85670de0b6b3a7640000611f778373ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea857600080fd5b505afa158015611ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ee09190810190613dd1565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401611f19919061441f565b60206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f699190810190613dd1565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6060600080600090505b8351811015611fe0576000848281518110611faf57fe5b602002602001015160000151608001511415611fca57611fd3565b81806001019250505b8080600101915050611f98565b508060405190808252806020026020018201604052801561201b57816020015b612008613330565b8152602001906001900390816120005790505b509150600080600090505b845181101561209957600085828151811061203d57fe5b6020026020010151600001516080015114156120585761208c565b84818151811061206457fe5b602002602001015184838151811061207857fe5b602002602001018190525081806001019250505b8080600101915050612026565b508292505050919050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663b0772d0b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561210157600080fd5b505afa158015612115573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061213e9190810190613c19565b9050600080600090505b825181101561221057600083828151811061215f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b815260040161219f919061441f565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121ef9190810190613dd1565b14156121fa57612203565b81806001019250505b8080600101915050612148565b50806040519080825280602002602001820160405280156122405781602001602082028038833980820191505090505b509250600080600090505b835181101561236d57600084828151811061226257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193886040518263ffffffff1660e01b81526004016122a2919061441f565b60206040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122f29190810190613dd1565b14156122fd57612360565b83818151811061230957fe5b602002602001015185838151811061231d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081806001019250505b808060010191505061224b565b50839350505050919050565b6060600080600090505b83518110156123cb57600084828151811061239a57fe5b6020026020010151600001516080015114156123b5576123be565b81806001019250505b8080600101915050612383565b508060405190808252806020026020018201604052801561240657816020015b6123f3613357565b8152602001906001900390816123eb5790505b509150600080600090505b845181101561248457600085828151811061242857fe5b60200260200101516000015160800151141561244357612477565b84818151811061244f57fe5b602002602001015184838151811061246357fe5b602002602001018190525081806001019250505b8080600101915050612411565b508292505050919050565b61249c8160000151612a90565b8160400181815250506124b28160200151612ad7565b8160600181815250506124c88160000151612b1e565b8160800181815250506124e381604001518260600151612b61565b8160c00181815250506124fe81608001518260600151612b90565b8160a001818152505061251981600001518260200151612be0565b8160e0018190525050565b61252c613370565b612537818484612d77565b80905092915050565b612551816000015160000151612dc7565b816020018181525050612593670de0b6b3a764000061258583602001518460000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b81604001818152505050565b80826000015160200181815250506125ba8260000151612e89565b5050565b80826000015160200181815250506125d98260000151612e89565b6125e282612540565b5050565b6125ee613408565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816020018181525050828160400181815250508181606001818152505061264d81612ee8565b809050949350505050565b60008060008090505b83600001515181101561269b578360000151818151811061267e57fe5b602002602001015160a00151830192508080600101915050612661565b5060008090505b8360200151518110156126dc57836020015181815181106126bf57fe5b602002602001015160a001518201915080806001019150506126a2565b5080821115612713576126f881836113b390919063ffffffff16565b83604001818152505060018360600190151590811515815250505b8082116127485761272d82826113b390919063ffffffff16565b83604001818152505060008360600190151590811515815250505b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b90508073ffffffffffffffffffffffffffffffffffffffff16631d7b33d7846040518263ffffffff1660e01b81526004016127a0919061441f565b60206040518083038186803b1580156127b857600080fd5b505afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127f09190810190613dd1565b915050919050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561284657600080fd5b505afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061287e9190810190613dd1565b905060008273ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c857600080fd5b505afa1580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129009190810190613dd1565b905060008373ffffffffffffffffffffffffffffffffffffffff16638f840ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129829190810190613dd1565b90506129a98161299b8486611e3390919063ffffffff16565b6113b390919063ffffffff16565b945050505050919050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a075760009050612a8b565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a859190810190613b73565b90508090505b919050565b600080600090505b8251811015612ace57828181518110612aad57fe5b60200260200101516000015160800151820191508080600101915050612a98565b50809050919050565b600080600090505b8251811015612b1557828181518110612af457fe5b60200260200101516000015160800151820191508080600101915050612adf565b50809050919050565b600080600090505b8251811015612b5857828181518110612b3b57fe5b602002602001015160400151820191508080600101915050612b26565b50809050919050565b600081831115612b8557612b7e82846113b390919063ffffffff16565b9050612b8a565b600090505b92915050565b600080831415612baa57670de0b6b3a76400009050612bda565b612bd783612bc9670de0b6b3a7640000856113ca90919063ffffffff16565b6113fe90919063ffffffff16565b90505b92915050565b60608251604051908082528060200260200182016040528015612c125781602001602082028038833980820191505090505b5090506000612c1f6132f0565b60008090505b8551811015612d6b57612c53868281518110612c3d57fe5b6020026020010151600001516000015186612f61565b80935081945050506000868281518110612c6957fe5b6020026020010151604001511415612cb5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848281518110612ca857fe5b6020026020010181815250505b82612cd9576000848281518110612cc857fe5b602002602001018181525050612d5e565b6000868281518110612ce757fe5b60200260200101516040015114612d5d57612d44868281518110612d0757fe5b602002602001015160400151612d36670de0b6b3a76400008560000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b848281518110612d5057fe5b6020026020010181815250505b5b8080600101915050612c25565b50829250505092915050565b81836000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080836020018181525050612dc283612e89565b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16638e8f294b846040518263ffffffff1660e01b8152600401612e17919061441f565b60606040518083038186803b158015612e2f57600080fd5b505afa158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e679190810190613c5a565b50809350819250505080612e7f576000915050612e84565b819150505b919050565b612e968160000151613009565b8160400181905250612eab8160000151611d43565b816060018181525050612ec68160200151826000015161321d565b816080018181525050612edc816000015161274d565b8160a001818152505050565b612ef58160000151613009565b8160800181905250612f55670de0b6b3a7640000612f478360600151612f39612f2f866020015187604001516113ca90919063ffffffff16565b866000015161321d565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b8160a001818152505050565b6000612f6b6132f0565b60008090505b8351811015612ff9578473ffffffffffffffffffffffffffffffffffffffff16848281518110612f9d57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff161415612fec576001848281518110612fd757fe5b60200260200101518090509250925050613002565b8080600101915050612f71565b50600081915091505b9250929050565b6060734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613090576040518060400160405280600381526020017f45544800000000000000000000000000000000000000000000000000000000008152509050613218565b73f5dce57282a584d2746faf1593d3121fcac444dc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613115576040518060400160405280600381526020017f53414900000000000000000000000000000000000000000000000000000000008152509050613218565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561315b57600080fd5b505afa15801561316f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131939190810190613b73565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506132159190810190613ca9565b90505b919050565b60008061322983611d43565b905061325b81600a0a61324d8661323f87610d32565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91508191505092915050565b604051806040016040528060008152602001600081525090565b60405180608001604052806060815260200160608152602001600081526020016000151581525090565b60405180610100016040528060608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b6040518060200160405280613303613454565b81525090565b604051806060016040528061331c613454565b815260200160008152602001600081525090565b6040518060600160405280613343613454565b815260200160008152602001600081525090565b604051806020016040528061336a613454565b81525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6000813590506134af81614929565b92915050565b6000815190506134c481614929565b92915050565b600082601f8301126134db57600080fd5b81516134ee6134e9826145a0565b614573565b9150818183526020840193506020810190508385602084028201111561351357600080fd5b60005b83811015613543578161352988826134b5565b845260208401935060208301925050600181019050613516565b5050505092915050565b600082601f83011261355e57600080fd5b815161357161356c826145c8565b614573565b9150818183526020840193506020810190508385602084028201111561359657600080fd5b60005b838110156135c657816135ac8882613750565b845260208401935060208301925050600181019050613599565b5050505092915050565b600082601f8301126135e157600080fd5b81356135f46135ef826145f0565b614573565b9150818183526020840193506020810190508360005b8381101561363a578135860161362088826139cf565b84526020840193506020830192505060018101905061360a565b5050505092915050565b600082601f83011261365557600080fd5b813561366861366382614618565b614573565b9150818183526020840193506020810190508360005b838110156136ae57813586016136948882613a93565b84526020840193506020830192505060018101905061367e565b5050505092915050565b600082601f8301126136c957600080fd5b81356136dc6136d782614640565b614573565b9150818183526020840193506020810190508385602084028201111561370157600080fd5b60005b8381101561373157816137178882613b0b565b845260208401935060208301925050600181019050613704565b5050505092915050565b60008151905061374a81614940565b92915050565b60008151905061375f81614957565b92915050565b600082601f83011261377657600080fd5b813561378961378482614668565b614573565b915080825260208301602083018583830111156137a557600080fd5b6137b08382846148c9565b50505092915050565b600082601f8301126137ca57600080fd5b81516137dd6137d882614694565b614573565b915080825260208301602083018583830111156137f957600080fd5b6138048382846148d8565b50505092915050565b6000610100828403121561382057600080fd5b61382b610100614573565b9050600082013567ffffffffffffffff81111561384757600080fd5b61385384828501613644565b600083015250602082013567ffffffffffffffff81111561387357600080fd5b61387f848285016135d0565b602083015250604061389384828501613b0b565b60408301525060606138a784828501613b0b565b60608301525060806138bb84828501613b0b565b60808301525060a06138cf84828501613b0b565b60a08301525060c06138e384828501613b0b565b60c08301525060e082013567ffffffffffffffff81111561390357600080fd5b61390f848285016136b8565b60e08301525092915050565b600060c0828403121561392d57600080fd5b61393760c0614573565b90506000613947848285016134a0565b600083015250602061395b84828501613b0b565b602083015250604082013567ffffffffffffffff81111561397b57600080fd5b61398784828501613765565b604083015250606061399b84828501613b0b565b60608301525060806139af84828501613b0b565b60808301525060a06139c384828501613b0b565b60a08301525092915050565b6000602082840312156139e157600080fd5b6139eb6020614573565b9050600082013567ffffffffffffffff811115613a0757600080fd5b613a138482850161391b565b60008301525092915050565b600060808284031215613a3157600080fd5b613a3b6080614573565b90506000613a4b84828501613b20565b6000830152506020613a5f84828501613b20565b6020830152506040613a73848285016134b5565b6040830152506060613a8784828501613b20565b60608301525092915050565b600060608284031215613aa557600080fd5b613aaf6060614573565b9050600082013567ffffffffffffffff811115613acb57600080fd5b613ad78482850161391b565b6000830152506020613aeb84828501613b0b565b6020830152506040613aff84828501613b0b565b60408301525092915050565b600081359050613b1a8161496e565b92915050565b600081519050613b2f8161496e565b92915050565b600081519050613b4481614985565b92915050565b600060208284031215613b5c57600080fd5b6000613b6a848285016134a0565b91505092915050565b600060208284031215613b8557600080fd5b6000613b93848285016134b5565b91505092915050565b60008060408385031215613baf57600080fd5b6000613bbd858286016134a0565b9250506020613bce85828601613b0b565b9150509250929050565b600060208284031215613bea57600080fd5b600082015167ffffffffffffffff811115613c0457600080fd5b613c10848285016134ca565b91505092915050565b600060208284031215613c2b57600080fd5b600082015167ffffffffffffffff811115613c4557600080fd5b613c518482850161354d565b91505092915050565b600080600060608486031215613c6f57600080fd5b6000613c7d8682870161373b565b9350506020613c8e86828701613b20565b9250506040613c9f8682870161373b565b9150509250925092565b600060208284031215613cbb57600080fd5b600082015167ffffffffffffffff811115613cd557600080fd5b613ce1848285016137b9565b91505092915050565b600060208284031215613cfc57600080fd5b600082013567ffffffffffffffff811115613d1657600080fd5b613d228482850161380d565b91505092915050565b60008060408385031215613d3e57600080fd5b600083013567ffffffffffffffff811115613d5857600080fd5b613d648582860161380d565b9250506020613d7585828601613b0b565b9150509250929050565b600060808284031215613d9157600080fd5b6000613d9f84828501613a1f565b91505092915050565b600060208284031215613dba57600080fd5b6000613dc884828501613b0b565b91505092915050565b600060208284031215613de357600080fd5b6000613df184828501613b20565b91505092915050565b600060208284031215613e0c57600080fd5b6000613e1a84828501613b35565b91505092915050565b6000613e2f83836142cf565b905092915050565b6000613e4383836142f9565b905092915050565b6000613e5783836143b1565b905092915050565b6000613e6b8383614401565b60208301905092915050565b613e80816147d1565b82525050565b613e8f816147d1565b82525050565b6000613ea082614700565b613eaa818561476b565b935083602082028501613ebc856146c0565b8060005b85811015613ef85784840389528151613ed98582613e23565b9450613ee483614737565b925060208a01995050600181019050613ec0565b50829750879550505050505092915050565b6000613f158261470b565b613f1f818561477c565b935083602082028501613f31856146d0565b8060005b85811015613f6d5784840389528151613f4e8582613e37565b9450613f5983614744565b925060208a01995050600181019050613f35565b50829750879550505050505092915050565b6000613f8a82614716565b613f94818561478d565b935083602082028501613fa6856146e0565b8060005b85811015613fe25784840389528151613fc38582613e4b565b9450613fce83614751565b925060208a01995050600181019050613faa565b50829750879550505050505092915050565b6000613fff82614721565b614009818561479e565b9350614014836146f0565b8060005b8381101561404557815161402c8882613e5f565b97506140378361475e565b925050600181019050614018565b5085935050505092915050565b61405b816147e3565b82525050565b61406a816147e3565b82525050565b6140798161484b565b82525050565b6140888161486f565b82525050565b61409781614893565b82525050565b6140a6816148b7565b82525050565b60006140b78261472c565b6140c181856147af565b93506140d18185602086016148d8565b6140da8161490b565b840191505092915050565b60006140f08261472c565b6140fa81856147c0565b935061410a8185602086016148d8565b6141138161490b565b840191505092915050565b6000608083016000830151848203600086015261413b8282613f0a565b915050602083015184820360208601526141558282613f0a565b915050604083015161416a6040860182614401565b50606083015161417d6060860182614052565b508091505092915050565b60006101008301600083015184820360008601526141a68282613f7f565b915050602083015184820360208601526141c08282613e95565b91505060408301516141d56040860182614401565b5060608301516141e86060860182614401565b5060808301516141fb6080860182614401565b5060a083015161420e60a0860182614401565b5060c083015161422160c0860182614401565b5060e083015184820360e08601526142398282613ff4565b9150508091505092915050565b600060c08301600083015161425e6000860182613e77565b5060208301516142716020860182614401565b506040830151848203604086015261428982826140ac565b915050606083015161429e6060860182614401565b5060808301516142b16080860182614401565b5060a08301516142c460a0860182614401565b508091505092915050565b600060208301600083015184820360008601526142ec8282614246565b9150508091505092915050565b600060c0830160008301516143116000860182613e77565b5060208301516143246020860182614401565b5060408301516143376040860182614401565b50606083015161434a6060860182614401565b506080830151848203608086015261436282826140ac565b91505060a083015161437760a0860182614401565b508091505092915050565b6040820160008201516143986000850182614401565b5060208201516143ab6020850182614401565b50505050565b600060608301600083015184820360008601526143ce8282614246565b91505060208301516143e36020860182614401565b5060408301516143f66040860182614401565b508091505092915050565b61440a81614834565b82525050565b61441981614834565b82525050565b60006020820190506144346000830184613e86565b92915050565b600060408201905061444f6000830185614061565b81810360208301526144618184614188565b90509392505050565b600060208201905061447f6000830184614070565b92915050565b600060608201905061449a600083018661407f565b6144a7602083018561408e565b6144b46040830184613e86565b949350505050565b60006020820190506144d1600083018461409d565b92915050565b600060208201905081810360008301526144f181846140e5565b905092915050565b60006020820190508181036000830152614513818461411e565b905092915050565b600060208201905081810360008301526145358184614188565b905092915050565b60006040820190506145526000830184614382565b92915050565b600060208201905061456d6000830184614410565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561459657600080fd5b8060405250919050565b600067ffffffffffffffff8211156145b757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156145df57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561460757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561462f57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561465757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561467f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156146ab57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006147dc82614814565b9050919050565b60008115159050919050565b60006147fa826147d1565b9050919050565b600081905061480f8261491c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006148568261485d565b9050919050565b600061486882614814565b9050919050565b600061487a82614881565b9050919050565b600061488c82614814565b9050919050565b600061489e826148a5565b9050919050565b60006148b082614814565b9050919050565b60006148c282614801565b9050919050565b82818337600083830152505050565b60005b838110156148f65780820151818401526020810190506148db565b83811115614905576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061492657fe5b50565b614932816147d1565b811461493d57600080fd5b50565b614949816147e3565b811461495457600080fd5b50565b614960816147ef565b811461496b57600080fd5b50565b61497781614834565b811461498257600080fd5b50565b61498e8161483e565b811461499957600080fd5b5056fea365627a7a72315820059da9e8fb338326f069bdf45a4bfcc034c0672b81114baa65039095278e3f4b6c6578706572696d656e74616cf564736f6c63430005100040

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063bee42a951161008c578063f690a1f611610066578063f690a1f6146102ac578063fa57b27d146102dc578063fcdf209b1461030d578063fe7c5f4b1461033d576100ea565b8063bee42a951461021b578063cbe3b1be1461024b578063e9bf882a1461027b576100ea565b806354fd4d50116100c857806354fd4d501461017f57806359883d791461019d5780635d2a23f8146101bb5780638ab8e35b146101eb576100ea565b806307dc96dd146100ef5780633d44b4561461011f5780634874cf8f1461014f575b600080fd5b61010960048036036101049190810190613da8565b61035b565b604051610116919061441f565b60405180910390f35b61013960048036036101349190810190613d2b565b6103a0565b6040516101469190614558565b60405180910390f35b61016960048036036101649190810190613b4a565b6103b4565b604051610176919061453d565b60405180910390f35b6101876103cc565b60405161019491906144d7565b60405180910390f35b6101a5610405565b6040516101b29190614558565b60405180910390f35b6101d560048036036101d09190810190613b4a565b610429565b6040516101e291906144bc565b60405180910390f35b61020560048036036102009190810190613b9c565b61043b565b6040516102129190614558565b60405180910390f35b61023560048036036102309190810190613b9c565b61044f565b60405161024291906144f9565b60405180910390f35b61026560048036036102609190810190613b4a565b610469565b604051610272919061451b565b60405180910390f35b61029560048036036102909190810190613d2b565b610481565b6040516102a392919061443a565b60405180910390f35b6102c660048036036102c19190810190613cea565b6104a0565b6040516102d391906144bc565b60405180910390f35b6102f660048036036102f19190810190613cea565b6104b2565b60405161030492919061443a565b60405180910390f35b61032760048036036103229190810190613d2b565b6104ce565b60405161033491906144f9565b60405180910390f35b6103456104e8565b6040516103529190614558565b60405180910390f35b600062b82beb82106103835773ccf4429db6322d5c611ee964527d42e5d685dd6a905061039b565b73c11b1268c1a384e55c48c2391d8d480264a3a7f490505b919050565b60006103ac838361050c565b905092915050565b6103bc613267565b6103c5826105f3565b9050919050565b6040518060400160405280600281526020017f763300000000000000000000000000000000000000000000000000000000000081525081565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600061043482610784565b9050919050565b6000610447838361079e565b905092915050565b610457613281565b61046183836107ba565b905092915050565b6104716132ab565b61047a826107dc565b9050919050565b600061048b6132ab565b6104958484610811565b915091509250929050565b60006104ab82610a09565b9050919050565b60006104bc6132ab565b6104c583610b7f565b91509150915091565b6104d6613281565b6104e08383610cfe565b905092915050565b60006105077370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4610d32565b905090565b600060608360000151905060608460200151905060008090505b82518110156105835761057283828151811061053e57fe5b60200260200101516000015160200151600085848151811061055c57fe5b6020026020010151600001516000015188611041565b840193508080600101915050610526565b5060008090505b81518110156105e7576105d660008383815181106105a457fe5b602002602001015160000151602001518484815181106105c057fe5b6020026020010151600001516000015188611041565b84019350808060010191505061058a565b50829250505092915050565b6105fb613267565b73c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610648919061441f565b60206040518083038186803b15801561066057600080fd5b505afa158015610674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106989190810190613dd1565b816000018181525050600073d513d22422a3062bd342ae374b4b9c20e0a9a07490508073ffffffffffffffffffffffffffffffffffffffff16631ea6374173c00e94cb662c3520282e6f5717214004a7f26888733d9819210a31b4961b30ef54be2aed79b9c9cd3b866040518463ffffffff1660e01b815260040161071f93929190614485565b608060405180830381600087803b15801561073957600080fd5b505af115801561074d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107719190810190613d7f565b6060015182602001818152505050919050565b6000610797610792836107dc565b610a09565b9050919050565b60006107b26107ac846107dc565b8361050c565b905092915050565b6107c2613281565b6107d46107ce846107dc565b83610cfe565b905092915050565b6107e46132ab565b60606107ef836110d8565b905060606107fc8461123e565b9050610808828261138a565b92505050919050565b600061081b6132ab565b600161082685610a09565b600281111561083157fe5b11156108435760008191509150610a02565b60608460000151905060008090505b81518110156109f857600082828151811061086957fe5b6020026020010151602001511415610880576109eb565b600061088a6132f0565b610892613309565b5b6108ad662386f26fc10000896113b390919063ffffffff16565b8960e0015185815181106108bd57fe5b6020026020010151116109e75761097e670de0b6b3a7640000610970670de0b6b3a764000061096261090f8e60e001518a815181106108f857fe5b60200260200101518e6113b390919063ffffffff16565b6109548b8b8151811061091e57fe5b6020026020010151602001518c8c8151811061093657fe5b602002602001015160000151602001516113ca90919063ffffffff16565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b6113fe90919063ffffffff16565b92506109a585858151811061098f57fe5b6020026020010151600001516000015184611412565b91506109cc8585815181106109b657fe5b6020026020010151600001516000015184611441565b90506109d88983611479565b6109e28982611642565b610893565b5050505b8080600101915050610852565b5060018592509250505b9250929050565b6000809050610a19826001610cfe565b60600151610a2657600190505b60008090505b8260e0015151811015610abb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360e001518281518110610a6a57fe5b60200260200101511415610a7d57610aae565b670de0b6b3a76400008360e001518281518110610a9657fe5b60200260200101511115610aad5760029150610abb565b5b8080600101915050610a2c565b506000610ac6613309565b60008090505b846020015151811015610b7457670de0b6b3a764000085602001518281518110610af257fe5b602002602001015160000151608001511015610b0d57610b67565b610b3a85602001518281518110610b2057fe5b60200260200101516000015160000151866000015161180b565b809350819450505082610b505760029350610b74565b600082602001511415610b665760029350610b74565b5b8080600101915050610acc565b508292505050919050565b6000610b896132ab565b6001610b9484610a09565b6002811115610b9f57fe5b1115610bb15760008191509150610cf9565b6060836000015151604051908082528060200260200182016040528015610bf257816020015b610bdf613330565b815260200190600190039081610bd75790505b5090506000806000610c026132f0565b60008090505b886000015151811015610cdf5788600001518181518110610c2557fe5b602002602001015160000151600001519450610c45858a602001516118b3565b809350819450505082610c755788600001518181518110610c6257fe5b6020026020010151600001516020015193505b610caf8260000151602001518a600001518381518110610c9157fe5b602002602001015160000151602001516113b390919063ffffffff16565b9350610cbb8585611441565b868281518110610cc757fe5b60200260200101819052508080600101915050610c08565b5060606001610cee878361138a565b975097505050505050505b915091565b610d06613281565b610d2a610d1784600001518461195b565b610d25856020015185611aa8565b611bf5565b905092915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8f57600080fd5b505afa158015610da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dc79190810190613b73565b90507339aa39c021dfbae8fac545936693ac917d5e756373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e56575073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610e6f57670de0b6b3a764000091508191505061103c565b73ccf4429db6322d5c611ee964527d42e5d685dd6a73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610efc575073c11b1268c1a384e55c48c2391d8d480264a3a7f473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610fac57610fa16402540be4008273ffffffffffffffffffffffffffffffffffffffff1663fc57d4df866040518263ffffffff1660e01b8152600401610f43919061446a565b60206040518083038186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f939190810190613dd1565b6113fe90919063ffffffff16565b91508191505061103c565b8073ffffffffffffffffffffffffffffffffffffffff1663fc57d4df846040518263ffffffff1660e01b8152600401610fe5919061446a565b60206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190613dd1565b9150819150505b919050565b60008061104e8484611c21565b9050600061105c8588611c46565b9050600061106a8688611c8a565b9050600061108b7370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4611d43565b90506110c781600a0a6110b96110aa8587611e3390919063ffffffff16565b876113ca90919063ffffffff16565b6113fe90919063ffffffff16565b945084945050505050949350505050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663abfceffc846040518263ffffffff1660e01b8152600401611128919061441f565b60006040518083038186803b15801561114057600080fd5b505afa158015611154573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061117d9190810190613bd8565b905080516040519080825280602002602001820160405280156111ba57816020015b6111a7613330565b81526020019060019003908161119f5790505b50915060008090505b8151811015611229576112058282815181106111db57fe5b6020026020010151611200868585815181106111f357fe5b6020026020010151611e4d565b611441565b83828151811061121157fe5b602002602001018190525080806001019150506111c3565b5061123382611f8e565b915081915050919050565b60608061124a836120a4565b9050805160405190808252806020026020018201604052801561128757816020015b611274613357565b81526020019060019003908161126c5790505b50915060008090505b8151811015611375576113518282815181106112a857fe5b60200260200101518383815181106112bc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b81526004016112fc919061441f565b60206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061134c9190810190613dd1565b611412565b83828151811061135d57fe5b60200260200101819052508080600101915050611290565b5061137f82612379565b915081915050919050565b6113926132ab565b8281600001819052508181602001819052506113ad8161248f565b92915050565b6000828211156113bf57fe5b818303905092915050565b6000808314156113dd57600090506113f8565b8183029050818382816113ec57fe5b04146113f457fe5b8090505b92915050565b600081838161140957fe5b04905092915050565b61141a6132f0565b611422613370565b61142c8484612524565b90508082600001819052508191505092915050565b611449613309565b611451613370565b61145b8484612524565b905080826000018190525061146f82612540565b8191505092915050565b60008090505b8260200151518110156115615781600001516000015173ffffffffffffffffffffffffffffffffffffffff16836020015182815181106114bb57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146114eb57611554565b611545836020015182815181106114fe57fe5b60200260200101516115408460000151602001518660200151858151811061152257fe5b60200260200101516000015160200151611e3390919063ffffffff16565b61259f565b61154e8361248f565b5061163e565b808060010191505061147f565b50600061157d6001846020015151611e3390919063ffffffff16565b90506060816040519080825280602002602001820160405280156115bb57816020015b6115a8613357565b8152602001906001900390816115a05790505b50905060008090505b84602001515181101561160d57846020015181815181106115e157fe5b60200260200101518282815181106115f557fe5b602002602001018190525080806001019150506115c4565b508281600184038151811061161e57fe5b602002602001018190525080846020018190525061163b8461248f565b50505b5050565b60008090505b82600001515181101561172a5781600001516000015173ffffffffffffffffffffffffffffffffffffffff168360000151828151811061168457fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146116b45761171d565b61170e836000015182815181106116c757fe5b6020026020010151611709846000015160200151866000015185815181106116eb57fe5b60200260200101516000015160200151611e3390919063ffffffff16565b6125be565b6117178361248f565b50611807565b8080600101915050611648565b5060006117466001846000015151611e3390919063ffffffff16565b905060608160405190808252806020026020018201604052801561178457816020015b611771613330565b8152602001906001900390816117695790505b50905060008090505b8460000151518110156117d657846000015181815181106117aa57fe5b60200260200101518282815181106117be57fe5b6020026020010181905250808060010191505061178d565b50828160018403815181106117e757fe5b60200260200101819052508084600001819052506118048461248f565b50505b5050565b6000611815613309565b60008090505b83518110156118a35783818151811061183057fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561189657600184828151811061188157fe5b602002602001015180905092509250506118ac565b808060010191505061181b565b50600081915091505b9250929050565b60006118bd6132f0565b60008090505b835181101561194b578381815181106118d857fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561193e57600184828151811061192957fe5b60200260200101518090509250925050611954565b80806001019150506118c3565b50600081915091505b9250929050565b6060825160405190808252806020026020018201604052801561199857816020015b6119856133bc565b81526020019060019003908161197d5790505b509050600080600080600090505b8651811015611a9b578681815181106119bb57fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a4b9190810190613dd1565b9250868181518110611a5957fe5b602002602001015160000151602001519150611a77848484896125e6565b858281518110611a8357fe5b602002602001018190525080806001019150506119a6565b5083935050505092915050565b60608251604051908082528060200260200182016040528015611ae557816020015b611ad26133bc565b815260200190600190039081611aca5790505b509050600080600080600090505b8651811015611be857868181518110611b0857fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6057600080fd5b505afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b989190810190613dd1565b9250868181518110611ba657fe5b602002602001015160000151602001519150611bc4848484896125e6565b858281518110611bd057fe5b60200260200101819052508080600101915050611af3565b5083935050505092915050565b611bfd613281565b828160000181905250818160200181905250611c1881612658565b80905092915050565b6000611c3e82611c308561274d565b6113ca90919063ffffffff16565b905092915050565b600080611c52846127f8565b9050611c8181611c73670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d0b9190810190613dd1565b9050611d3a81611d2c670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d995760129050809050611e2e565b6000611da4836129b4565b90508073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611dec57600080fd5b505afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e249190810190613dfa565b60ff169150819150505b919050565b6000818301905082811015611e4457fe5b80905092915050565b600080829050611f85670de0b6b3a7640000611f778373ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea857600080fd5b505afa158015611ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ee09190810190613dd1565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401611f19919061441f565b60206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f699190810190613dd1565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6060600080600090505b8351811015611fe0576000848281518110611faf57fe5b602002602001015160000151608001511415611fca57611fd3565b81806001019250505b8080600101915050611f98565b508060405190808252806020026020018201604052801561201b57816020015b612008613330565b8152602001906001900390816120005790505b509150600080600090505b845181101561209957600085828151811061203d57fe5b6020026020010151600001516080015114156120585761208c565b84818151811061206457fe5b602002602001015184838151811061207857fe5b602002602001018190525081806001019250505b8080600101915050612026565b508292505050919050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663b0772d0b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561210157600080fd5b505afa158015612115573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061213e9190810190613c19565b9050600080600090505b825181101561221057600083828151811061215f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b815260040161219f919061441f565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121ef9190810190613dd1565b14156121fa57612203565b81806001019250505b8080600101915050612148565b50806040519080825280602002602001820160405280156122405781602001602082028038833980820191505090505b509250600080600090505b835181101561236d57600084828151811061226257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193886040518263ffffffff1660e01b81526004016122a2919061441f565b60206040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122f29190810190613dd1565b14156122fd57612360565b83818151811061230957fe5b602002602001015185838151811061231d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081806001019250505b808060010191505061224b565b50839350505050919050565b6060600080600090505b83518110156123cb57600084828151811061239a57fe5b6020026020010151600001516080015114156123b5576123be565b81806001019250505b8080600101915050612383565b508060405190808252806020026020018201604052801561240657816020015b6123f3613357565b8152602001906001900390816123eb5790505b509150600080600090505b845181101561248457600085828151811061242857fe5b60200260200101516000015160800151141561244357612477565b84818151811061244f57fe5b602002602001015184838151811061246357fe5b602002602001018190525081806001019250505b8080600101915050612411565b508292505050919050565b61249c8160000151612a90565b8160400181815250506124b28160200151612ad7565b8160600181815250506124c88160000151612b1e565b8160800181815250506124e381604001518260600151612b61565b8160c00181815250506124fe81608001518260600151612b90565b8160a001818152505061251981600001518260200151612be0565b8160e0018190525050565b61252c613370565b612537818484612d77565b80905092915050565b612551816000015160000151612dc7565b816020018181525050612593670de0b6b3a764000061258583602001518460000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b81604001818152505050565b80826000015160200181815250506125ba8260000151612e89565b5050565b80826000015160200181815250506125d98260000151612e89565b6125e282612540565b5050565b6125ee613408565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816020018181525050828160400181815250508181606001818152505061264d81612ee8565b809050949350505050565b60008060008090505b83600001515181101561269b578360000151818151811061267e57fe5b602002602001015160a00151830192508080600101915050612661565b5060008090505b8360200151518110156126dc57836020015181815181106126bf57fe5b602002602001015160a001518201915080806001019150506126a2565b5080821115612713576126f881836113b390919063ffffffff16565b83604001818152505060018360600190151590811515815250505b8082116127485761272d82826113b390919063ffffffff16565b83604001818152505060008360600190151590811515815250505b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b90508073ffffffffffffffffffffffffffffffffffffffff16631d7b33d7846040518263ffffffff1660e01b81526004016127a0919061441f565b60206040518083038186803b1580156127b857600080fd5b505afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127f09190810190613dd1565b915050919050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561284657600080fd5b505afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061287e9190810190613dd1565b905060008273ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c857600080fd5b505afa1580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129009190810190613dd1565b905060008373ffffffffffffffffffffffffffffffffffffffff16638f840ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129829190810190613dd1565b90506129a98161299b8486611e3390919063ffffffff16565b6113b390919063ffffffff16565b945050505050919050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a075760009050612a8b565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a859190810190613b73565b90508090505b919050565b600080600090505b8251811015612ace57828181518110612aad57fe5b60200260200101516000015160800151820191508080600101915050612a98565b50809050919050565b600080600090505b8251811015612b1557828181518110612af457fe5b60200260200101516000015160800151820191508080600101915050612adf565b50809050919050565b600080600090505b8251811015612b5857828181518110612b3b57fe5b602002602001015160400151820191508080600101915050612b26565b50809050919050565b600081831115612b8557612b7e82846113b390919063ffffffff16565b9050612b8a565b600090505b92915050565b600080831415612baa57670de0b6b3a76400009050612bda565b612bd783612bc9670de0b6b3a7640000856113ca90919063ffffffff16565b6113fe90919063ffffffff16565b90505b92915050565b60608251604051908082528060200260200182016040528015612c125781602001602082028038833980820191505090505b5090506000612c1f6132f0565b60008090505b8551811015612d6b57612c53868281518110612c3d57fe5b6020026020010151600001516000015186612f61565b80935081945050506000868281518110612c6957fe5b6020026020010151604001511415612cb5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848281518110612ca857fe5b6020026020010181815250505b82612cd9576000848281518110612cc857fe5b602002602001018181525050612d5e565b6000868281518110612ce757fe5b60200260200101516040015114612d5d57612d44868281518110612d0757fe5b602002602001015160400151612d36670de0b6b3a76400008560000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b848281518110612d5057fe5b6020026020010181815250505b5b8080600101915050612c25565b50829250505092915050565b81836000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080836020018181525050612dc283612e89565b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16638e8f294b846040518263ffffffff1660e01b8152600401612e17919061441f565b60606040518083038186803b158015612e2f57600080fd5b505afa158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e679190810190613c5a565b50809350819250505080612e7f576000915050612e84565b819150505b919050565b612e968160000151613009565b8160400181905250612eab8160000151611d43565b816060018181525050612ec68160200151826000015161321d565b816080018181525050612edc816000015161274d565b8160a001818152505050565b612ef58160000151613009565b8160800181905250612f55670de0b6b3a7640000612f478360600151612f39612f2f866020015187604001516113ca90919063ffffffff16565b866000015161321d565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b8160a001818152505050565b6000612f6b6132f0565b60008090505b8351811015612ff9578473ffffffffffffffffffffffffffffffffffffffff16848281518110612f9d57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff161415612fec576001848281518110612fd757fe5b60200260200101518090509250925050613002565b8080600101915050612f71565b50600081915091505b9250929050565b6060734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613090576040518060400160405280600381526020017f45544800000000000000000000000000000000000000000000000000000000008152509050613218565b73f5dce57282a584d2746faf1593d3121fcac444dc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613115576040518060400160405280600381526020017f53414900000000000000000000000000000000000000000000000000000000008152509050613218565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561315b57600080fd5b505afa15801561316f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131939190810190613b73565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506132159190810190613ca9565b90505b919050565b60008061322983611d43565b905061325b81600a0a61324d8661323f87610d32565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91508191505092915050565b604051806040016040528060008152602001600081525090565b60405180608001604052806060815260200160608152602001600081526020016000151581525090565b60405180610100016040528060608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b6040518060200160405280613303613454565b81525090565b604051806060016040528061331c613454565b815260200160008152602001600081525090565b6040518060600160405280613343613454565b815260200160008152602001600081525090565b604051806020016040528061336a613454565b81525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6000813590506134af81614929565b92915050565b6000815190506134c481614929565b92915050565b600082601f8301126134db57600080fd5b81516134ee6134e9826145a0565b614573565b9150818183526020840193506020810190508385602084028201111561351357600080fd5b60005b83811015613543578161352988826134b5565b845260208401935060208301925050600181019050613516565b5050505092915050565b600082601f83011261355e57600080fd5b815161357161356c826145c8565b614573565b9150818183526020840193506020810190508385602084028201111561359657600080fd5b60005b838110156135c657816135ac8882613750565b845260208401935060208301925050600181019050613599565b5050505092915050565b600082601f8301126135e157600080fd5b81356135f46135ef826145f0565b614573565b9150818183526020840193506020810190508360005b8381101561363a578135860161362088826139cf565b84526020840193506020830192505060018101905061360a565b5050505092915050565b600082601f83011261365557600080fd5b813561366861366382614618565b614573565b9150818183526020840193506020810190508360005b838110156136ae57813586016136948882613a93565b84526020840193506020830192505060018101905061367e565b5050505092915050565b600082601f8301126136c957600080fd5b81356136dc6136d782614640565b614573565b9150818183526020840193506020810190508385602084028201111561370157600080fd5b60005b8381101561373157816137178882613b0b565b845260208401935060208301925050600181019050613704565b5050505092915050565b60008151905061374a81614940565b92915050565b60008151905061375f81614957565b92915050565b600082601f83011261377657600080fd5b813561378961378482614668565b614573565b915080825260208301602083018583830111156137a557600080fd5b6137b08382846148c9565b50505092915050565b600082601f8301126137ca57600080fd5b81516137dd6137d882614694565b614573565b915080825260208301602083018583830111156137f957600080fd5b6138048382846148d8565b50505092915050565b6000610100828403121561382057600080fd5b61382b610100614573565b9050600082013567ffffffffffffffff81111561384757600080fd5b61385384828501613644565b600083015250602082013567ffffffffffffffff81111561387357600080fd5b61387f848285016135d0565b602083015250604061389384828501613b0b565b60408301525060606138a784828501613b0b565b60608301525060806138bb84828501613b0b565b60808301525060a06138cf84828501613b0b565b60a08301525060c06138e384828501613b0b565b60c08301525060e082013567ffffffffffffffff81111561390357600080fd5b61390f848285016136b8565b60e08301525092915050565b600060c0828403121561392d57600080fd5b61393760c0614573565b90506000613947848285016134a0565b600083015250602061395b84828501613b0b565b602083015250604082013567ffffffffffffffff81111561397b57600080fd5b61398784828501613765565b604083015250606061399b84828501613b0b565b60608301525060806139af84828501613b0b565b60808301525060a06139c384828501613b0b565b60a08301525092915050565b6000602082840312156139e157600080fd5b6139eb6020614573565b9050600082013567ffffffffffffffff811115613a0757600080fd5b613a138482850161391b565b60008301525092915050565b600060808284031215613a3157600080fd5b613a3b6080614573565b90506000613a4b84828501613b20565b6000830152506020613a5f84828501613b20565b6020830152506040613a73848285016134b5565b6040830152506060613a8784828501613b20565b60608301525092915050565b600060608284031215613aa557600080fd5b613aaf6060614573565b9050600082013567ffffffffffffffff811115613acb57600080fd5b613ad78482850161391b565b6000830152506020613aeb84828501613b0b565b6020830152506040613aff84828501613b0b565b60408301525092915050565b600081359050613b1a8161496e565b92915050565b600081519050613b2f8161496e565b92915050565b600081519050613b4481614985565b92915050565b600060208284031215613b5c57600080fd5b6000613b6a848285016134a0565b91505092915050565b600060208284031215613b8557600080fd5b6000613b93848285016134b5565b91505092915050565b60008060408385031215613baf57600080fd5b6000613bbd858286016134a0565b9250506020613bce85828601613b0b565b9150509250929050565b600060208284031215613bea57600080fd5b600082015167ffffffffffffffff811115613c0457600080fd5b613c10848285016134ca565b91505092915050565b600060208284031215613c2b57600080fd5b600082015167ffffffffffffffff811115613c4557600080fd5b613c518482850161354d565b91505092915050565b600080600060608486031215613c6f57600080fd5b6000613c7d8682870161373b565b9350506020613c8e86828701613b20565b9250506040613c9f8682870161373b565b9150509250925092565b600060208284031215613cbb57600080fd5b600082015167ffffffffffffffff811115613cd557600080fd5b613ce1848285016137b9565b91505092915050565b600060208284031215613cfc57600080fd5b600082013567ffffffffffffffff811115613d1657600080fd5b613d228482850161380d565b91505092915050565b60008060408385031215613d3e57600080fd5b600083013567ffffffffffffffff811115613d5857600080fd5b613d648582860161380d565b9250506020613d7585828601613b0b565b9150509250929050565b600060808284031215613d9157600080fd5b6000613d9f84828501613a1f565b91505092915050565b600060208284031215613dba57600080fd5b6000613dc884828501613b0b565b91505092915050565b600060208284031215613de357600080fd5b6000613df184828501613b20565b91505092915050565b600060208284031215613e0c57600080fd5b6000613e1a84828501613b35565b91505092915050565b6000613e2f83836142cf565b905092915050565b6000613e4383836142f9565b905092915050565b6000613e5783836143b1565b905092915050565b6000613e6b8383614401565b60208301905092915050565b613e80816147d1565b82525050565b613e8f816147d1565b82525050565b6000613ea082614700565b613eaa818561476b565b935083602082028501613ebc856146c0565b8060005b85811015613ef85784840389528151613ed98582613e23565b9450613ee483614737565b925060208a01995050600181019050613ec0565b50829750879550505050505092915050565b6000613f158261470b565b613f1f818561477c565b935083602082028501613f31856146d0565b8060005b85811015613f6d5784840389528151613f4e8582613e37565b9450613f5983614744565b925060208a01995050600181019050613f35565b50829750879550505050505092915050565b6000613f8a82614716565b613f94818561478d565b935083602082028501613fa6856146e0565b8060005b85811015613fe25784840389528151613fc38582613e4b565b9450613fce83614751565b925060208a01995050600181019050613faa565b50829750879550505050505092915050565b6000613fff82614721565b614009818561479e565b9350614014836146f0565b8060005b8381101561404557815161402c8882613e5f565b97506140378361475e565b925050600181019050614018565b5085935050505092915050565b61405b816147e3565b82525050565b61406a816147e3565b82525050565b6140798161484b565b82525050565b6140888161486f565b82525050565b61409781614893565b82525050565b6140a6816148b7565b82525050565b60006140b78261472c565b6140c181856147af565b93506140d18185602086016148d8565b6140da8161490b565b840191505092915050565b60006140f08261472c565b6140fa81856147c0565b935061410a8185602086016148d8565b6141138161490b565b840191505092915050565b6000608083016000830151848203600086015261413b8282613f0a565b915050602083015184820360208601526141558282613f0a565b915050604083015161416a6040860182614401565b50606083015161417d6060860182614052565b508091505092915050565b60006101008301600083015184820360008601526141a68282613f7f565b915050602083015184820360208601526141c08282613e95565b91505060408301516141d56040860182614401565b5060608301516141e86060860182614401565b5060808301516141fb6080860182614401565b5060a083015161420e60a0860182614401565b5060c083015161422160c0860182614401565b5060e083015184820360e08601526142398282613ff4565b9150508091505092915050565b600060c08301600083015161425e6000860182613e77565b5060208301516142716020860182614401565b506040830151848203604086015261428982826140ac565b915050606083015161429e6060860182614401565b5060808301516142b16080860182614401565b5060a08301516142c460a0860182614401565b508091505092915050565b600060208301600083015184820360008601526142ec8282614246565b9150508091505092915050565b600060c0830160008301516143116000860182613e77565b5060208301516143246020860182614401565b5060408301516143376040860182614401565b50606083015161434a6060860182614401565b506080830151848203608086015261436282826140ac565b91505060a083015161437760a0860182614401565b508091505092915050565b6040820160008201516143986000850182614401565b5060208201516143ab6020850182614401565b50505050565b600060608301600083015184820360008601526143ce8282614246565b91505060208301516143e36020860182614401565b5060408301516143f66040860182614401565b508091505092915050565b61440a81614834565b82525050565b61441981614834565b82525050565b60006020820190506144346000830184613e86565b92915050565b600060408201905061444f6000830185614061565b81810360208301526144618184614188565b90509392505050565b600060208201905061447f6000830184614070565b92915050565b600060608201905061449a600083018661407f565b6144a7602083018561408e565b6144b46040830184613e86565b949350505050565b60006020820190506144d1600083018461409d565b92915050565b600060208201905081810360008301526144f181846140e5565b905092915050565b60006020820190508181036000830152614513818461411e565b905092915050565b600060208201905081810360008301526145358184614188565b905092915050565b60006040820190506145526000830184614382565b92915050565b600060208201905061456d6000830184614410565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561459657600080fd5b8060405250919050565b600067ffffffffffffffff8211156145b757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156145df57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561460757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561462f57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561465757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561467f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156146ab57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006147dc82614814565b9050919050565b60008115159050919050565b60006147fa826147d1565b9050919050565b600081905061480f8261491c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006148568261485d565b9050919050565b600061486882614814565b9050919050565b600061487a82614881565b9050919050565b600061488c82614814565b9050919050565b600061489e826148a5565b9050919050565b60006148b082614814565b9050919050565b60006148c282614801565b9050919050565b82818337600083830152505050565b60005b838110156148f65780820151818401526020810190506148db565b83811115614905576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061492657fe5b50565b614932816147d1565b811461493d57600080fd5b50565b614949816147e3565b811461495457600080fd5b50565b614960816147ef565b811461496b57600080fd5b50565b61497781614834565b811461498257600080fd5b50565b61498e8161483e565b811461499957600080fd5b5056fea365627a7a72315820059da9e8fb338326f069bdf45a4bfcc034c0672b81114baa65039095278e3f4b6c6578706572696d656e74616cf564736f6c63430005100040

Deployed Bytecode Sourcemap

39346:13957:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39346:13957:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4542:196;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40168:222;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39658:138;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39413:37;;;:::i;:::-;;;;;;;;;;;;;;;;24724:119;;;:::i;:::-;;;;;;;;;;;;;;;;41418:180;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39972:188;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40584:224;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40421:155;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40816:301;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41606:218;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41832:244;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41125:262;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39804:133;;;:::i;:::-;;;;;;;;;;;;;;;;4542:196;4602:7;4641:8;4626:11;:23;4623:75;;3892:42;4667:17;;;;4623:75;3802:42;4712:16;;4542:196;;;;:::o;40168:222::-;40282:19;40320:62;40351:14;40367;40320:30;:62::i;:::-;40313:69;;40168:222;;;;:::o;39658:138::-;39712:30;;:::i;:::-;39761:27;39784:3;39761:22;:27::i;:::-;39754:34;;39658:138;;;:::o;39413:37::-;;;;;;;;;;;;;;;;;;;:::o;24724:119::-;24765:78;24724:119;:::o;41418:180::-;41488:45;41552:38;41586:3;41552:33;:38::i;:::-;41545:45;;41418:180;;;:::o;39972:188::-;40058:24;40101:51;40132:3;40137:14;40101:30;:51::i;:::-;40094:58;;39972:188;;;;:::o;40584:224::-;40675:52;;:::i;:::-;40746:54;40780:3;40785:14;40746:33;:54::i;:::-;40739:61;;40584:224;;;;:::o;40421:155::-;40483:36;;:::i;:::-;40538:30;40564:3;40538:25;:30::i;:::-;40531:37;;40421:155;;;:::o;40816:301::-;40949:16;40967:43;;:::i;:::-;41029:80;41062:14;41078:30;41029:32;:80::i;:::-;41022:87;;;;40816:301;;;;;:::o;41606:218::-;41703:45;41767:49;41801:14;41767:33;:49::i;:::-;41760:56;;41606:218;;;:::o;41832:244::-;41932:16;41950:47;;:::i;:::-;42016:52;42053:14;42016:36;:52::i;:::-;42009:59;;;;41832:244;;;:::o;41125:262::-;41243:52;;:::i;:::-;41314:65;41348:14;41364;41314:33;:65::i;:::-;41307:72;;41125:262;;;;:::o;39804:133::-;39853:19;39891:38;4017:42;39891:27;:38::i;:::-;39884:45;;39804:133;:::o;43176:771::-;43297:19;43328:35;43366:14;:29;;;43328:67;;43406:35;43444:14;:29;;;43406:67;;43490:6;43499:1;43490:10;;43486:204;43506:14;:21;43502:1;:25;43486:204;;;43566:112;43592:14;43607:1;43592:17;;;;;;;;;;;;;;:23;;;:30;;;43624:1;43627:14;43642:1;43627:17;;;;;;;;;;;;;;:23;;;:34;;;43663:14;43566:25;:112::i;:::-;43548:130;;;;43529:3;;;;;;;43486:204;;;;43706:6;43715:1;43706:10;;43702:204;43722:14;:21;43718:1;:25;43702:204;;;43782:112;43808:1;43811:14;43826:1;43811:17;;;;;;;;;;;;;;:23;;;:30;;;43843:14;43858:1;43843:17;;;;;;;;;;;;;;:23;;;:34;;;43879:14;43782:25;:112::i;:::-;43764:130;;;;43745:3;;;;;;;43702:204;;;;43925:14;43918:21;;;;43176:771;;;;:::o;43955:389::-;44017:30;;:::i;:::-;4193:42;44083:25;;;44109:3;44083:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44083:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44083:30: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;44083:30:0;;;;;;;;;44061:11;:19;;:52;;;;;44126:25;4291:42;44126:58;;44222:12;:38;;;4193:42;4386;44320:3;44222:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44222:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44222:102: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;44222:102:0;;;;;;;;;:112;;;44195:11;:24;;:139;;;;;43955:389;;;;:::o;51861:215::-;51939:45;52003:65;52037:30;52063:3;52037:25;:30::i;:::-;52003:33;:65::i;:::-;51996:72;;51861:215;;;:::o;42116:220::-;42212:19;42250:78;42281:30;42307:3;42281:25;:30::i;:::-;42313:14;42250:30;:78::i;:::-;42243:85;;42116:220;;;;:::o;47685:259::-;47784:52;;:::i;:::-;47855:81;47889:30;47915:3;47889:25;:30::i;:::-;47921:14;47855:33;:81::i;:::-;47848:88;;47685:259;;;;:::o;44352:331::-;44422:36;;:::i;:::-;44472:35;44510:22;44528:3;44510:17;:22::i;:::-;44472:60;;44543:35;44581:22;44599:3;44581:17;:22::i;:::-;44543:60;;44623:52;44644:14;44660;44623:20;:52::i;:::-;44616:59;;;;44352:331;;;:::o;46012:1665::-;46151:16;46169:43;;:::i;:::-;46355:1;46302:49;46336:14;46302:33;:49::i;:::-;46297:55;;;;;;;;:59;46294:101;;;46366:5;46373:21;46358:37;;;;;;46294:101;46514:35;46552:14;:29;;;46514:67;;46598:6;46607:1;46598:10;;46594:1034;46614:14;:21;46610:1;:25;46594:1034;;;46710:1;46663:14;46678:1;46663:17;;;;;;;;;;;;;;:43;;;:48;46660:61;;;46713:8;;46660:61;46740:20;46777:34;;:::i;:::-;46828;;:::i;:::-;46881:736;46943:49;39561:17;46943:30;:34;;:49;;;;:::i;:::-;46887:14;:49;;;46937:1;46887:52;;;;;;;;;;;;;;:105;46881:736;;47032:207;3278:6;47032:190;3278:6;47032:173;47116:88;47151:14;:49;;;47201:1;47151:52;;;;;;;;;;;;;;47116:30;:34;;:88;;;;:::i;:::-;47032:79;47067:14;47082:1;47067:17;;;;;;;;;;;;;;:43;;;47032:14;47047:1;47032:17;;;;;;;;;;;;;;:23;;;:30;;;:34;;:79;;;;:::i;:::-;:83;;:173;;;;:::i;:::-;:177;;:190;;;;:::i;:::-;:194;;:207;;;;:::i;:::-;47014:225;;47278:70;47296:14;47311:1;47296:17;;;;;;;;;;;;;;:23;;;:34;;;47332:15;47278:17;:70::i;:::-;47260:88;;47387:70;47405:14;47420:1;47405:17;;;;;;;;;;;;;;:23;;;:34;;;47441:15;47387:17;:70::i;:::-;47369:88;;47480:47;47495:14;47511:15;47480:14;:47::i;:::-;47548:49;47565:14;47581:15;47548:16;:49::i;:::-;46881:736;;;46594:1034;;;;46637:3;;;;;;;46594:1034;;;;47648:4;47654:14;47640:29;;;;;46012:1665;;;;;;:::o;49797:2056::-;49900:45;50372:32;50347:57;;50424:52;50458:14;50474:1;50424:33;:52::i;:::-;:72;;;50420:170;;50537:41;50512:66;;50420:170;50606:6;50615:1;50606:10;;50602:407;50622:14;:49;;;:56;50618:1;:60;50602:407;;;24765:78;50702:14;:49;;;50752:1;50702:52;;;;;;;;;;;;;;:70;50699:83;;;50774:8;;50699:83;3278:6;50802:14;:49;;;50852:1;50802:52;;;;;;;;;;;;;;:66;50799:197;;;50914:42;50889:67;;50975:5;;50799:197;50602:407;50680:3;;;;;;;50602:407;;;;51021:13;51045:32;;:::i;:::-;51092:6;51101:1;51092:10;;51088:716;51108:14;:29;;;:36;51104:1;:40;51088:716;;;3278:6;51168:14;:29;;;51198:1;51168:32;;;;;;;;;;;;;;:38;;;:50;;;:64;51165:77;;;51234:8;;51165:77;51348:99;51366:14;:29;;;51396:1;51366:32;;;;;;;;;;;;;;:38;;;:49;;;51417:14;:29;;;51348:17;:99::i;:::-;51320:127;;;;;;;;51468:8;51464:139;;51521:42;51496:67;;51582:5;;51464:139;51665:1;51622:13;:39;;;:44;51619:174;;;51711:42;51686:67;;51772:5;;51619:174;51088:716;51146:3;;;;;;;51088:716;;;;51823:22;51816:29;;;;49797:2056;;;:::o;52084:1210::-;52190:16;52208:47;;:::i;:::-;52328:1;52275:49;52309:14;52275:33;:49::i;:::-;52270:55;;;;;;;;:59;52267:105;;;52339:5;52346:25;52331:41;;;;;;52267:105;52385:36;52442:14;:29;;;:36;52424:55;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52385:94;;52492:18;52521:11;52543:13;52567:32;;:::i;:::-;52614:6;52623:1;52614:10;;52610:548;52630:14;:29;;;:36;52626:1;:40;52610:548;;;52700:14;:29;;;52730:1;52700:32;;;;;;;;;;;;;;:38;;;:49;;;52687:62;;52794:58;52810:10;52822:14;:29;;;52794:15;:58::i;:::-;52766:86;;;;;;;;52871:8;52867:102;;52908:14;:29;;;52938:1;52908:32;;;;;;;;;;;;;;:38;;;:45;;;52899:54;;52867:102;52994:77;53044:13;:19;;;:26;;;52994:14;:29;;;53024:1;52994:32;;;;;;;;;;;;;;:38;;;:45;;;:49;;:77;;;;:::i;:::-;52985:86;;53109:37;53127:10;53139:6;53109:17;:37::i;:::-;53088:15;53104:1;53088:18;;;;;;;;;;;;;:58;;;;52668:3;;;;;;;52610:548;;;;53170:35;53226:4;53232:53;53253:15;53270:14;53232:20;:53::i;:::-;53218:68;;;;;;;;;;52084:1210;;;;:::o;47952:365::-;48076:52;;:::i;:::-;48147:162;48176:65;48195:14;:29;;;48226:14;48176:18;:65::i;:::-;48243;48262:14;:29;;;48293:14;48243:18;:65::i;:::-;48147:28;:162::i;:::-;48140:169;;47952:365;;;;:::o;12336:699::-;12416:15;12449:18;4386:42;12470:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12470:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12470:37: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;12470:37:0;;;;;;;;;12449:58;;3624:42;12527:23;;:10;:23;;;:50;;;;3713:42;12554:23;;:10;:23;;;12527:50;12524:149;;;3278:6;12597:24;;12647:10;12640:17;;;;;12524:149;3892:42;12692:24;;:10;:24;;;:51;;;;3802:42;12720:23;;:10;:23;;;12692:51;12689:213;;;12776:74;12843:6;12788:10;12776:42;;;12826:10;12776:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12776:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12776:62: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;12776:62:0;;;;;;;;;:66;;:74;;;;:::i;:::-;12763:87;;12876:10;12869:17;;;;;12689:213;12943:10;12931:42;;;12981:10;12931:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12931:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12931:62: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;12931:62:0;;;;;;;;;12918:75;;13015:10;13008:17;;;12336:699;;;;:::o;42344:822::-;42484:27;42525:19;42547:49;42569:10;42581:14;42547:21;:49::i;:::-;42525:71;;42607:38;42648:68;42689:10;42701:14;42648:40;:68::i;:::-;42607:109;;42727:38;42768:68;42809:10;42821:14;42768:40;:68::i;:::-;42727:109;;42847:13;42863:36;4017:42;42863:25;:36::i;:::-;42847:52;;43006:110;43107:8;43103:2;:12;43006:92;43025:72;43063:33;43025;:37;;:72;;;;:::i;:::-;43006:14;:18;;:92;;;;:::i;:::-;:96;;:110;;;;:::i;:::-;42981:135;;43136:22;43129:29;;;;;;42344:822;;;;;;:::o;44691:737::-;44753:35;44800:39;4386:42;44842:40;;;44883:3;44842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44842:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44842:45:0;;;;;;39:16:-1;36:1;17:17;2:54;44842:45: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;44842:45:0;;;;;;;;;44800:87;;44933:22;:29;44915:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44898:65;;44980:6;44989:1;44980:10;;44976:343;44996:22;:29;44992:1;:33;44976:343;;;45198:109;45216:22;45239:1;45216:25;;;;;;;;;;;;;;45243:63;45275:3;45280:22;45303:1;45280:25;;;;;;;;;;;;;;45243:31;:63::i;:::-;45198:17;:109::i;:::-;45178:14;45193:1;45178:17;;;;;;;;;;;;;:129;;;;45027:3;;;;;;;44976:343;;;;45348:38;45371:14;45348:22;:38::i;:::-;45331:55;;45406:14;45399:21;;;44691:737;;;:::o;45436:566::-;45498:35;45545;45583:29;45608:3;45583:24;:29::i;:::-;45545:67;;45660:18;:25;45642:44;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45625:61;;45703:6;45712:1;45703:10;;45699:194;45719:18;:25;45715:1;:29;45699:194;;;45785:96;45803:18;45822:1;45803:21;;;;;;;;;;;;;;45833:18;45852:1;45833:21;;;;;;;;;;;;;;45826:49;;;45876:3;45826:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45826:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45826:54: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;45826:54:0;;;;;;;;;45785:17;:96::i;:::-;45765:14;45780:1;45765:17;;;;;;;;;;;;;:116;;;;45746:3;;;;;;;45699:194;;;;45922:38;45945:14;45922:22;:38::i;:::-;45905:55;;45980:14;45973:21;;;45436:566;;;:::o;30832:335::-;30958:36;;:::i;:::-;31038:14;31006;:29;;:46;;;;31095:14;31063;:29;;:46;;;;31122:37;31144:14;31122:21;:37::i;:::-;30832:335;;;;:::o;905:113::-;963:7;991:1;986;:6;;979:14;;;;1011:1;1007;:5;1000:12;;905:113;;;;:::o;250:174::-;308:9;335:1;330;:6;326:37;;;354:1;347:8;;;;326:37;377:1;373;:5;369:9;;401:1;396;392;:5;;;;;;:10;385:18;;;;417:1;410:8;;250:174;;;;;:::o;511:277::-;569:7;781:1;777;:5;;;;;;770:12;;511:277;;;;:::o;29001:251::-;29083:30;;:::i;:::-;29125:18;;:::i;:::-;29146:31;29158:10;29170:6;29146:11;:31::i;:::-;29125:52;;29208:5;29188:11;:17;;:25;;;;29233:11;29226:18;;;29001:251;;;;:::o;28698:295::-;28780:30;;:::i;:::-;28822:18;;:::i;:::-;28843:31;28855:10;28867:6;28843:11;:31::i;:::-;28822:52;;28905:5;28885:11;:17;;:25;;;;28923:31;28942:11;28923:18;:31::i;:::-;28974:11;28967:18;;;28698:295;;;;:::o;36238:995::-;36360:6;36369:1;36360:10;;36356:409;36376:14;:29;;;:36;36372:1;:40;36356:409;;;36489:11;:17;;;:28;;;36436:81;;:14;:29;;;36466:1;36436:32;;;;;;;;;;;;;;:38;;;:49;;;:81;;;36433:94;;36519:8;;36433:94;36544:134;36568:14;:29;;;36598:1;36568:32;;;;;;;;;;;;;;36602:75;36652:11;:17;;;:24;;;36602:14;:29;;;36632:1;36602:32;;;;;;;;;;;;;;:38;;;:45;;;:49;;:75;;;;:::i;:::-;36544:23;:134::i;:::-;36693:37;36715:14;36693:21;:37::i;:::-;36747:7;;;36356:409;36414:3;;;;;;;36356:409;;;;36777:11;36791:43;36832:1;36791:14;:29;;;:36;:40;;:43;;;;:::i;:::-;36777:57;;36845:36;36902:6;36884:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;36845:64;;36926:6;36935:1;36926:10;;36922:142;36942:14;:29;;;:36;36938:1;:40;36922:142;;;37020:14;:29;;;37050:1;37020:32;;;;;;;;;;;;;;36999:15;37015:1;36999:18;;;;;;;;;;;;;:53;;;;36980:3;;;;;;;36922:142;;;;37104:11;37076:15;37099:1;37092:6;:8;37076:25;;;;;;;;;;;;;:39;;;;37160:15;37128:14;:29;;:47;;;;37186:37;37208:14;37186:21;:37::i;:::-;36238:995;;;;;:::o;35183:1047::-;35309:6;35318:1;35309:10;;35305:409;35325:14;:29;;;:36;35321:1;:40;35305:409;;;35438:11;:17;;;:28;;;35385:81;;:14;:29;;;35415:1;35385:32;;;;;;;;;;;;;;:38;;;:49;;;:81;;;35382:94;;35468:8;;35382:94;35493:134;35517:14;:29;;;35547:1;35517:32;;;;;;;;;;;;;;35551:75;35601:11;:17;;;:24;;;35551:14;:29;;;35581:1;35551:32;;;;;;;;;;;;;;:38;;;:45;;;:49;;:75;;;;:::i;:::-;35493:23;:134::i;:::-;35642:37;35664:14;35642:21;:37::i;:::-;35696:7;;;35305:409;35363:3;;;;;;;35305:409;;;;35780:11;35794:43;35835:1;35794:14;:29;;;:36;:40;;:43;;;;:::i;:::-;35780:57;;35848:35;35904:6;35886:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;35848:63;;35928:6;35937:1;35928:10;;35924:141;35944:14;:29;;;:36;35940:1;:40;35924:141;;;36021:14;:29;;;36051:1;36021:32;;;;;;;;;;;;;;36001:14;36016:1;36001:17;;;;;;;;;;;;;:52;;;;35982:3;;;;;;;35924:141;;;;36104:11;36077:14;36099:1;36092:6;:8;36077:24;;;;;;;;;;;;;:38;;;;36158:14;36126;:29;;:46;;;;36185:37;36207:14;36185:21;:37::i;:::-;35183:1047;;;;;:::o;37241:394::-;37345:13;37360:30;;:::i;:::-;37406:6;37415:1;37406:10;;37402:186;37422:12;:19;37418:1;:23;37402:186;;;37479:12;37492:1;37479:15;;;;;;;;;;;;;;:21;;;:32;;;37465:46;;:10;:46;;;37462:115;;;37539:4;37545:12;37558:1;37545:15;;;;;;;;;;;;;;37531:30;;;;;;;;;;37462:115;37443:3;;;;;;;37402:186;;;;37608:5;37615:11;37600:27;;;;37241:394;;;;;;:::o;37643:392::-;37745:13;37760:30;;:::i;:::-;37806:6;37815:1;37806:10;;37802:186;37822:12;:19;37818:1;:23;37802:186;;;37879:12;37892:1;37879:15;;;;;;;;;;;;;;:21;;;:32;;;37865:46;;:10;:46;;;37862:115;;;37939:4;37945:12;37958:1;37945:15;;;;;;;;;;;;;;37931:30;;;;;;;;;;37862:115;37843:3;;;;;;;37802:186;;;;38008:5;38015:11;38000:27;;;;37643:392;;;;;;:::o;48325:723::-;48431:39;48521:12;:19;48500:41;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48482:59;;48554:18;48583:25;48619:12;48646:6;48655:1;48646:10;;48642:364;48662:12;:19;48658:1;:23;48642:364;;;48715:12;48728:1;48715:15;;;;;;;;;;;;;;:21;;;:32;;;48702:45;;48792:10;48785:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48785:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48785:39: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;48785:39:0;;;;;;;;;48762:62;;48849:12;48862:1;48849:15;;;;;;;;;;;;;;:21;;;:28;;;48839:38;;48915:79;48936:10;48948:20;48970:7;48979:14;48915:20;:79::i;:::-;48894:15;48910:1;48894:18;;;;;;;;;;;;;:100;;;;48683:3;;;;;;;48642:364;;;;49025:15;49018:22;;;;;48325:723;;;;:::o;49056:733::-;49164:39;49254:14;:21;49233:43;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49215:61;;49289:18;49318:25;49354:12;49381:6;49390:1;49381:10;;49377:370;49397:14;:21;49393:1;:25;49377:370;;;49452:14;49467:1;49452:17;;;;;;;;;;;;;;:23;;;:34;;;49439:47;;49531:10;49524:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49524:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49524:39: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;49524:39:0;;;;;;;;;49501:62;;49588:14;49603:1;49588:17;;;;;;;;;;;;;;:23;;;:30;;;49578:40;;49656:79;49677:10;49689:20;49711:7;49720:14;49656:20;:79::i;:::-;49635:15;49651:1;49635:18;;;;;;;;;;;;;:100;;;;49420:3;;;;;;;49377:370;;;;49766:15;49759:22;;;;;49056:733;;;;:::o;27138:445::-;27280:52;;:::i;:::-;27385:15;27344:22;:38;;:56;;;;27452:15;27411:22;:38;;:56;;;;27480:53;27510:22;27480:29;:53::i;:::-;27553:22;27546:29;;27138:445;;;;:::o;15125:204::-;15219:19;15259:60;15304:14;15259:40;15288:10;15259:28;:40::i;:::-;:44;;:60;;;;:::i;:::-;15252:67;;15125:204;;;;:::o;17843:294::-;17956:38;18008:16;18027:30;18046:10;18027:18;:30::i;:::-;18008:49;;18079:48;18115:11;18079:31;3278:6;18079:14;:18;;:31;;;;:::i;:::-;:35;;:48;;;;:::i;:::-;18072:55;;;17843:294;;;;:::o;18605:299::-;18718:38;18772:16;18798:10;18791:31;;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18791:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18791:33: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;18791:33:0;;;;;;;;;18772:52;;18846:48;18882:11;18846:31;3278:6;18846:14;:18;;:31;;;;:::i;:::-;:35;;:48;;;;:::i;:::-;18839:55;;;18605:299;;;;:::o;13900:374::-;13977:13;3535:42;14007:22;;:10;:22;;;14004:104;;;14059:2;14048:13;;14086:8;14079:15;;;;14004:104;14122:22;14147:33;14169:10;14147:21;:33::i;:::-;14122:58;;14210:14;14204:30;;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14204:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14204:32: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;14204:32:0;;;;;;;;;14193:43;;;;14256:8;14249:15;;;13900:374;;;;:::o;1085:127::-;1143:9;1169:1;1165;:5;1161:9;;1189:1;1184;:6;;1177:14;;;;1205:1;1198:8;;1085:127;;;;:::o;18914:274::-;19010:29;19053:13;19076:10;19053:34;;19107:71;3278:6;19107:54;19133:6;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19133:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19133:27: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;19133:27:0;;;;;;;;;19107:6;:16;;;19124:3;19107:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19107:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19107:21: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;19107:21:0;;;;;;;;;:25;;:54;;;;:::i;:::-;:58;;:71;;;;:::i;:::-;19100:78;;;18914:274;;;;:::o;38043:642::-;38132:36;38180:11;38208:6;38217:1;38208:10;;38204:148;38224:12;:19;38220:1;:23;38204:148;;;38304:1;38267:12;38280:1;38267:15;;;;;;;;;;;;;;:21;;;:33;;;:38;38264:51;;;38307:8;;38264:51;38332:8;;;;;;;38204:148;38245:3;;;;;;;38204:148;;;;38400:6;38382:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;38364:43;;38418:10;38445:6;38454:1;38445:10;;38441:202;38461:12;:19;38457:1;:23;38441:202;;;38541:1;38504:12;38517:1;38504:15;;;;;;;;;;;;;;:21;;;:33;;;:38;38501:51;;;38544:8;;38501:51;38594:12;38607:1;38594:15;;;;;;;;;;;;;;38569;38585:5;38569:22;;;;;;;;;;;;;:40;;;;38624:7;;;;;;;38441:202;38482:3;;;;;;;38441:202;;;;38662:15;38655:22;;;;38043:642;;;:::o;19198:825::-;19267:35;19316:26;4386:42;19345;;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19345:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19345:44:0;;;;;;39:16:-1;36:1;17:17;2:54;19345:44: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;19345:44:0;;;;;;;;;19316:73;;19404:11;19432:6;19441:1;19432:10;;19428:229;19448:10;:17;19444:1;:21;19428:229;;;19605:1;19563:10;19574:1;19563:13;;;;;;;;;;;;;;:33;;;19597:3;19563:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19563:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19563:38: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;19563:38:0;;;;;;;;;:43;19560:56;;;19608:8;;19560:56;19635:8;;;;;;;19428:229;19467:3;;;;;;;19428:229;;;;19706:6;19692:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;19692:21:0;;;;19671:42;;19728:10;19755:6;19764:1;19755:10;;19751:223;19771:10;:17;19767:1;:21;19751:223;;;19856:1;19814:10;19825:1;19814:13;;;;;;;;;;;;;;:33;;;19848:3;19814:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19814:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19814:38: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;19814:38:0;;;;;;;;;:43;19811:56;;;19859:8;;19811:56;19922:10;19933:1;19922:13;;;;;;;;;;;;;;19886:18;19905:5;19886:25;;;;;;;;;;;;;:50;;;;;;;;;;;19953:7;;;;;;;19751:223;19790:3;;;;;;;19751:223;;;;19995:18;19988:25;;;;;19198:825;;;:::o;38693:642::-;38782:36;38830:11;38858:6;38867:1;38858:10;;38854:148;38874:12;:19;38870:1;:23;38854:148;;;38954:1;38917:12;38930:1;38917:15;;;;;;;;;;;;;;:21;;;:33;;;:38;38914:51;;;38957:8;;38914:51;38982:8;;;;;;;38854:148;38895:3;;;;;;;38854:148;;;;39050:6;39032:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;39014:43;;39068:10;39095:6;39104:1;39095:10;;39091:202;39111:12;:19;39107:1;:23;39091:202;;;39191:1;39154:12;39167:1;39154:15;;;;;;;;;;;;;;:21;;;:33;;;:38;39151:51;;;39194:8;;39151:51;39244:12;39257:1;39244:15;;;;;;;;;;;;;;39219;39235:5;39219:22;;;;;;;;;;;;;:40;;;;39274:7;;;;;;;39091:202;39132:3;;;;;;;39091:202;;;;39312:15;39305:22;;;;38693:642;;;:::o;31175:870::-;31305:52;31327:14;:29;;;31305:21;:52::i;:::-;31268:14;:34;;:89;;;;;31405:52;31427:14;:29;;;31405:21;:52::i;:::-;31368:14;:34;;:89;;;;;31517:64;31551:14;:29;;;31517:33;:64::i;:::-;31468:14;:46;;:113;;;;;31625:89;31643:14;:34;;;31679:14;:34;;;31625:17;:89::i;:::-;31592:14;:30;;:122;;;;;31766:109;31792:14;:46;;;31840:14;:34;;;31766:25;:109::i;:::-;31725:14;:38;;:150;;;;;31938:99;31976:14;:29;;;32007:14;:29;;;31938:37;:99::i;:::-;31886:14;:49;;:151;;;;31175:870;:::o;30046:177::-;30122:18;;:::i;:::-;30152:38;30164:5;30171:10;30183:6;30152:11;:38::i;:::-;30210:5;30203:12;;30046:177;;;;:::o;29704:334::-;29828:61;29860:11;:17;;;:28;;;29828:31;:61::i;:::-;29788:11;:37;;:101;;;;;29941:89;3278:6;29941:72;29975:11;:37;;;29941:11;:17;;;:29;;;:33;;:72;;;;:::i;:::-;:76;;:89;;;;:::i;:::-;29900:11;:38;;:130;;;;;29704:334;:::o;29503:193::-;29635:9;29608:11;:17;;;:24;;:36;;;;;29657:31;29670:11;:17;;;29657:12;:31::i;:::-;29503:193;;:::o;29260:235::-;29392:9;29365:11;:17;;;:24;;:36;;;;;29414:31;29427:11;:17;;;29414:12;:31::i;:::-;29456;29475:11;29456:18;:31::i;:::-;29260:235;;:::o;26244:481::-;26378:36;;:::i;:::-;26454:10;26426:14;:25;;:38;;;;;;;;;;;26513:20;26475:14;:35;;:58;;;;;26569:7;26544:14;:22;;:32;;;;;26619:14;26587;:29;;:46;;;;;26646:37;26668:14;26646:21;:37::i;:::-;26703:14;26696:21;;26244:481;;;;;;:::o;27591:1099::-;27709:29;27749;27795:6;27804:1;27795:10;;27791:182;27811:22;:38;;;:45;27807:1;:49;27791:182;;;27905:22;:38;;;27944:1;27905:41;;;;;;;;;;;;;;:56;;;27877:84;;;;27858:3;;;;;;;27791:182;;;;27989:6;27998:1;27989:10;;27985:182;28005:22;:38;;;:45;28001:1;:49;27985:182;;;28099:22;:38;;;28138:1;28099:41;;;;;;;;;;;;;;:56;;;28071:84;;;;28052:3;;;;;;;27985:182;;;;28209:24;28182;:51;28179:245;;;28294:54;28323:24;28294;:28;;:54;;;;:::i;:::-;28249:22;:42;;:99;;;;;28408:4;28363:22;:42;;:49;;;;;;;;;;;28179:245;28467:24;28439;:52;28436:247;;28552:54;28581:24;28552;:28;;:54;;;;:::i;:::-;28507:22;:42;;:99;;;;;28666:5;28621:22;:42;;:50;;;;;;;;;;;28436:247;27591:1099;;;:::o;14875:238::-;14955:26;14995:23;4386:42;14995:54;;15069:11;:22;;;15092:10;15069:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15069:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15069:34: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;15069:34:0;;;;;;;;;15062:41;;;14875:238;;;:::o;14509:356::-;14579:16;14609:13;14632:10;14609:34;;14656:9;14668:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14668:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14668:16: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;14668:16:0;;;;;;;;;14656:28;;14697:16;14716:6;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14716:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14716:21: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;14716:21:0;;;;;;;;;14697:40;;14750:18;14771:6;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14771:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14771:22: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;14771:22:0;;;;;;;;;14750:43;;14815:40;14841:13;14815:21;14824:11;14815:4;:8;;:21;;;;:::i;:::-;:25;;:40;;;;:::i;:::-;14808:47;;;;;;14509:356;;;:::o;11670:292::-;11743:22;3535:42;11783:22;;:10;:22;;;11780:74;;;11838:1;11823:17;;;;11780:74;11892:10;11885:29;;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11885:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11885:31: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;11885:31:0;;;;;;;;;11868:48;;11938:14;11931:21;;11670:292;;;;:::o;32053:301::-;32143:23;32182:6;32191:1;32182:10;;32178:131;32198:14;:21;32194:1;:25;32178:131;;;32262:14;32277:1;32262:17;;;;;;;;;;;;;;:23;;;:35;;;32240:57;;;;32221:3;;;;;;;32178:131;;;;32328:18;32321:25;;32053:301;;;:::o;32362:::-;32452:23;32491:6;32500:1;32491:10;;32487:131;32507:14;:21;32503:1;:25;32487:131;;;32571:14;32586:1;32571:17;;;;;;;;;;;;;;:23;;;:35;;;32549:57;;;;32530:3;;;;;;;32487:131;;;;32637:18;32630:25;;32362:301;;;:::o;32671:358::-;32773:35;32824:6;32833:1;32824:10;;32820:152;32840:14;:21;32836:1;:25;32820:152;;;32916:14;32931:1;32916:17;;;;;;;;;;;;;;:44;;;32882:78;;;;32863:3;;;;;;;32820:152;;;;32991:30;32984:37;;32671:358;;;:::o;34509:277::-;34608:19;34663:18;34642;:39;34639:119;;;34704:42;34727:18;34704;:22;;:42;;;;:::i;:::-;34697:49;;;;34639:119;34777:1;34770:8;;34509:277;;;;;:::o;33037:315::-;33156:27;33232:1;33198:30;:35;33195:58;;;3278:6;33235:18;;;;33195:58;33273:71;33313:30;33273:35;3278:6;33273:18;:22;;:35;;;;:::i;:::-;:39;;:71;;;;:::i;:::-;33266:78;;33037:315;;;;;:::o;33360:1141::-;33503:48;33613:14;:21;33602:33;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;33602:33:0;;;;33565:70;;33648:14;33673:33;;:::i;:::-;33723:6;33732:1;33723:10;;33719:721;33739:14;:21;33735:1;:25;33719:721;;;33811:81;33841:14;33856:1;33841:17;;;;;;;;;;;;;;:23;;;:34;;;33877:14;33811:29;:81::i;:::-;33781:111;;;;;;;;33960:1;33912:14;33927:1;33912:17;;;;;;;;;;;;;;:44;;;:49;33909:142;;;24765:78;33981:34;34016:1;33981:37;;;;;;;;;;;;;:54;;;;;33909:142;34071:9;34067:117;;34140:1;34100:34;34135:1;34100:37;;;;;;;;;;;;;:41;;;;;34160:8;;34067:117;34251:1;34203:14;34218:1;34203:17;;;;;;;;;;;;;;:44;;;:49;34200:227;;34312:99;34366:14;34381:1;34366:17;;;;;;;;;;;;;;:44;;;34312:49;3278:6;34312:14;:20;;;:32;;;:36;;:49;;;;:::i;:::-;:53;;:99;;;;:::i;:::-;34272:34;34307:1;34272:37;;;;;;;;;;;;;:139;;;;;34200:227;33719:721;33762:3;;;;;;;33719:721;;;;34459:34;34452:41;;;;33360:1141;;;;:::o;30231:199::-;30348:10;30329:5;:16;;:29;;;;;;;;;;;30384:6;30369:5;:12;;:21;;;;;30403:19;30416:5;30403:12;:19::i;:::-;30231:199;;;:::o;20033:336::-;20116:29;20159:13;4386:42;20228:36;;;20265:10;20228:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20228:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20228:48: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;20228:48:0;;;;;;;;;20187:89;;;;;;;;;20295:8;20291:22;;20312:1;20305:8;;;;;20291:22;20335:24;20328:31;;;20033:336;;;;:::o;30438:386::-;30530:41;30554:5;:16;;;30530:23;:41::i;:::-;30504:5;:23;;:67;;;;30610:43;30636:5;:16;;;30610:25;:43::i;:::-;30582:5;:25;;:71;;;;;30684:56;30709:5;:12;;;30723:5;:16;;;30684:24;:56::i;:::-;30664:5;:17;;:76;;;;;30770:46;30799:5;:16;;;30770:28;:46::i;:::-;30751:5;:16;;:65;;;;;30438:386;:::o;26733:397::-;26861:50;26885:14;:25;;;26861:23;:50::i;:::-;26826:14;:32;;:85;;;;26954:168;3278:6;26954:151;27075:14;:29;;;26954:116;26979:63;27006:14;:35;;;26979:14;:22;;;:26;;:63;;;;:::i;:::-;27044:14;:25;;;26954:24;:116::i;:::-;:120;;:151;;;;:::i;:::-;:155;;:168;;;;:::i;:::-;26922:14;:29;;:200;;;;;26733:397;:::o;34794:381::-;34912:13;34927:30;;:::i;:::-;34973:6;34982:1;34973:10;;34969:159;34989:14;:21;34985:1;:25;34969:159;;;35072:10;35034:48;;:14;35049:1;35034:17;;;;;;;;;;;;;;:23;;;:34;;;:48;;;35031:85;;;35092:4;35098:14;35113:1;35098:17;;;;;;;;;;;;;;35084:32;;;;;;;;;;35031:85;35012:3;;;;;;;34969:159;;;;35148:5;35155:11;35140:27;;;;34794:381;;;;;;:::o;13596:294::-;13671:33;3535:42;13721:22;;:10;:22;;;13718:39;;;13745:12;;;;;;;;;;;;;;;;;;;;;13718:39;4105:42;13775:22;;:10;:22;;;13772:39;;;13799:12;;;;;;;;;;;;;;;;;;;;;13772:39;13846:10;13839:29;;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13839:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13839:31: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;13839:31:0;;;;;;;;;13833:45;;;:47;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13833:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13833:47:0;;;;;;39:16:-1;36:1;17:17;2:54;13833:47: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;13833:47:0;;;;;;;;;13826:54;;13596:294;;;;:::o;11974:352::-;12074:15;12105:23;12131:37;12157:10;12131:25;:37::i;:::-;12105:63;;12194:90;12265:18;12261:2;:22;12194:62;12238:17;12194:39;12222:10;12194:27;:39::i;:::-;:43;;:62;;;;:::i;:::-;:66;;:90;;;;:::i;:::-;12181:103;;12306:10;12299:17;;;11974:352;;;;:::o;39346:13957::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;301:722;;429:3;422:4;414:6;410:17;406:27;396:2;;447:1;444;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;;;499:80;;;490:89;;596:5;621:6;614:5;607:21;651:4;643:6;639:17;629:27;;673:4;668:3;664:14;657:21;;726:6;773:3;765:4;757:6;753:17;748:3;744:27;741:36;738:2;;;790:1;787;780:12;738:2;815:1;800:217;825:6;822:1;819:13;800:217;;;883:3;905:48;949:3;937:10;905:48;;;900:3;893:61;977:4;972:3;968:14;961:21;;1005:4;1000:3;996:14;989:21;;857:160;847:1;844;840:9;835:14;;800:217;;;804:14;389:634;;;;;;;;1057:764;;1199:3;1192:4;1184:6;1180:17;1176:27;1166:2;;1217:1;1214;1207:12;1166:2;1247:6;1241:13;1269:94;1284:78;1355:6;1284:78;;;1269:94;;;1260:103;;1380:5;1405:6;1398:5;1391:21;1435:4;1427:6;1423:17;1413:27;;1457:4;1452:3;1448:14;1441:21;;1510:6;1557:3;1549:4;1541:6;1537:17;1532:3;1528:27;1525:36;1522:2;;;1574:1;1571;1564:12;1522:2;1599:1;1584:231;1609:6;1606:1;1603:13;1584:231;;;1667:3;1689:62;1747:3;1735:10;1689:62;;;1684:3;1677:75;1775:4;1770:3;1766:14;1759:21;;1803:4;1798:3;1794:14;1787:21;;1641:174;1631:1;1628;1624:9;1619:14;;1584:231;;;1588:14;1159:662;;;;;;;;1884:745;;2022:3;2015:4;2007:6;2003:17;1999:27;1989:2;;2040:1;2037;2030:12;1989:2;2077:6;2064:20;2099:101;2114:85;2192:6;2114:85;;;2099:101;;;2090:110;;2217:5;2242:6;2235:5;2228:21;2272:4;2264:6;2260:17;2250:27;;2294:4;2289:3;2285:14;2278:21;;2347:6;2380:1;2365:258;2390:6;2387:1;2384:13;2365:258;;;2473:3;2460:17;2452:6;2448:30;2497:62;2555:3;2543:10;2497:62;;;2492:3;2485:75;2583:4;2578:3;2574:14;2567:21;;2611:4;2606:3;2602:14;2595:21;;2422:201;2412:1;2409;2405:9;2400:14;;2365:258;;;2369:14;1982:647;;;;;;;;2692:745;;2830:3;2823:4;2815:6;2811:17;2807:27;2797:2;;2848:1;2845;2838:12;2797:2;2885:6;2872:20;2907:101;2922:85;3000:6;2922:85;;;2907:101;;;2898:110;;3025:5;3050:6;3043:5;3036:21;3080:4;3072:6;3068:17;3058:27;;3102:4;3097:3;3093:14;3086:21;;3155:6;3188:1;3173:258;3198:6;3195:1;3192:13;3173:258;;;3281:3;3268:17;3260:6;3256:30;3305:62;3363:3;3351:10;3305:62;;;3300:3;3293:75;3391:4;3386:3;3382:14;3375:21;;3419:4;3414:3;3410:14;3403:21;;3230:201;3220:1;3217;3213:9;3208:14;;3173:258;;;3177:14;2790:647;;;;;;;;3463:699;;3576:3;3569:4;3561:6;3557:17;3553:27;3543:2;;3594:1;3591;3584:12;3543:2;3631:6;3618:20;3653:76;3668:60;3721:6;3668:60;;;3653:76;;;3644:85;;3746:5;3771:6;3764:5;3757:21;3801:4;3793:6;3789:17;3779:27;;3823:4;3818:3;3814:14;3807:21;;3876:6;3923:3;3915:4;3907:6;3903:17;3898:3;3894:27;3891:36;3888:2;;;3940:1;3937;3930:12;3888:2;3965:1;3950:206;3975:6;3972:1;3969:13;3950:206;;;4033:3;4055:37;4088:3;4076:10;4055:37;;;4050:3;4043:50;4116:4;4111:3;4107:14;4100:21;;4144:4;4139:3;4135:14;4128:21;;4007:149;3997:1;3994;3990:9;3985:14;;3950:206;;;3954:14;3536:626;;;;;;;;4170:128;;4251:6;4245:13;4236:22;;4263:30;4287:5;4263:30;;;4230:68;;;;;4305:162;;4403:6;4397:13;4388:22;;4415:47;4456:5;4415:47;;;4382:85;;;;;4475:434;;4573:3;4566:4;4558:6;4554:17;4550:27;4540:2;;4591:1;4588;4581:12;4540:2;4628:6;4615:20;4650:61;4665:45;4703:6;4665:45;;;4650:61;;;4641:70;;4731:6;4724:5;4717:21;4767:4;4759:6;4755:17;4800:4;4793:5;4789:16;4835:3;4826:6;4821:3;4817:16;4814:25;4811:2;;;4852:1;4849;4842:12;4811:2;4862:41;4896:6;4891:3;4886;4862:41;;;4533:376;;;;;;;;4918:444;;5031:3;5024:4;5016:6;5012:17;5008:27;4998:2;;5049:1;5046;5039:12;4998:2;5079:6;5073:13;5101:65;5116:49;5158:6;5116:49;;;5101:65;;;5092:74;;5186:6;5179:5;5172:21;5222:4;5214:6;5210:17;5255:4;5248:5;5244:16;5290:3;5281:6;5276:3;5272:16;5269:25;5266:2;;;5307:1;5304;5297:12;5266:2;5317:39;5349:6;5344:3;5339;5317:39;;;4991:371;;;;;;;;5424:1854;;5545:6;5533:9;5528:3;5524:19;5520:32;5517:2;;;5565:1;5562;5555:12;5517:2;5583:22;5598:6;5583:22;;;5574:31;;5693:1;5682:9;5678:17;5665:31;5716:18;5708:6;5705:30;5702:2;;;5748:1;5745;5738:12;5702:2;5783:95;5874:3;5865:6;5854:9;5850:22;5783:95;;;5776:4;5769:5;5765:16;5758:121;5615:275;5978:2;5967:9;5963:18;5950:32;6002:18;5994:6;5991:30;5988:2;;;6034:1;6031;6024:12;5988:2;6069:95;6160:3;6151:6;6140:9;6136:22;6069:95;;;6062:4;6055:5;6051:16;6044:121;5900:276;6241:2;6274:49;6319:3;6310:6;6299:9;6295:22;6274:49;;;6267:4;6260:5;6256:16;6249:75;6186:149;6400:2;6433:49;6478:3;6469:6;6458:9;6454:22;6433:49;;;6426:4;6419:5;6415:16;6408:75;6345:149;6571:3;6605:49;6650:3;6641:6;6630:9;6626:22;6605:49;;;6598:4;6591:5;6587:16;6580:75;6504:162;6735:3;6769:49;6814:3;6805:6;6794:9;6790:22;6769:49;;;6762:4;6755:5;6751:16;6744:75;6676:154;6891:3;6925:49;6970:3;6961:6;6950:9;6946:22;6925:49;;;6918:4;6911:5;6907:16;6900:75;6840:146;7094:3;7083:9;7079:19;7066:33;7119:18;7111:6;7108:30;7105:2;;;7151:1;7148;7141:12;7105:2;7186:70;7252:3;7243:6;7232:9;7228:22;7186:70;;;7179:4;7172:5;7168:16;7161:96;6996:272;5511:1767;;;;;7330:1180;;7438:4;7426:9;7421:3;7417:19;7413:30;7410:2;;;7456:1;7453;7446:12;7410:2;7474:20;7489:4;7474:20;;;7465:29;;7550:1;7582:49;7627:3;7618:6;7607:9;7603:22;7582:49;;;7575:4;7568:5;7564:16;7557:75;7504:139;7695:2;7728:49;7773:3;7764:6;7753:9;7749:22;7728:49;;;7721:4;7714:5;7710:16;7703:75;7653:136;7880:2;7869:9;7865:18;7852:32;7904:18;7896:6;7893:30;7890:2;;;7936:1;7933;7926:12;7890:2;7971:55;8022:3;8013:6;8002:9;7998:22;7971:55;;;7964:4;7957:5;7953:16;7946:81;7799:239;8103:2;8136:49;8181:3;8172:6;8161:9;8157:22;8136:49;;;8129:4;8122:5;8118:16;8111:75;8048:149;8254:3;8288:49;8333:3;8324:6;8313:9;8309:22;8288:49;;;8281:4;8274:5;8270:16;8263:75;8207:142;8405:3;8439:49;8484:3;8475:6;8464:9;8460:22;8439:49;;;8432:4;8425:5;8421:16;8414:75;8359:141;7404:1106;;;;;8568:429;;8682:4;8670:9;8665:3;8661:19;8657:30;8654:2;;;8700:1;8697;8690:12;8654:2;8718:20;8733:4;8718:20;;;8709:29;;8817:1;8806:9;8802:17;8789:31;8840:18;8832:6;8829:30;8826:2;;;8872:1;8869;8862:12;8826:2;8907:68;8971:3;8962:6;8951:9;8947:22;8907:68;;;8900:4;8893:5;8889:16;8882:94;8748:239;8648:349;;;;;9053:837;;9192:4;9180:9;9175:3;9171:19;9167:30;9164:2;;;9210:1;9207;9200:12;9164:2;9228:20;9243:4;9228:20;;;9219:29;;9301:1;9333:60;9389:3;9380:6;9369:9;9365:22;9333:60;;;9326:4;9319:5;9315:16;9308:86;9258:147;9456:2;9489:60;9545:3;9536:6;9525:9;9521:22;9489:60;;;9482:4;9475:5;9471:16;9464:86;9415:146;9615:2;9648:60;9704:3;9695:6;9684:9;9680:22;9648:60;;;9641:4;9634:5;9630:16;9623:86;9571:149;9775:2;9808:60;9864:3;9855:6;9844:9;9840:22;9808:60;;;9801:4;9794:5;9790:16;9783:86;9730:150;9158:732;;;;;9948:760;;10062:4;10050:9;10045:3;10041:19;10037:30;10034:2;;;10080:1;10077;10070:12;10034:2;10098:20;10113:4;10098:20;;;10089:29;;10197:1;10186:9;10182:17;10169:31;10220:18;10212:6;10209:30;10206:2;;;10252:1;10249;10242:12;10206:2;10287:68;10351:3;10342:6;10331:9;10327:22;10287:68;;;10280:4;10273:5;10269:16;10262:94;10128:239;10438:2;10471:49;10516:3;10507:6;10496:9;10492:22;10471:49;;;10464:4;10457:5;10453:16;10446:75;10377:155;10604:2;10637:49;10682:3;10673:6;10662:9;10658:22;10637:49;;;10630:4;10623:5;10619:16;10612:75;10542:156;10028:680;;;;;10715:130;;10795:6;10782:20;10773:29;;10807:33;10834:5;10807:33;;;10767:78;;;;;10852:134;;10936:6;10930:13;10921:22;;10948:33;10975:5;10948:33;;;10915:71;;;;;10993:130;;11075:6;11069:13;11060:22;;11087:31;11112:5;11087:31;;;11054:69;;;;;11130:241;;11234:2;11222:9;11213:7;11209:23;11205:32;11202:2;;;11250:1;11247;11240:12;11202:2;11285:1;11302:53;11347:7;11338:6;11327:9;11323:22;11302:53;;;11292:63;;11264:97;11196:175;;;;;11378:263;;11493:2;11481:9;11472:7;11468:23;11464:32;11461:2;;;11509:1;11506;11499:12;11461:2;11544:1;11561:64;11617:7;11608:6;11597:9;11593:22;11561:64;;;11551:74;;11523:108;11455:186;;;;;11648:366;;;11769:2;11757:9;11748:7;11744:23;11740:32;11737:2;;;11785:1;11782;11775:12;11737:2;11820:1;11837:53;11882:7;11873:6;11862:9;11858:22;11837:53;;;11827:63;;11799:97;11927:2;11945:53;11990:7;11981:6;11970:9;11966:22;11945:53;;;11935:63;;11906:98;11731:283;;;;;;12021:392;;12161:2;12149:9;12140:7;12136:23;12132:32;12129:2;;;12177:1;12174;12167:12;12129:2;12233:1;12222:9;12218:17;12212:24;12256:18;12248:6;12245:30;12242:2;;;12288:1;12285;12278:12;12242:2;12308:89;12389:7;12380:6;12369:9;12365:22;12308:89;;;12298:99;;12191:212;12123:290;;;;;12420:420;;12574:2;12562:9;12553:7;12549:23;12545:32;12542:2;;;12590:1;12587;12580:12;12542:2;12646:1;12635:9;12631:17;12625:24;12669:18;12661:6;12658:30;12655:2;;;12701:1;12698;12691:12;12655:2;12721:103;12816:7;12807:6;12796:9;12792:22;12721:103;;;12711:113;;12604:226;12536:304;;;;;12847:523;;;;12990:2;12978:9;12969:7;12965:23;12961:32;12958:2;;;13006:1;13003;12996:12;12958:2;13041:1;13058:61;13111:7;13102:6;13091:9;13087:22;13058:61;;;13048:71;;13020:105;13156:2;13174:64;13230:7;13221:6;13210:9;13206:22;13174:64;;;13164:74;;13135:109;13275:2;13293:61;13346:7;13337:6;13326:9;13322:22;13293:61;;;13283:71;;13254:106;12952:418;;;;;;13377:362;;13502:2;13490:9;13481:7;13477:23;13473:32;13470:2;;;13518:1;13515;13508:12;13470:2;13574:1;13563:9;13559:17;13553:24;13597:18;13589:6;13586:30;13583:2;;;13629:1;13626;13619:12;13583:2;13649:74;13715:7;13706:6;13695:9;13691:22;13649:74;;;13639:84;;13532:197;13464:275;;;;;13746:391;;13882:2;13870:9;13861:7;13857:23;13853:32;13850:2;;;13898:1;13895;13888:12;13850:2;13961:1;13950:9;13946:17;13933:31;13984:18;13976:6;13973:30;13970:2;;;14016:1;14013;14006:12;13970:2;14036:85;14113:7;14104:6;14093:9;14089:22;14036:85;;;14026:95;;13912:215;13844:293;;;;;14144:516;;;14297:2;14285:9;14276:7;14272:23;14268:32;14265:2;;;14313:1;14310;14303:12;14265:2;14376:1;14365:9;14361:17;14348:31;14399:18;14391:6;14388:30;14385:2;;;14431:1;14428;14421:12;14385:2;14451:85;14528:7;14519:6;14508:9;14504:22;14451:85;;;14441:95;;14327:215;14573:2;14591:53;14636:7;14627:6;14616:9;14612:22;14591:53;;;14581:63;;14552:98;14259:401;;;;;;14667:342;;14821:3;14809:9;14800:7;14796:23;14792:33;14789:2;;;14838:1;14835;14828:12;14789:2;14873:1;14890:103;14985:7;14976:6;14965:9;14961:22;14890:103;;;14880:113;;14852:147;14783:226;;;;;15016:241;;15120:2;15108:9;15099:7;15095:23;15091:32;15088:2;;;15136:1;15133;15126:12;15088:2;15171:1;15188:53;15233:7;15224:6;15213:9;15209:22;15188:53;;;15178:63;;15150:97;15082:175;;;;;15264:263;;15379:2;15367:9;15358:7;15354:23;15350:32;15347:2;;;15395:1;15392;15385:12;15347:2;15430:1;15447:64;15503:7;15494:6;15483:9;15479:22;15447:64;;;15437:74;;15409:108;15341:186;;;;;15534:259;;15647:2;15635:9;15626:7;15622:23;15618:32;15615:2;;;15663:1;15660;15653:12;15615:2;15698:1;15715:62;15769:7;15760:6;15749:9;15745:22;15715:62;;;15705:72;;15677:106;15609:184;;;;;15801:257;;15952:100;16048:3;16040:6;15952:100;;;15938:114;;15931:127;;;;;16067:269;;16224:106;16326:3;16318:6;16224:106;;;16210:120;;16203:133;;;;;16345:257;;16496:100;16592:3;16584:6;16496:100;;;16482:114;;16475:127;;;;;16611:173;;16698:46;16740:3;16732:6;16698:46;;;16773:4;16768:3;16764:14;16750:28;;16691:93;;;;;16792:103;16865:24;16883:5;16865:24;;;16860:3;16853:37;16847:48;;;16902:113;16985:24;17003:5;16985:24;;;16980:3;16973:37;16967:48;;;17127:1012;;17308:75;17377:5;17308:75;;;17396:101;17490:6;17485:3;17396:101;;;17389:108;;17520:3;17562:4;17554:6;17550:17;17545:3;17541:27;17589:77;17660:5;17589:77;;;17686:7;17714:1;17699:401;17724:6;17721:1;17718:13;17699:401;;;17786:9;17780:4;17776:20;17771:3;17764:33;17831:6;17825:13;17853:114;17962:4;17947:13;17853:114;;;17845:122;;17984:81;18058:6;17984:81;;;17974:91;;18088:4;18083:3;18079:14;18072:21;;17756:344;17746:1;17743;17739:9;17734:14;;17699:401;;;17703:14;18113:4;18106:11;;18130:3;18123:10;;17287:852;;;;;;;;;;18258:1036;;18445:78;18517:5;18445:78;;;18536:104;18633:6;18628:3;18536:104;;;18529:111;;18663:3;18705:4;18697:6;18693:17;18688:3;18684:27;18732:80;18806:5;18732:80;;;18832:7;18860:1;18845:410;18870:6;18867:1;18864:13;18845:410;;;18932:9;18926:4;18922:20;18917:3;18910:33;18977:6;18971:13;18999:120;19114:4;19099:13;18999:120;;;18991:128;;19136:84;19213:6;19136:84;;;19126:94;;19243:4;19238:3;19234:14;19227:21;;18902:353;18892:1;18889;18885:9;18880:14;;18845:410;;;18849:14;19268:4;19261:11;;19285:3;19278:10;;18424:870;;;;;;;;;;19407:1012;;19588:75;19657:5;19588:75;;;19676:101;19770:6;19765:3;19676:101;;;19669:108;;19800:3;19842:4;19834:6;19830:17;19825:3;19821:27;19869:77;19940:5;19869:77;;;19966:7;19994:1;19979:401;20004:6;20001:1;19998:13;19979:401;;;20066:9;20060:4;20056:20;20051:3;20044:33;20111:6;20105:13;20133:114;20242:4;20227:13;20133:114;;;20125:122;;20264:81;20338:6;20264:81;;;20254:91;;20368:4;20363:3;20359:14;20352:21;;20036:344;20026:1;20023;20019:9;20014:14;;19979:401;;;19983:14;20393:4;20386:11;;20410:3;20403:10;;19567:852;;;;;;;;;;20458:654;;20589:50;20633:5;20589:50;;;20652:76;20721:6;20716:3;20652:76;;;20645:83;;20749:52;20795:5;20749:52;;;20821:7;20849:1;20834:256;20859:6;20856:1;20853:13;20834:256;;;20926:6;20920:13;20947:63;21006:3;20991:13;20947:63;;;20940:70;;21027:56;21076:6;21027:56;;;21017:66;;20891:199;20881:1;20878;20874:9;20869:14;;20834:256;;;20838:14;21103:3;21096:10;;20568:544;;;;;;;;21120:94;21187:21;21202:5;21187:21;;;21182:3;21175:34;21169:45;;;21221:104;21298:21;21313:5;21298:21;;;21293:3;21286:34;21280:45;;;21332:154;21429:51;21474:5;21429:51;;;21424:3;21417:64;21411:75;;;21493:150;21588:49;21631:5;21588:49;;;21583:3;21576:62;21570:73;;;21650:190;21765:69;21828:5;21765:69;;;21760:3;21753:82;21747:93;;;21847:176;21955:62;22011:5;21955:62;;;21950:3;21943:75;21937:86;;;22030:319;;22128:35;22157:5;22128:35;;;22175:61;22229:6;22224:3;22175:61;;;22168:68;;22241:52;22286:6;22281:3;22274:4;22267:5;22263:16;22241:52;;;22314:29;22336:6;22314:29;;;22309:3;22305:39;22298:46;;22108:241;;;;;;22356:339;;22464:35;22493:5;22464:35;;;22511:71;22575:6;22570:3;22511:71;;;22504:78;;22587:52;22632:6;22627:3;22620:4;22613:5;22609:16;22587:52;;;22660:29;22682:6;22660:29;;;22655:3;22651:39;22644:46;;22444:251;;;;;;22823:1195;;23004:4;22999:3;22995:14;23098:4;23091:5;23087:16;23081:23;23150:3;23144:4;23140:14;23133:4;23128:3;23124:14;23117:38;23170:155;23320:4;23306:12;23170:155;;;23162:163;;23024:313;23421:4;23414:5;23410:16;23404:23;23473:3;23467:4;23463:14;23456:4;23451:3;23447:14;23440:38;23493:155;23643:4;23629:12;23493:155;;;23485:163;;23347:313;23748:4;23741:5;23737:16;23731:23;23760:63;23817:4;23812:3;23808:14;23794:12;23760:63;;;23670:159;23917:4;23910:5;23906:16;23900:23;23929:57;23980:4;23975:3;23971:14;23957:12;23929:57;;;23839:153;24009:4;24002:11;;22977:1041;;;;;;24130:1978;;24295:6;24290:3;24286:16;24390:4;24383:5;24379:16;24373:23;24442:3;24436:4;24432:14;24425:4;24420:3;24416:14;24409:38;24462:149;24606:4;24592:12;24462:149;;;24454:157;;24317:306;24706:4;24699:5;24695:16;24689:23;24758:3;24752:4;24748:14;24741:4;24736:3;24732:14;24725:38;24778:149;24922:4;24908:12;24778:149;;;24770:157;;24633:306;25027:4;25020:5;25016:16;25010:23;25039:63;25096:4;25091:3;25087:14;25073:12;25039:63;;;24949:159;25196:4;25189:5;25185:16;25179:23;25208:63;25265:4;25260:3;25256:14;25242:12;25208:63;;;25118:159;25377:4;25370:5;25366:16;25360:23;25389:63;25446:4;25441:3;25437:14;25423:12;25389:63;;;25287:171;25550:4;25543:5;25539:16;25533:23;25562:63;25619:4;25614:3;25610:14;25596:12;25562:63;;;25468:163;25715:4;25708:5;25704:16;25698:23;25727:63;25784:4;25779:3;25775:14;25761:12;25727:63;;;25641:155;25899:4;25892:5;25888:16;25882:23;25951:3;25945:4;25941:14;25934:4;25929:3;25925:14;25918:38;25971:99;26065:4;26051:12;25971:99;;;25963:107;;25806:276;26099:4;26092:11;;24268:1840;;;;;;26202:1214;;26335:4;26330:3;26326:14;26424:4;26417:5;26413:16;26407:23;26436:63;26493:4;26488:3;26484:14;26470:12;26436:63;;;26355:150;26580:4;26573:5;26569:16;26563:23;26592:63;26649:4;26644:3;26640:14;26626:12;26592:63;;;26515:146;26747:4;26740:5;26736:16;26730:23;26799:3;26793:4;26789:14;26782:4;26777:3;26773:14;26766:38;26819:69;26883:4;26869:12;26819:69;;;26811:77;;26671:229;26988:4;26981:5;26977:16;26971:23;27000:63;27057:4;27052:3;27048:14;27034:12;27000:63;;;26910:159;27149:4;27142:5;27138:16;27132:23;27161:63;27218:4;27213:3;27209:14;27195:12;27161:63;;;27079:151;27309:4;27302:5;27298:16;27292:23;27321:63;27378:4;27373:3;27369:14;27355:12;27321:63;;;27240:150;27407:4;27400:11;;26308:1108;;;;;;27522:434;;27667:4;27662:3;27658:14;27751:4;27744:5;27740:16;27734:23;27803:3;27797:4;27793:14;27786:4;27781:3;27777:14;27770:38;27823:95;27913:4;27899:12;27823:95;;;27815:103;;27687:243;27947:4;27940:11;;27640:316;;;;;;28068:1241;;28219:4;28214:3;28210:14;28308:4;28301:5;28297:16;28291:23;28320:63;28377:4;28372:3;28368:14;28354:12;28320:63;;;28239:150;28478:4;28471:5;28467:16;28461:23;28490:63;28547:4;28542:3;28538:14;28524:12;28490:63;;;28399:160;28635:4;28628:5;28624:16;28618:23;28647:63;28704:4;28699:3;28695:14;28681:12;28647:63;;;28569:147;28799:4;28792:5;28788:16;28782:23;28811:63;28868:4;28863:3;28859:14;28845:12;28811:63;;;28726:154;28966:4;28959:5;28955:16;28949:23;29018:3;29012:4;29008:14;29001:4;28996:3;28992:14;28985:38;29038:69;29102:4;29088:12;29038:69;;;29030:77;;28890:229;29202:4;29195:5;29191:16;29185:23;29214:63;29271:4;29266:3;29262:14;29248:12;29214:63;;;29129:154;29300:4;29293:11;;28192:1117;;;;;;29415:495;29566:4;29561:3;29557:14;29652:4;29645:5;29641:16;29635:23;29664:63;29721:4;29716:3;29712:14;29698:12;29664:63;;;29586:147;29814:4;29807:5;29803:16;29797:23;29826:63;29883:4;29878:3;29874:14;29860:12;29826:63;;;29743:152;29539:371;;;;30016:785;;30161:4;30156:3;30152:14;30245:4;30238:5;30234:16;30228:23;30297:3;30291:4;30287:14;30280:4;30275:3;30271:14;30264:38;30317:95;30407:4;30393:12;30317:95;;;30309:103;;30181:243;30518:4;30511:5;30507:16;30501:23;30530:63;30587:4;30582:3;30578:14;30564:12;30530:63;;;30434:165;30694:4;30687:5;30683:16;30677:23;30706:63;30763:4;30758:3;30754:14;30740:12;30706:63;;;30609:166;30792:4;30785:11;;30134:667;;;;;;30808:103;30881:24;30899:5;30881:24;;;30876:3;30869:37;30863:48;;;30918:113;31001:24;31019:5;31001:24;;;30996:3;30989:37;30983:48;;;31038:213;;31156:2;31145:9;31141:18;31133:26;;31170:71;31238:1;31227:9;31223:17;31214:6;31170:71;;;31127:124;;;;;31258:488;;31462:2;31451:9;31447:18;31439:26;;31476:65;31538:1;31527:9;31523:17;31514:6;31476:65;;;31589:9;31583:4;31579:20;31574:2;31563:9;31559:18;31552:48;31614:122;31731:4;31722:6;31614:122;;;31606:130;;31433:313;;;;;;31753:241;;31885:2;31874:9;31870:18;31862:26;;31899:85;31981:1;31970:9;31966:17;31957:6;31899:85;;;31856:138;;;;;32001:523;;32219:2;32208:9;32204:18;32196:26;;32233:83;32313:1;32302:9;32298:17;32289:6;32233:83;;;32327:104;32427:2;32416:9;32412:18;32403:6;32327:104;;;32442:72;32510:2;32499:9;32495:18;32486:6;32442:72;;;32190:334;;;;;;;32531:263;;32674:2;32663:9;32659:18;32651:26;;32688:96;32781:1;32770:9;32766:17;32757:6;32688:96;;;32645:149;;;;;32801:293;;32935:2;32924:9;32920:18;32912:26;;32985:9;32979:4;32975:20;32971:1;32960:9;32956:17;32949:47;33010:74;33079:4;33070:6;33010:74;;;33002:82;;32906:188;;;;;33101:421;;33299:2;33288:9;33284:18;33276:26;;33349:9;33343:4;33339:20;33335:1;33324:9;33320:17;33313:47;33374:138;33507:4;33498:6;33374:138;;;33366:146;;33270:252;;;;;33529:389;;33711:2;33700:9;33696:18;33688:26;;33761:9;33755:4;33751:20;33747:1;33736:9;33732:17;33725:47;33786:122;33903:4;33894:6;33786:122;;;33778:130;;33682:236;;;;;33925:329;;34101:2;34090:9;34086:18;34078:26;;34115:129;34241:1;34230:9;34226:17;34217:6;34115:129;;;34072:182;;;;;34261:213;;34379:2;34368:9;34364:18;34356:26;;34393:71;34461:1;34450:9;34446:17;34437:6;34393:71;;;34350:124;;;;;34481:256;;34543:2;34537:9;34527:19;;34581:4;34573:6;34569:17;34680:6;34668:10;34665:22;34644:18;34632:10;34629:34;34626:62;34623:2;;;34701:1;34698;34691:12;34623:2;34721:10;34717:2;34710:22;34521:216;;;;;34744:304;;34903:18;34895:6;34892:30;34889:2;;;34935:1;34932;34925:12;34889:2;34970:4;34962:6;34958:17;34950:25;;35033:4;35027;35023:15;35015:23;;34826:222;;;;35055:318;;35228:18;35220:6;35217:30;35214:2;;;35260:1;35257;35250:12;35214:2;35295:4;35287:6;35283:17;35275:25;;35358:4;35352;35348:15;35340:23;;35151:222;;;;35380:325;;35560:18;35552:6;35549:30;35546:2;;;35592:1;35589;35582:12;35546:2;35627:4;35619:6;35615:17;35607:25;;35690:4;35684;35680:15;35672:23;;35483:222;;;;35712:325;;35892:18;35884:6;35881:30;35878:2;;;35924:1;35921;35914:12;35878:2;35959:4;35951:6;35947:17;35939:25;;36022:4;36016;36012:15;36004:23;;35815:222;;;;36044:300;;36199:18;36191:6;36188:30;36185:2;;;36231:1;36228;36221:12;36185:2;36266:4;36258:6;36254:17;36246:25;;36329:4;36323;36319:15;36311:23;;36122:222;;;;36351:318;;36491:18;36483:6;36480:30;36477:2;;;36523:1;36520;36513:12;36477:2;36590:4;36586:9;36579:4;36571:6;36567:17;36563:33;36555:41;;36654:4;36648;36644:15;36636:23;;36414:255;;;;36676:322;;36820:18;36812:6;36809:30;36806:2;;;36852:1;36849;36842:12;36806:2;36919:4;36915:9;36908:4;36900:6;36896:17;36892:33;36884:41;;36983:4;36977;36973:15;36965:23;;36743:255;;;;37005:172;;37112:3;37104:11;;37150:4;37145:3;37141:14;37133:22;;37098:79;;;;37184:175;;37294:3;37286:11;;37332:4;37327:3;37323:14;37315:22;;37280:79;;;;37366:172;;37473:3;37465:11;;37511:4;37506:3;37502:14;37494:22;;37459:79;;;;37545:147;;37627:3;37619:11;;37665:4;37660:3;37656:14;37648:22;;37613:79;;;;37699:158;;37829:5;37823:12;37813:22;;37794:63;;;;37864:161;;37997:5;37991:12;37981:22;;37962:63;;;;38032:158;;38162:5;38156:12;38146:22;;38127:63;;;;38197:133;;38302:5;38296:12;38286:22;;38267:63;;;;38337:118;;38427:5;38421:12;38411:22;;38392:63;;;;38462:129;;38581:4;38576:3;38572:14;38564:22;;38558:33;;;;38598:132;;38720:4;38715:3;38711:14;38703:22;;38697:33;;;;38737:129;;38856:4;38851:3;38847:14;38839:22;;38833:33;;;;38873:104;;38967:4;38962:3;38958:14;38950:22;;38944:33;;;;38985:193;;39130:6;39125:3;39118:19;39167:4;39162:3;39158:14;39143:29;;39111:67;;;;;39187:196;;39335:6;39330:3;39323:19;39372:4;39367:3;39363:14;39348:29;;39316:67;;;;;39392:193;;39537:6;39532:3;39525:19;39574:4;39569:3;39565:14;39550:29;;39518:67;;;;;39594:168;;39714:6;39709:3;39702:19;39751:4;39746:3;39742:14;39727:29;;39695:67;;;;;39771:153;;39876:6;39871:3;39864:19;39913:4;39908:3;39904:14;39889:29;;39857:67;;;;;39933:163;;40048:6;40043:3;40036:19;40085:4;40080:3;40076:14;40061:29;;40029:67;;;;;40104:91;;40166:24;40184:5;40166:24;;;40155:35;;40149:46;;;;40202:85;;40275:5;40268:13;40261:21;40250:32;;40244:43;;;;40294:105;;40370:24;40388:5;40370:24;;;40359:35;;40353:46;;;;40406:160;;40495:5;40484:16;;40501:60;40555:5;40501:60;;;40478:88;;;;40573:121;;40646:42;40639:5;40635:54;40624:65;;40618:76;;;;40701:72;;40763:5;40752:16;;40746:27;;;;40780:81;;40851:4;40844:5;40840:16;40829:27;;40823:38;;;;40868:149;;40961:51;41006:5;40961:51;;;40948:64;;40942:75;;;;41024:122;;41117:24;41135:5;41117:24;;;41104:37;;41098:48;;;;41153:145;;41244:49;41287:5;41244:49;;;41231:62;;41225:73;;;;41305:120;;41396:24;41414:5;41396:24;;;41383:37;;41377:48;;;;41432:185;;41543:69;41606:5;41543:69;;;41530:82;;41524:93;;;;41624:140;;41735:24;41753:5;41735:24;;;41722:37;;41716:48;;;;41771:160;;41875:51;41920:5;41875:51;;;41862:64;;41856:75;;;;41939:145;42020:6;42015:3;42010;41997:30;42076:1;42067:6;42062:3;42058:16;42051:27;41990:94;;;;42093:268;42158:1;42165:101;42179:6;42176:1;42173:13;42165:101;;;42255:1;42250:3;42246:11;42240:18;42236:1;42231:3;42227:11;42220:39;42201:2;42198:1;42194:10;42189:15;;42165:101;;;42281:6;42278:1;42275:13;42272:2;;;42346:1;42337:6;42332:3;42328:16;42321:27;42272:2;42142:219;;;;;42369:97;;42457:2;42453:7;42448:2;42441:5;42437:14;42433:28;42423:38;;42417:49;;;;42474:118;42570:1;42563:5;42560:12;42550:2;;42576:9;42550:2;42544:48;;42599:117;42668:24;42686:5;42668:24;;;42661:5;42658:35;42648:2;;42707:1;42704;42697:12;42648:2;42642:74;;42723:111;42789:21;42804:5;42789:21;;;42782:5;42779:32;42769:2;;42825:1;42822;42815:12;42769:2;42763:71;;42841:145;42924:38;42956:5;42924:38;;;42917:5;42914:49;42904:2;;42977:1;42974;42967:12;42904:2;42898:88;;42993:117;43062:24;43080:5;43062:24;;;43055:5;43052:35;43042:2;;43101:1;43098;43091:12;43042:2;43036:74;;43117:113;43184:22;43200:5;43184:22;;;43177:5;43174:33;43164:2;;43221:1;43218;43211:12;43164:2;43158:72;

Swarm Source

bzzr://059da9e8fb338326f069bdf45a4bfcc034c0672b81114baa65039095278e3f4b

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

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.