ETH Price: $3,336.20 (-3.32%)

Contract

0xE48BC2Ba0F2d2E140382d8B5C8f261a3d35Ed09C
 
Transaction Hash
Method
Block
From
To
Withdraw Pawn Eq...190468992024-01-20 8:31:59311 days ago1705739519IN
ForTube: PoolPawn
0 ETH0.0005810215.04472152
Withdraw Pawn Eq...190468812024-01-20 8:28:23311 days ago1705739303IN
ForTube: PoolPawn
0 ETH0.001357617.05538928
Withdraw Pawn Eq...190468632024-01-20 8:24:47311 days ago1705739087IN
ForTube: PoolPawn
0 ETH0.0012066315.11942245
Withdraw Pawn Eq...190467322024-01-20 7:58:35311 days ago1705737515IN
ForTube: PoolPawn
0 ETH0.0013103215.55704203
Withdraw Pawn119457222021-02-28 12:09:411367 days ago1614514181IN
ForTube: PoolPawn
0 ETH0.1733839986
Withdraw Pawn119456852021-02-28 12:01:271367 days ago1614513687IN
ForTube: PoolPawn
0 ETH0.154234274
Withdraw Pawn116647222021-01-16 6:40:441410 days ago1610779244IN
ForTube: PoolPawn
0 ETH0.0940483647
Withdraw Pawn113398382020-11-27 9:40:271460 days ago1606470027IN
ForTube: PoolPawn
0 ETH0.0600303930
Supply Pawn113370112020-11-26 23:24:241460 days ago1606433064IN
ForTube: PoolPawn
0 ETH0.0084392220
Supply Pawn112737902020-11-17 6:28:011470 days ago1605594481IN
ForTube: PoolPawn
0 ETH0.0105509225
Withdraw Pawn112272572020-11-10 3:00:451477 days ago1604977245IN
ForTube: PoolPawn
0 ETH0.0716521734
Borrow Pawn111702232020-11-01 8:59:541486 days ago1604221194IN
ForTube: PoolPawn
0 ETH0.0306964916
Supply Pawn111701522020-11-01 8:45:401486 days ago1604220340IN
ForTube: PoolPawn
0 ETH0.0071746917.00000145
Withdraw Pawn111159562020-10-24 1:05:461494 days ago1603501546IN
ForTube: PoolPawn
0 ETH0.0423668920.2
Withdraw Pawn110726302020-10-17 9:33:151501 days ago1602927195IN
ForTube: PoolPawn
0 ETH0.0587304228
Withdraw Pawn110701392020-10-17 0:17:391501 days ago1602893859IN
ForTube: PoolPawn
0 ETH0.04088820.5
Withdraw Pawn110064122020-10-07 4:16:531511 days ago1602044213IN
ForTube: PoolPawn
0 ETH0.0637887632
Withdraw Pawn110012882020-10-06 9:02:231512 days ago1601974943IN
ForTube: PoolPawn
0 ETH0.0942692147
Withdraw Pawn109435552020-09-27 8:32:031521 days ago1601195523IN
ForTube: PoolPawn
0 ETH0.1030676851
Withdraw Pawn109357862020-09-26 3:15:331522 days ago1601090133IN
ForTube: PoolPawn
0 ETH0.1050911652
Withdraw Pawn109237832020-09-24 6:50:361524 days ago1600930236IN
ForTube: PoolPawn
0 ETH0.1096395855
Withdraw Pawn109197422020-09-23 15:42:091525 days ago1600875729IN
ForTube: PoolPawn
0 ETH0.0990
Withdraw Pawn109105202020-09-22 5:50:041526 days ago1600753804IN
ForTube: PoolPawn
0 ETH0.1717060886.92187516
Withdraw Pawn109097242020-09-22 2:55:261526 days ago1600743326IN
ForTube: PoolPawn
0 ETH0.1818740790
Withdraw Pawn108864982020-09-18 13:52:041530 days ago1600437124IN
ForTube: PoolPawn
0 ETH0.41857746212.00000112
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
190468992024-01-20 8:31:59311 days ago1705739519
ForTube: PoolPawn
0.32763315 ETH
119456852021-02-28 12:01:271367 days ago1614513687
ForTube: PoolPawn
0.25129967 ETH
112272572020-11-10 3:00:451477 days ago1604977245
ForTube: PoolPawn
2.00767013 ETH
111159562020-10-24 1:05:461494 days ago1603501546
ForTube: PoolPawn
0.70320922 ETH
110726302020-10-17 9:33:151501 days ago1602927195
ForTube: PoolPawn
0.45207191 ETH
109927212020-10-05 1:13:081513 days ago1601860388
ForTube: PoolPawn
2.71209683 ETH
109766132020-10-02 12:30:111516 days ago1601641811
ForTube: PoolPawn
4.61592794 ETH
109105202020-09-22 5:50:041526 days ago1600753804
ForTube: PoolPawn
45.09333313 ETH
108864982020-09-18 13:52:041530 days ago1600437124
ForTube: PoolPawn
120.08393146 ETH
108858112020-09-18 11:14:031530 days ago1600427643
ForTube: PoolPawn
75.5987868 ETH
108857392020-09-18 10:56:341530 days ago1600426594
ForTube: PoolPawn
103.20723413 ETH
108712232020-09-16 5:19:501532 days ago1600233590
ForTube: PoolPawn
91.48853805 ETH
108607852020-09-14 14:58:201534 days ago1600095500
ForTube: PoolPawn
8.02318266 ETH
108491472020-09-12 19:50:161536 days ago1599940216
ForTube: PoolPawn
20.02861038 ETH
108343572020-09-10 13:47:241538 days ago1599745644
ForTube: PoolPawn
28.88646195 ETH
108342802020-09-10 13:30:421538 days ago1599744642
ForTube: PoolPawn
45.05611852 ETH
108342762020-09-10 13:30:091538 days ago1599744609
ForTube: PoolPawn
95.12337842 ETH
108312392020-09-10 2:13:581538 days ago1599704038
ForTube: PoolPawn
7.00002841 ETH
108282752020-09-09 15:22:291539 days ago1599664949
ForTube: PoolPawn
5.00651302 ETH
108267012020-09-09 9:21:411539 days ago1599643301
ForTube: PoolPawn
95.13682416 ETH
108263092020-09-09 7:53:161539 days ago1599637996
ForTube: PoolPawn
5 ETH
108255072020-09-09 5:01:011539 days ago1599627661
ForTube: PoolPawn
200.02856725 ETH
108246812020-09-09 1:54:391539 days ago1599616479
ForTube: PoolPawn
500.06290784 ETH
108235552020-09-08 21:50:461540 days ago1599601846
ForTube: PoolPawn
13.01564315 ETH
108235382020-09-08 21:46:271540 days ago1599601587
ForTube: PoolPawn
0.00008697 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PoolPawn

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-01
*/

/**
 *Submitted for verification at Etherscan.io on 2020-08-01
*/

/*
 * Copyright (c) The Force Protocol Development Team
 * Submitted for verification at Etherscan.io on 2019-09-17
 */

pragma solidity 0.5.13;
// pragma experimental ABIEncoderV2;

contract ReentrancyGuard {
    bool private _notEntered;

    constructor() internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size != 0;
    }
}

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error.
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "uint mul overflow");

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b != 0, "uint div by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "uint sub overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "uint add overflow");

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "uint mod by zero");
        return a % b;
    }
}

/**
 * @title ERC20 interface
 * @dev see https://eips.ethereum.org/EIPS/eip-20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

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

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function totalSupply() external view returns (uint256);

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

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

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

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

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

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(
            value
        );
        callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(
            value
        );
        callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

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

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

        require(address(token).isContract());

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

        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)));
        }
    }
}

library addressMakePayable {
    function makePayable(address x) internal pure returns (address payable) {
        return address(uint160(x));
    }
}

contract IOracle {
    function get(address token) external view returns (uint256, bool);
}

contract IInterestRateModel {
    function getLoanRate(int256 cash, int256 borrow)
    external
    view
    returns (int256 y);

    function getDepositRate(int256 cash, int256 borrow)
    external
    view
    returns (int256 y);

    function calculateBalance(
        int256 principal,
        int256 lastIndex,
        int256 newIndex
    ) external view returns (int256 y);

    function calculateInterestIndex(
        int256 Index,
        int256 r,
        int256 t
    ) external view returns (int256 y);

    function pert(
        int256 principal,
        int256 r,
        int256 t
    ) external view returns (int256 y);

    function getNewReserve(
        int256 oldReserve,
        int256 cash,
        int256 borrow,
        int256 blockDelta
    ) external view returns (int256 y);
}

contract PoolPawn is ReentrancyGuard {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;
    using addressMakePayable for address;

    uint public constant int_max = 57896044618658097711785492504343953926634992332820282019728792003956564819967;

    address public admin; //the admin address
    address public proposedAdmin; //use pull over push pattern for admin

    // uint256 public constant interestRateDenomitor = 1e18;

    /**
     * @notice Container for borrow balance information
     * @member principal Total balance (with accrued interest), after applying the most recent balance-changing action
     * @member interestIndex Global borrowIndex as of the most recent balance-changing action
     */
    // Balance struct
    struct Balance {
        uint256 principal;
        uint256 interestIndex;
        uint256 totalPnl; //total profit and loss
    }

    struct Market {
        uint256 accrualBlockNumber;
        int256 supplyRate; //存款利率
        int256 demondRate; //借款利率
        IInterestRateModel irm;
        uint256 totalSupply;
        uint256 supplyIndex;
        uint256 totalBorrows;
        uint256 borrowIndex;
        uint256 totalReserves; //系统盈利
        uint256 minPledgeRate; //最小质押率
        uint256 liquidationDiscount; //清算折扣
        uint256 decimals; //币种的最小精度
    }

    // Mappings of users' balance of each token
    mapping(address => mapping(address => Balance))
    public accountSupplySnapshot; //tokenContract->address(usr)->SupplySnapshot
    mapping(address => mapping(address => Balance))
    public accountBorrowSnapshot; //tokenContract->address(usr)->BorrowSnapshot

    struct LiquidateInfo {
        address targetAccount; //被清算账户
        address liquidator; //清算人
        address assetCollatera; //抵押物token地址
        address assetBorrow; //债务token地址
        uint256 liquidateAmount; //清算额度,抵押物
        uint256 targetAmount; //目标额度, 债务
        uint256 timestamp;
    }

    mapping(uint256 => LiquidateInfo) public liquidateInfoMap;
    uint256 public liquidateIndexes;

    function setLiquidateInfoMap(
        address _targetAccount,
        address _liquidator,
        address _assetCollatera,
        address _assetBorrow,
        uint256 x,
        uint256 y
    ) internal {
        LiquidateInfo memory newStruct = LiquidateInfo(
            _targetAccount,
            _liquidator,
            _assetCollatera,
            _assetBorrow,
            x,
            y,
            block.timestamp
        );
        // Update liquidation record
        liquidateInfoMap[liquidateIndexes] = newStruct;
        liquidateIndexes++;
    }

    //user table
    mapping(uint256 => address) public accounts;
    mapping(address => uint256) public indexes;
    uint256 public index = 1;

    // Add new user
    function join(address who) internal {
        if (indexes[who] == 0) {
            accounts[index] = who;
            indexes[who] = index;
            ++index;
        }
    }

    event SupplyPawnLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event WithdrawPawnLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event BorrowPawnLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event RepayFastBorrowLog(
        address usr,
        address t,
        uint256 amount,
        uint256 beg,
        uint256 end
    );
    event LiquidateBorrowPawnLog(
        address usr,
        address tBorrow,
        uint256 endBorrow,
        address liquidator,
        address tCol,
        uint256 endCol
    );
    event WithdrawPawnEquityLog(
        address t,
        uint256 equityAvailableBefore,
        uint256 amount,
        address owner
    );

    mapping(address => Market) public mkts; //tokenAddress->Market
    address[] public collateralTokens; //抵押币种
    IOracle public oracleInstance;

    uint256 public constant initialInterestIndex = 10**18;
    uint256 public constant defaultOriginationFee = 0; // default is zero bps
    uint256 public constant originationFee = 0;
    uint256 public constant ONE_ETH = 1 ether;

    // 增加抵押币种
    function addCollateralMarket(address asset) public onlyAdmin {
        for (uint256 i = 0; i < collateralTokens.length; i++) {
            if (collateralTokens[i] == asset) {
                return;
            }
        }
        collateralTokens.push(asset);
    }

    function getCollateralMarketsLength() external view returns (uint256) {
        return collateralTokens.length;
    }

    function setInterestRateModel(address t, address irm) public onlyAdmin {
        mkts[t].irm = IInterestRateModel(irm);
    }

    function setMinPledgeRate(address t, uint256 minPledgeRate)
    external
    onlyAdmin
    {
        mkts[t].minPledgeRate = minPledgeRate;
    }

    function setLiquidationDiscount(address t, uint256 liquidationDiscount)
    external
    onlyAdmin
    {
        mkts[t].liquidationDiscount = liquidationDiscount;
    }

    function initCollateralMarket(
        address t,
        address irm,
        address oracle,
        uint256 decimals
    ) external onlyAdmin {
        if (address(oracleInstance) == address(0)) {
            setOracle(oracle);
        }
        Market memory m = mkts[t];
        if (address(m.irm) == address(0)) {
            setInterestRateModel(t, irm);
        }

        addCollateralMarket(t);
        if (m.supplyIndex == 0) {
            m.supplyIndex = initialInterestIndex;
        }

        if (m.borrowIndex == 0) {
            m.borrowIndex = initialInterestIndex;
        }

        if (m.decimals == 0) {
            m.decimals = decimals;
        }
        mkts[t] = m;
    }

    constructor() public {
        admin = msg.sender;
    }

    //Starting from Solidity 0.4.0, contracts without a fallback function automatically revert payments, making the code above redundant.
    // function() external payable {
    //   revert("fallback can't be payable");
    // }

    modifier onlyAdmin() {
        require(msg.sender == admin, "only admin can do this!");
        _;
    }

    function proposeNewAdmin(address admin_) external onlyAdmin {
        proposedAdmin = admin_;
    }

    function claimAdministration() external {
        require(msg.sender == proposedAdmin, "Not proposed admin.");
        admin = proposedAdmin;
        proposedAdmin = address(0);
    }

    // Set the initial timestamp of tokens
    function setInitialTimestamp(address token) external onlyAdmin {
        mkts[token].accrualBlockNumber = now;
    }

    function setDecimals(address t, uint256 decimals) external onlyAdmin {
        mkts[t].decimals = decimals;
    }

    function setOracle(address oracle) public onlyAdmin {
        oracleInstance = IOracle(oracle);
    }

    modifier existOracle() {
        require(address(oracleInstance) != address(0), "oracle not set");
        _;
    }

    // Get price of oracle
    function fetchAssetPrice(address asset)
    public
    view
    returns (uint256, bool)
    {
        require(address(oracleInstance) != address(0), "oracle not set");
        return oracleInstance.get(asset);
    }

    function valid_uint(uint r) internal view returns (int256) {
        require(r <= int_max, "uint r is not valid");
        return int256(r);
    }

    // Get the price of assetAmount tokens
    function getPriceForAssetAmount(address asset, uint256 assetAmount)
    public
    view
    returns (uint256)
    {
        require(address(oracleInstance) != address(0), "oracle not set");
        (uint256 price, bool ok) = fetchAssetPrice(asset);
        require(ok && price != 0, "invalid token price");
        return price.mul(assetAmount).div(10**mkts[asset].decimals);
    }

    // Calc the token amount of usdValue
    function getAssetAmountForValue(address t, uint256 usdValue)
    public
    view
    returns (uint256)
    {
        require(address(oracleInstance) != address(0), "oracle not set");
        (uint256 price, bool ok) = fetchAssetPrice(t);
        require(ok && price != 0, "invalid token price");
        return usdValue.mul(10**mkts[t].decimals).div(price);
    }

    // Balance of "t" token of this contract
    function getCash(address t) public view returns (uint256) {
        // address(0) represents for eth
        if (t == address(0)) {
            return address(this).balance;
        }
        IERC20 token = IERC20(t);
        return token.balanceOf(address(this));
    }

    // Balance of "asset" token of the "from" account
    function getBalanceOf(address asset, address from)
    internal
    view
    returns (uint256)
    {
        // address(0) represents for eth
        if (asset == address(0)) {
            return address(from).balance;
        }

        IERC20 token = IERC20(asset);

        return token.balanceOf(from);
    }

    //  totalBorrows / totalSupply
    function loanToDepositRatio(address asset) public view returns (uint256) {
        uint256 loan = mkts[asset].totalBorrows;
        uint256 deposit = mkts[asset].totalSupply;
        // uint256 _1 = 1 ether;

        return loan.mul(ONE_ETH).div(deposit);
    }

    //m:market, a:account
    //i(n,m)=i(n-1,m)*(1+rm*t)
    //return P*(i(n,m)/i(n-1,a))
    // Calc the balance of the "t" token of "acc" account
    function getSupplyBalance(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage supplyBalance = accountSupplySnapshot[t][acc];

        int256 mSupplyIndex = mkts[t].irm.pert(
            int256(mkts[t].supplyIndex),
            mkts[t].supplyRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userSupplyCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(supplyBalance.principal),
                int256(supplyBalance.interestIndex),
                mSupplyIndex
            )
        );
        return userSupplyCurrent;
    }

    // Calc the actual USD value of "t" token of "who" account
    function getSupplyBalanceInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getSupplyBalance(who, t));
    }

    // Calc the profit of "t" token of "acc" account
    function getSupplyPnl(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage supplyBalance = accountSupplySnapshot[t][acc];

        int256 mSupplyIndex = mkts[t].irm.pert(
            int256(mkts[t].supplyIndex),
            mkts[t].supplyRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userSupplyCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(supplyBalance.principal),
                int256(supplyBalance.interestIndex),
                mSupplyIndex
            )
        );

        if (userSupplyCurrent > supplyBalance.principal) {
            return
            supplyBalance.totalPnl.add(
                userSupplyCurrent.sub(supplyBalance.principal)
            );
        } else {
            return supplyBalance.totalPnl;
        }
    }

    // Calc the profit of "t" token of "acc" account in USD value
    function getSupplyPnlInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getSupplyPnl(who, t));
    }

    // Gets USD all token values of supply profit
    function getTotalSupplyPnl(address who)
    public
    view
    returns (uint256 sumPnl)
    {
        uint256 length = collateralTokens.length;

        for (uint256 i = 0; i < length; i++) {
            uint256 pnl = getSupplyPnlInUSD(who, collateralTokens[i]);
            sumPnl = sumPnl.add(pnl);
        }
    }

    //m:market, a:account
    //i(n,m)=i(n-1,m)*(1+rm*t)
    //return P*(i(n,m)/i(n-1,a))
    function getBorrowBalance(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage borrowBalance = accountBorrowSnapshot[t][acc];

        int256 mBorrowIndex = mkts[t].irm.pert(
            int256(mkts[t].borrowIndex),
            mkts[t].demondRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                int256(borrowBalance.interestIndex),
                mBorrowIndex
            )
        );
        return userBorrowCurrent;
    }

    function getBorrowBalanceInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getBorrowBalance(who, t));
    }

    function getBorrowPnl(address acc, address t)
    public
    view
    returns (uint256)
    {
        Balance storage borrowBalance = accountBorrowSnapshot[t][acc];

        int256 mBorrowIndex = mkts[t].irm.pert(
            int256(mkts[t].borrowIndex),
            mkts[t].demondRate,
            int256(now - mkts[t].accrualBlockNumber)
        );

        uint256 userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                int256(borrowBalance.interestIndex),
                mBorrowIndex
            )
        );

        return
        borrowBalance.totalPnl.add(userBorrowCurrent).sub(
            borrowBalance.principal
        );
    }

    function getBorrowPnlInUSD(address who, address t)
    public
    view
    returns (uint256)
    {
        return getPriceForAssetAmount(t, getBorrowPnl(who, t));
    }

    // Gets USD all token values of borrow lose
    function getTotalBorrowPnl(address who)
    public
    view
    returns (uint256 sumPnl)
    {
        uint256 length = collateralTokens.length;
        // uint sumPnl = 0;

        for (uint256 i = 0; i < length; i++) {
            uint256 pnl = getBorrowPnlInUSD(who, collateralTokens[i]);
            sumPnl = sumPnl.add(pnl);
        }
        // return sumPnl;
    }

    // BorrowBalance * collateral ratio
    // collateral ratio always great than 1
    function getBorrowBalanceLeverage(address who, address t)
    public
    view
    returns (uint256)
    {
        return
        getBorrowBalanceInUSD(who, t).mul(mkts[t].minPledgeRate).div(
            ONE_ETH
        );
    }

    // Gets USD token values of supply and borrow balances
    function calcAccountTokenValuesInternal(address who, address t)
    public
    view
    returns (uint256, uint256)
    {
        return (getSupplyBalanceInUSD(who, t), getBorrowBalanceInUSD(who, t));
    }

    // Gets USD token values of supply and borrow balances
    function calcAccountTokenValuesLeverageInternal(address who, address t)
    public
    view
    returns (uint256, uint256)
    {
        return (
        getSupplyBalanceInUSD(who, t),
        getBorrowBalanceLeverage(who, t)
        );
    }

    // Gets USD all token values of supply and borrow balances
    function calcAccountAllTokenValuesLeverageInternal(address who)
    public
    view
    returns (uint256 sumSupplies, uint256 sumBorrowLeverage)
    {
        uint256 length = collateralTokens.length;

        for (uint256 i = 0; i < length; i++) {
            (
            uint256 supplyValue,
            uint256 borrowsLeverage
            ) = calcAccountTokenValuesLeverageInternal(
                who,
                collateralTokens[i]
            );
            sumSupplies = sumSupplies.add(supplyValue);
            sumBorrowLeverage = sumBorrowLeverage.add(borrowsLeverage);
        }
    }

    function calcAccountLiquidity(address who)
    public
    view
    returns (uint256, uint256)
    {
        uint256 sumSupplies;
        uint256 sumBorrowsLeverage; //sumBorrows* collateral ratio
        (
        sumSupplies,
        sumBorrowsLeverage
        ) = calcAccountAllTokenValuesLeverageInternal(who);
        if (sumSupplies < sumBorrowsLeverage) {
            return (0, sumBorrowsLeverage.sub(sumSupplies)); //不足
        } else {
            return (sumSupplies.sub(sumBorrowsLeverage), 0); //有余
        }
    }

    struct SupplyIR {
        uint256 startingBalance;
        uint256 newSupplyIndex;
        uint256 userSupplyCurrent;
        uint256 userSupplyUpdated;
        uint256 newTotalSupply;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newBorrowIndex;
    }

    // deposit
    function supplyPawn(address t, uint256 amount)
    external
    payable
    nonReentrant
    {
        uint256 supplyAmount = amount;
        // address(0) represents for eth
        if (t == address(0)) {
            require(amount == msg.value, "Eth value should be equal to amount");
            supplyAmount = msg.value;
        } else {
            require(msg.value == 0, "Eth should not be provided");
        }
        SupplyIR memory tmp;
        Market storage market = mkts[t];
        Balance storage supplyBalance = accountSupplySnapshot[t][msg.sender];

        uint256 lastTimestamp = market.accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // Calc the supplyIndex of supplyBalance
        tmp.newSupplyIndex = uint256(
            market.irm.pert(
                int256(market.supplyIndex),
                market.supplyRate,
                int256(blockDelta)
            )
        );
        tmp.userSupplyCurrent = uint256(
            market.irm.calculateBalance(
                valid_uint(accountSupplySnapshot[t][msg.sender].principal),
                int256(supplyBalance.interestIndex),
                int256(tmp.newSupplyIndex)
            )
        );
        tmp.userSupplyUpdated = tmp.userSupplyCurrent.add(supplyAmount);
        // Update supply of the market
        tmp.newTotalSupply = market.totalSupply.add(tmp.userSupplyUpdated).sub(
            supplyBalance.principal
        );

        tmp.currentCash = getCash(t);
        // address(0) represents for eth
        // We support both ERC20 and ETH.
        // Calc the new Balance of the contract if it's ERC20
        // else(ETH) does nothing because the cash has been added(msg.value) when the contract is called
        tmp.updatedCash = t != address(0)
        ? tmp.currentCash.add(supplyAmount)
        : tmp.currentCash;

        // Update supplyRate and demondRate
        market.supplyRate = market.irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );
        tmp.newBorrowIndex = uint256(
            market.irm.pert(
                int256(market.borrowIndex),
                market.demondRate,
                int256(blockDelta)
            )
        );
        market.demondRate = market.irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );

        market.borrowIndex = tmp.newBorrowIndex;
        market.supplyIndex = tmp.newSupplyIndex;
        market.totalSupply = tmp.newTotalSupply;
        market.accrualBlockNumber = now;
        // mkts[t] = market;
        tmp.startingBalance = supplyBalance.principal;
        supplyBalance.principal = tmp.userSupplyUpdated;
        supplyBalance.interestIndex = tmp.newSupplyIndex;

        // Update total profit of user
        if (tmp.userSupplyCurrent > tmp.startingBalance) {
            supplyBalance.totalPnl = supplyBalance.totalPnl.add(
                tmp.userSupplyCurrent.sub(tmp.startingBalance)
            );
        }

        join(msg.sender);

        safeTransferFrom(
            t,
            msg.sender,
            address(this),
            address(this).makePayable(),
            supplyAmount,
            0
        );

        emit SupplyPawnLog(
            msg.sender,
            t,
            supplyAmount,
            tmp.startingBalance,
            tmp.userSupplyUpdated
        );
    }

    struct WithdrawIR {
        uint256 withdrawAmount;
        uint256 startingBalance;
        uint256 newSupplyIndex;
        uint256 userSupplyCurrent;
        uint256 userSupplyUpdated;
        uint256 newTotalSupply;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newBorrowIndex;
        uint256 accountLiquidity;
        uint256 accountShortfall;
        uint256 usdValueOfWithdrawal;
        uint256 withdrawCapacity;
    }

    // withdraw
    function withdrawPawn(address t, uint256 requestedAmount)
    external
    nonReentrant
    {
        Market storage market = mkts[t];
        Balance storage supplyBalance = accountSupplySnapshot[t][msg.sender];

        WithdrawIR memory tmp;

        uint256 lastTimestamp = mkts[t].accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // Judge if the user has ability to withdraw
        (tmp.accountLiquidity, tmp.accountShortfall) = calcAccountLiquidity(
            msg.sender
        );
        require(
            tmp.accountLiquidity != 0 && tmp.accountShortfall == 0,
            "can't withdraw, shortfall"
        );
        // Update the balance of the user
        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );
        tmp.userSupplyCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(supplyBalance.principal),
                int256(supplyBalance.interestIndex),
                int256(tmp.newSupplyIndex)
            )
        );

        // Get the balance of this contract
        tmp.currentCash = getCash(t);
        // uint(-1) represents the user want to withdraw all of his supplies of the "t" token
        if (requestedAmount == uint256(-1)) {
            // max withdraw amount = min(his account liquidity, his balance)
            tmp.withdrawCapacity = getAssetAmountForValue(
                t,
                tmp.accountLiquidity
            );
            tmp.withdrawAmount = min(
                min(tmp.withdrawCapacity, tmp.userSupplyCurrent),
                tmp.currentCash
            );
            // tmp.withdrawAmount = min(tmp.withdrawAmount, tmp.currentCash);
        } else {
            tmp.withdrawAmount = requestedAmount;
        }

        // Update balance of this contract
        tmp.updatedCash = tmp.currentCash.sub(tmp.withdrawAmount);
        tmp.userSupplyUpdated = tmp.userSupplyCurrent.sub(tmp.withdrawAmount);

        // Get the amount of token to withdraw
        tmp.usdValueOfWithdrawal = getPriceForAssetAmount(
            t,
            tmp.withdrawAmount
        );
        // require account liquidity is enough
        require(
            tmp.usdValueOfWithdrawal <= tmp.accountLiquidity,
            "account is short"
        );

        // Update totalSupply of the market
        tmp.newTotalSupply = market.totalSupply.add(tmp.userSupplyUpdated).sub(
            supplyBalance.principal
        );

        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );

        // Update loan to deposit rate
        market.supplyRate = mkts[t].irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );
        tmp.newBorrowIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].borrowIndex),
                mkts[t].demondRate,
                int256(blockDelta)
            )
        );
        market.demondRate = mkts[t].irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(market.totalBorrows)
        );

        market.accrualBlockNumber = now;
        market.totalSupply = tmp.newTotalSupply;
        market.supplyIndex = tmp.newSupplyIndex;
        market.borrowIndex = tmp.newBorrowIndex;
        // mkts[t] = market;
        tmp.startingBalance = supplyBalance.principal;
        supplyBalance.principal = tmp.userSupplyUpdated;
        supplyBalance.interestIndex = tmp.newSupplyIndex;

        safeTransferFrom(
            t,
            address(this).makePayable(),
            address(this),
            msg.sender,
            tmp.withdrawAmount,
            0
        );

        emit WithdrawPawnLog(
            msg.sender,
            t,
            tmp.withdrawAmount,
            tmp.startingBalance,
            tmp.userSupplyUpdated
        );
    }

    struct PayBorrowIR {
        uint256 newBorrowIndex;
        uint256 userBorrowCurrent;
        uint256 repayAmount;
        uint256 userBorrowUpdated;
        uint256 newTotalBorrows;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newSupplyIndex;
        uint256 startingBalance;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a < b) {
            return a;
        } else {
            return b;
        }
    }

    //`(1 + originationFee) * borrowAmount`
    function calcBorrowAmountWithFee(uint256 borrowAmount)
    public
    pure
    returns (uint256)
    {
        return borrowAmount.mul((ONE_ETH).add(originationFee)).div(ONE_ETH);
    }

    // supply value * min pledge rate
    function getPriceForAssetAmountMulCollatRatio(
        address t,
        uint256 assetAmount
    ) public view returns (uint256) {
        return
        getPriceForAssetAmount(t, assetAmount)
        .mul(mkts[t].minPledgeRate)
        .div(ONE_ETH);
    }

    struct BorrowIR {
        uint256 newBorrowIndex;
        uint256 userBorrowCurrent;
        uint256 borrowAmountWithFee;
        uint256 userBorrowUpdated;
        uint256 newTotalBorrows;
        uint256 currentCash;
        uint256 updatedCash;
        uint256 newSupplyIndex;
        uint256 startingBalance;
        uint256 accountLiquidity;
        uint256 accountShortfall;
        uint256 usdValueOfBorrowAmountWithFee;
    }

    // borrow
    function BorrowPawn(address t, uint256 amount) external nonReentrant {
        BorrowIR memory tmp;
        Market storage market = mkts[t];
        Balance storage borrowBalance = accountBorrowSnapshot[t][msg.sender];

        uint256 lastTimestamp = mkts[t].accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // Calc borrow index
        tmp.newBorrowIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].borrowIndex),
                mkts[t].demondRate,
                int256(blockDelta)
            )
        );
        int256 lastIndex = int256(borrowBalance.interestIndex);
        tmp.userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                lastIndex,
                int256(tmp.newBorrowIndex)
            )
        );
        // add borrow fee
        tmp.borrowAmountWithFee = calcBorrowAmountWithFee(amount);

        tmp.userBorrowUpdated = tmp.userBorrowCurrent.add(
            tmp.borrowAmountWithFee
        );
        // Update market borrows
        tmp.newTotalBorrows = market
        .totalBorrows
        .add(tmp.userBorrowUpdated)
        .sub(borrowBalance.principal);

        // calc account liquidity
        (tmp.accountLiquidity, tmp.accountShortfall) = calcAccountLiquidity(
            msg.sender
        );
        require(
            tmp.accountLiquidity != 0 && tmp.accountShortfall == 0,
            "can't borrow, shortfall"
        );

        // require accountLiquitidy is enough
        tmp.usdValueOfBorrowAmountWithFee = getPriceForAssetAmountMulCollatRatio(
            t,
            tmp.borrowAmountWithFee
        );
        require(
            tmp.usdValueOfBorrowAmountWithFee <= tmp.accountLiquidity,
            "can't borrow, without enough value"
        );

        // Update the balance of this contract
        tmp.currentCash = getCash(t);
        tmp.updatedCash = tmp.currentCash.sub(amount);

        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );
        market.supplyRate = mkts[t].irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );
        market.demondRate = mkts[t].irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );

        market.accrualBlockNumber = now;
        market.totalBorrows = tmp.newTotalBorrows;
        market.supplyIndex = tmp.newSupplyIndex;
        market.borrowIndex = tmp.newBorrowIndex;
        // mkts[t] = market;
        tmp.startingBalance = borrowBalance.principal;
        borrowBalance.principal = tmp.userBorrowUpdated;
        borrowBalance.interestIndex = tmp.newBorrowIndex;

        // 更新币种的借币总额
        // borrowBalance.totalPnl = borrowBalance.totalPnl.add(tmp.userBorrowCurrent.sub(tmp.startingBalance));

        safeTransferFrom(
            t,
            address(this).makePayable(),
            address(this),
            msg.sender,
            amount,
            0
        );

        emit BorrowPawnLog(
            msg.sender,
            t,
            amount,
            tmp.startingBalance,
            tmp.userBorrowUpdated
        );
        // return 0;
    }

    // repay
    function repayFastBorrow(address t, uint256 amount)
    external
    payable
    nonReentrant
    {
        PayBorrowIR memory tmp;
        Market storage market = mkts[t];
        Balance storage borrowBalance = accountBorrowSnapshot[t][msg.sender];

        uint256 lastTimestamp = mkts[t].accrualBlockNumber;
        uint256 blockDelta = now - lastTimestamp;

        // calc the new borrow index
        tmp.newBorrowIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].borrowIndex),
                mkts[t].demondRate,
                int256(blockDelta)
            )
        );

        int256 lastIndex = int256(borrowBalance.interestIndex);
        tmp.userBorrowCurrent = uint256(
            mkts[t].irm.calculateBalance(
                valid_uint(borrowBalance.principal),
                lastIndex,
                int256(tmp.newBorrowIndex)
            )
        );

        // uint(-1) represents the user want to repay all of his borrows of "t" token
        if (amount == uint256(-1)) {
            // that is the minimum of (his balance, his borrows)
            tmp.repayAmount = min(
                getBalanceOf(t, msg.sender),
                tmp.userBorrowCurrent
            );
            // address(0) represents for eth
            // if the user want to repay eth, he needs to repay a little more
            // because the exact amount will be calculated in the above
            // the extra eth will be returned in the safeTransferFrom
            if (t == address(0)) {
                require(
                    msg.value > tmp.repayAmount,
                    "Eth value should be larger than repayAmount"
                );
            }
        } else {
            tmp.repayAmount = amount;
            if (t == address(0)) {
                require(
                    msg.value == tmp.repayAmount,
                    "Eth value should be equal to repayAmount"
                );
            }
        }

        // calc the new borrows of user
        tmp.userBorrowUpdated = tmp.userBorrowCurrent.sub(tmp.repayAmount);
        // calc the new borrows of market
        tmp.newTotalBorrows = market
        .totalBorrows
        .add(tmp.userBorrowUpdated)
        .sub(borrowBalance.principal);
        tmp.currentCash = getCash(t);
        // address(0) represents for eth
        // just like the supplyPawn function, eth has been transfered.
        tmp.updatedCash = t != address(0)
        ? tmp.currentCash.add(tmp.repayAmount)
        : tmp.currentCash;

        tmp.newSupplyIndex = uint256(
            mkts[t].irm.pert(
                int256(mkts[t].supplyIndex),
                mkts[t].supplyRate,
                int256(blockDelta)
            )
        );
        // update deposit and loan rate
        market.supplyRate = mkts[t].irm.getDepositRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );
        market.demondRate = mkts[t].irm.getLoanRate(
            valid_uint(tmp.updatedCash),
            valid_uint(tmp.newTotalBorrows)
        );

        market.accrualBlockNumber = now;
        market.totalBorrows = tmp.newTotalBorrows;
        market.supplyIndex = tmp.newSupplyIndex;
        market.borrowIndex = tmp.newBorrowIndex;
        // mkts[t] = market;
        tmp.startingBalance = borrowBalance.principal;
        borrowBalance.principal = tmp.userBorrowUpdated;
        borrowBalance.interestIndex = tmp.newBorrowIndex;

        safeTransferFrom(
            t,
            msg.sender,
            address(this),
            address(this).makePayable(),
            tmp.repayAmount,
            msg.value
        );

        emit RepayFastBorrowLog(
            msg.sender,
            t,
            tmp.repayAmount,
            tmp.startingBalance,
            tmp.userBorrowUpdated
        );

    }

    // shortfall/(price*(minPledgeRate-liquidationDiscount-1))
    // underwaterAsset is borrowAsset
    function calcDiscountedRepayToEvenAmount(
        address targetAccount,
        address underwaterAsset,
        uint256 underwaterAssetPrice
    ) public view returns (uint256) {
        (, uint256 shortfall) = calcAccountLiquidity(targetAccount);
        uint256 minPledgeRate = mkts[underwaterAsset].minPledgeRate;
        uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount;
        uint256 gap = minPledgeRate.sub(liquidationDiscount).sub(1 ether);
        return
        shortfall.mul(10**mkts[underwaterAsset].decimals).div(
            underwaterAssetPrice.mul(gap).div(ONE_ETH)
        ); //underwater asset amount
    }

    //[supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow)
    //[supplyCurrent * (Oracle price for the collateral)] / [ (1 + liquidationDiscount) * (Oracle price for the borrow) ]
    // amount of underwaterAsset to be repayed by liquidator, calculated by the amount of collateral asset
    function calcDiscountedBorrowDenominatedCollateral(
        address underwaterAsset,
        address collateralAsset,
        uint256 underwaterAssetPrice,
        uint256 collateralPrice,
        uint256 supplyCurrent_TargetCollateralAsset
    ) public view returns (uint256 res) {
        uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount;
        uint256 onePlusLiquidationDiscount = (ONE_ETH).add(liquidationDiscount);
        uint256 supplyCurrentTimesOracleCollateral
        = supplyCurrent_TargetCollateralAsset.mul(collateralPrice);

        res = supplyCurrentTimesOracleCollateral.div(
            onePlusLiquidationDiscount.mul(underwaterAssetPrice).div(ONE_ETH)
        ); //underwaterAsset amout
        res = res.mul(10**mkts[underwaterAsset].decimals);
        res = res.div(10**mkts[collateralAsset].decimals);
    }

    //closeBorrowAmount_TargetUnderwaterAsset * (1+liquidationDiscount) * priceBorrow/priceCollateral
    //underwaterAssetPrice * (1+liquidationDiscount) *closeBorrowAmount_TargetUnderwaterAsset) / collateralPrice
    //underwater is borrow
    // calc the amount of collateral asset bought by underwaterAsset(amount: closeBorrowAmount_TargetUnderwaterAsset)
    function calcAmountSeize(
        address underwaterAsset,
        address collateralAsset,
        uint256 underwaterAssetPrice,
        uint256 collateralPrice,
        uint256 closeBorrowAmount_TargetUnderwaterAsset
    ) public view returns (uint256 res) {
        uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount;
        uint256 onePlusLiquidationDiscount = (ONE_ETH).add(liquidationDiscount);
        res = underwaterAssetPrice.mul(onePlusLiquidationDiscount);
        res = res.mul(closeBorrowAmount_TargetUnderwaterAsset);
        res = res.div(collateralPrice);
        res = res.div(ONE_ETH);
        res = res.mul(10**mkts[collateralAsset].decimals);
        res = res.div(10**mkts[underwaterAsset].decimals);
    }

    struct LiquidateIR {
        // we need these addresses in the struct for use with `emitLiquidationEvent` to avoid `CompilerError: Stack too deep, try removing local variables.`
        address targetAccount;
        address assetBorrow;
        address liquidator;
        address assetCollateral;
        // borrow index and supply index are global to the asset, not specific to the user
        uint256 newBorrowIndex_UnderwaterAsset;
        uint256 newSupplyIndex_UnderwaterAsset;
        uint256 newBorrowIndex_CollateralAsset;
        uint256 newSupplyIndex_CollateralAsset;
        // the target borrow's full balance with accumulated interest
        uint256 currentBorrowBalance_TargetUnderwaterAsset;
        // currentBorrowBalance_TargetUnderwaterAsset minus whatever gets repaid as part of the liquidation
        uint256 updatedBorrowBalance_TargetUnderwaterAsset;
        uint256 newTotalBorrows_ProtocolUnderwaterAsset;
        uint256 startingBorrowBalance_TargetUnderwaterAsset;
        uint256 startingSupplyBalance_TargetCollateralAsset;
        uint256 startingSupplyBalance_LiquidatorCollateralAsset;
        uint256 currentSupplyBalance_TargetCollateralAsset;
        uint256 updatedSupplyBalance_TargetCollateralAsset;
        // If liquidator already has a balance of collateralAsset, we will accumulate
        // interest on it before transferring seized collateral from the borrower.
        uint256 currentSupplyBalance_LiquidatorCollateralAsset;
        // This will be the liquidator's accumulated balance of collateral asset before the liquidation (if any)
        // plus the amount seized from the borrower.
        uint256 updatedSupplyBalance_LiquidatorCollateralAsset;
        uint256 newTotalSupply_ProtocolCollateralAsset;
        uint256 currentCash_ProtocolUnderwaterAsset;
        uint256 updatedCash_ProtocolUnderwaterAsset;
        // cash does not change for collateral asset

        //mkts[t]
        uint256 newSupplyRateMantissa_ProtocolUnderwaterAsset;
        uint256 newBorrowRateMantissa_ProtocolUnderwaterAsset;
        // Why no variables for the interest rates for the collateral asset?
        // We don't need to calculate new rates for the collateral asset since neither cash nor borrows change

        uint256 discountedRepayToEvenAmount;
        //[supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow) (discountedBorrowDenominatedCollateral)
        uint256 discountedBorrowDenominatedCollateral;
        uint256 maxCloseableBorrowAmount_TargetUnderwaterAsset;
        uint256 closeBorrowAmount_TargetUnderwaterAsset;
        uint256 seizeSupplyAmount_TargetCollateralAsset;
        uint256 collateralPrice;
        uint256 underwaterAssetPrice;
    }

    // get the max amount to be liquidated
    function calcMaxLiquidateAmount(
        address targetAccount,
        address assetBorrow,
        address assetCollateral
    ) external view returns (uint256) {
        require(msg.sender != targetAccount, "can't self-liquidate");
        LiquidateIR memory tmp;

        uint256 blockDelta = now - mkts[assetBorrow].accrualBlockNumber;

        Market storage borrowMarket = mkts[assetBorrow];
        Market storage collateralMarket = mkts[assetCollateral];

        Balance storage borrowBalance_TargeUnderwaterAsset
        = accountBorrowSnapshot[assetBorrow][targetAccount];


        Balance storage supplyBalance_TargetCollateralAsset
        = accountSupplySnapshot[assetCollateral][targetAccount];

        tmp.newSupplyIndex_CollateralAsset = uint256(
            collateralMarket.irm.pert(
                int256(collateralMarket.supplyIndex),
                collateralMarket.supplyRate,
                int256(blockDelta)
            )
        );
        tmp.newBorrowIndex_UnderwaterAsset = uint256(
            borrowMarket.irm.pert(
                int256(borrowMarket.borrowIndex),
                borrowMarket.demondRate,
                int256(blockDelta)
            )
        );
        tmp.currentSupplyBalance_TargetCollateralAsset = uint256(
            collateralMarket.irm.calculateBalance(
                valid_uint(supplyBalance_TargetCollateralAsset.principal),
                int256(supplyBalance_TargetCollateralAsset.interestIndex),
                int256(tmp.newSupplyIndex_CollateralAsset)
            )
        );
        tmp.currentBorrowBalance_TargetUnderwaterAsset = uint256(
            borrowMarket.irm.calculateBalance(
                valid_uint(borrowBalance_TargeUnderwaterAsset.principal),
                int256(borrowBalance_TargeUnderwaterAsset.interestIndex),
                int256(tmp.newBorrowIndex_UnderwaterAsset)
            )
        );

        bool ok;
        (tmp.collateralPrice, ok) = fetchAssetPrice(assetCollateral);
        require(ok, "fail to get collateralPrice");

        (tmp.underwaterAssetPrice, ok) = fetchAssetPrice(assetBorrow);
        require(ok, "fail to get underwaterAssetPrice");

        tmp.discountedBorrowDenominatedCollateral = calcDiscountedBorrowDenominatedCollateral(
            assetBorrow,
            assetCollateral,
            tmp.underwaterAssetPrice,
            tmp.collateralPrice,
            tmp.currentSupplyBalance_TargetCollateralAsset
        );
        tmp.discountedRepayToEvenAmount = calcDiscountedRepayToEvenAmount(
            targetAccount,
            assetBorrow,
            tmp.underwaterAssetPrice
        );
        tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min(
            tmp.currentBorrowBalance_TargetUnderwaterAsset,
            tmp.discountedBorrowDenominatedCollateral
        );
        tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min(
            tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset,
            tmp.discountedRepayToEvenAmount
        );

        return tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset;
    }

    // liquidate
    function liquidateBorrowPawn(
        address targetAccount,
        address assetBorrow,
        address assetCollateral,
        uint256 requestedAmountClose
    ) external payable nonReentrant {
        require(msg.sender != targetAccount, "can't self-liquidate");
        LiquidateIR memory tmp;
        // Copy these addresses into the struct for use with `emitLiquidationEvent`
        // We'll use tmp.liquidator inside this function for clarity vs using msg.sender.
        tmp.targetAccount = targetAccount;
        tmp.assetBorrow = assetBorrow;
        tmp.liquidator = msg.sender;
        tmp.assetCollateral = assetCollateral;

        uint256 blockDelta = now - mkts[assetBorrow].accrualBlockNumber;

        Market storage borrowMarket = mkts[assetBorrow];
        Market storage collateralMarket = mkts[assetCollateral];

        // borrower's borrow balance and supply balance
        Balance storage borrowBalance_TargeUnderwaterAsset
        = accountBorrowSnapshot[assetBorrow][targetAccount];

        Balance storage supplyBalance_TargetCollateralAsset
        = accountSupplySnapshot[assetCollateral][targetAccount];

        // Liquidator might already hold some of the collateral asset
        Balance storage supplyBalance_LiquidatorCollateralAsset
        = accountSupplySnapshot[assetCollateral][tmp.liquidator];

        bool ok;
        (tmp.collateralPrice, ok) = fetchAssetPrice(assetCollateral);
        require(ok, "fail to get collateralPrice");

        (tmp.underwaterAssetPrice, ok) = fetchAssetPrice(assetBorrow);
        require(ok, "fail to get underwaterAssetPrice");

        // calc borrower's borrow balance with the newest interest
        tmp.newBorrowIndex_UnderwaterAsset = uint256(
            borrowMarket.irm.pert(
                int256(borrowMarket.borrowIndex),
                borrowMarket.demondRate,
                int256(blockDelta)
            )
        );
        tmp.currentBorrowBalance_TargetUnderwaterAsset = uint256(
            borrowMarket.irm.calculateBalance(
                valid_uint(borrowBalance_TargeUnderwaterAsset.principal),
                int256(borrowBalance_TargeUnderwaterAsset.interestIndex),
                int256(tmp.newBorrowIndex_UnderwaterAsset)
            )
        );

        // calc borrower's supply balance with the newest interest
        tmp.newSupplyIndex_CollateralAsset = uint256(
            collateralMarket.irm.pert(
                int256(collateralMarket.supplyIndex),
                collateralMarket.supplyRate,
                int256(blockDelta)
            )
        );
        tmp.currentSupplyBalance_TargetCollateralAsset = uint256(
            collateralMarket.irm.calculateBalance(
                valid_uint(supplyBalance_TargetCollateralAsset.principal),
                int256(supplyBalance_TargetCollateralAsset.interestIndex),
                int256(tmp.newSupplyIndex_CollateralAsset)
            )
        );

        // calc liquidator's balance of the collateral asset
        tmp.currentSupplyBalance_LiquidatorCollateralAsset = uint256(
            collateralMarket.irm.calculateBalance(
                valid_uint(supplyBalance_LiquidatorCollateralAsset.principal),
                int256(supplyBalance_LiquidatorCollateralAsset.interestIndex),
                int256(tmp.newSupplyIndex_CollateralAsset)
            )
        );

        // update collateral asset of the market
        tmp.newTotalSupply_ProtocolCollateralAsset = collateralMarket
        .totalSupply
        .add(tmp.currentSupplyBalance_TargetCollateralAsset)
        .sub(supplyBalance_TargetCollateralAsset.principal);
        tmp.newTotalSupply_ProtocolCollateralAsset = tmp
        .newTotalSupply_ProtocolCollateralAsset
        .add(tmp.currentSupplyBalance_LiquidatorCollateralAsset)
        .sub(supplyBalance_LiquidatorCollateralAsset.principal);

        // calc the max amount to be liquidated
        tmp.discountedBorrowDenominatedCollateral = calcDiscountedBorrowDenominatedCollateral(
            assetBorrow,
            assetCollateral,
            tmp.underwaterAssetPrice,
            tmp.collateralPrice,
            tmp.currentSupplyBalance_TargetCollateralAsset
        );
        tmp.discountedRepayToEvenAmount = calcDiscountedRepayToEvenAmount(
            targetAccount,
            assetBorrow,
            tmp.underwaterAssetPrice
        );
        tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min(
            min(
                tmp.currentBorrowBalance_TargetUnderwaterAsset,
                tmp.discountedBorrowDenominatedCollateral
            ),
            tmp.discountedRepayToEvenAmount
        );

        // uint(-1) represents the user want to liquidate all
        if (requestedAmountClose == uint256(-1)) {
            tmp.closeBorrowAmount_TargetUnderwaterAsset = tmp
            .maxCloseableBorrowAmount_TargetUnderwaterAsset;
        } else {
            tmp.closeBorrowAmount_TargetUnderwaterAsset = requestedAmountClose;
        }
        require(
            tmp.closeBorrowAmount_TargetUnderwaterAsset <=
            tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset,
            "closeBorrowAmount > maxCloseableBorrowAmount err"
        );
        // address(0) represents for eth
        if (assetBorrow == address(0)) {
            // just the repay method, eth amount be transfered should be a litte more
            require(
                msg.value >= tmp.closeBorrowAmount_TargetUnderwaterAsset,
                "Not enough ETH"
            );
        } else {
            // user needs to have enough balance
            require(
                getBalanceOf(assetBorrow, tmp.liquidator) >=
                tmp.closeBorrowAmount_TargetUnderwaterAsset,
                "insufficient balance"
            );
        }

        // 计算清算人实际清算得到的此质押币数量
        // The amount of collateral asset that liquidator can get
        tmp.seizeSupplyAmount_TargetCollateralAsset = calcAmountSeize(
            assetBorrow,
            assetCollateral,
            tmp.underwaterAssetPrice,
            tmp.collateralPrice,
            tmp.closeBorrowAmount_TargetUnderwaterAsset
        );

        // 被清算人借币余额减少
        // Update borrower's balance
        tmp.updatedBorrowBalance_TargetUnderwaterAsset = tmp
        .currentBorrowBalance_TargetUnderwaterAsset
        .sub(tmp.closeBorrowAmount_TargetUnderwaterAsset);
        // 更新借币市场总量
        // Update borrow market
        tmp.newTotalBorrows_ProtocolUnderwaterAsset = borrowMarket
        .totalBorrows
        .add(tmp.updatedBorrowBalance_TargetUnderwaterAsset)
        .sub(borrowBalance_TargeUnderwaterAsset.principal);

        tmp.currentCash_ProtocolUnderwaterAsset = getCash(assetBorrow);
        // address(0) represents for eth
        // eth has been transfered when called
        tmp.updatedCash_ProtocolUnderwaterAsset = assetBorrow != address(0)
        ? tmp.currentCash_ProtocolUnderwaterAsset.add(
            tmp.closeBorrowAmount_TargetUnderwaterAsset
        )
        : tmp.currentCash_ProtocolUnderwaterAsset;

        tmp.newSupplyIndex_UnderwaterAsset = uint256(
            borrowMarket.irm.pert(
                int256(borrowMarket.supplyIndex),
                borrowMarket.demondRate,
                int256(blockDelta)
            )
        );
        borrowMarket.supplyRate = borrowMarket.irm.getDepositRate(
            int256(tmp.updatedCash_ProtocolUnderwaterAsset),
            int256(tmp.newTotalBorrows_ProtocolUnderwaterAsset)
        );
        borrowMarket.demondRate = borrowMarket.irm.getLoanRate(
            int256(tmp.updatedCash_ProtocolUnderwaterAsset),
            int256(tmp.newTotalBorrows_ProtocolUnderwaterAsset)
        );
        tmp.newBorrowIndex_CollateralAsset = uint256(
            collateralMarket.irm.pert(
                int256(collateralMarket.supplyIndex),
                collateralMarket.demondRate,
                int256(blockDelta)
            )
        );

        // Update the balance of liquidator and borrower
        tmp.updatedSupplyBalance_TargetCollateralAsset = tmp
        .currentSupplyBalance_TargetCollateralAsset
        .sub(tmp.seizeSupplyAmount_TargetCollateralAsset);
        tmp.updatedSupplyBalance_LiquidatorCollateralAsset = tmp
        .currentSupplyBalance_LiquidatorCollateralAsset
        .add(tmp.seizeSupplyAmount_TargetCollateralAsset);

        borrowMarket.accrualBlockNumber = now;
        borrowMarket.totalBorrows = tmp.newTotalBorrows_ProtocolUnderwaterAsset;
        borrowMarket.supplyIndex = tmp.newSupplyIndex_UnderwaterAsset;
        borrowMarket.borrowIndex = tmp.newBorrowIndex_UnderwaterAsset;
        // mkts[assetBorrow] = borrowMarket;
        collateralMarket.accrualBlockNumber = now;
        collateralMarket.totalSupply = tmp
        .newTotalSupply_ProtocolCollateralAsset;
        collateralMarket.supplyIndex = tmp.newSupplyIndex_CollateralAsset;
        collateralMarket.borrowIndex = tmp.newBorrowIndex_CollateralAsset;
        // mkts[assetCollateral] = collateralMarket;
        tmp.startingBorrowBalance_TargetUnderwaterAsset = borrowBalance_TargeUnderwaterAsset
        .principal; // save for use in event
        borrowBalance_TargeUnderwaterAsset.principal = tmp
        .updatedBorrowBalance_TargetUnderwaterAsset;
        borrowBalance_TargeUnderwaterAsset.interestIndex = tmp
        .newBorrowIndex_UnderwaterAsset;

        tmp.startingSupplyBalance_TargetCollateralAsset = supplyBalance_TargetCollateralAsset
        .principal; // save for use in event
        supplyBalance_TargetCollateralAsset.principal = tmp
        .updatedSupplyBalance_TargetCollateralAsset;
        supplyBalance_TargetCollateralAsset.interestIndex = tmp
        .newSupplyIndex_CollateralAsset;

        tmp.startingSupplyBalance_LiquidatorCollateralAsset = supplyBalance_LiquidatorCollateralAsset
        .principal; // save for use in event
        supplyBalance_LiquidatorCollateralAsset.principal = tmp
        .updatedSupplyBalance_LiquidatorCollateralAsset;
        supplyBalance_LiquidatorCollateralAsset.interestIndex = tmp
        .newSupplyIndex_CollateralAsset;

        setLiquidateInfoMap(
            tmp.targetAccount,
            tmp.liquidator,
            tmp.assetCollateral,
            assetBorrow,
            tmp.seizeSupplyAmount_TargetCollateralAsset,
            tmp.closeBorrowAmount_TargetUnderwaterAsset
        );

        safeTransferFrom(
            assetBorrow,
            tmp.liquidator.makePayable(),
            address(this),
            address(this).makePayable(),
            tmp.closeBorrowAmount_TargetUnderwaterAsset,
            msg.value
        );

        emit LiquidateBorrowPawnLog(
            tmp.targetAccount,
            assetBorrow,
            tmp.updatedBorrowBalance_TargetUnderwaterAsset,
            tmp.liquidator,
            tmp.assetCollateral,
            tmp.updatedSupplyBalance_TargetCollateralAsset
        );
    }

    function safeTransferFrom(
        address token,
        address payable owner,
        address spender,
        address payable to,
        uint256 amount,
        uint256 msgValue
    ) internal {
        require(amount != 0, "invalid safeTransferFrom amount");
        if (owner != spender && token != address(0)) {
            // transfer in ERC20
            require(
                IERC20(token).allowance(owner, spender) >= amount,
                "Insufficient allowance"
            );
        }
        if (token != address(0)) {
            require(
                IERC20(token).balanceOf(owner) >= amount,
                "Insufficient balance"
            );
        } else if (owner == spender) {
            // eth, owner == spender represents for transfer out, requires enough balance
            require(owner.balance >= amount, "Insufficient eth balance");
        }

        if (owner != spender) {
            // transfer in
            if (token != address(0)) {
                // transferFrom ERC20
                IERC20(token).safeTransferFrom(owner, to, amount);
            } else if (msgValue != 0 && msgValue > amount) {
                // return the extra eth to user
                owner.transfer(msgValue.sub(amount));
            }
            // eth has been transfered when called using msg.value
        } else {
            // transfer out
            if (token != address(0)) {
                // ERC20
                IERC20(token).safeTransfer(to, amount);
            } else {
                // 参数设置, msgValue 大于0,即还款或清算逻辑,实际还的钱大于需要还的钱,需要返回多余的钱
                // msgValue 等于 0,借钱或取钱逻辑,直接转出 amount 数量的币

                // msgValue greater than 0 represents for repay or liquidate,
                // which means we should give back the extra eth to user
                // msgValue equals to 0 represents for withdraw or borrow
                // just take the wanted money
                if (msgValue != 0 && msgValue > amount) {
                    to.transfer(msgValue.sub(amount));
                } else {
                    to.transfer(amount);
                }
            }
        }
    }

    // admin transfers profit out
    function withdrawPawnEquity(address t, uint256 amount)
    external
    nonReentrant
    onlyAdmin
    {
        uint256 cash = getCash(t);
        uint256 equity = cash.add(mkts[t].totalBorrows).sub(
            mkts[t].totalSupply
        );
        require(equity >= amount, "insufficient equity amount");
        safeTransferFrom(
            t,
            address(this).makePayable(),
            address(this),
            admin.makePayable(),
            amount,
            0
        );
        emit WithdrawPawnEquityLog(t, equity, amount, admin);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"BorrowPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"tBorrow","type":"address"},{"indexed":false,"internalType":"uint256","name":"endBorrow","type":"uint256"},{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"tCol","type":"address"},{"indexed":false,"internalType":"uint256","name":"endCol","type":"uint256"}],"name":"LiquidateBorrowPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"RepayFastBorrowLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"SupplyPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"equityAvailableBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"WithdrawPawnEquityLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"WithdrawPawnLog","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BorrowPawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ONE_ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountBorrowSnapshot","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"},{"internalType":"uint256","name":"totalPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountSupplySnapshot","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"},{"internalType":"uint256","name":"totalPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accounts","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"addCollateralMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calcAccountAllTokenValuesLeverageInternal","outputs":[{"internalType":"uint256","name":"sumSupplies","type":"uint256"},{"internalType":"uint256","name":"sumBorrowLeverage","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calcAccountLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"calcAccountTokenValuesInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"calcAccountTokenValuesLeverageInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"},{"internalType":"uint256","name":"collateralPrice","type":"uint256"},{"internalType":"uint256","name":"closeBorrowAmount_TargetUnderwaterAsset","type":"uint256"}],"name":"calcAmountSeize","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"calcBorrowAmountWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"},{"internalType":"uint256","name":"collateralPrice","type":"uint256"},{"internalType":"uint256","name":"supplyCurrent_TargetCollateralAsset","type":"uint256"}],"name":"calcDiscountedBorrowDenominatedCollateral","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"}],"name":"calcDiscountedRepayToEvenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"address","name":"assetCollateral","type":"address"}],"name":"calcMaxLiquidateAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimAdministration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultOriginationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"fetchAssetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"usdValue","type":"uint256"}],"name":"getAssetAmountForValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalanceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalanceLeverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowPnl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowPnlInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCollateralMarketsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"getPriceForAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"getPriceForAssetAmountMulCollatRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyBalanceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyPnl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyPnlInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalBorrowPnl","outputs":[{"internalType":"uint256","name":"sumPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalSupplyPnl","outputs":[{"internalType":"uint256","name":"sumPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"indexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"initCollateralMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialInterestIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"int_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"address","name":"assetCollateral","type":"address"},{"internalType":"uint256","name":"requestedAmountClose","type":"uint256"}],"name":"liquidateBorrowPawn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"liquidateIndexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidateInfoMap","outputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"assetCollatera","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"loanToDepositRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mkts","outputs":[{"internalType":"uint256","name":"accrualBlockNumber","type":"uint256"},{"internalType":"int256","name":"supplyRate","type":"int256"},{"internalType":"int256","name":"demondRate","type":"int256"},{"internalType":"contract IInterestRateModel","name":"irm","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"supplyIndex","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"internalType":"uint256","name":"totalReserves","type":"uint256"},{"internalType":"uint256","name":"minPledgeRate","type":"uint256"},{"internalType":"uint256","name":"liquidationDiscount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleInstance","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"originationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"proposeNewAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposedAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayFastBorrow","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"setDecimals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setInitialTimestamp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"address","name":"irm","type":"address"}],"name":"setInterestRateModel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"liquidationDiscount","type":"uint256"}],"name":"setLiquidationDiscount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"minPledgeRate","type":"uint256"}],"name":"setMinPledgeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyPawn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"name":"withdrawPawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPawnEquity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600160085534801561001557600080fd5b5060008054600160ff1990911617610100600160a81b0319166101003302178155615f549081906200004790396000f3fe6080604052600436106103975760003560e01c80637701d0bd116101dc578063c5af0bab11610102578063e03368c1116100a0578063f2a40db81161006f578063f2a40db814610f5f578063f673e9ca14610f89578063f851a44014610fcc578063feb59ccf14610fe157610397565b8063e03368c114610ed8578063ea3a4c6014610ed8578063ed1d840d14610eed578063f0f8aff914610f2657610397565b8063d3339024116100dc578063d333902414610da2578063d7d9dba014610db7578063ddec280e14610df2578063de6843c314610e3e57610397565b8063c5af0bab14610d27578063c92fcfb314610d3c578063cb3db56314610d6f57610397565b8063a21accdc1161017a578063b7fc3ada11610149578063b7fc3ada14610c7a578063b8bb5c421461060e578063ba37773114610cb3578063bbde010214610cee57610397565b8063a21accdc14610bc4578063a637674614610bf7578063ad2cb23914610c2a578063b19322a614610c3f57610397565b8063841d0071116101b6578063841d007114610add5780638cd3b02214610b1057806391de89c614610b5f5780639c74acda14610b8b57610397565b80637701d0bd14610a225780637adbf97314610a715780637e67e5ce14610aa457610397565b806335b773cb116102c157806341ed3ad61161025f578063607b463a1161022e578063607b463a1461096c57806365dc4e3a1461099f5780636e04d137146109d25780636e2ede0314610a0d57610397565b806341ed3ad6146108315780634613f1271461087657806353131ab5146108ea5780636012481a1461093357610397565b80633e3ae88a1161029b5780633e3ae88a146107575780634100b9f01461079057806341b41316146107e957806341d6864e1461081c57610397565b806335b773cb146106a65780633c03d33e146106e15780633cb7317b1461071c57610397565b80631b6a935e116103395780632c7769b2116103085780632c7769b21461060e5780632db78d931461062357806332f751ec14610656578063332279b11461066b57610397565b80631b6a935e1461054857806326bc59fa1461057257806327001627146105c65780632986c0e5146105f957610397565b8063118e31b711610375578063118e31b71461043f578063172c48c71461048c57806317585b12146104d25780631925a7511461050d57610397565b80630cffc6761461039c5780630ddeb327146103da578063101828d114610406575b600080fd5b6103d8600480360360808110156103b257600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561101c565b005b6103d8600480360360408110156103f057600080fd5b506001600160a01b038135169060200135611c69565b34801561041257600080fd5b506103d86004803603604081101561042957600080fd5b506001600160a01b038135169060200135612250565b34801561044b57600080fd5b5061047a6004803603604081101561046257600080fd5b506001600160a01b038135811691602001351661281b565b60408051918252519081900360200190f35b34801561049857600080fd5b506104b6600480360360208110156104af57600080fd5b503561298e565b604080516001600160a01b039092168252519081900360200190f35b3480156104de57600080fd5b506103d8600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166129b5565b34801561051957600080fd5b5061047a6004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516612a38565b34801561055457600080fd5b5061047a6004803603602081101561056b57600080fd5b5035612a54565b34801561057e57600080fd5b506105ad6004803603604081101561059557600080fd5b506001600160a01b0381358116916020013516612a96565b6040805192835260208301919091528051918290030190f35b3480156105d257600080fd5b5061047a600480360360208110156105e957600080fd5b50356001600160a01b0316612ab8565b34801561060557600080fd5b5061047a612aff565b34801561061a57600080fd5b5061047a612b05565b34801561062f57600080fd5b5061047a6004803603602081101561064657600080fd5b50356001600160a01b0316612b0a565b34801561066257600080fd5b506104b6612b1c565b34801561067757600080fd5b5061047a6004803603604081101561068e57600080fd5b506001600160a01b0381358116916020013516612b2b565b3480156106b257600080fd5b5061047a600480360360408110156106c957600080fd5b506001600160a01b0381358116916020013516612cba565b3480156106ed57600080fd5b5061047a6004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516612cc6565b34801561072857600080fd5b5061047a6004803603604081101561073f57600080fd5b506001600160a01b0381358116916020013516612e77565b34801561076357600080fd5b506103d86004803603604081101561077a57600080fd5b506001600160a01b038135169060200135612e87565b34801561079c57600080fd5b506107cb600480360360408110156107b357600080fd5b506001600160a01b0381358116916020013516613066565b60408051938452602084019290925282820152519081900360600190f35b3480156107f557600080fd5b506105ad6004803603602081101561080c57600080fd5b50356001600160a01b031661308e565b34801561082857600080fd5b5061047a613108565b34801561083d57600080fd5b5061047a6004803603606081101561085457600080fd5b506001600160a01b038135811691602081013582169160409091013516613113565b34801561088257600080fd5b506108a06004803603602081101561089957600080fd5b503561357f565b604080516001600160a01b039889168152968816602088015294871686860152929095166060850152608084015260a083019390935260c082019290925290519081900360e00190f35b3480156108f657600080fd5b506103d86004803603608081101561090d57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356135ce565b34801561093f57600080fd5b506103d86004803603604081101561095657600080fd5b506001600160a01b0381351690602001356137ef565b34801561097857600080fd5b5061047a6004803603602081101561098f57600080fd5b50356001600160a01b0316613ee6565b3480156109ab57600080fd5b506103d8600480360360208110156109c257600080fd5b50356001600160a01b0316613f79565b3480156109de57600080fd5b5061047a600480360360408110156109f557600080fd5b506001600160a01b0381358116916020013516614068565b348015610a1957600080fd5b5061047a614078565b348015610a2e57600080fd5b5061047a600480360360a0811015610a4557600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561407e565b348015610a7d57600080fd5b506103d860048036036020811015610a9457600080fd5b50356001600160a01b0316614175565b348015610ab057600080fd5b506103d860048036036040811015610ac757600080fd5b506001600160a01b0381351690602001356141e9565b348015610ae957600080fd5b5061047a60048036036020811015610b0057600080fd5b50356001600160a01b031661425a565b348015610b1c57600080fd5b5061047a600480360360a0811015610b3357600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356142bb565b6103d860048036036040811015610b7557600080fd5b506001600160a01b0381351690602001356143a5565b348015610b9757600080fd5b5061047a60048036036040811015610bae57600080fd5b506001600160a01b03813516906020013561495d565b348015610bd057600080fd5b506105ad60048036036020811015610be757600080fd5b50356001600160a01b0316614a50565b348015610c0357600080fd5b506103d860048036036020811015610c1a57600080fd5b50356001600160a01b0316614aae565b348015610c3657600080fd5b506103d8614b22565b348015610c4b57600080fd5b506105ad60048036036040811015610c6257600080fd5b506001600160a01b0381358116916020013516614ba9565b348015610c8657600080fd5b506103d860048036036040811015610c9d57600080fd5b506001600160a01b038135169060200135614bc0565b348015610cbf57600080fd5b5061047a60048036036040811015610cd657600080fd5b506001600160a01b0381358116916020013516614c31565b348015610cfa57600080fd5b506103d860048036036040811015610d1157600080fd5b506001600160a01b038135169060200135614cc1565b348015610d3357600080fd5b506104b6614d33565b348015610d4857600080fd5b506103d860048036036020811015610d5f57600080fd5b50356001600160a01b0316614d42565b348015610d7b57600080fd5b5061047a60048036036020811015610d9257600080fd5b50356001600160a01b0316614db0565b348015610dae57600080fd5b5061047a614e0a565b348015610dc357600080fd5b5061047a60048036036040811015610dda57600080fd5b506001600160a01b0381358116916020013516614e10565b348015610dfe57600080fd5b50610e2560048036036020811015610e1557600080fd5b50356001600160a01b0316614e54565b6040805192835290151560208301528051918290030190f35b348015610e4a57600080fd5b50610e7160048036036020811015610e6157600080fd5b50356001600160a01b0316614f2d565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b348015610ee457600080fd5b5061047a614fa0565b348015610ef957600080fd5b5061047a60048036036040811015610f1057600080fd5b506001600160a01b038135169060200135614fac565b348015610f3257600080fd5b5061047a60048036036040811015610f4957600080fd5b506001600160a01b038135169060200135615093565b348015610f6b57600080fd5b506104b660048036036020811015610f8257600080fd5b50356150cb565b348015610f9557600080fd5b5061047a60048036036060811015610fac57600080fd5b506001600160a01b038135811691602081013590911690604001356150e6565b348015610fd857600080fd5b506104b6615188565b348015610fed57600080fd5b506107cb6004803603604081101561100457600080fd5b506001600160a01b038135811691602001351661519c565b60005460ff16611061576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055336001600160a01b03851614156110c0576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b6110c8615b14565b6001600160a01b03808616808352858216602080850182905233604080870191825288861660608801819052600085815260098552828120805483835284832097835260038752848320898452875284832084845260028089528685209a85528a89528685209585528852955190991682529690945290832042969096039591929091906111558a614e54565b6103808a01919091529050806111b2576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6111bb8b614e54565b6103a08a0191909152905080611218576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b600386015460078701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d60208110156112a957600080fd5b50516080890152600386015484546001600160a01b039091169063e14768ed906112d2906151c8565b86600101548b608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b5051610100890152600385015460058601546001870154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b505160e0890152600385015483546001600160a01b039091169063e14768ed9061140a906151c8565b85600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50516101c0890152600385015482546001600160a01b039091169063e14768ed906114aa906151c8565b84600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161020089015282546101c08901516004870154611556929161154a919063ffffffff61522016565b9063ffffffff61526e16565b610240890181905282546102008a01516115799261154a9163ffffffff61522016565b6102408901526103a08801516103808901516101c08a015161159e928e928e926142bb565b6103008901526103a08801516115b7908d908d906150e6565b6102e08901526101008801516103008901516115e1916115d6916152bf565b896102e001516152bf565b6103208901526000198914156116025761032088015161034089015261160b565b61034088018990525b87610320015188610340015111156116545760405162461bcd60e51b8152600401808060200182810382526030815260200180615ef06030913960400191505060405180910390fd5b6001600160a01b038b166116b2578761034001513410156116ad576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b611710565b8761034001516116c68c8a604001516152d7565b1015611710576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61172c8b8b8a6103a001518b61038001518c610340015161407e565b61036089015261034088015161010089015161174d9163ffffffff61526e16565b6101208901819052845460068801546117709261154a919063ffffffff61522016565b61014089015261177f8b613ee6565b6102608901526001600160a01b038b1661179e578761026001516117b9565b6103408801516102608901516117b99163ffffffff61522016565b610280890152600386015460058701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505160a089015260038601546102808901516101408a01516040805163a1d7796760e01b815260048101939093526024830191909152516001600160a01b039092169163a1d7796791604480820192602092909190829003018186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d60208110156118e357600080fd5b5051600187015560038601546102808901516101408a0151604080516313f17e7360e21b815260048101939093526024830191909152516001600160a01b0390921691634fc5f9cc91604480820192602092909190829003018186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516002808801919091556003860154600587015491870154604080516396e973f560e01b815260048101949094526024840191909152604483018a9052516001600160a01b03909116916396e973f5916064808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b505160c08901526103608801516101c0890151611a329163ffffffff61526e16565b6101e0890152610360880151610200890151611a539163ffffffff61522016565b8861022001818152505042866000018190555087610140015186600601819055508760a0015186600501819055508760800151866007018190555042856000018190555087610240015185600401819055508760e0015185600501819055508760c001518560070181905550836000015488610160018181525050876101200151846000018190555087608001518460010181905550826000015488610180018181525050876101e0015183600001819055508760e0015183600101819055508160000154886101a001818152505087610220015182600001819055508760e001518260010181905550611b61886000015189604001518a606001518e8c61036001518d6103400151615376565b611b918b611b7b8a604001516001600160a01b0316615454565b30611b8581615454565b8c610340015134615457565b7f564b05ce5b1718b3406f5483d56f1b9609a9aab4603bdaeba9c415e0b38b039e88600001518c8a61012001518b604001518c606001518d6101e0015160405180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001965050505050505060405180910390a150506000805460ff1916600117905550505050505050505050565b60005460ff16611cae576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055611cc0615c17565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed90611db7906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015611dff57600080fd5b505afa158015611e13573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b50516020870152600019871415611eab57611e51611e4789336152d7565b87602001516152bf565b60408701526001600160a01b038816611ea65785604001513411611ea65760405162461bcd60e51b815260040180806020018281038252602b815260200180615ec5602b913960400191505060405180910390fd5b611f02565b604086018790526001600160a01b038816611f025785604001513414611f025760405162461bcd60e51b8152600401808060200182810382526028815260200180615e5b6028913960400191505060405180910390fd5b60408601516020870151611f1b9163ffffffff61526e16565b6060870181905284546006870154611f3d9261154a919063ffffffff61522016565b6080870152611f4b88613ee6565b60a08701526001600160a01b038816611f68578560a00151611f81565b604086015160a0870151611f819163ffffffff61522016565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d602081101561202557600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612060906151c8565b61206d89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc9061210d906151c8565b61211a89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556121d48833306121c981615454565b8a6040015134615457565b6040808701516101008801516060808a015184513381526001600160a01b038e1660208201528086019490945290830191909152608082015290517f95536f77ac48f30901e02b7e98147d28fa621a9296283b46afa87ea9f994290d9181900360a00190a150506000805460ff19166001179055505050505050565b60005460ff16612295576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191690556122a7615c63565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed9061239e906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156123e657600080fd5b505afa1580156123fa573d6000803e3d6000fd5b505050506040513d602081101561241057600080fd5b5051602087015261242087612a54565b60408701819052602087015161243b9163ffffffff61522016565b606087018190528454600687015461245d9261154a919063ffffffff61522016565b608087015261246b33614a50565b61014088015261012087018190521580159061248a5750610140860151155b6124db576040805162461bcd60e51b815260206004820152601760248201527f63616e277420626f72726f772c2073686f727466616c6c000000000000000000604482015290519081900360640190fd5b6124e9888760400151615093565b610160870181905261012087015110156125345760405162461bcd60e51b8152600401808060200182810382526022815260200180615ea36022913960400191505060405180910390fd5b61253d88613ee6565b60a08701819052612554908863ffffffff61526e16565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b1580156125ce57600080fd5b505afa1580156125e2573d6000803e3d6000fd5b505050506040513d60208110156125f857600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612633906151c8565b61264089608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561267b57600080fd5b505afa15801561268f573d6000803e3d6000fd5b505050506040513d60208110156126a557600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc906126e0906151c8565b6126ed89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d602081101561275257600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556127a48861279a30615454565b30338b6000615457565b610100860151606080880151604080513381526001600160a01b038d1660208201528082018c905292830193909352608082015290517fccf497a6d8ab6e2d0cd3345e3f91702b378c9ba26a707adc43e47ec8ceccacbd9181900360a00190a150506000805460ff19166001179055505050505050565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b1580156128ac57600080fd5b505afa1580156128c0573d6000803e3d6000fd5b505050506040513d60208110156128d657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed9061290e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d602081101561298057600080fd5b505193505050505b92915050565b600a818154811061299b57fe5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b03163314612a07576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260096020526040902060030180546001600160a01b03191691909216179055565b6000612a4d82612a488585614c31565b614fac565b9392505050565b6000612a8e670de0b6b3a7640000612a82612a75828563ffffffff61522016565b859063ffffffff61583c16565b9063ffffffff61589f16565b90505b919050565b600080612aa38484612a38565b612aad8585614e10565b915091509250929050565b6001600160a01b03811660009081526009602052604081206006810154600490910154612af781612a8284670de0b6b3a764000063ffffffff61583c16565b949350505050565b60085481565b600081565b60076020526000908152604090205481565b6001546001600160a01b031681565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612c1e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612c6657600080fd5b505afa158015612c7a573d6000803e3d6000fd5b505050506040513d6020811015612c9057600080fd5b505183546002850154919250612cb09161154a908463ffffffff61522016565b9695505050505050565b6000612a4d82612a4885855b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b158015612d5657600080fd5b505afa158015612d6a573d6000803e3d6000fd5b505050506040513d6020811015612d8057600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612db8906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612e0057600080fd5b505afa158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b50518354909150811115612e6a578254612e6090612e4f90839063ffffffff61526e16565b60028501549063ffffffff61522016565b9350505050612988565b5050600201549050612988565b6000612a4d82612a48858561281b565b60005460ff16612ecc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169081905561010090046001600160a01b03163314612f27576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6000612f3283613ee6565b6001600160a01b038416600090815260096020526040812060048101546006909101549293509091612f70919061154a90859063ffffffff61522016565b905082811015612fc7576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e742065717569747920616d6f756e74000000000000604482015290519081900360640190fd5b612ff884612fd430615454565b6000543090612ff09061010090046001600160a01b0316615454565b876000615457565b600054604080516001600160a01b03808816825260208201859052818301879052610100909304929092166060830152517ff436439e28c1812ec03906f344bbce09c25881eae35d800d55585265cc9d7c8b9181900360800190a150506000805460ff191660011790555050565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b600a546000908190815b81811015613101576000806130ce87600a85815481106130b457fe5b6000918252602090912001546001600160a01b0316612a96565b90925090506130e3868363ffffffff61522016565b95506130f5858263ffffffff61522016565b94505050600101613098565b5050915091565b6001600160ff1b0381565b6000336001600160a01b038516141561316a576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b613172615b14565b6001600160a01b038085166000818152600960209081526040808320805489871680865283862096865260038086528487208e8a1680895290875285882092885260028752858820908852865295849020958701546005880154600189015486516396e973f560e01b81526004810192909252602482015242939093036044840181905294519498939796919591949316926396e973f5926064808201939291829003018186803b15801561322657600080fd5b505afa15801561323a573d6000803e3d6000fd5b505050506040513d602081101561325057600080fd5b505160e0870152600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201889052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156132be57600080fd5b505afa1580156132d2573d6000803e3d6000fd5b505050506040513d60208110156132e857600080fd5b50516080870152600383015481546001600160a01b039091169063e14768ed90613311906151c8565b83600101548960e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d602081101561338757600080fd5b50516101c0870152600384015482546001600160a01b039091169063e14768ed906133b1906151c8565b846001015489608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156133fd57600080fd5b505afa158015613411573d6000803e3d6000fd5b505050506040513d602081101561342757600080fd5b5051610100870152600061343a89614e54565b610380890191909152905080613497576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6134a08a614e54565b6103a08901919091529050806134fd576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b6135198a8a896103a001518a61038001518b6101c001516142bb565b6103008801526103a0870151613532908c908c906150e6565b6102e088015261010087015161030088015161354e91906152bf565b61032088018190526102e088015161356691906152bf565b6103209097018790525094955050505050509392505050565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b039485169693851695928516949093169290919087565b60005461010090046001600160a01b03163314613620576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b546001600160a01b03166136395761363982614175565b613641615cc4565b506001600160a01b038085166000908152600960208181526040928390208351610180810185528154815260018201549281019290925260028101549382019390935260038301549093166060840181905260048301546080850152600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015290820154610120840152600a820154610140840152600b909101546101608301526136f5576136f585856129b5565b6136fe85613f79565b60a081015161371657670de0b6b3a764000060a08201525b60e081015161372e57670de0b6b3a764000060e08201525b6101608101516137415761016081018290525b6001600160a01b039485166000908152600960208181526040928390208451815590840151600182015591830151600283015560608301516003830180546001600160a01b03191691909816179096556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015195810195909555610140810151600a8601556101600151600b90940193909355505050565b60005460ff16613834576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191681556001600160a01b03831681526009602090815260408083206002835281842033855290925290912061386e615d2e565b6001600160a01b0385166000908152600960205260409020544281900361389433614a50565b6101408501526101208401819052158015906138b35750610140830151155b613904576040805162461bcd60e51b815260206004820152601960248201527f63616e27742077697468647261772c2073686f727466616c6c00000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b15801561397957600080fd5b505afa15801561398d573d6000803e3d6000fd5b505050506040513d60208110156139a357600080fd5b50516040808501919091526001600160a01b03808916600090815260096020529190912060030154855491169063e14768ed906139df906151c8565b866001015486604001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015613a2b57600080fd5b505afa158015613a3f573d6000803e3d6000fd5b505050506040513d6020811015613a5557600080fd5b50516060840152613a6587613ee6565b60c0840152600019861415613aae57613a838784610120015161495d565b61018084018190526060840151613aa791613a9d916152bf565b8460c001516152bf565b8352613ab2565b8583525b825160c0840151613ac89163ffffffff61526e16565b60e084015282516060840151613ae39163ffffffff61526e16565b60808401528251613af5908890614fac565b61016084018190526101208401511015613b49576040805162461bcd60e51b815260206004820152601060248201526f1858d8dbdd5b9d081a5cc81cda1bdc9d60821b604482015290519081900360640190fd5b835460808401516004870154613b6a929161154a919063ffffffff61522016565b60a08401526001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613be457600080fd5b505afa158015613bf8573d6000803e3d6000fd5b505050506040513d6020811015613c0e57600080fd5b50516040808501919091526001600160a01b0380891660009081526009602052919091206003015460e085015191169063a1d7796790613c4d906151c8565b613c5a88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d6020811015613cbf57600080fd5b505160018601556001600160a01b038088166000908152600960209081526040918290206003810154600782015460029092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613d3b57600080fd5b505afa158015613d4f573d6000803e3d6000fd5b505050506040513d6020811015613d6557600080fd5b50516101008401526001600160a01b0380881660009081526009602052604090206003015460e0850151911690634fc5f9cc90613da1906151c8565b613dae88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613de957600080fd5b505afa158015613dfd573d6000803e3d6000fd5b505050506040513d6020811015613e1357600080fd5b5051600286015542855560a08301516004860155604083015160058601819055610100840151600787015584546020850152608084015185556001850155613e6c87613e5e30615454565b303387600001516000615457565b8251602080850151608080870151604080513381526001600160a01b038e169581019590955284810195909552606084019290925282015290517f3a0d99036aff524c10246e725551deede13cd5021ca17c7e974432fa11d0faab9181900360a00190a150506000805460ff191660011790555050505050565b60006001600160a01b038216613efd575047612a91565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015613f4657600080fd5b505afa158015613f5a573d6000803e3d6000fd5b505050506040513d6020811015613f7057600080fd5b50519392505050565b60005461010090046001600160a01b03163314613fcb576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b60005b600a5481101561401857816001600160a01b0316600a8281548110613fef57fe5b6000918252602090912001546001600160a01b031614156140105750614065565b600101613fce565b50600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0383161790555b50565b6000612a4d82612a488585612b2b565b600a5490565b6001600160a01b0385166000908152600960205260408120600a0154816140b3670de0b6b3a76400008363ffffffff61522016565b90506140c5868263ffffffff61583c16565b92506140d7838563ffffffff61583c16565b92506140e9838663ffffffff61589f16565b925061410383670de0b6b3a764000063ffffffff61589f16565b6001600160a01b0388166000908152600960205260409020600b0154909350614136908490600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909350614169908490600a0a63ffffffff61589f16565b98975050505050505050565b60005461010090046001600160a01b031633146141c7576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b0316331461423b576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600b0155565b600a54600090815b818110156142b457600061429785600a848154811061427d57fe5b6000918252602090912001546001600160a01b0316614068565b90506142a9848263ffffffff61522016565b935050600101614262565b5050919050565b6001600160a01b0385166000908152600960205260408120600a0154816142f0670de0b6b3a76400008363ffffffff61522016565b90506000614304858763ffffffff61583c16565b9050614332614325670de0b6b3a7640000612a82858b63ffffffff61583c16565b829063ffffffff61589f16565b6001600160a01b038a166000908152600960205260409020600b0154909450614365908590600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909450614398908590600a0a63ffffffff61589f16565b9998505050505050505050565b60005460ff166143ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055806001600160a01b038316614448573482146144415760405162461bcd60e51b8152600401808060200182810382526023815260200180615e186023913960400191505060405180910390fd5b503461449b565b341561449b576040805162461bcd60e51b815260206004820152601a60248201527f4574682073686f756c64206e6f742062652070726f7669646564000000000000604482015290519081900360640190fd5b6144a3615d96565b6001600160a01b03808516600090815260096020908152604080832060028352818420338552835292819020835460038501546005860154600187015485516396e973f560e01b8152600481019290925260248201524283900360448201819052945196979396929591909316926396e973f59260648083019392829003018186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d602081101561455c57600080fd5b505160208681019190915260038501546001600160a01b038a81166000908152600284526040808220338352909452929092205491169063e14768ed906145a2906151c8565b856001015488602001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156145ee57600080fd5b505afa158015614602573d6000803e3d6000fd5b505050506040513d602081101561461857600080fd5b505160408601819052614631908763ffffffff61522016565b60608601819052835460048601546146539261154a919063ffffffff61522016565b608086015261466188613ee6565b60a08601526001600160a01b03881661467e578460a00151614693565b60a0850151614693908763ffffffff61522016565b60c0860181905260038501546001600160a01b03169063a1d77967906146b8906151c8565b6146c587600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561470057600080fd5b505afa158015614714573d6000803e3d6000fd5b505050506040513d602081101561472a57600080fd5b50516001850155600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201849052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561479857600080fd5b505afa1580156147ac573d6000803e3d6000fd5b505050506040513d60208110156147c257600080fd5b505160e0860152600384015460c08601516001600160a01b0390911690634fc5f9cc906147ee906151c8565b6147fb87600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561483657600080fd5b505afa15801561484a573d6000803e3d6000fd5b505050506040513d602081101561486057600080fd5b5051600285015560e08501516007850155602085015160058501819055608086015160048601554285558354808752606087015185556001850191909155604086015111156148ca57845160408601516148c491612e4f919063ffffffff61526e16565b60028401555b6148d3336158fa565b6148ea8833306148e281615454565b8a6000615457565b8451606080870151604080513381526001600160a01b038d1660208201528082018b905292830193909352608082015290517f143bd853fff4531b869cc4385ac10699088f797a4b6fbdfe28577d7fd3fa3fa29181900360a00190a150506000805460ff19166001179055505050505050565b600b546000906001600160a01b03166149ae576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b6000806149ba85614e54565b915091508080156149ca57508115155b614a11576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a47908390612a82908790600a0a63ffffffff61583c16565b95945050505050565b600080600080614a5f8561308e565b909250905080821015614a8b576000614a7e828463ffffffff61526e16565b9094509250614aa9915050565b614a9b828263ffffffff61526e16565b935060009250614aa9915050565b915091565b60005461010090046001600160a01b03163314614b00576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314614b77576040805162461bcd60e51b81526020600482015260136024820152722737ba10383937b837b9b2b21030b236b4b71760691b604482015290519081900360640190fd5b6001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600080614bb68484612a38565b612aad8585612e77565b60005461010090046001600160a01b03163314614c12576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600a0155565b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b1580156128ac57600080fd5b60005461010090046001600160a01b03163314614d13576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b0390911660009081526009602081905260409091200155565b600b546001600160a01b031681565b60005461010090046001600160a01b03163314614d94576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020429055565b600a54600090815b818110156142b4576000614ded85600a8481548110614dd357fe5b6000918252602090912001546001600160a01b0316612cba565b9050614dff848263ffffffff61522016565b935050600101614db8565b60055481565b6001600160a01b038116600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787612e77565b9063ffffffff61583c16565b600b5460009081906001600160a01b0316614ea7576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b600b54604080516330af0bbf60e21b81526001600160a01b038681166004830152825193169263c2bc2efc92602480840193919291829003018186803b158015614ef057600080fd5b505afa158015614f04573d6000803e3d6000fd5b505050506040513d6040811015614f1a57600080fd5b5080516020909101519092509050915091565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a90046001600160a01b03169080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b670de0b6b3a764000081565b600b546000906001600160a01b0316614ffd576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b60008061500985614e54565b9150915080801561501957508115155b615060576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a4790600a0a612a82848763ffffffff61583c16565b6001600160a01b038216600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787614fac565b6006602052600090815260409020546001600160a01b031681565b6000806150f285614a50565b6001600160a01b0386166000908152600960208190526040822090810154600a909101549294509250615137670de0b6b3a764000061154a858563ffffffff61526e16565b9050614169615158670de0b6b3a7640000612a82898563ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154612a82908790600a0a63ffffffff61583c16565b60005461010090046001600160a01b031681565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60006001600160ff1b0382111561521c576040805162461bcd60e51b81526020600482015260136024820152721d5a5b9d081c881a5cc81b9bdd081d985b1a59606a1b604482015290519081900360640190fd5b5090565b600082820183811015612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e7420616464206f766572666c6f7760781b604482015290519081900360640190fd5b6000828211156152b9576040805162461bcd60e51b815260206004820152601160248201527075696e7420737562206f766572666c6f7760781b604482015290519081900360640190fd5b50900390565b6000818310156152d0575081612988565b5080612988565b60006001600160a01b0383166152f857506001600160a01b03811631612988565b604080516370a0823160e01b81526001600160a01b038481166004830152915185928316916370a08231916024808301926020929190829003018186803b15801561534257600080fd5b505afa158015615356573d6000803e3d6000fd5b505050506040513d602081101561536c57600080fd5b5051949350505050565b61537e615ddb565b506040805160e0810182526001600160a01b0397881681529587166020808801918252958816878301908152948816606088019081526080880194855260a088019384524260c089019081526005805460009081526004998a905294909420985189546001600160a01b0319908116918c16919091178a5592516001808b0180548616928d1692909217909155965160028a0180548516918c1691909117905590516003890180549093169916989098179055915193850193909355915183830155925160069092019190915580549091019055565b90565b816154a9576040805162461bcd60e51b815260206004820152601f60248201527f696e76616c696420736166655472616e7366657246726f6d20616d6f756e7400604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316141580156154d357506001600160a01b03861615155b156155a25760408051636eb1769f60e11b81526001600160a01b03878116600483015286811660248301529151849289169163dd62ed3e916044808301926020929190829003018186803b15801561552a57600080fd5b505afa15801561553e573d6000803e3d6000fd5b505050506040513d602081101561555457600080fd5b505110156155a2576040805162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015290519081900360640190fd5b6001600160a01b038616156156835781866001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561560857600080fd5b505afa15801561561c573d6000803e3d6000fd5b505050506040513d602081101561563257600080fd5b5051101561567e576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6156fc565b836001600160a01b0316856001600160a01b031614156156fc5781856001600160a01b03163110156156fc576040805162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74206574682062616c616e63650000000000000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316146157a3576001600160a01b038616156157445761573f6001600160a01b03871686858563ffffffff61596116565b61579e565b801580159061575257508181115b1561579e576001600160a01b0385166108fc615774838563ffffffff61526e16565b6040518115909202916000818181858888f1935050505015801561579c573d6000803e3d6000fd5b505b615834565b6001600160a01b038616156157cc5761579e6001600160a01b038716848463ffffffff6159c116565b80158015906157da57508181115b156157fc576001600160a01b0383166108fc615774838563ffffffff61526e16565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015615832573d6000803e3d6000fd5b505b505050505050565b60008261584b57506000612988565b8282028284828161585857fe5b0414612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e74206d756c206f766572666c6f7760781b604482015290519081900360640190fd5b6000816158e6576040805162461bcd60e51b815260206004820152601060248201526f75696e7420646976206279207a65726f60801b604482015290519081900360640190fd5b60008284816158f157fe5b04949350505050565b6001600160a01b0381166000908152600760205260409020546140655760088054600090815260066020908152604080832080546001600160a01b0387166001600160a01b0319909116811790915584549084526007909252909120819055600101905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526159bb908590615a18565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a13908490615a18565b505050565b615a2a826001600160a01b0316615b0e565b615a3357600080fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a715780518252601f199092019160209182019101615a52565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ad3576040519150601f19603f3d011682016040523d82523d6000602084013e615ad8565b606091505b509150915081615ae757600080fd5b8051156159bb57808060200190516020811015615b0357600080fd5b50516159bb57600080fd5b3b151590565b604051806103c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe4574682076616c75652073686f756c6420626520657175616c20746f20616d6f756e745265656e7472616e637947756172643a207265656e7472616e742063616c6c004574682076616c75652073686f756c6420626520657175616c20746f207265706179416d6f756e746f6e6c792061646d696e2063616e20646f20746869732100000000000000000063616e277420626f72726f772c20776974686f757420656e6f7567682076616c75654574682076616c75652073686f756c64206265206c6172676572207468616e207265706179416d6f756e74636c6f7365426f72726f77416d6f756e74203e206d6178436c6f736561626c65426f72726f77416d6f756e7420657272a265627a7a7231582092b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c62764736f6c634300050d0032

Deployed Bytecode

0x6080604052600436106103975760003560e01c80637701d0bd116101dc578063c5af0bab11610102578063e03368c1116100a0578063f2a40db81161006f578063f2a40db814610f5f578063f673e9ca14610f89578063f851a44014610fcc578063feb59ccf14610fe157610397565b8063e03368c114610ed8578063ea3a4c6014610ed8578063ed1d840d14610eed578063f0f8aff914610f2657610397565b8063d3339024116100dc578063d333902414610da2578063d7d9dba014610db7578063ddec280e14610df2578063de6843c314610e3e57610397565b8063c5af0bab14610d27578063c92fcfb314610d3c578063cb3db56314610d6f57610397565b8063a21accdc1161017a578063b7fc3ada11610149578063b7fc3ada14610c7a578063b8bb5c421461060e578063ba37773114610cb3578063bbde010214610cee57610397565b8063a21accdc14610bc4578063a637674614610bf7578063ad2cb23914610c2a578063b19322a614610c3f57610397565b8063841d0071116101b6578063841d007114610add5780638cd3b02214610b1057806391de89c614610b5f5780639c74acda14610b8b57610397565b80637701d0bd14610a225780637adbf97314610a715780637e67e5ce14610aa457610397565b806335b773cb116102c157806341ed3ad61161025f578063607b463a1161022e578063607b463a1461096c57806365dc4e3a1461099f5780636e04d137146109d25780636e2ede0314610a0d57610397565b806341ed3ad6146108315780634613f1271461087657806353131ab5146108ea5780636012481a1461093357610397565b80633e3ae88a1161029b5780633e3ae88a146107575780634100b9f01461079057806341b41316146107e957806341d6864e1461081c57610397565b806335b773cb146106a65780633c03d33e146106e15780633cb7317b1461071c57610397565b80631b6a935e116103395780632c7769b2116103085780632c7769b21461060e5780632db78d931461062357806332f751ec14610656578063332279b11461066b57610397565b80631b6a935e1461054857806326bc59fa1461057257806327001627146105c65780632986c0e5146105f957610397565b8063118e31b711610375578063118e31b71461043f578063172c48c71461048c57806317585b12146104d25780631925a7511461050d57610397565b80630cffc6761461039c5780630ddeb327146103da578063101828d114610406575b600080fd5b6103d8600480360360808110156103b257600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561101c565b005b6103d8600480360360408110156103f057600080fd5b506001600160a01b038135169060200135611c69565b34801561041257600080fd5b506103d86004803603604081101561042957600080fd5b506001600160a01b038135169060200135612250565b34801561044b57600080fd5b5061047a6004803603604081101561046257600080fd5b506001600160a01b038135811691602001351661281b565b60408051918252519081900360200190f35b34801561049857600080fd5b506104b6600480360360208110156104af57600080fd5b503561298e565b604080516001600160a01b039092168252519081900360200190f35b3480156104de57600080fd5b506103d8600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166129b5565b34801561051957600080fd5b5061047a6004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516612a38565b34801561055457600080fd5b5061047a6004803603602081101561056b57600080fd5b5035612a54565b34801561057e57600080fd5b506105ad6004803603604081101561059557600080fd5b506001600160a01b0381358116916020013516612a96565b6040805192835260208301919091528051918290030190f35b3480156105d257600080fd5b5061047a600480360360208110156105e957600080fd5b50356001600160a01b0316612ab8565b34801561060557600080fd5b5061047a612aff565b34801561061a57600080fd5b5061047a612b05565b34801561062f57600080fd5b5061047a6004803603602081101561064657600080fd5b50356001600160a01b0316612b0a565b34801561066257600080fd5b506104b6612b1c565b34801561067757600080fd5b5061047a6004803603604081101561068e57600080fd5b506001600160a01b0381358116916020013516612b2b565b3480156106b257600080fd5b5061047a600480360360408110156106c957600080fd5b506001600160a01b0381358116916020013516612cba565b3480156106ed57600080fd5b5061047a6004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516612cc6565b34801561072857600080fd5b5061047a6004803603604081101561073f57600080fd5b506001600160a01b0381358116916020013516612e77565b34801561076357600080fd5b506103d86004803603604081101561077a57600080fd5b506001600160a01b038135169060200135612e87565b34801561079c57600080fd5b506107cb600480360360408110156107b357600080fd5b506001600160a01b0381358116916020013516613066565b60408051938452602084019290925282820152519081900360600190f35b3480156107f557600080fd5b506105ad6004803603602081101561080c57600080fd5b50356001600160a01b031661308e565b34801561082857600080fd5b5061047a613108565b34801561083d57600080fd5b5061047a6004803603606081101561085457600080fd5b506001600160a01b038135811691602081013582169160409091013516613113565b34801561088257600080fd5b506108a06004803603602081101561089957600080fd5b503561357f565b604080516001600160a01b039889168152968816602088015294871686860152929095166060850152608084015260a083019390935260c082019290925290519081900360e00190f35b3480156108f657600080fd5b506103d86004803603608081101561090d57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356135ce565b34801561093f57600080fd5b506103d86004803603604081101561095657600080fd5b506001600160a01b0381351690602001356137ef565b34801561097857600080fd5b5061047a6004803603602081101561098f57600080fd5b50356001600160a01b0316613ee6565b3480156109ab57600080fd5b506103d8600480360360208110156109c257600080fd5b50356001600160a01b0316613f79565b3480156109de57600080fd5b5061047a600480360360408110156109f557600080fd5b506001600160a01b0381358116916020013516614068565b348015610a1957600080fd5b5061047a614078565b348015610a2e57600080fd5b5061047a600480360360a0811015610a4557600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561407e565b348015610a7d57600080fd5b506103d860048036036020811015610a9457600080fd5b50356001600160a01b0316614175565b348015610ab057600080fd5b506103d860048036036040811015610ac757600080fd5b506001600160a01b0381351690602001356141e9565b348015610ae957600080fd5b5061047a60048036036020811015610b0057600080fd5b50356001600160a01b031661425a565b348015610b1c57600080fd5b5061047a600480360360a0811015610b3357600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356142bb565b6103d860048036036040811015610b7557600080fd5b506001600160a01b0381351690602001356143a5565b348015610b9757600080fd5b5061047a60048036036040811015610bae57600080fd5b506001600160a01b03813516906020013561495d565b348015610bd057600080fd5b506105ad60048036036020811015610be757600080fd5b50356001600160a01b0316614a50565b348015610c0357600080fd5b506103d860048036036020811015610c1a57600080fd5b50356001600160a01b0316614aae565b348015610c3657600080fd5b506103d8614b22565b348015610c4b57600080fd5b506105ad60048036036040811015610c6257600080fd5b506001600160a01b0381358116916020013516614ba9565b348015610c8657600080fd5b506103d860048036036040811015610c9d57600080fd5b506001600160a01b038135169060200135614bc0565b348015610cbf57600080fd5b5061047a60048036036040811015610cd657600080fd5b506001600160a01b0381358116916020013516614c31565b348015610cfa57600080fd5b506103d860048036036040811015610d1157600080fd5b506001600160a01b038135169060200135614cc1565b348015610d3357600080fd5b506104b6614d33565b348015610d4857600080fd5b506103d860048036036020811015610d5f57600080fd5b50356001600160a01b0316614d42565b348015610d7b57600080fd5b5061047a60048036036020811015610d9257600080fd5b50356001600160a01b0316614db0565b348015610dae57600080fd5b5061047a614e0a565b348015610dc357600080fd5b5061047a60048036036040811015610dda57600080fd5b506001600160a01b0381358116916020013516614e10565b348015610dfe57600080fd5b50610e2560048036036020811015610e1557600080fd5b50356001600160a01b0316614e54565b6040805192835290151560208301528051918290030190f35b348015610e4a57600080fd5b50610e7160048036036020811015610e6157600080fd5b50356001600160a01b0316614f2d565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b348015610ee457600080fd5b5061047a614fa0565b348015610ef957600080fd5b5061047a60048036036040811015610f1057600080fd5b506001600160a01b038135169060200135614fac565b348015610f3257600080fd5b5061047a60048036036040811015610f4957600080fd5b506001600160a01b038135169060200135615093565b348015610f6b57600080fd5b506104b660048036036020811015610f8257600080fd5b50356150cb565b348015610f9557600080fd5b5061047a60048036036060811015610fac57600080fd5b506001600160a01b038135811691602081013590911690604001356150e6565b348015610fd857600080fd5b506104b6615188565b348015610fed57600080fd5b506107cb6004803603604081101561100457600080fd5b506001600160a01b038135811691602001351661519c565b60005460ff16611061576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055336001600160a01b03851614156110c0576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b6110c8615b14565b6001600160a01b03808616808352858216602080850182905233604080870191825288861660608801819052600085815260098552828120805483835284832097835260038752848320898452875284832084845260028089528685209a85528a89528685209585528852955190991682529690945290832042969096039591929091906111558a614e54565b6103808a01919091529050806111b2576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6111bb8b614e54565b6103a08a0191909152905080611218576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b600386015460078701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d60208110156112a957600080fd5b50516080890152600386015484546001600160a01b039091169063e14768ed906112d2906151c8565b86600101548b608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b5051610100890152600385015460058601546001870154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b505160e0890152600385015483546001600160a01b039091169063e14768ed9061140a906151c8565b85600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50516101c0890152600385015482546001600160a01b039091169063e14768ed906114aa906151c8565b84600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161020089015282546101c08901516004870154611556929161154a919063ffffffff61522016565b9063ffffffff61526e16565b610240890181905282546102008a01516115799261154a9163ffffffff61522016565b6102408901526103a08801516103808901516101c08a015161159e928e928e926142bb565b6103008901526103a08801516115b7908d908d906150e6565b6102e08901526101008801516103008901516115e1916115d6916152bf565b896102e001516152bf565b6103208901526000198914156116025761032088015161034089015261160b565b61034088018990525b87610320015188610340015111156116545760405162461bcd60e51b8152600401808060200182810382526030815260200180615ef06030913960400191505060405180910390fd5b6001600160a01b038b166116b2578761034001513410156116ad576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b611710565b8761034001516116c68c8a604001516152d7565b1015611710576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61172c8b8b8a6103a001518b61038001518c610340015161407e565b61036089015261034088015161010089015161174d9163ffffffff61526e16565b6101208901819052845460068801546117709261154a919063ffffffff61522016565b61014089015261177f8b613ee6565b6102608901526001600160a01b038b1661179e578761026001516117b9565b6103408801516102608901516117b99163ffffffff61522016565b610280890152600386015460058701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505160a089015260038601546102808901516101408a01516040805163a1d7796760e01b815260048101939093526024830191909152516001600160a01b039092169163a1d7796791604480820192602092909190829003018186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d60208110156118e357600080fd5b5051600187015560038601546102808901516101408a0151604080516313f17e7360e21b815260048101939093526024830191909152516001600160a01b0390921691634fc5f9cc91604480820192602092909190829003018186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516002808801919091556003860154600587015491870154604080516396e973f560e01b815260048101949094526024840191909152604483018a9052516001600160a01b03909116916396e973f5916064808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b505160c08901526103608801516101c0890151611a329163ffffffff61526e16565b6101e0890152610360880151610200890151611a539163ffffffff61522016565b8861022001818152505042866000018190555087610140015186600601819055508760a0015186600501819055508760800151866007018190555042856000018190555087610240015185600401819055508760e0015185600501819055508760c001518560070181905550836000015488610160018181525050876101200151846000018190555087608001518460010181905550826000015488610180018181525050876101e0015183600001819055508760e0015183600101819055508160000154886101a001818152505087610220015182600001819055508760e001518260010181905550611b61886000015189604001518a606001518e8c61036001518d6103400151615376565b611b918b611b7b8a604001516001600160a01b0316615454565b30611b8581615454565b8c610340015134615457565b7f564b05ce5b1718b3406f5483d56f1b9609a9aab4603bdaeba9c415e0b38b039e88600001518c8a61012001518b604001518c606001518d6101e0015160405180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001965050505050505060405180910390a150506000805460ff1916600117905550505050505050505050565b60005460ff16611cae576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055611cc0615c17565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed90611db7906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015611dff57600080fd5b505afa158015611e13573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b50516020870152600019871415611eab57611e51611e4789336152d7565b87602001516152bf565b60408701526001600160a01b038816611ea65785604001513411611ea65760405162461bcd60e51b815260040180806020018281038252602b815260200180615ec5602b913960400191505060405180910390fd5b611f02565b604086018790526001600160a01b038816611f025785604001513414611f025760405162461bcd60e51b8152600401808060200182810382526028815260200180615e5b6028913960400191505060405180910390fd5b60408601516020870151611f1b9163ffffffff61526e16565b6060870181905284546006870154611f3d9261154a919063ffffffff61522016565b6080870152611f4b88613ee6565b60a08701526001600160a01b038816611f68578560a00151611f81565b604086015160a0870151611f819163ffffffff61522016565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d602081101561202557600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612060906151c8565b61206d89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc9061210d906151c8565b61211a89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556121d48833306121c981615454565b8a6040015134615457565b6040808701516101008801516060808a015184513381526001600160a01b038e1660208201528086019490945290830191909152608082015290517f95536f77ac48f30901e02b7e98147d28fa621a9296283b46afa87ea9f994290d9181900360a00190a150506000805460ff19166001179055505050505050565b60005460ff16612295576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191690556122a7615c63565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed9061239e906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156123e657600080fd5b505afa1580156123fa573d6000803e3d6000fd5b505050506040513d602081101561241057600080fd5b5051602087015261242087612a54565b60408701819052602087015161243b9163ffffffff61522016565b606087018190528454600687015461245d9261154a919063ffffffff61522016565b608087015261246b33614a50565b61014088015261012087018190521580159061248a5750610140860151155b6124db576040805162461bcd60e51b815260206004820152601760248201527f63616e277420626f72726f772c2073686f727466616c6c000000000000000000604482015290519081900360640190fd5b6124e9888760400151615093565b610160870181905261012087015110156125345760405162461bcd60e51b8152600401808060200182810382526022815260200180615ea36022913960400191505060405180910390fd5b61253d88613ee6565b60a08701819052612554908863ffffffff61526e16565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b1580156125ce57600080fd5b505afa1580156125e2573d6000803e3d6000fd5b505050506040513d60208110156125f857600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612633906151c8565b61264089608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561267b57600080fd5b505afa15801561268f573d6000803e3d6000fd5b505050506040513d60208110156126a557600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc906126e0906151c8565b6126ed89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d602081101561275257600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556127a48861279a30615454565b30338b6000615457565b610100860151606080880151604080513381526001600160a01b038d1660208201528082018c905292830193909352608082015290517fccf497a6d8ab6e2d0cd3345e3f91702b378c9ba26a707adc43e47ec8ceccacbd9181900360a00190a150506000805460ff19166001179055505050505050565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b1580156128ac57600080fd5b505afa1580156128c0573d6000803e3d6000fd5b505050506040513d60208110156128d657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed9061290e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d602081101561298057600080fd5b505193505050505b92915050565b600a818154811061299b57fe5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b03163314612a07576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260096020526040902060030180546001600160a01b03191691909216179055565b6000612a4d82612a488585614c31565b614fac565b9392505050565b6000612a8e670de0b6b3a7640000612a82612a75828563ffffffff61522016565b859063ffffffff61583c16565b9063ffffffff61589f16565b90505b919050565b600080612aa38484612a38565b612aad8585614e10565b915091509250929050565b6001600160a01b03811660009081526009602052604081206006810154600490910154612af781612a8284670de0b6b3a764000063ffffffff61583c16565b949350505050565b60085481565b600081565b60076020526000908152604090205481565b6001546001600160a01b031681565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612c1e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612c6657600080fd5b505afa158015612c7a573d6000803e3d6000fd5b505050506040513d6020811015612c9057600080fd5b505183546002850154919250612cb09161154a908463ffffffff61522016565b9695505050505050565b6000612a4d82612a4885855b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b158015612d5657600080fd5b505afa158015612d6a573d6000803e3d6000fd5b505050506040513d6020811015612d8057600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612db8906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612e0057600080fd5b505afa158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b50518354909150811115612e6a578254612e6090612e4f90839063ffffffff61526e16565b60028501549063ffffffff61522016565b9350505050612988565b5050600201549050612988565b6000612a4d82612a48858561281b565b60005460ff16612ecc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169081905561010090046001600160a01b03163314612f27576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6000612f3283613ee6565b6001600160a01b038416600090815260096020526040812060048101546006909101549293509091612f70919061154a90859063ffffffff61522016565b905082811015612fc7576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e742065717569747920616d6f756e74000000000000604482015290519081900360640190fd5b612ff884612fd430615454565b6000543090612ff09061010090046001600160a01b0316615454565b876000615457565b600054604080516001600160a01b03808816825260208201859052818301879052610100909304929092166060830152517ff436439e28c1812ec03906f344bbce09c25881eae35d800d55585265cc9d7c8b9181900360800190a150506000805460ff191660011790555050565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b600a546000908190815b81811015613101576000806130ce87600a85815481106130b457fe5b6000918252602090912001546001600160a01b0316612a96565b90925090506130e3868363ffffffff61522016565b95506130f5858263ffffffff61522016565b94505050600101613098565b5050915091565b6001600160ff1b0381565b6000336001600160a01b038516141561316a576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b613172615b14565b6001600160a01b038085166000818152600960209081526040808320805489871680865283862096865260038086528487208e8a1680895290875285882092885260028752858820908852865295849020958701546005880154600189015486516396e973f560e01b81526004810192909252602482015242939093036044840181905294519498939796919591949316926396e973f5926064808201939291829003018186803b15801561322657600080fd5b505afa15801561323a573d6000803e3d6000fd5b505050506040513d602081101561325057600080fd5b505160e0870152600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201889052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156132be57600080fd5b505afa1580156132d2573d6000803e3d6000fd5b505050506040513d60208110156132e857600080fd5b50516080870152600383015481546001600160a01b039091169063e14768ed90613311906151c8565b83600101548960e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d602081101561338757600080fd5b50516101c0870152600384015482546001600160a01b039091169063e14768ed906133b1906151c8565b846001015489608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156133fd57600080fd5b505afa158015613411573d6000803e3d6000fd5b505050506040513d602081101561342757600080fd5b5051610100870152600061343a89614e54565b610380890191909152905080613497576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6134a08a614e54565b6103a08901919091529050806134fd576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b6135198a8a896103a001518a61038001518b6101c001516142bb565b6103008801526103a0870151613532908c908c906150e6565b6102e088015261010087015161030088015161354e91906152bf565b61032088018190526102e088015161356691906152bf565b6103209097018790525094955050505050509392505050565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b039485169693851695928516949093169290919087565b60005461010090046001600160a01b03163314613620576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b546001600160a01b03166136395761363982614175565b613641615cc4565b506001600160a01b038085166000908152600960208181526040928390208351610180810185528154815260018201549281019290925260028101549382019390935260038301549093166060840181905260048301546080850152600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015290820154610120840152600a820154610140840152600b909101546101608301526136f5576136f585856129b5565b6136fe85613f79565b60a081015161371657670de0b6b3a764000060a08201525b60e081015161372e57670de0b6b3a764000060e08201525b6101608101516137415761016081018290525b6001600160a01b039485166000908152600960208181526040928390208451815590840151600182015591830151600283015560608301516003830180546001600160a01b03191691909816179096556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015195810195909555610140810151600a8601556101600151600b90940193909355505050565b60005460ff16613834576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191681556001600160a01b03831681526009602090815260408083206002835281842033855290925290912061386e615d2e565b6001600160a01b0385166000908152600960205260409020544281900361389433614a50565b6101408501526101208401819052158015906138b35750610140830151155b613904576040805162461bcd60e51b815260206004820152601960248201527f63616e27742077697468647261772c2073686f727466616c6c00000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b15801561397957600080fd5b505afa15801561398d573d6000803e3d6000fd5b505050506040513d60208110156139a357600080fd5b50516040808501919091526001600160a01b03808916600090815260096020529190912060030154855491169063e14768ed906139df906151c8565b866001015486604001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015613a2b57600080fd5b505afa158015613a3f573d6000803e3d6000fd5b505050506040513d6020811015613a5557600080fd5b50516060840152613a6587613ee6565b60c0840152600019861415613aae57613a838784610120015161495d565b61018084018190526060840151613aa791613a9d916152bf565b8460c001516152bf565b8352613ab2565b8583525b825160c0840151613ac89163ffffffff61526e16565b60e084015282516060840151613ae39163ffffffff61526e16565b60808401528251613af5908890614fac565b61016084018190526101208401511015613b49576040805162461bcd60e51b815260206004820152601060248201526f1858d8dbdd5b9d081a5cc81cda1bdc9d60821b604482015290519081900360640190fd5b835460808401516004870154613b6a929161154a919063ffffffff61522016565b60a08401526001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613be457600080fd5b505afa158015613bf8573d6000803e3d6000fd5b505050506040513d6020811015613c0e57600080fd5b50516040808501919091526001600160a01b0380891660009081526009602052919091206003015460e085015191169063a1d7796790613c4d906151c8565b613c5a88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d6020811015613cbf57600080fd5b505160018601556001600160a01b038088166000908152600960209081526040918290206003810154600782015460029092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613d3b57600080fd5b505afa158015613d4f573d6000803e3d6000fd5b505050506040513d6020811015613d6557600080fd5b50516101008401526001600160a01b0380881660009081526009602052604090206003015460e0850151911690634fc5f9cc90613da1906151c8565b613dae88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613de957600080fd5b505afa158015613dfd573d6000803e3d6000fd5b505050506040513d6020811015613e1357600080fd5b5051600286015542855560a08301516004860155604083015160058601819055610100840151600787015584546020850152608084015185556001850155613e6c87613e5e30615454565b303387600001516000615457565b8251602080850151608080870151604080513381526001600160a01b038e169581019590955284810195909552606084019290925282015290517f3a0d99036aff524c10246e725551deede13cd5021ca17c7e974432fa11d0faab9181900360a00190a150506000805460ff191660011790555050505050565b60006001600160a01b038216613efd575047612a91565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015613f4657600080fd5b505afa158015613f5a573d6000803e3d6000fd5b505050506040513d6020811015613f7057600080fd5b50519392505050565b60005461010090046001600160a01b03163314613fcb576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b60005b600a5481101561401857816001600160a01b0316600a8281548110613fef57fe5b6000918252602090912001546001600160a01b031614156140105750614065565b600101613fce565b50600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0383161790555b50565b6000612a4d82612a488585612b2b565b600a5490565b6001600160a01b0385166000908152600960205260408120600a0154816140b3670de0b6b3a76400008363ffffffff61522016565b90506140c5868263ffffffff61583c16565b92506140d7838563ffffffff61583c16565b92506140e9838663ffffffff61589f16565b925061410383670de0b6b3a764000063ffffffff61589f16565b6001600160a01b0388166000908152600960205260409020600b0154909350614136908490600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909350614169908490600a0a63ffffffff61589f16565b98975050505050505050565b60005461010090046001600160a01b031633146141c7576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b0316331461423b576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600b0155565b600a54600090815b818110156142b457600061429785600a848154811061427d57fe5b6000918252602090912001546001600160a01b0316614068565b90506142a9848263ffffffff61522016565b935050600101614262565b5050919050565b6001600160a01b0385166000908152600960205260408120600a0154816142f0670de0b6b3a76400008363ffffffff61522016565b90506000614304858763ffffffff61583c16565b9050614332614325670de0b6b3a7640000612a82858b63ffffffff61583c16565b829063ffffffff61589f16565b6001600160a01b038a166000908152600960205260409020600b0154909450614365908590600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909450614398908590600a0a63ffffffff61589f16565b9998505050505050505050565b60005460ff166143ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055806001600160a01b038316614448573482146144415760405162461bcd60e51b8152600401808060200182810382526023815260200180615e186023913960400191505060405180910390fd5b503461449b565b341561449b576040805162461bcd60e51b815260206004820152601a60248201527f4574682073686f756c64206e6f742062652070726f7669646564000000000000604482015290519081900360640190fd5b6144a3615d96565b6001600160a01b03808516600090815260096020908152604080832060028352818420338552835292819020835460038501546005860154600187015485516396e973f560e01b8152600481019290925260248201524283900360448201819052945196979396929591909316926396e973f59260648083019392829003018186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d602081101561455c57600080fd5b505160208681019190915260038501546001600160a01b038a81166000908152600284526040808220338352909452929092205491169063e14768ed906145a2906151c8565b856001015488602001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156145ee57600080fd5b505afa158015614602573d6000803e3d6000fd5b505050506040513d602081101561461857600080fd5b505160408601819052614631908763ffffffff61522016565b60608601819052835460048601546146539261154a919063ffffffff61522016565b608086015261466188613ee6565b60a08601526001600160a01b03881661467e578460a00151614693565b60a0850151614693908763ffffffff61522016565b60c0860181905260038501546001600160a01b03169063a1d77967906146b8906151c8565b6146c587600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561470057600080fd5b505afa158015614714573d6000803e3d6000fd5b505050506040513d602081101561472a57600080fd5b50516001850155600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201849052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561479857600080fd5b505afa1580156147ac573d6000803e3d6000fd5b505050506040513d60208110156147c257600080fd5b505160e0860152600384015460c08601516001600160a01b0390911690634fc5f9cc906147ee906151c8565b6147fb87600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561483657600080fd5b505afa15801561484a573d6000803e3d6000fd5b505050506040513d602081101561486057600080fd5b5051600285015560e08501516007850155602085015160058501819055608086015160048601554285558354808752606087015185556001850191909155604086015111156148ca57845160408601516148c491612e4f919063ffffffff61526e16565b60028401555b6148d3336158fa565b6148ea8833306148e281615454565b8a6000615457565b8451606080870151604080513381526001600160a01b038d1660208201528082018b905292830193909352608082015290517f143bd853fff4531b869cc4385ac10699088f797a4b6fbdfe28577d7fd3fa3fa29181900360a00190a150506000805460ff19166001179055505050505050565b600b546000906001600160a01b03166149ae576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b6000806149ba85614e54565b915091508080156149ca57508115155b614a11576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a47908390612a82908790600a0a63ffffffff61583c16565b95945050505050565b600080600080614a5f8561308e565b909250905080821015614a8b576000614a7e828463ffffffff61526e16565b9094509250614aa9915050565b614a9b828263ffffffff61526e16565b935060009250614aa9915050565b915091565b60005461010090046001600160a01b03163314614b00576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314614b77576040805162461bcd60e51b81526020600482015260136024820152722737ba10383937b837b9b2b21030b236b4b71760691b604482015290519081900360640190fd5b6001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600080614bb68484612a38565b612aad8585612e77565b60005461010090046001600160a01b03163314614c12576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600a0155565b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b1580156128ac57600080fd5b60005461010090046001600160a01b03163314614d13576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b0390911660009081526009602081905260409091200155565b600b546001600160a01b031681565b60005461010090046001600160a01b03163314614d94576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020429055565b600a54600090815b818110156142b4576000614ded85600a8481548110614dd357fe5b6000918252602090912001546001600160a01b0316612cba565b9050614dff848263ffffffff61522016565b935050600101614db8565b60055481565b6001600160a01b038116600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787612e77565b9063ffffffff61583c16565b600b5460009081906001600160a01b0316614ea7576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b600b54604080516330af0bbf60e21b81526001600160a01b038681166004830152825193169263c2bc2efc92602480840193919291829003018186803b158015614ef057600080fd5b505afa158015614f04573d6000803e3d6000fd5b505050506040513d6040811015614f1a57600080fd5b5080516020909101519092509050915091565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a90046001600160a01b03169080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b670de0b6b3a764000081565b600b546000906001600160a01b0316614ffd576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b60008061500985614e54565b9150915080801561501957508115155b615060576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a4790600a0a612a82848763ffffffff61583c16565b6001600160a01b038216600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787614fac565b6006602052600090815260409020546001600160a01b031681565b6000806150f285614a50565b6001600160a01b0386166000908152600960208190526040822090810154600a909101549294509250615137670de0b6b3a764000061154a858563ffffffff61526e16565b9050614169615158670de0b6b3a7640000612a82898563ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154612a82908790600a0a63ffffffff61583c16565b60005461010090046001600160a01b031681565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60006001600160ff1b0382111561521c576040805162461bcd60e51b81526020600482015260136024820152721d5a5b9d081c881a5cc81b9bdd081d985b1a59606a1b604482015290519081900360640190fd5b5090565b600082820183811015612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e7420616464206f766572666c6f7760781b604482015290519081900360640190fd5b6000828211156152b9576040805162461bcd60e51b815260206004820152601160248201527075696e7420737562206f766572666c6f7760781b604482015290519081900360640190fd5b50900390565b6000818310156152d0575081612988565b5080612988565b60006001600160a01b0383166152f857506001600160a01b03811631612988565b604080516370a0823160e01b81526001600160a01b038481166004830152915185928316916370a08231916024808301926020929190829003018186803b15801561534257600080fd5b505afa158015615356573d6000803e3d6000fd5b505050506040513d602081101561536c57600080fd5b5051949350505050565b61537e615ddb565b506040805160e0810182526001600160a01b0397881681529587166020808801918252958816878301908152948816606088019081526080880194855260a088019384524260c089019081526005805460009081526004998a905294909420985189546001600160a01b0319908116918c16919091178a5592516001808b0180548616928d1692909217909155965160028a0180548516918c1691909117905590516003890180549093169916989098179055915193850193909355915183830155925160069092019190915580549091019055565b90565b816154a9576040805162461bcd60e51b815260206004820152601f60248201527f696e76616c696420736166655472616e7366657246726f6d20616d6f756e7400604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316141580156154d357506001600160a01b03861615155b156155a25760408051636eb1769f60e11b81526001600160a01b03878116600483015286811660248301529151849289169163dd62ed3e916044808301926020929190829003018186803b15801561552a57600080fd5b505afa15801561553e573d6000803e3d6000fd5b505050506040513d602081101561555457600080fd5b505110156155a2576040805162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015290519081900360640190fd5b6001600160a01b038616156156835781866001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561560857600080fd5b505afa15801561561c573d6000803e3d6000fd5b505050506040513d602081101561563257600080fd5b5051101561567e576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6156fc565b836001600160a01b0316856001600160a01b031614156156fc5781856001600160a01b03163110156156fc576040805162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74206574682062616c616e63650000000000000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316146157a3576001600160a01b038616156157445761573f6001600160a01b03871686858563ffffffff61596116565b61579e565b801580159061575257508181115b1561579e576001600160a01b0385166108fc615774838563ffffffff61526e16565b6040518115909202916000818181858888f1935050505015801561579c573d6000803e3d6000fd5b505b615834565b6001600160a01b038616156157cc5761579e6001600160a01b038716848463ffffffff6159c116565b80158015906157da57508181115b156157fc576001600160a01b0383166108fc615774838563ffffffff61526e16565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015615832573d6000803e3d6000fd5b505b505050505050565b60008261584b57506000612988565b8282028284828161585857fe5b0414612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e74206d756c206f766572666c6f7760781b604482015290519081900360640190fd5b6000816158e6576040805162461bcd60e51b815260206004820152601060248201526f75696e7420646976206279207a65726f60801b604482015290519081900360640190fd5b60008284816158f157fe5b04949350505050565b6001600160a01b0381166000908152600760205260409020546140655760088054600090815260066020908152604080832080546001600160a01b0387166001600160a01b0319909116811790915584549084526007909252909120819055600101905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526159bb908590615a18565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a13908490615a18565b505050565b615a2a826001600160a01b0316615b0e565b615a3357600080fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a715780518252601f199092019160209182019101615a52565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ad3576040519150601f19603f3d011682016040523d82523d6000602084013e615ad8565b606091505b509150915081615ae757600080fd5b8051156159bb57808060200190516020811015615b0357600080fd5b50516159bb57600080fd5b3b151590565b604051806103c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe4574682076616c75652073686f756c6420626520657175616c20746f20616d6f756e745265656e7472616e637947756172643a207265656e7472616e742063616c6c004574682076616c75652073686f756c6420626520657175616c20746f207265706179416d6f756e746f6e6c792061646d696e2063616e20646f20746869732100000000000000000063616e277420626f72726f772c20776974686f757420656e6f7567682076616c75654574682076616c75652073686f756c64206265206c6172676572207468616e207265706179416d6f756e74636c6f7365426f72726f77416d6f756e74203e206d6178436c6f736561626c65426f72726f77416d6f756e7420657272a265627a7a7231582092b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c62764736f6c634300050d0032

Deployed Bytecode Sourcemap

10560:57953:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54306:11252;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;54306:11252:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41135:3967;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41135:3967:0;;;;;;;;:::i;37594:3519::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37594:3519:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37594:3519:0;;;;;;;;:::i;23037:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23037:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23037:663:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14736:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14736:33:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14736:33:0;;:::i;:::-;;;;-1:-1:-1;;;;;14736:33:0;;;;;;;;;;;;;;15502:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15502:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15502:127:0;;;;;;;;;;:::i;21156:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21156:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21156:182:0;;;;;;;;;;:::i;36613:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36613:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36613:191:0;;:::i;25949:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25949:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25949:251:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19994:267;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19994:267:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19994:267:0;-1:-1:-1;;;;;19994:267:0;;:::i;13494:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13494:24:0;;;:::i;14889:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14889:49:0;;;:::i;13445:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13445:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13445:42:0;-1:-1:-1;;;;;13445:42:0;;:::i;10879:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10879:28:0;;;:::i;23898:751::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23898:751:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23898:751:0;;;;;;;;;;:::i;22375:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22375:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22375:174:0;;;;;;;;;;:::i;21400:900::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21400:900:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21400:900:0;;;;;;;;;;:::i;23708:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23708:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23708:182:0;;;;;;;;;;:::i;67928:582::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67928:582:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67928:582:0;;;;;;;;:::i;12031:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12031:81:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12031:81:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26272:621;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26272:621:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26272:621:0;-1:-1:-1;;;;;26272:621:0;;:::i;10715:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10715:108:0;;;:::i;51117:3163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51117:3163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51117:3163:0;;;;;;;;;;;;;;;;;;;:::i;12678:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12678:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12678:57:0;;:::i;:::-;;;;-1:-1:-1;;;;;12678:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15977:724;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15977:724:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15977:724:0;;;;;;;;;;;;;;;;;;;;;;:::i;31806:4243::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31806:4243:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31806:4243:0;;;;;;;;:::i;19285:277::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19285:277:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19285:277:0;-1:-1:-1;;;;;19285:277:0;;:::i;15094:273::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15094:273:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15094:273:0;-1:-1:-1;;;;;15094:273:0;;:::i;24657:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24657:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24657:174:0;;;;;;;;;;:::i;15375:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15375:119:0;;;:::i;47476:765::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47476:765:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;47476:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17723:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17723:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17723:103:0;-1:-1:-1;;;;;17723:103:0;;:::i;17600:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17600:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17600:115:0;;;;;;;;:::i;24888:384::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24888:384:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24888:384:0;-1:-1:-1;;;;;24888:384:0;;:::i;46232:872::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46232:872:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;46232:872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27772:3533::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27772:3533:0;;;;;;;;:::i;18859:372::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18859:372:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18859:372:0;;;;;;;;:::i;26901:550::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26901:550:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26901:550:0;-1:-1:-1;;;;;26901:550:0;;:::i;17126:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17126:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17126:101:0;-1:-1:-1;;;;;17126:101:0;;:::i;17235:187::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17235:187:0;;;:::i;25670:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25670:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25670:211:0;;;;;;;;;;:::i;15795:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15795:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15795:174:0;;;;;;;;:::i;20421:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20421:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20421:663:0;;;;;;;;;;:::i;15637:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15637:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15637:150:0;;;;;;;;:::i;14791:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14791:29:0;;;:::i;17474:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17474:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17474:118:0;-1:-1:-1;;;;;17474:118:0;;:::i;22608:328::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22608:328:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22608:328:0;-1:-1:-1;;;;;22608:328:0;;:::i;12742:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12742:31:0;;;:::i;25366:236::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25366:236:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25366:236:0;;;;;;;;;;:::i;17988:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17988:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17988:222:0;-1:-1:-1;;;;;17988:222:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14668:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14668:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14668:38:0;-1:-1:-1;;;;;14668:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14829:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14829:53:0;;;:::i;18419:390::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18419:390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18419:390:0;;;;;;;;:::i;36851:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36851:266:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36851:266:0;;;;;;;;:::i;13395:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13395:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13395:43:0;;:::i;45213:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45213:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45213:663:0;;;;;;;;;;;;;;;;;:::i;10832:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10832:20:0;;;:::i;12165:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12165:81:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12165:81:0;;;;;;;;;;:::i;54306:11252::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;54526:10;-1:-1:-1;;;;;54526:27:0;;;;54518:60;;;;;-1:-1:-1;;;54518:60:0;;;;;;;;;;;;-1:-1:-1;;;54518:60:0;;;;;;;;;;;;;;;54589:22;;:::i;:::-;-1:-1:-1;;;;;54798:33:0;;;;;;54842:29;;;:15;;;;:29;;;54899:10;54882:14;;;;:27;;;54920:37;;;:19;;;:37;;;54798:17;54997;;;:4;:17;;;;;:36;;55138:21;;;;;;55291:34;;;:21;:34;;;;;:49;;;;;;;;55416:38;;;:21;:38;;;;;;:53;;;;;;;;;55620:38;;;;;55659:14;;55620:54;;;;;;;;;;;;54991:3;:42;;;;;55291:49;;55416:53;;55620:54;55733:32;54942:15;55733;:32::i;:::-;55706:19;;;55705:60;;;;;-1:-1:-1;55705:60:0;55776:42;;;;;-1:-1:-1;;;55776:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55864:28;55880:11;55864:15;:28::i;:::-;55832:24;;;55831:61;;;;;-1:-1:-1;55831:61:0;55903:47;;;;;-1:-1:-1;;;55903:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56090:16;;;;56137:24;;;;56181:23;;;;56090:166;;;-1:-1:-1;;;56090:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56090:16:0;;;;:21;;:166;;;;;;;;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;56090:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56090:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56090:166:0;56031:34;;;:236;56349:16;;;;56412:44;;-1:-1:-1;;;;;56349:16:0;;;;:33;;56401:56;;:10;:56::i;:::-;56483:34;:48;;;56558:3;:34;;;56349:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56349:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56349:259:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56349:259:0;56278:46;;;:341;56759:20;;;;56810:28;;;;56759:20;56858:27;;;56759:178;;;-1:-1:-1;;;56759:178:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56759:20:0;;;;:25;;:178;;;;;56349:259;;56759:178;;;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;56759:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56759:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56759:178:0;56700:34;;;:248;57030:20;;;;57097:45;;-1:-1:-1;;;;;57030:20:0;;;;:37;;57086:57;;:10;:57::i;:::-;57169:35;:49;;;57245:3;:34;;;57030:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57030:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57030:265:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57030:265:0;56959:46;;;:347;57456:20;;;;57523:49;;-1:-1:-1;;;;;57456:20:0;;;;:37;;57512:61;;:10;:61::i;:::-;57599:39;:53;;;57679:3;:34;;;57456:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57456:273:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57456:273:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57456:273:0;57381:50;;;:359;57963:45;;57901:46;;;;57848:38;;;;:161;;57963:45;57848:100;;:38;:100;:52;:100;:::i;:::-;:114;:161;:114;:161;:::i;:::-;57803:42;;;:206;;;58198:49;;58132:50;;;;58065:183;;:118;;;:66;:118;:::i;:183::-;58020:42;;;:228;58466:24;;;;58505:19;;;;58539:46;;;;58354:242;;58410:11;;58436:15;;58354:41;:242::i;:::-;58310:41;;;:286;58741:24;;;;58641:135;;58687:13;;58715:11;;58641:31;:135::i;:::-;58607:31;;;:169;58880:46;;;;58945:41;;;;58840:218;;58858:143;;:3;:143::i;:::-;59016:3;:31;;;58840:3;:218::i;:::-;58787:50;;;:271;-1:-1:-1;;59138:35:0;;59134:277;;;59236:64;;;;59190:43;;;:110;59134:277;;;59333:43;;;:66;;;59134:277;59503:3;:50;;;59443:3;:43;;;:110;;59421:208;;;;-1:-1:-1;;;59421:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59686:25:0;;59682:547;;59854:3;:43;;;59841:9;:56;;59815:132;;;;;-1:-1:-1;;;59815:132:0;;;;;;;;;;;;-1:-1:-1;;;59815:132:0;;;;;;;;;;;;;;;59682:547;;;60118:3;:43;;;60056:41;60069:11;60082:3;:14;;;60056:12;:41::i;:::-;:105;;60030:187;;;;;-1:-1:-1;;;60030:187:0;;;;;;;;;;;;-1:-1:-1;;;60030:187:0;;;;;;;;;;;;;;;60421:213;60451:11;60477:15;60507:3;:24;;;60546:3;:19;;;60580:3;:43;;;60421:15;:213::i;:::-;60375:43;;;:259;60848:43;;;;60777:56;;;;:115;;;:70;:115;:::i;:::-;60728:46;;;:164;;;61131:44;;61019:35;;;;:157;;:97;;:35;:97;:49;:97;:::i;:157::-;60973:43;;;:203;61231:20;61239:11;61231:7;:20::i;:::-;61189:39;;;:62;-1:-1:-1;;;;;61394:25:0;;:200;;61555:3;:39;;;61394:200;;;61489:43;;;;61431:39;;;;:112;;;:43;:112;:::i;:::-;61352:39;;;:242;61666:16;;;;61713:24;;;;61757:23;;;;61666:166;;;-1:-1:-1;;;61666:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61666:16:0;;;;:21;;:166;;;;;;;;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;61666:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61666:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61666:166:0;61607:34;;;:236;61880:16;;;;61933:39;;;;61995:43;;;;61880:170;;;-1:-1:-1;;;61880:170:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61880:16:0;;;;:31;;:170;;;;;61666:166;;61880:170;;;;;;;;:16;:170;;;5:2:-1;;;;30:1;27;20:12;5:2;61880:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61880:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61880:170:0;61854:23;;;:196;62087:16;;;;62137:39;;;;62199:43;;;;62087:167;;;-1:-1:-1;;;62087:167:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62087:16:0;;;;:28;;:167;;;;;61880:170;;62087:167;;;;;;;;:16;:167;;;5:2:-1;;;;30:1;27;20:12;5:2;62087:167:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62087:167:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62087:167:0;62061:23;;;;:193;;;;62324:20;;;;62375:28;;;;62423:27;;;;62324:178;;;-1:-1:-1;;;62324:178:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62324:20:0;;;;:25;;:178;;;;;62087:167;;62324:178;;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;62324:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62324:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62324:178:0;62265:34;;;:248;62704:43;;;;62633:56;;;;:115;;;:70;:115;:::i;:::-;62584:46;;;:164;62887:43;;;;62812:60;;;;:119;;;:74;:119;:::i;:::-;62759:3;:50;;:172;;;;;62978:3;62944:12;:31;;:37;;;;63020:3;:43;;;62992:12;:25;;:71;;;;63101:3;:34;;;63074:12;:24;;:61;;;;63173:3;:34;;;63146:12;:24;;:61;;;;63302:3;63264:16;:35;;:41;;;;63347:3;:52;;;63316:16;:28;;:83;;;;63441:3;:34;;;63410:16;:28;;:65;;;;63517:3;:34;;;63486:16;:28;;:65;;;;63666:34;:54;;;63616:3;:47;;:104;;;;;63803:3;:56;;;63756:34;:44;;:103;;;;63921:3;:44;;;63870:34;:48;;:95;;;;64028:35;:55;;;63978:3;:47;;:105;;;;;64167:3;:56;;;64119:35;:45;;:104;;;;64286:3;:44;;;64234:35;:49;;:96;;;;64397:39;:59;;;64343:3;:51;;:113;;;;;64544:3;:60;;;64492:39;:49;;:112;;;;64671:3;:44;;;64615:39;:53;;:100;;;;64728:267;64762:3;:17;;;64794:3;:14;;;64823:3;:19;;;64857:11;64883:3;:43;;;64941:3;:43;;;64728:19;:267::i;:::-;65008:248;65039:11;65065:28;:3;:14;;;-1:-1:-1;;;;;65065:26:0;;:28::i;:::-;65116:4;65136:27;65116:4;65136:25;:27::i;:::-;65178:3;:43;;;65236:9;65008:16;:248::i;:::-;65274:276;65311:3;:17;;;65343:11;65369:3;:46;;;65430:3;:14;;;65459:3;:19;;;65493:3;:46;;;65274:276;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;;;;;54306:11252:0:o;41135:3967::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;41248:22;;:::i;:::-;-1:-1:-1;;;;;41305:7:0;;;41281:21;41305:7;;;:4;:7;;;;;;;;41355:21;:24;;;;;;41380:10;41355:36;;;;;;;41428:7;;;;;;;:26;;41599:11;;;;41641:19;;;;41680:18;;;;41599:151;;-1:-1:-1;;;41599:151:0;;;;;;;;;;;;;41486:3;:19;;;41599:151;;;;;;;;41305:7;;41486:19;;41599:11;;;;;:16;;:151;;;;;;;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;41599:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41599:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41599:151:0;41556:205;;41800:27;;;;-1:-1:-1;;;;;41885:7:0;;;41556:18;41885:7;;;:4;41599:151;41885:7;;;;:11;;;41943:23;;41885:11;;;:28;;41932:35;;:10;:35::i;:::-;41986:9;42021:3;:18;;;41885:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41885:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41885:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41885:170:0;;41839:21;;:227;-1:-1:-1;;42170:21:0;;42166:994;;;42292:104;42314:27;42327:1;42330:10;42314:12;:27::i;:::-;42360:3;:21;;;42292:3;:104::i;:::-;42274:15;;;:122;-1:-1:-1;;;;;42684:15:0;;42680:200;;42762:3;:15;;;42750:9;:27;42720:144;;;;-1:-1:-1;;;42720:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42166:994;;;42912:15;;;:24;;;-1:-1:-1;;;;;42955:15:0;;42951:198;;43034:3;:15;;;43021:9;:28;42991:142;;;;-1:-1:-1;;;42991:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43263:15;;;;43237:21;;;;:42;;;:25;:42;:::i;:::-;43213:21;;;:66;;;43436:23;;43355:29;;;;:105;;:66;;:29;:66;:43;:66;:::i;:105::-;43333:19;;;:127;43489:10;43497:1;43489:7;:10::i;:::-;43471:15;;;:28;-1:-1:-1;;;;;43642:15:0;;:90;;43717:3;:15;;;43642:90;;;43689:15;;;;43669;;;;:36;;;:19;:36;:::i;:::-;43624:15;;;:108;-1:-1:-1;;;;;43788:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;43830:19;;;;43788:11;43869:18;;;;43788:151;;-1:-1:-1;;;43788:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;43788:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43788:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43788:151:0;43745:18;;;:205;-1:-1:-1;;;;;44022:7:0;;;;;;;:4;43788:151;44022:7;;;;:11;;;44074:15;;;;44022:11;;;:26;;44063:27;;:10;:27::i;:::-;44105:31;44116:3;:19;;;44105:10;:31::i;:::-;44022:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44022:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44022:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44022:125:0;44002:17;;;:145;-1:-1:-1;;;;;44178:7:0;;;;;;;:4;44022:125;44178:7;;;;:11;;;44227:15;;;;44178:11;;;:23;;44216:27;;:10;:27::i;:::-;44258:31;44269:3;:19;;;44258:10;:31::i;:::-;44178:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44178:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44178:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44178:122:0;44158:17;;;:142;44341:3;44313:31;;44377:19;;;;44355;;;:41;44428:18;;;;44407;;;:39;44478:18;;44457;;;:39;;;44559:23;;44537:19;;;:45;44619:21;;;;44593:47;;-1:-1:-1;44651:27:0;;:48;44712:192;44743:1;44759:10;44792:4;44812:27;44792:4;44812:25;:27::i;:::-;44854:3;:15;;;44884:9;44712:16;:192::i;:::-;44996:15;;;;;45026:19;;;;45060:21;;;;;44922:170;;44955:10;44922:170;;-1:-1:-1;;;;;44922:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;41135:3967:0:o;37594:3519::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;37674;;:::i;:::-;-1:-1:-1;;;;;37728:7:0;;;37704:21;37728:7;;;:4;:7;;;;;;;;37778:21;:24;;;;;;37803:10;37778:36;;;;;;;37851:7;;;;;;;:26;;38014:11;;;;38056:19;;;;38095:18;;;;38014:151;;-1:-1:-1;;;38014:151:0;;;;;;;;;;;;;37909:3;:19;;;38014:151;;;;;;;;37728:7;;37909:19;;38014:11;;;;;:16;;:151;;;;;;;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;38014:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38014:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38014:151:0;37971:205;;38213:27;;;;-1:-1:-1;;;;;38298:7:0;;;37971:18;38298:7;;;:4;38014:151;38298:7;;;;:11;;;38356:23;;38298:11;;;:28;;38345:35;;:10;:35::i;:::-;38399:9;38434:3;:18;;;38298:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38298:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38298:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38298:170:0;;38252:21;;:227;38543:31;38567:6;38543:23;:31::i;:::-;38517:23;;;:57;;;38611:21;;;;:74;;;:25;:74;:::i;:::-;38587:21;;;:98;;;38833:23;;38752:29;;;;:105;;:66;;:29;:66;:43;:66;:::i;:105::-;38730:19;;;:127;38952:56;38987:10;38952:20;:56::i;:::-;38928:20;;;38905:103;38906:20;;;38905:103;;;39041:25;;;;:54;;-1:-1:-1;39070:20:0;;;;:25;39041:54;39019:127;;;;;-1:-1:-1;;;39019:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39242:101;39293:1;39309:3;:23;;;39242:36;:101::i;:::-;39206:33;;;:137;;;39413:20;;;;-1:-1:-1;39376:57:0;39354:141;;;;-1:-1:-1;;;39354:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39574:10;39582:1;39574:7;:10::i;:::-;39556:15;;;:28;;;39613:27;;39633:6;39613:27;:19;:27;:::i;:::-;39595:15;;;:45;-1:-1:-1;;;;;39696:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;39738:19;;;;39696:11;39777:18;;;;39696:151;;-1:-1:-1;;;39696:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;39696:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39696:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39696:151:0;39653:18;;;:205;-1:-1:-1;;;;;39889:7:0;;;;;;;:4;39696:151;39889:7;;;;:11;;;39941:15;;;;39889:11;;;:26;;39930:27;;:10;:27::i;:::-;39972:31;39983:3;:19;;;39972:10;:31::i;:::-;39889:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39889:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39889:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39889:125:0;39869:17;;;:145;-1:-1:-1;;;;;40045:7:0;;;;;;;:4;39889:125;40045:7;;;;:11;;;40094:15;;;;40045:11;;;:23;;40083:27;;:10;:27::i;:::-;40125:31;40136:3;:19;;;40125:10;:31::i;:::-;40045:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40045:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40045:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40045:122:0;40025:17;;;:142;40208:3;40180:31;;40244:19;;;;40222;;;:41;40295:18;;;;40274;;;:39;40345:18;;40324;;;:39;;;40426:23;;40404:19;;;:45;40486:21;;;;40460:47;;-1:-1:-1;40518:27:0;;:48;40734:175;40765:1;40781:27;40789:4;40781:25;:27::i;:::-;40831:4;40851:10;40876:6;40897:1;40734:16;:175::i;:::-;41017:19;;;;41051:21;;;;;40927:156;;;40955:10;40927:156;;-1:-1:-1;;;;;40927:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;37594:3519:0:o;23037:663::-;-1:-1:-1;;;;;23180:24:0;;;23123:7;23180:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;23244:7;;;:4;:7;;;;;:11;;;;23282:19;;;;23317:18;;;;23363:26;;23244:157;;-1:-1:-1;;;23244:157:0;;;;;;;;;;;;;;;;23357:3;:32;;;;23244:157;;;;;;23123:7;;;;23244:11;;;:16;;:157;;;;;23180:24;;23244:157;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;23244:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23244:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23244:157:0;-1:-1:-1;;;;;23464:7:0;;;23414:25;23464:7;;;:4;23244:157;23464:7;;;;:11;;;23522:23;;23244:157;;-1:-1:-1;23414:25:0;;23464:11;;;:28;;23511:35;;:10;:35::i;:::-;23572:13;:27;;;23619:12;23464:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23464:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23464:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23464:182:0;;-1:-1:-1;;;;23037:663:0;;;;;:::o;14736:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14736:33:0;;-1:-1:-1;14736:33:0;:::o;15502:127::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15584:7:0;;;;;;;:4;:7;;;;;:11;;:37;;-1:-1:-1;;;;;;15584:37:0;;;;;;;;15502:127::o;21156:182::-;21247:7;21279:51;21302:1;21305:24;21322:3;21327:1;21305:16;:24::i;:::-;21279:22;:51::i;:::-;21272:58;21156:182;-1:-1:-1;;;21156:182:0:o;36613:191::-;36704:7;36736:60;15051:7;36736:47;36753:29;15051:7;36704;36753:29;:13;:29;:::i;:::-;36736:12;;:47;:16;:47;:::i;:::-;:51;:60;:51;:60;:::i;:::-;36729:67;;36613:191;;;;:::o;25949:251::-;26057:7;26066;26109:29;26131:3;26136:1;26109:21;:29::i;:::-;26149:32;26174:3;26179:1;26149:24;:32::i;:::-;26091:101;;;;25949:251;;;;;:::o;19994:267::-;-1:-1:-1;;;;;20093:11:0;;20058:7;20093:11;;;:4;:11;;;;;:24;;;;20146:23;;;;;20223:30;20146:23;20223:17;20093:24;15051:7;20223:17;:8;:17;:::i;:30::-;20216:37;19994:267;-1:-1:-1;;;;19994:267:0:o;13494:24::-;;;;:::o;14889:49::-;14937:1;14889:49;:::o;13445:42::-;;;;;;;;;;;;;:::o;10879:28::-;;;-1:-1:-1;;;;;10879:28:0;;:::o;23898:751::-;-1:-1:-1;;;;;24037:24:0;;;23980:7;24037:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;24101:7;;;:4;:7;;;;;:11;;;;24139:19;;;;24174:18;;;;24220:26;;24101:157;;-1:-1:-1;;;24101:157:0;;;;;;;;;;;;;;;;24214:3;:32;;;;24101:157;;;;;;23980:7;;;;24101:11;;;:16;;:157;;;;;24037:24;;24101:157;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;24101:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24101:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24101:157:0;-1:-1:-1;;;;;24321:7:0;;;24271:25;24321:7;;;:4;24101:157;24321:7;;;;:11;;;24379:23;;24101:157;;-1:-1:-1;24271:25:0;;24321:11;;;:28;;24368:35;;:10;:35::i;:::-;24429:13;:27;;;24476:12;24321:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24321:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24321:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24321:182:0;24607:23;;24543:22;;;;24321:182;;-1:-1:-1;24543:98:0;;:45;;24321:182;24543:45;:26;:45;:::i;:98::-;24527:114;23898:751;-1:-1:-1;;;;;;23898:751:0:o;22375:174::-;22462:7;22494:47;22517:1;22520:20;22533:3;22538:1;21400:900;-1:-1:-1;;;;;21539:24:0;;;21482:7;21539:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;21603:7;;;:4;:7;;;;;:11;;;;21641:19;;;;21603:11;21676:18;;;21722:26;;21603:157;;-1:-1:-1;;;21603:157:0;;;;;;;;;;;;;;;;21716:3;:32;;;;21603:157;;;;;;21482:7;;;;21603:11;;;:16;;:157;;;;;;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;21603:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21603:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21603:157:0;-1:-1:-1;;;;;21823:7:0;;;21773:25;21823:7;;;:4;21603:157;21823:7;;;;:11;;;21881:23;;21603:157;;-1:-1:-1;21773:25:0;;21823:11;;;:28;;21870:35;;:10;:35::i;:::-;21931:13;:27;;;21978:12;21823:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21823:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21823:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21823:182:0;22053:23;;21823:182;;-1:-1:-1;22033:43:0;;22029:264;;;22180:23;;22113:106;;22158:46;;:17;;:46;:21;:46;:::i;:::-;22113:22;;;;;:106;:26;:106;:::i;:::-;22093:126;;;;;;;22029:264;-1:-1:-1;;22259:22:0;;;;-1:-1:-1;22252:29:0;;23708:182;23799:7;23831:51;23854:1;23857:24;23874:3;23879:1;23857:16;:24::i;67928:582::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;;;;17065:5;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;68046:12;68061:10;68069:1;68061:7;:10::i;:::-;-1:-1:-1;;;;;68148:7:0;;68082:14;68148:7;;;:4;:7;;;;;:19;;;;68108:20;;;;;68046:25;;-1:-1:-1;68082:14:0;;68099:79;;68148:19;68099:30;;68046:25;;68099:30;:8;:30;:::i;:79::-;68082:96;;68207:6;68197;:16;;68189:55;;;;;-1:-1:-1;;;68189:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68255:184;68286:1;68302:27;68310:4;68302:25;:27::i;:::-;68372:5;;68352:4;;68372:19;;:5;;;-1:-1:-1;;;;;68372:5:0;:17;:19::i;:::-;68406:6;68427:1;68255:16;:184::i;:::-;68496:5;;68455:47;;;-1:-1:-1;;;;;68455:47:0;;;;;;;;;;;;;;;;;68496:5;;;;;;;;68455:47;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;67928:582:0:o;12031:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26272:621::-;26453:16;:23;26372:19;;;;;26489:397;26513:6;26509:1;:10;26489:397;;;26556:19;26590:23;26631:113;26688:3;26710:16;26727:1;26710:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26710:19:0;26631:38;:113::i;:::-;26541:203;;-1:-1:-1;26541:203:0;-1:-1:-1;26773:28:0;:11;26541:203;26773:28;:15;:28;:::i;:::-;26759:42;-1:-1:-1;26836:38:0;:17;26858:15;26836:38;:21;:38;:::i;:::-;26816:58;-1:-1:-1;;;26521:3:0;;26489:397;;;;26272:621;;;;:::o;10715:108::-;-1:-1:-1;;;;;10715:108:0;:::o;51117:3163::-;51275:7;51303:10;-1:-1:-1;;;;;51303:27:0;;;;51295:60;;;;;-1:-1:-1;;;51295:60:0;;;;;;;;;;;;-1:-1:-1;;;51295:60:0;;;;;;;;;;;;;;;51366:22;;:::i;:::-;-1:-1:-1;;;;;51428:17:0;;;51401:18;51428:17;;;:4;:17;;;;;;;;:36;;51569:21;;;;;;;;;51665:34;;;:21;:34;;;;;;:49;;;;;;;;;;;;51792:38;;;:21;:38;;;;;:53;;;;;;;;;51917:20;;;;51968:28;;;;51917:20;52016:27;;;51917:178;;-1:-1:-1;;;51917:178:0;;;;;;;;;;;;;51422:3;:42;;;;51917:178;;;;;;;;51422:42;;51428:17;;51569:21;51665:49;;51792:53;;51917:20;;;:25;;:178;;;;;51428:17;51917:178;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;51917:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51917:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51917:178:0;51858:34;;;:248;52176:16;;;;52223:24;;;;52267:23;;;;52176:166;;;-1:-1:-1;;;52176:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52176:16:0;;;;:21;;:166;;;;;51917:178;;52176:166;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;52176:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52176:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52176:166:0;52117:34;;;:236;52435:20;;;;52502:45;;-1:-1:-1;;;;;52435:20:0;;;;:37;;52491:57;;:10;:57::i;:::-;52574:35;:49;;;52650:3;:34;;;52435:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52435:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52435:265:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52435:265:0;52364:46;;;:347;52793:16;;;;52856:44;;-1:-1:-1;;;;;52793:16:0;;;;:33;;52845:56;;:10;:56::i;:::-;52927:34;:48;;;53002:3;:34;;;52793:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52793:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52793:259:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52793:259:0;52722:46;;;:341;53076:7;53122:32;53138:15;53122;:32::i;:::-;53095:19;;;53094:60;;;;;-1:-1:-1;53094:60:0;53165:42;;;;;-1:-1:-1;;;53165:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53253:28;53269:11;53253:15;:28::i;:::-;53221:24;;;53220:61;;;;;-1:-1:-1;53220:61:0;53292:47;;;;;-1:-1:-1;;;53292:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53396:242;53452:11;53478:15;53508:3;:24;;;53547:3;:19;;;53581:3;:46;;;53396:41;:242::i;:::-;53352:41;;;:286;53783:24;;;;53683:135;;53729:13;;53757:11;;53683:31;:135::i;:::-;53649:31;;;:169;53900:46;;;;53961:41;;;;53882:131;;53900:46;53882:3;:131::i;:::-;53829:50;;;:184;;;54160:31;;;;54077:125;;53829:184;54077:3;:125::i;:::-;54024:50;;;;:178;;;-1:-1:-1;54024:178:0;;-1:-1:-1;;;;;;51117:3163:0;;;;;:::o;12678:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12678:57:0;;;;;;;;;;;;;;;;;;;;:::o;15977:724::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;16150:14;;-1:-1:-1;;;;;16150:14:0;16138:87;;16196:17;16206:6;16196:9;:17::i;:::-;16235:15;;:::i;:::-;-1:-1:-1;;;;;;16253:7:0;;;;;;;:4;:7;;;;;;;;;16235:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16271:89;;16320:28;16341:1;16344:3;16320:20;:28::i;:::-;16372:22;16392:1;16372:19;:22::i;:::-;16409:13;;;;16405:87;;14876:6;16444:13;;;:36;16405:87;16508:13;;;;16504:87;;14876:6;16543:13;;;:36;16504:87;16607:10;;;;16603:69;;16639:10;;;:21;;;16603:69;-1:-1:-1;;;;;16682:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16682:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15977:724:0:o;31806:4243::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;-1:-1:-1;;;;;31936:7:0;;;;:4;:7;;;;;;;;31986:21;:24;;;;;32011:10;31986:36;;;;;;;;32035:21;;:::i;:::-;-1:-1:-1;;;;;32093:7:0;;32069:21;32093:7;;;:4;:7;;;;;:26;32151:3;:19;;;32284:56;32319:10;32284:20;:56::i;:::-;32260:20;;;32237:103;32238:20;;;32237:103;;;32373:25;;;;:54;;-1:-1:-1;32402:20:0;;;;:25;32373:54;32351:129;;;;;-1:-1:-1;;;32351:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32577:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;32619:19;;;;32577:11;32658:18;;;;32577:151;;-1:-1:-1;;;32577:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;32577:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32577:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32577:151:0;32534:18;;;;:205;;;;-1:-1:-1;;;;;32796:7:0;;;;;;;:4;32577:151;32796:7;;;;;:11;;;32854:23;;32796:11;;;:28;;32843:35;;:10;:35::i;:::-;32904:13;:27;;;32958:3;:18;;;32796:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32796:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32796:196:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32796:196:0;32750:21;;;:253;33079:10;33087:1;33079:7;:10::i;:::-;33061:15;;;:28;-1:-1:-1;;33199:30:0;;33195:563;;;33347:96;33388:1;33408:3;:20;;;33347:22;:96::i;:::-;33324:20;;;:119;;;33527:21;;;;33479:119;;33501:48;;:3;:48::i;:::-;33568:3;:15;;;33479:3;:119::i;:::-;33458:140;;33195:563;;;33710:36;;;33195:563;33852:18;;33832:15;;;;:39;;;:19;:39;:::i;:::-;33814:15;;;:57;33932:18;;33906:21;;;;:45;;;:25;:45;:::i;:::-;33882:21;;;:69;34092:18;;34039:82;;34076:1;;34039:22;:82::i;:::-;34012:24;;;:109;;;34230:20;;;;-1:-1:-1;34202:48:0;34180:114;;;;;-1:-1:-1;;;34180:114:0;;;;;;;;;;;;-1:-1:-1;;;34180:114:0;;;;;;;;;;;;;;;34437:23;;34396:21;;;;34373:18;;;;:98;;34437:23;34373:45;;:18;:45;:22;:45;:::i;:98::-;34352:18;;;:119;-1:-1:-1;;;;;34527:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;34569:19;;;;34527:11;34608:18;;;;34527:151;;-1:-1:-1;;;34527:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;34527:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34527:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34527:151:0;34484:18;;;;:205;;;;-1:-1:-1;;;;;34762:7:0;;;;;;;:4;34527:151;34762:7;;;;;:11;;;34814:15;;;;34762:11;;;:26;;34803:27;;:10;:27::i;:::-;34845:31;34856:6;:19;;;34845:10;:31::i;:::-;34762:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34762:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34762:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34762:125:0;34742:17;;;:145;-1:-1:-1;;;;;34941:7:0;;;;;;;:4;34762:125;34941:7;;;;;;;;:11;;;;34983:19;;;;35022:18;;;;;34941:151;;-1:-1:-1;;;34941:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;34762:125;34941:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;34941:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34941:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34941:151:0;34898:18;;;:205;-1:-1:-1;;;;;35134:7:0;;;;;;;:4;34941:151;35134:7;;;;:11;;;35183:15;;;;35134:11;;;:23;;35172:27;;:10;:27::i;:::-;35214:31;35225:6;:19;;;35214:10;:31::i;:::-;35134:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35134:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35134:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35134:122:0;35114:17;;;:142;35297:3;35269:31;;35332:18;;;;35311;;;:39;35382:18;;;;35361;;;:39;;;35432:18;;;;35411;;;:39;35513:23;;35134:122;35491:19;;:45;-1:-1:-1;35573:21:0;;;35547:47;;-1:-1:-1;35605:27:0;;:48;35666:187;35697:1;35713:27;35721:4;35713:25;:27::i;:::-;35763:4;35783:10;35808:3;:18;;;35841:1;35666:16;:187::i;:::-;35942:18;;35975:19;;;;;36009:21;;;;;35871:170;;;35901:10;35871:170;;-1:-1:-1;;;;;35871:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;31806:4243:0:o;19285:277::-;19334:7;-1:-1:-1;;;;;19400:15:0;;19396:76;;-1:-1:-1;19439:21:0;19432:28;;19396:76;19524:30;;;-1:-1:-1;;;19524:30:0;;19548:4;19524:30;;;;;;19504:1;;-1:-1:-1;;;;;19524:15:0;;;;;:30;;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;19524:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19524:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19524:30:0;;19285:277;-1:-1:-1;;;19285:277:0:o;15094:273::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;15171:9;15166:155;15190:16;:23;15186:27;;15166:155;;;15262:5;-1:-1:-1;;;;;15239:28:0;:16;15256:1;15239:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15239:19:0;:28;15235:75;;;15288:7;;;15235:75;15215:3;;15166:155;;;-1:-1:-1;15331:16:0;27:10:-1;;39:1;23:18;;45:23;;-1:-1;15331:28:0;;;;;;;;-1:-1:-1;;;;;;15331:28:0;-1:-1:-1;;;;;15331:28:0;;;;;17109:1;15094:273;:::o;24657:174::-;24744:7;24776:47;24799:1;24802:20;24815:3;24820:1;24802:12;:20::i;15375:119::-;15463:16;:23;15375:119;:::o;47476:765::-;-1:-1:-1;;;;;47782:21:0;;47728:11;47782:21;;;:4;:21;;;;;:41;;;47728:11;47871:34;15051:7;47782:41;47871:34;:13;:34;:::i;:::-;47834:71;-1:-1:-1;47922:52:0;:20;47834:71;47922:52;:24;:52;:::i;:::-;47916:58;-1:-1:-1;47991:48:0;47916:58;47999:39;47991:48;:7;:48;:::i;:::-;47985:54;-1:-1:-1;48056:24:0;47985:54;48064:15;48056:24;:7;:24;:::i;:::-;48050:30;-1:-1:-1;48097:16:0;48050:30;15051:7;48097:16;:7;:16;:::i;:::-;-1:-1:-1;;;;;48142:21:0;;;;;;:4;:21;;;;;:30;;;48091:22;;-1:-1:-1;48130:43:0;;48091:22;;48138:2;:34;48130:43;:7;:43;:::i;:::-;-1:-1:-1;;;;;48202:21:0;;;;;;:4;:21;;;;;:30;;;48124:49;;-1:-1:-1;48190:43:0;;48124:49;;48198:2;:34;48190:43;:7;:43;:::i;:::-;48184:49;47476:765;-1:-1:-1;;;;;;;;47476:765:0:o;17723:103::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;17786:14;:32;;-1:-1:-1;;;;;;17786:32:0;-1:-1:-1;;;;;17786:32:0;;;;;;;;;;17723:103::o;17600:115::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17680:7:0;;;;;;;:4;:7;;;;;:16;;:27;17600:115::o;24888:384::-;25013:16;:23;24964:14;;;25078:160;25102:6;25098:1;:10;25078:160;;;25130:11;25144:43;25162:3;25167:16;25184:1;25167:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25167:19:0;25144:17;:43::i;:::-;25130:57;-1:-1:-1;25211:15:0;:6;25130:57;25211:15;:10;:15;:::i;:::-;25202:24;-1:-1:-1;;25110:3:0;;25078:160;;;;24888:384;;;;:::o;46232:872::-;-1:-1:-1;;;;;46560:21:0;;46506:11;46560:21;;;:4;:21;;;;;:41;;;46506:11;46649:34;15051:7;46560:41;46649:34;:13;:34;:::i;:::-;46612:71;-1:-1:-1;46694:42:0;46748:56;:35;46788:15;46748:56;:39;:56;:::i;:::-;46694:110;-1:-1:-1;46823:129:0;46876:65;15051:7;46876:52;:26;46907:20;46876:52;:30;:52;:::i;:65::-;46823:34;;:129;:38;:129;:::i;:::-;-1:-1:-1;;;;;47005:21:0;;;;;;:4;:21;;;;;:30;;;46817:135;;-1:-1:-1;46993:43:0;;46817:135;;47001:2;:34;46993:43;:7;:43;:::i;:::-;-1:-1:-1;;;;;47065:21:0;;;;;;:4;:21;;;;;:30;;;46987:49;;-1:-1:-1;47053:43:0;;46987:49;;47061:2;:34;47053:43;:7;:43;:::i;:::-;47047:49;46232:872;-1:-1:-1;;;;;;;;;46232:872:0:o;27772:3533::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;27903:6;-1:-1:-1;;;;;27966:15:0;;27962:240;;28016:9;28006:6;:19;27998:67;;;;-1:-1:-1;;;27998:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28095:9:0;27962:240;;;28145:9;:14;28137:53;;;;;-1:-1:-1;;;28137:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28212:19;;:::i;:::-;-1:-1:-1;;;;;28266:7:0;;;28242:21;28266:7;;;:4;:7;;;;;;;;28316:21;:24;;;;;28341:10;28316:36;;;;;;;;28389:25;;28571:10;;;;28612:18;;;;28571:10;28650:17;;;28571:148;;-1:-1:-1;;;28571:148:0;;;;;;;;;;;;;28446:3;:19;;;28571:148;;;;;;;;28266:7;;28316:36;;28389:25;;28571:10;;;;;:15;;:148;;;;;28266:7;28571:148;;;;;:10;:148;;;5:2:-1;;;;30:1;27;20:12;5:2;28571:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28571:148:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28571:148:0;;28528:18;;;:202;;;;28787:10;;;;-1:-1:-1;;;;;28844:24:0;;;28787:10;28844:24;;;:21;:24;;;;;;28869:10;28844:36;;;;;;;;;:46;28787:10;;;:27;;28833:58;;:10;:58::i;:::-;28917:13;:27;;;28971:3;:18;;;28787:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28787:218:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28787:218:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28787:218:0;28741:21;;;:275;;;29051:39;;29077:12;29051:39;:25;:39;:::i;:::-;29027:21;;;:63;;;29226:23;;29162:18;;;;:98;;:45;;:18;:45;:22;:45;:::i;:98::-;29141:18;;;:119;29291:10;29299:1;29291:7;:10::i;:::-;29273:15;;;:28;-1:-1:-1;;;;;29584:15:0;;:87;;29656:3;:15;;;29584:87;;;29611:15;;;;:33;;29631:12;29611:33;:19;:33;:::i;:::-;29566:15;;;:105;;;29749:10;;;;-1:-1:-1;;;;;29749:10:0;;:25;;29789:27;;:10;:27::i;:::-;29831:31;29842:6;:19;;;29831:10;:31::i;:::-;29749:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29749:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29749:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29749:124:0;29729:17;;;:144;29927:10;;;;29968:18;;;;30006:17;;;;29927:148;;;-1:-1:-1;;;29927:148:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29927:10:0;;;;:15;;:148;;;;;29749:124;;29927:148;;;;;;;;:10;:148;;;5:2:-1;;;;30:1;27;20:12;5:2;29927:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29927:148:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29927:148:0;29884:18;;;:202;30117:10;;;;30165:15;;;;-1:-1:-1;;;;;30117:10:0;;;;:22;;30154:27;;:10;:27::i;:::-;30196:31;30207:6;:19;;;30196:10;:31::i;:::-;30117:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30117:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30117:121:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30117:121:0;30097:17;;;:141;30272:18;;;;30251;;;:39;30117:121;30322:18;;;30301;;;:39;;;30372:18;;;;30351;;;:39;30429:3;30401:31;;30495:23;;30473:45;;;30555:21;;;;30529:47;;-1:-1:-1;30587:27:0;;:48;;;;30692:21;;;;:43;30688:207;;;30848:19;;30822:21;;;;30777:106;;30822:46;;:21;:46;:25;:46;:::i;30777:106::-;30752:22;;;:131;30688:207;30907:16;30912:10;30907:4;:16::i;:::-;30936:181;30967:1;30983:10;31016:4;31036:27;31016:4;31036:25;:27::i;:::-;31078:12;31105:1;30936:16;:181::i;:::-;31231:19;;31265:21;;;;;31135:162;;;31163:10;31135:162;;-1:-1:-1;;;;;31135:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;27772:3533:0:o;18859:372::-;18997:14;;18956:7;;-1:-1:-1;;;;;18997:14:0;18981:64;;;;;-1:-1:-1;;;18981:64:0;;;;;;;;;;;;-1:-1:-1;;;18981:64:0;;;;;;;;;;;;;;;19057:13;19072:7;19083:18;19099:1;19083:15;:18::i;:::-;19056:45;;;;19120:2;:16;;;;-1:-1:-1;19126:10:0;;;19120:16;19112:48;;;;;-1:-1:-1;;;19112:48:0;;;;;;;;;;;;-1:-1:-1;;;19112:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19195:7:0;;;;;;:4;:7;;;;;:16;;;19178:45;;19217:5;;19178:34;;:8;;19191:2;:20;19178:34;:12;:34;:::i;:45::-;19171:52;18859:372;-1:-1:-1;;;;;18859:372:0:o;26901:550::-;26980:7;26989;27014:19;27044:26;27177:46;27219:3;27177:41;:46::i;:::-;27112:111;;-1:-1:-1;27112:111:0;-1:-1:-1;27238:32:0;;;27234:210;;;27295:1;27298:35;:18;27321:11;27298:35;:22;:35;:::i;:::-;27287:47;;-1:-1:-1;27287:47:0;-1:-1:-1;27287:47:0;;-1:-1:-1;;27287:47:0;27234:210;27384:35;:11;27400:18;27384:35;:15;:35;:::i;:::-;27376:47;-1:-1:-1;27421:1:0;;-1:-1:-1;27376:47:0;;-1:-1:-1;;27376:47:0;26901:550;;;;:::o;17126:101::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;17197:13;:22;;-1:-1:-1;;;;;;17197:22:0;-1:-1:-1;;;;;17197:22:0;;;;;;;;;;17126:101::o;17235:187::-;17308:13;;-1:-1:-1;;;;;17308:13:0;17294:10;:27;17286:59;;;;;-1:-1:-1;;;17286:59:0;;;;;;;;;;;;-1:-1:-1;;;17286:59:0;;;;;;;;;;;;;;;17364:13;;;;17356:21;;-1:-1:-1;;;;;;17356:21:0;17364:13;-1:-1:-1;;;;;17364:13:0;;17356:21;;;;-1:-1:-1;;;;;;17388:26:0;;;17235:187::o;25670:211::-;25770:7;25779;25812:29;25834:3;25839:1;25812:21;:29::i;:::-;25843;25865:3;25870:1;25843:21;:29::i;15795:174::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15912:7:0;;;;;;;:4;:7;;;;;:27;;:49;15795:174::o;20421:663::-;-1:-1:-1;;;;;20564:24:0;;;20507:7;20564:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;20628:7;;;:4;:7;;;;;:11;;;;20666:19;;;;20628:11;20701:18;;;20747:26;;20628:157;;-1:-1:-1;;;20628:157:0;;;;;;;;;;;;;;;;20741:3;:32;;;;20628:157;;;;;;20507:7;;;;20628:11;;;:16;;:157;;;;;;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;15637:150:0;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15742:7:0;;;;;;;:4;:7;;;;;;;;:21;:37;15637:150::o;14791:29::-;;;-1:-1:-1;;;;;14791:29:0;;:::o;17474:118::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:11:0;;;;;:4;:11;;;;;17581:3;17548:36;;17474:118::o;22608:328::-;22733:16;:23;22684:14;;;22769:160;22793:6;22789:1;:10;22769:160;;;22821:11;22835:43;22853:3;22858:16;22875:1;22858:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22858:19:0;22835:17;:43::i;:::-;22821:57;-1:-1:-1;22902:15:0;:6;22821:57;22902:15;:10;:15;:::i;:::-;22893:24;-1:-1:-1;;22801:3:0;;22769:160;;12742:31;;;;:::o;25366:236::-;-1:-1:-1;;;;;25535:7:0;;25460;25535;;;:4;:7;;;;;;;:21;;25501:93;;15051:7;;25501:56;;:29;25523:3;25540:1;25501:21;:29::i;:::-;:33;:56;:33;:56;:::i;17988:222::-;18111:14;;18064:7;;;;-1:-1:-1;;;;;18111:14:0;18095:64;;;;;-1:-1:-1;;;18095:64:0;;;;;;;;;;;;-1:-1:-1;;;18095:64:0;;;;;;;;;;;;;;;18177:14;;:25;;;-1:-1:-1;;;18177:25:0;;-1:-1:-1;;;;;18177:25:0;;;;;;;;;:14;;;:18;;:25;;;;;;;;;;;;;:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;18177:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18177:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18177:25:0;;;;;;;;;-1:-1:-1;18177:25:0;-1:-1:-1;17988:222:0;;;:::o;14668:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14829:53::-;14876:6;14829:53;:::o;18419:390::-;18564:14;;18523:7;;-1:-1:-1;;;;;18564:14:0;18548:64;;;;;-1:-1:-1;;;18548:64:0;;;;;;;;;;;;-1:-1:-1;;;18548:64:0;;;;;;;;;;;;;;;18624:13;18639:7;18650:22;18666:5;18650:15;:22::i;:::-;18623:49;;;;18691:2;:16;;;;-1:-1:-1;18697:10:0;;;18691:16;18683:48;;;;;-1:-1:-1;;;18683:48:0;;;;;;;;;;;;-1:-1:-1;;;18683:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18780:11:0;;;;;;:4;:11;;;;;:20;;;18749:52;;18776:2;:24;18749:22;:5;18759:11;18749:22;:9;:22;:::i;36851:266::-;-1:-1:-1;;;;;37064:7:0;;36975;37064;;;:4;:7;;;;;;;:21;;37011:98;;15051:7;;37011:75;;:38;37069:1;37037:11;37011:22;:38::i;13395:43::-;;;;;;;;;;;;-1:-1:-1;;;;;13395:43:0;;:::o;45213:663::-;45387:7;45410:17;45431:35;45452:13;45431:20;:35::i;:::-;-1:-1:-1;;;;;45501:21:0;;45477;45501;;;:4;:21;;;;;;;:35;;;;45577:41;;;;;45407:59;;-1:-1:-1;45501:35:0;-1:-1:-1;45643:51:0;45686:7;45643:38;45501:35;45577:41;45643:38;:17;:38;:::i;:51::-;45629:65;-1:-1:-1;45721:121:0;45789:42;15051:7;45789:29;:20;45629:65;45789:29;:24;:29;:::i;:42::-;-1:-1:-1;;;;;45739:21:0;;;;;;:4;:21;;;;;:30;;;45721:49;;:9;;45735:2;:34;45721:49;:13;:49;:::i;10832:20::-;;;;;;-1:-1:-1;;;;;10832:20:0;;:::o;12165:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18218:149::-;18269:6;-1:-1:-1;;;;;18296:1:0;:12;;18288:44;;;;;-1:-1:-1;;;18288:44:0;;;;;;;;;;;;-1:-1:-1;;;18288:44:0;;;;;;;;;;;;;;;-1:-1:-1;18357:1:0;18218:149::o;4273:171::-;4331:7;4363:5;;;4387:6;;;;4379:36;;;;;-1:-1:-1;;;4379:36:0;;;;;;;;;;;;-1:-1:-1;;;4379:36:0;;;;;;;;;;;;;;4014:171;4072:7;4105:1;4100;:6;;4092:36;;;;;-1:-1:-1;;;4092:36:0;;;;;;;;;;;;-1:-1:-1;;;4092:36:0;;;;;;;;;;;;;;;-1:-1:-1;4151:5:0;;;4014:171::o;36388:172::-;36446:7;36474:1;36470;:5;36466:87;;;-1:-1:-1;36499:1:0;36492:8;;36466:87;-1:-1:-1;36540:1:0;36533:8;;19625:325;19714:7;-1:-1:-1;;;;;19785:19:0;;19781:80;;-1:-1:-1;;;;;;19828:21:0;;;19821:28;;19781:80;19921:21;;;-1:-1:-1;;;19921:21:0;;-1:-1:-1;;;;;19921:21:0;;;;;;;;;19895:5;;19921:15;;;;;:21;;;;;;;;;;;;;;:15;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;19921:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19921:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19921:21:0;;19625:325;-1:-1:-1;;;;19625:325:0:o;12782:587::-;13006:30;;:::i;:::-;-1:-1:-1;13039:198:0;;;;;;;;-1:-1:-1;;;;;13039:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13211:15;13039:198;;;;;;13303:16;;;-1:-1:-1;13286:34:0;;;:16;:34;;;;;;;;:46;;;;-1:-1:-1;;;;;;13286:46:0;;;;;;;;;;;;;;-1:-1:-1;13286:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13343:18;;;;;;;12782:587::o;9497:117::-;9603:1;9497:117::o;65566:2319::-;65790:11;65782:55;;;;;-1:-1:-1;;;65782:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65861:7;-1:-1:-1;;;;;65852:16:0;:5;-1:-1:-1;;;;;65852:16:0;;;:39;;;;-1:-1:-1;;;;;;65872:19:0;;;;65852:39;65848:239;;;65968:39;;;-1:-1:-1;;;65968:39:0;;-1:-1:-1;;;;;65968:39:0;;;;;;;;;;;;;;;;66011:6;;65968:23;;;;;:39;;;;;;;;;;;;;;:23;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;65968:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65968:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65968:39:0;:49;;65942:133;;;;;-1:-1:-1;;;65942:133:0;;;;;;;;;;;;-1:-1:-1;;;65942:133:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;66101:19:0;;;66097:382;;66197:6;66170:5;-1:-1:-1;;;;;66163:23:0;;66187:5;66163:30;;;;;;;;;;;;;-1:-1:-1;;;;;66163:30:0;-1:-1:-1;;;;;66163:30:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66163:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66163:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66163:30:0;:40;;66137:122;;;;;-1:-1:-1;;;66137:122:0;;;;;;;;;;;;-1:-1:-1;;;66137:122:0;;;;;;;;;;;;;;;66097:382;;;66290:7;-1:-1:-1;;;;;66281:16:0;:5;-1:-1:-1;;;;;66281:16:0;;66277:202;;;66432:6;66415:5;-1:-1:-1;;;;;66415:13:0;;:23;;66407:60;;;;;-1:-1:-1;;;66407:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66504:7;-1:-1:-1;;;;;66495:16:0;:5;-1:-1:-1;;;;;66495:16:0;;66491:1387;;-1:-1:-1;;;;;66560:19:0;;;66556:314;;66639:49;-1:-1:-1;;;;;66639:30:0;;66670:5;66677:2;66681:6;66639:49;:30;:49;:::i;:::-;66556:314;;;66714:13;;;;;:34;;;66742:6;66731:8;:17;66714:34;66710:160;;;-1:-1:-1;;;;;66818:14:0;;:36;66833:20;:8;66846:6;66833:20;:12;:20;:::i;:::-;66818:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66818:36:0;66710:160;66491:1387;;;-1:-1:-1;;;;;67003:19:0;;;66999:868;;67069:38;-1:-1:-1;;;;;67069:26:0;;67096:2;67100:6;67069:38;:26;:38;:::i;66999:868::-;67672:13;;;;;:34;;;67700:6;67689:8;:17;67672:34;67668:184;;;-1:-1:-1;;;;;67731:11:0;;:33;67743:20;:8;67756:6;67743:20;:12;:20;:::i;67668:184::-;67813:19;;-1:-1:-1;;;;;67813:11:0;;;:19;;;;;67825:6;;67813:19;;;;67825:6;67813:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67813:19:0;67668:184;65566:2319;;;;;;:::o;2963:454::-;3021:7;3265:6;3261:47;;-1:-1:-1;3295:1:0;3288:8;;3261:47;3332:5;;;3336:1;3332;:5;:1;3356:5;;;;;:10;3348:40;;;;;-1:-1:-1;;;3348:40:0;;;;;;;;;;;;-1:-1:-1;;;3348:40:0;;;;;;;;;;;;;;3552:324;3610:7;3705:6;3697:35;;;;;-1:-1:-1;;;3697:35:0;;;;;;;;;;;;-1:-1:-1;;;3697:35:0;;;;;;;;;;;;;;;3743:9;3759:1;3755;:5;;;;;;;3552:324;-1:-1:-1;;;;3552:324:0:o;13548:182::-;-1:-1:-1;;;;;13599:12:0;;;;;;:7;:12;;;;;;13595:128;;13642:5;;;13633:15;;;;:8;:15;;;;;;;;:21;;-1:-1:-1;;;;;13633:21:0;;-1:-1:-1;;;;;;13633:21:0;;;;;;;;13684:5;;13669:12;;;:7;:12;;;;;;:20;;;13633:21;13704:7;;;13548:182;:::o;6408:284::-;6605:68;;;-1:-1:-1;;;;;6605:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6605:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;6552:132:0;;6585:5;;6552:18;:132::i;:::-;6408:284;;;;:::o;6153:247::-;6323:58;;;-1:-1:-1;;;;;6323:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6323:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;6270:122:0;;6303:5;;6270:18;:122::i;:::-;6153:247;;;:::o;8556:900::-;9108:27;9116:5;-1:-1:-1;;;;;9108:25:0;;:27::i;:::-;9100:36;;;;;;9210:12;9224:23;9259:5;-1:-1:-1;;;;;9251:19:0;9271:4;9251:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9251:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9209:67:0;;;;9295:7;9287:16;;;;;;9320:17;;:21;9316:133;;9417:10;9406:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9406:30:0;9398:39;;;;;2091:650;2676:20;2724:9;;;2091:650::o;10560:57953::-;;;;;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://92b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c627

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Algorithm-driven crypto digital bank, deposit and withdraw anytime, borrow and repay anytime.

Validator Index Block Amount
View All Withdrawals

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

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