S Price: $0.721524 (-10.66%)

Contract

0x5fCd059a7871aaD4C82E0CA0Ec20662a871a8b0e

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Multicall

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 11 : Multicall.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "contracts/interfaces/ITOKEN.sol";
import "contracts/interfaces/IVTOKEN.sol";
import "contracts/interfaces/IVTOKENRewarder.sol";
import "contracts/interfaces/IMinter.sol";
import "contracts/interfaces/IGauge.sol";
import "contracts/interfaces/IBribe.sol";
import "contracts/interfaces/IVoter.sol";
import "contracts/interfaces/IPlugin.sol";

interface IChainlinkOracle {
    function latestAnswer() external view returns (uint256);
}

interface IPythOracle {
    struct Price {
        int64 price;
        uint64 conf;
        int32 expo;
        uint256 publishTime;
    }
    function getPriceUnsafe(bytes32 id) external view returns (Price memory price);
}

contract Multicall {

    /*===================================================================*/
    /*===========================  SETTINGS  ============================*/

    address public constant ORACLE = 0x2880aB155794e7179c9eE2e38200202908C17B43;
    bytes32 public constant FEED_ID = 0xb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc;

    /*===========================  END SETTINGS  ========================*/
    /*===================================================================*/

    /*----------  CONSTANTS  --------------------------------------------*/

    uint256 public constant DIVISOR = 10000;
    uint256 public constant PRECISION = 1e18;

    /*----------  STATE VARIABLES  --------------------------------------*/

    address public immutable voter;
    address public immutable BASE;
    address public immutable TOKEN;
    address public immutable OTOKEN;
    address public immutable VTOKEN;
    address public immutable rewarder;

    uint256 public immutable FEE;

    struct SwapCard {
        uint256 frBASE;
        uint256 mrvBASE;
        uint256 mrrBASE;
        uint256 mrrTOKEN;
        uint256 marketMaxTOKEN;
    }

    struct BondingCurve {
        uint256 priceBASE;              // C1
        uint256 priceTOKEN;             // C2
        uint256 priceOTOKEN;            // C3
        uint256 maxMarketSell;          // C4

        uint256 tvl;                    // C5
        uint256 supplyTOKEN;            // C6
        uint256 supplyVTOKEN;           // C7
        uint256 apr;                    // C8
        uint256 ltv;                    // C9
        uint256 marketCap;              // C10
        uint256 weekly;                 // C11

        uint256 accountBASE;            // C12
        uint256 accountTOKEN;           // C13
        uint256 accountOTOKEN;          // C14

        uint256 accountEarnedBASE;      // C15
        uint256 accountEarnedTOKEN;     // C16    
        uint256 accountEarnedOTOKEN;    // C17 

        uint256 accountVTOKEN;          // C18
        uint256 accountVotingPower;     // C19
        uint256 accountUsedWeights;     // C20

        uint256 accountBorrowCredit;    // C21
        uint256 accountBorrowDebt;      // C22
        uint256 accountMaxWithdraw;     // C23         

        uint256 accountLastVoted;       // C24

    }

    struct GaugeCard {
        address plugin;                     // G1
        address underlying;                 // G2
        uint8 underlyingDecimals;           // G3

        address gauge;                      // G4
        bool isAlive;                       // G5

        string protocol;                    // G6
        string symbol;                      // G7
        address[] tokensInUnderlying;       // G8

        uint256 priceBase;                  // G9
        uint256 priceOTOKEN;                // G10

        uint256 rewardPerToken;             // G11
        uint256 rewardPerTokenUSD;          // G12
        uint256 votingWeight;               // G13
        uint256 totalSupply;                // G14

        uint256 accountUnderlyingBalance;   // G15
        uint256 accountStakedBalance;       // G16
        uint256 accountEarnedOTOKEN;        // G17
    }

    struct BribeCard {
        address plugin;                 // B1
        address bribe;                  // B2
        bool isAlive;                   // B3

        string protocol;                // B4
        string symbol;                  // B5

        address[] rewardTokens;         // B6
        uint8[] rewardTokenDecimals;    // B7
        uint256[] rewardsPerToken;      // B8
        uint256[] accountRewardsEarned; // B9

        uint256 voteWeight;             // B10
        uint256 votePercent;            // B11

        uint256 accountVote;            // B12
    }

    struct Portfolio {
        uint256 total;
        uint256 stakingRewards;
        uint256 farmingRewards;
    }

    /*----------  FUNCTIONS  --------------------------------------------*/

    constructor(
        address _voter,
        address _BASE,
        address _TOKEN,
        address _OTOKEN,
        address _VTOKEN,
        address _rewarder
    ) {
        voter = _voter;
        BASE = _BASE;
        TOKEN = _TOKEN;
        OTOKEN = _OTOKEN;
        VTOKEN = _VTOKEN;
        rewarder = _rewarder;

        FEE = ITOKEN(TOKEN).PROTOCOL_FEE();
    }

    /*----------  VIEW FUNCTIONS  ---------------------------------------*/

    function getBasePrice() public view returns (uint256) {
        if (ORACLE == address(0)) {
            return 1e18;
        } else if (FEED_ID == 0x0) {
            return IChainlinkOracle(ORACLE).latestAnswer() * 1e18 / 1e8;
        } else {
            int64 price = IPythOracle(ORACLE).getPriceUnsafe(FEED_ID).price;
            return uint256(int256(price)) * 1e18 / 1e8;  
        }
    }

    function swapCardData() external view returns (SwapCard memory swapCard) {
        swapCard.frBASE = ITOKEN(TOKEN).frBASE();
        swapCard.mrvBASE = ITOKEN(TOKEN).mrvBASE();
        swapCard.mrrBASE = ITOKEN(TOKEN).mrrBASE();
        swapCard.mrrTOKEN = ITOKEN(TOKEN).mrrTOKEN();
        swapCard.marketMaxTOKEN = ITOKEN(TOKEN).mrvBASE();

        return swapCard;
    }

    function bondingCurveData(address account) external view returns (BondingCurve memory bondingCurve) {
        bondingCurve.priceBASE = getBasePrice();
        bondingCurve.priceTOKEN = ITOKEN(TOKEN).getMarketPrice() * bondingCurve.priceBASE / 1e18;
        bondingCurve.priceOTOKEN = ITOKEN(TOKEN).getOTokenPrice() * bondingCurve.priceBASE / 1e18;
        bondingCurve.maxMarketSell = ITOKEN(TOKEN).getMaxSell();

        bondingCurve.tvl = ITOKEN(TOKEN).getTotalValueLocked() * bondingCurve.priceBASE / 1e18;
        bondingCurve.supplyTOKEN = IERC20(TOKEN).totalSupply();
        bondingCurve.supplyVTOKEN = IVTOKEN(VTOKEN).totalSupplyTOKEN();
        bondingCurve.apr = bondingCurve.supplyVTOKEN == 0 ? 0 : (((IVTOKENRewarder(rewarder).getRewardForDuration(BASE) * bondingCurve.priceBASE / 1e18) + (IVTOKENRewarder(rewarder).getRewardForDuration(TOKEN) * bondingCurve.priceTOKEN / 1e18) + 
                           (IVTOKENRewarder(rewarder).getRewardForDuration(OTOKEN) * bondingCurve.priceOTOKEN / 1e18)) * 365 * 100 * 1e18 / (7 * IERC20(VTOKEN).totalSupply() * bondingCurve.priceTOKEN / 1e18));
        bondingCurve.ltv = 100 * ITOKEN(TOKEN).getFloorPrice() * 1e18 / ITOKEN(TOKEN).getMarketPrice();
        bondingCurve.marketCap = bondingCurve.supplyTOKEN * bondingCurve.priceTOKEN / 1e18;
        bondingCurve.weekly = IMinter(IVoter(voter).minter()).weekly();

        bondingCurve.accountBASE = (account == address(0) ? 0 : IERC20(BASE).balanceOf(account));
        bondingCurve.accountTOKEN = (account == address(0) ? 0 : IERC20(TOKEN).balanceOf(account));
        bondingCurve.accountOTOKEN = (account == address(0) ? 0 : IERC20(OTOKEN).balanceOf(account));

        bondingCurve.accountEarnedBASE = (account == address(0) ? 0 : IVTOKENRewarder(rewarder).earned(account, BASE));
        bondingCurve.accountEarnedTOKEN = (account == address(0) ? 0 : IVTOKENRewarder(rewarder).earned(account, TOKEN));
        bondingCurve.accountEarnedOTOKEN = (account == address(0) ? 0 : IVTOKENRewarder(rewarder).earned(account, OTOKEN));

        bondingCurve.accountVTOKEN = (account == address(0) ? 0 : IVTOKEN(VTOKEN).balanceOfTOKEN(account));
        bondingCurve.accountVotingPower = (account == address(0) ? 0 : IERC20(VTOKEN).balanceOf(account));
        bondingCurve.accountUsedWeights = (account == address(0) ? 0 : IVoter(voter).usedWeights(account));

        bondingCurve.accountBorrowCredit = (account == address(0) ? 0 : ITOKEN(TOKEN).getAccountCredit(account));
        bondingCurve.accountBorrowDebt = (account == address(0) ? 0 : ITOKEN(TOKEN).debts(account));
        bondingCurve.accountMaxWithdraw = (account == address(0) ? 0 : (IVoter(voter).usedWeights(account) > 0 ? 0 : bondingCurve.accountVTOKEN - bondingCurve.accountBorrowDebt));

        bondingCurve.accountLastVoted = (account == address(0) ? 0 : IVoter(voter).lastVoted(account));

        return bondingCurve;
    }

    function gaugeCardData(address plugin, address account) public view returns (GaugeCard memory gaugeCard) {
        gaugeCard.plugin = plugin;
        gaugeCard.underlying = IPlugin(plugin).getUnderlyingAddress();
        gaugeCard.underlyingDecimals = IPlugin(plugin).getUnderlyingDecimals();

        gaugeCard.gauge = IVoter(voter).gauges(plugin);
        gaugeCard.isAlive = IVoter(voter).isAlive(gaugeCard.gauge);
        
        gaugeCard.protocol = IPlugin(plugin).getProtocol();
        gaugeCard.symbol = IPlugin(plugin).getUnderlyingSymbol();
        gaugeCard.tokensInUnderlying = IPlugin(plugin).getTokensInUnderlying();

        gaugeCard.priceBase = getBasePrice();
        gaugeCard.priceOTOKEN = ITOKEN(TOKEN).getOTokenPrice() * (gaugeCard.priceBase) / 1e18;
        
        gaugeCard.rewardPerToken = IGauge(gaugeCard.gauge).totalSupply() == 0 ? 0 : (IGauge(IVoter(voter).gauges(plugin)).getRewardForDuration(OTOKEN) * 1e18 / IGauge(gaugeCard.gauge).totalSupply());
        gaugeCard.rewardPerTokenUSD = IGauge(gaugeCard.gauge).totalSupply() == 0 ? 0 : (IGauge(IVoter(voter).gauges(plugin)).getRewardForDuration(OTOKEN) * gaugeCard.priceOTOKEN / IGauge(gaugeCard.gauge).totalSupply());
        gaugeCard.votingWeight = (IVoter(voter).totalWeight() == 0 ? 0 : 100 * IVoter(voter).weights(plugin) * 1e18 / IVoter(voter).totalWeight());
        gaugeCard.totalSupply = IGauge(gaugeCard.gauge).totalSupply();

        gaugeCard.accountUnderlyingBalance = (account == address(0) ? 0 : IERC20(gaugeCard.underlying).balanceOf(account));
        gaugeCard.accountStakedBalance = (account == address(0) ? 0 : IPlugin(plugin).balanceOf(account));
        gaugeCard.accountEarnedOTOKEN = (account == address(0) ? 0 : IGauge(IVoter(voter).gauges(plugin)).earned(account, OTOKEN));

        return gaugeCard;
    }

    function bribeCardData(address plugin, address account) public view returns (BribeCard memory bribeCard) {
        bribeCard.plugin = plugin;
        bribeCard.bribe = IVoter(voter).bribes(plugin);
        bribeCard.isAlive = IVoter(voter).isAlive(IVoter(voter).gauges(plugin));

        bribeCard.protocol = IPlugin(plugin).getProtocol();
        bribeCard.symbol = IPlugin(plugin).getUnderlyingSymbol();
        bribeCard.rewardTokens = IBribe(IVoter(voter).bribes(plugin)).getRewardTokens();

        uint8[] memory _rewardTokenDecimals = new uint8[](bribeCard.rewardTokens.length);
        for (uint i = 0; i < bribeCard.rewardTokens.length; i++) {
            _rewardTokenDecimals[i] = IERC20Metadata(bribeCard.rewardTokens[i]).decimals();
        }
        bribeCard.rewardTokenDecimals = _rewardTokenDecimals;

        uint[] memory _rewardsPerToken = new uint[](bribeCard.rewardTokens.length);
        for (uint i = 0; i < bribeCard.rewardTokens.length; i++) {
            _rewardsPerToken[i] = (IBribe(bribeCard.bribe).totalSupply() == 0 ? 0 : IBribe(bribeCard.bribe).getRewardForDuration(bribeCard.rewardTokens[i]) * 1e18 / IBribe(bribeCard.bribe).totalSupply());
        }
        bribeCard.rewardsPerToken = _rewardsPerToken;

        uint[] memory _accountRewardsEarned = new uint[](bribeCard.rewardTokens.length);
        for (uint i = 0; i < bribeCard.rewardTokens.length; i++) {
            _accountRewardsEarned[i] = (account == address(0) ? 0 : IBribe(IVoter(voter).bribes(plugin)).earned(account, bribeCard.rewardTokens[i]));
        }
        bribeCard.accountRewardsEarned = _accountRewardsEarned;

        bribeCard.voteWeight = IVoter(voter).weights(plugin);
        bribeCard.votePercent = (IVoter(voter).totalWeight() == 0 ? 0 : 100 * IVoter(voter).weights(plugin) * 1e18 / IVoter(voter).totalWeight());

        bribeCard.accountVote = (account == address(0) ? 0 : IBribe(bribeCard.bribe).balanceOf(account));

        return bribeCard;
    }

    function getGaugeCards(uint256 start, uint256 stop, address account) external view returns (GaugeCard[] memory) {
        GaugeCard[] memory gaugeCards = new GaugeCard[](stop - start);
        for (uint i = start; i < stop; i++) {
            gaugeCards[i] = gaugeCardData(getPlugin(i), account);
        }
        return gaugeCards;
    }

    function getBribeCards(uint256 start, uint256 stop, address account) external view returns (BribeCard[] memory) {
        BribeCard[] memory bribeCards = new BribeCard[](stop - start);
        for (uint i = start; i < stop; i++) {
            bribeCards[i] = bribeCardData(getPlugin(i), account);
        }
        return bribeCards;
    }

    function getPlugins() external view returns (address[] memory) {
        return IVoter(voter).getPlugins();
    }

    function getPlugin(uint256 index) public view returns (address) {
        return IVoter(voter).plugins(index);
    }

    function quoteBuyIn(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) {
        uint256 feeBASE = input * FEE / DIVISOR;
        uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE();
        uint256 newMrBASE = oldMrBASE + input - feeBASE;
        uint256 oldMrTOKEN = ITOKEN(TOKEN).mrrTOKEN();
        output = oldMrTOKEN - (oldMrBASE * oldMrTOKEN / newMrBASE);
        slippage = 100 * (1e18 - (output * ITOKEN(TOKEN).getMarketPrice() / input));
        minOutput = (input * 1e18 / ITOKEN(TOKEN).getMarketPrice()) * slippageTolerance / DIVISOR;
        autoMinOutput = (input * 1e18 / ITOKEN(TOKEN).getMarketPrice()) * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18);
    }

    function quoteBuyOut(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) {
        uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE();
        output = DIVISOR * ((oldMrBASE * ITOKEN(TOKEN).mrrTOKEN() / (ITOKEN(TOKEN).mrrTOKEN() - input)) - oldMrBASE) / (DIVISOR - FEE);
        slippage = 100 * (1e18 - (input * ITOKEN(TOKEN).getMarketPrice() / output));
        minOutput = input * slippageTolerance / DIVISOR;
        autoMinOutput = input * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18);
    }

    function quoteSellIn(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) {
        uint256 feeTOKEN = input * FEE / DIVISOR;
        uint256 oldMrTOKEN = ITOKEN(TOKEN).mrrTOKEN();
        uint256 newMrTOKEN = oldMrTOKEN + input - feeTOKEN;
        if (newMrTOKEN > ITOKEN(TOKEN).mrvBASE()) {
            return (0, 0, 0, 0);
        }

        uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE();
        output = oldMrBASE - (oldMrBASE * oldMrTOKEN / newMrTOKEN);
        slippage = 100 * (1e18 - (output * 1e18 / (input * ITOKEN(TOKEN).getMarketPrice() / 1e18)));
        minOutput = input * ITOKEN(TOKEN).getMarketPrice() /1e18 * slippageTolerance / DIVISOR;
        autoMinOutput = input * ITOKEN(TOKEN).getMarketPrice() /1e18 * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18);
    }

    function quoteSellOut(uint256 input, uint256 slippageTolerance) external view returns (uint256 output, uint256 slippage, uint256 minOutput, uint256 autoMinOutput) {
        uint256 oldMrBASE = ITOKEN(TOKEN).mrvBASE() + ITOKEN(TOKEN).mrrBASE();
        output = DIVISOR * ((oldMrBASE * ITOKEN(TOKEN).mrrTOKEN() / (oldMrBASE - input)) - ITOKEN(TOKEN).mrrTOKEN()) / (DIVISOR - FEE);
        if (output + ITOKEN(TOKEN).mrrTOKEN() > ITOKEN(TOKEN).mrvBASE()) {
            return (0, 0, 0, 0);
        }
        slippage = 100 * (1e18 - (input * 1e18 / (output * ITOKEN(TOKEN).getMarketPrice() / 1e18)));
        minOutput = input * slippageTolerance / DIVISOR;
        autoMinOutput = input * ((DIVISOR * 1e18) - ((slippage + 1e18) * 100)) / (DIVISOR * 1e18);
    }

    function portfolioData(address account) external view returns (Portfolio memory portfolio) {
        uint256 priceBASE = getBasePrice();

        portfolio.total = (account == address(0) ? 0 : priceBASE * ((IERC20(BASE).balanceOf(account)) 
            + ((IERC20(TOKEN).balanceOf(account) + IVTOKEN(VTOKEN).balanceOfTOKEN(account)) * ITOKEN(TOKEN).getMarketPrice() / 1e18) 
            + (IERC20(OTOKEN).balanceOf(account) * ITOKEN(TOKEN).getOTokenPrice() / 1e18)) / 1e18);

        portfolio.stakingRewards = (account == address(0) ? 0 : priceBASE * (IVTOKENRewarder(rewarder).getRewardForDuration(BASE)
            + (IVTOKENRewarder(rewarder).getRewardForDuration(TOKEN) * ITOKEN(TOKEN).getMarketPrice() / 1e18)
            + (IVTOKENRewarder(rewarder).getRewardForDuration(OTOKEN) * ITOKEN(TOKEN).getOTokenPrice() / 1e18)) / 1e18
            * IERC20(VTOKEN).balanceOf(account) / IERC20(VTOKEN).totalSupply());

        address[] memory plugins = IVoter(voter).getPlugins();
        uint256 rewardsOTOKEN = 0;
        for (uint i = 0; i < plugins.length; i++) {
            address gauge = IVoter(voter).gauges(plugins[i]);
            if (IPlugin(plugins[i]).balanceOf(account) > 0) {
                rewardsOTOKEN += (IGauge(gauge).getRewardForDuration(OTOKEN) * IGauge(gauge).balanceOf(account) / IGauge(gauge).totalSupply());
            }
        }

        portfolio.farmingRewards = rewardsOTOKEN * ITOKEN(TOKEN).getOTokenPrice() * priceBASE / 1e36;
        
        return portfolio;
    }

}

File 2 of 11 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 3 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

File 4 of 11 : IBribe.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IBribe {
    /*----------  FUNCTIONS  --------------------------------------------*/
    function getReward(address account) external;
    function notifyRewardAmount(address token, uint amount) external;
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    function _deposit(uint amount, address account) external;
    function _withdraw(uint amount, address account) external;
    function addReward(address rewardToken) external;
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function rewardPerToken(address reward) external view returns (uint);
    function getRewardForDuration(address reward) external view returns (uint);
    function left(address reward) external view returns (uint);
    function earned(address account, address reward) external view returns (uint);
    function getRewardTokens() external view returns (address[] memory);
    function DURATION() external view returns (uint);
    function isRewardToken(address token) external view returns (bool);
}

File 5 of 11 : IGauge.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IGauge {
    /*----------  FUNCTIONS  --------------------------------------------*/
    function getReward(address account) external;
    function notifyRewardAmount(address token, uint amount) external;
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    function _deposit(address account, uint256 amount) external;
    function _withdraw(address account, uint256 amount) external;
    function addReward(address rewardToken) external;
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function rewardPerToken(address reward) external view returns (uint);
    function getRewardForDuration(address reward) external view returns (uint);
    function earned(address account, address reward) external view returns (uint);
    function left(address token) external view returns (uint);
}

File 6 of 11 : IMinter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IMinter {
    /*----------  FUNCTIONS  --------------------------------------------*/
    function update_period() external returns (uint256);
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function team() external view returns (address);
    function weekly() external view returns (uint256);
}

File 7 of 11 : IPlugin.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IPlugin {
    /*----------  FUNCTIONS  --------------------------------------------*/
    function claimAndDistribute() external;
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    function setGauge(address gauge) external;
    function setBribe(address bribe) external;
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function getUnderlyingName() external view returns (string memory);
    function getUnderlyingSymbol() external view returns (string memory);
    function getUnderlyingAddress() external view returns (address);
    function getProtocol() external view returns (string memory);
    function getTokensInUnderlying() external view returns (address[] memory);
    function getBribeTokens() external view returns (address[] memory);
    function getUnderlyingDecimals() external view returns (uint8);
}

File 8 of 11 : ITOKEN.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface ITOKEN {
    /*----------  FUNCTIONS  --------------------------------------------*/
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function BASE() external view returns (address);
    function OTOKEN() external view returns (address);
    function VTOKEN() external view returns (address);
    function totalSupply() external view returns (uint256);
    function frBASE() external view returns (uint256);
    function mrvBASE() external view returns (uint256);
    function mrrBASE() external view returns (uint256);
    function mrrTOKEN() external view returns (uint256);
    function getFloorPrice() external view returns (uint256);
    function getMaxSell() external view returns (uint256);
    function getMarketPrice() external view returns (uint256);
    function getOTokenPrice() external view returns (uint256);
    function getTotalValueLocked() external view returns (uint256);
    function getAccountCredit(address account) external view returns (uint256) ;
    function debts(address account) external view returns (uint256);
    function FEES() external view returns (address);
    function PROTOCOL_FEE() external view returns (uint256);
    function DIVISOR() external view returns (uint256);
    function PRECISION() external view returns (uint256);
}

File 9 of 11 : IVoter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IVoter {
    /*----------  FUNCTIONS  --------------------------------------------*/
    function distribute(address _gauge) external;
    function emitDeposit(address account, uint amount) external;
    function emitWithdraw(address account, uint amount) external;
    function notifyRewardAmount(uint amount) external;
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function OTOKEN() external view returns (address);
    function plugins(uint256 index) external view returns (address);
    function getPlugins() external view returns (address[] memory);
    function gauges(address pool) external view returns (address);
    function bribes(address pool) external view returns (address);
    function isAlive(address gauge) external view returns (bool);
    function usedWeights(address account) external view returns (uint256);
    function weights(address pool) external view returns (uint256);
    function totalWeight() external view returns (uint256);
    function votes(address account, address pool) external view returns (uint256);
    function lastVoted(address account) external view returns (uint256);
    function minter() external view returns (address);
}

File 10 of 11 : IVTOKEN.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IVTOKEN {
    /*----------  FUNCTIONS  --------------------------------------------*/
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function OTOKEN() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function balanceOfTOKEN(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function totalSupplyTOKEN() external view returns (uint256);
}

File 11 of 11 : IVTOKENRewarder.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

interface IVTOKENRewarder {
    /*----------  FUNCTIONS  --------------------------------------------*/
    function balanceOf(address account) external view returns (uint256);
    function notifyRewardAmount(address token, uint amount) external;
    /*----------  RESTRICTED FUNCTIONS  ---------------------------------*/
    function _deposit(uint amount, address account) external;
    function _withdraw(uint amount, address account) external;
    function addReward(address rewardToken) external;
    /*----------  VIEW FUNCTIONS  ---------------------------------------*/
    function rewardPerToken(address _rewardsToken) external view returns (uint256);
    function getRewardForDuration(address reward) external view returns (uint);
    function earned(address account, address _rewardsToken) external view returns (uint256);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200,
    "details": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_voter","type":"address"},{"internalType":"address","name":"_BASE","type":"address"},{"internalType":"address","name":"_TOKEN","type":"address"},{"internalType":"address","name":"_OTOKEN","type":"address"},{"internalType":"address","name":"_VTOKEN","type":"address"},{"internalType":"address","name":"_rewarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEED_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VTOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"bondingCurveData","outputs":[{"components":[{"internalType":"uint256","name":"priceBASE","type":"uint256"},{"internalType":"uint256","name":"priceTOKEN","type":"uint256"},{"internalType":"uint256","name":"priceOTOKEN","type":"uint256"},{"internalType":"uint256","name":"maxMarketSell","type":"uint256"},{"internalType":"uint256","name":"tvl","type":"uint256"},{"internalType":"uint256","name":"supplyTOKEN","type":"uint256"},{"internalType":"uint256","name":"supplyVTOKEN","type":"uint256"},{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"ltv","type":"uint256"},{"internalType":"uint256","name":"marketCap","type":"uint256"},{"internalType":"uint256","name":"weekly","type":"uint256"},{"internalType":"uint256","name":"accountBASE","type":"uint256"},{"internalType":"uint256","name":"accountTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountOTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountEarnedBASE","type":"uint256"},{"internalType":"uint256","name":"accountEarnedTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountEarnedOTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountVTOKEN","type":"uint256"},{"internalType":"uint256","name":"accountVotingPower","type":"uint256"},{"internalType":"uint256","name":"accountUsedWeights","type":"uint256"},{"internalType":"uint256","name":"accountBorrowCredit","type":"uint256"},{"internalType":"uint256","name":"accountBorrowDebt","type":"uint256"},{"internalType":"uint256","name":"accountMaxWithdraw","type":"uint256"},{"internalType":"uint256","name":"accountLastVoted","type":"uint256"}],"internalType":"struct Multicall.BondingCurve","name":"bondingCurve","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"bribeCardData","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"bribe","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint8[]","name":"rewardTokenDecimals","type":"uint8[]"},{"internalType":"uint256[]","name":"rewardsPerToken","type":"uint256[]"},{"internalType":"uint256[]","name":"accountRewardsEarned","type":"uint256[]"},{"internalType":"uint256","name":"voteWeight","type":"uint256"},{"internalType":"uint256","name":"votePercent","type":"uint256"},{"internalType":"uint256","name":"accountVote","type":"uint256"}],"internalType":"struct Multicall.BribeCard","name":"bribeCard","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"gaugeCardData","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"underlyingDecimals","type":"uint8"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"tokensInUnderlying","type":"address[]"},{"internalType":"uint256","name":"priceBase","type":"uint256"},{"internalType":"uint256","name":"priceOTOKEN","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenUSD","type":"uint256"},{"internalType":"uint256","name":"votingWeight","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"accountUnderlyingBalance","type":"uint256"},{"internalType":"uint256","name":"accountStakedBalance","type":"uint256"},{"internalType":"uint256","name":"accountEarnedOTOKEN","type":"uint256"}],"internalType":"struct Multicall.GaugeCard","name":"gaugeCard","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getBribeCards","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"bribe","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint8[]","name":"rewardTokenDecimals","type":"uint8[]"},{"internalType":"uint256[]","name":"rewardsPerToken","type":"uint256[]"},{"internalType":"uint256[]","name":"accountRewardsEarned","type":"uint256[]"},{"internalType":"uint256","name":"voteWeight","type":"uint256"},{"internalType":"uint256","name":"votePercent","type":"uint256"},{"internalType":"uint256","name":"accountVote","type":"uint256"}],"internalType":"struct Multicall.BribeCard[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"getGaugeCards","outputs":[{"components":[{"internalType":"address","name":"plugin","type":"address"},{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"underlyingDecimals","type":"uint8"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"bool","name":"isAlive","type":"bool"},{"internalType":"string","name":"protocol","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"tokensInUnderlying","type":"address[]"},{"internalType":"uint256","name":"priceBase","type":"uint256"},{"internalType":"uint256","name":"priceOTOKEN","type":"uint256"},{"internalType":"uint256","name":"rewardPerToken","type":"uint256"},{"internalType":"uint256","name":"rewardPerTokenUSD","type":"uint256"},{"internalType":"uint256","name":"votingWeight","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"accountUnderlyingBalance","type":"uint256"},{"internalType":"uint256","name":"accountStakedBalance","type":"uint256"},{"internalType":"uint256","name":"accountEarnedOTOKEN","type":"uint256"}],"internalType":"struct Multicall.GaugeCard[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPlugin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlugins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"portfolioData","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"stakingRewards","type":"uint256"},{"internalType":"uint256","name":"farmingRewards","type":"uint256"}],"internalType":"struct Multicall.Portfolio","name":"portfolio","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteBuyIn","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteBuyOut","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteSellIn","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"input","type":"uint256"},{"internalType":"uint256","name":"slippageTolerance","type":"uint256"}],"name":"quoteSellOut","outputs":[{"internalType":"uint256","name":"output","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"minOutput","type":"uint256"},{"internalType":"uint256","name":"autoMinOutput","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapCardData","outputs":[{"components":[{"internalType":"uint256","name":"frBASE","type":"uint256"},{"internalType":"uint256","name":"mrvBASE","type":"uint256"},{"internalType":"uint256","name":"mrrBASE","type":"uint256"},{"internalType":"uint256","name":"mrrTOKEN","type":"uint256"},{"internalType":"uint256","name":"marketMaxTOKEN","type":"uint256"}],"internalType":"struct Multicall.SwapCard","name":"swapCard","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6101606040523480156200001257600080fd5b50604051620064dc380380620064dc8339810160408190526200003591620000f5565b6001600160a01b0380871660805285811660a05284811660c081905284821660e052838216610100529082166101205260408051630b4501fd60e01b81529051630b4501fd916004808201926020929091908290030181865afa158015620000a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c7919062000176565b610140525062000190945050505050565b80516001600160a01b0381168114620000f057600080fd5b919050565b60008060008060008060c087890312156200010f57600080fd5b6200011a87620000d8565b95506200012a60208801620000d8565b94506200013a60408801620000d8565b93506200014a60608801620000d8565b92506200015a60808801620000d8565b91506200016a60a08801620000d8565b90509295509295509295565b6000602082840312156200018957600080fd5b5051919050565b60805160a05160c05160e051610100516101205161014051615ffd620004df6000396000818161051e01528181613ffe015281816144b001528181614a04015261543c01526000818161055801528181611821015281816118f1015281816119be01528181611f2d01528181611ffc015281816120cb01528181612bc301528181612d0c0152612dca0152600081816105a6015281816116970152818161173301528181612172015281816122190152818161280f015281816129ef0152612a8e0152600081816104f701528181610b6c01528181610d8701528181611226015281816117ee01528181611e5e015281816120a3015281816126e601528181612b9b01526131450152600081816104210152818161095d0152818161138901528181611436015281816114d40152818161156d0152818161160c015281816118be01528181611a9901528181611b1b01528181611db701528181611fd4015281816123650152818161240c01528181612648015281816127700152818161289901528181612b0501528181612c4d01528181612ce40152818161320001528181613eeb01528181613f6d01528181614027015281816140b30152818161416b015281816141ed0152818161429c015281816144e50152818161458201528181614623015281816146a50152818161475d0152818161483b0152818161493f01528181614a3901528181614abb01528181614b6401528181614c0a01528181614cc301528181614dc601528181614e8c01528181614f1701528181614fa20152818161502d015281816150b801528181615329015281816153ab01528181615467015281816154f301526155ac01526000818161057f0152818161198b01528181611d1001528181611f05015281816129410152612da2015260008181610387015281816106e40152818161077801528181610aea01528181610d0501528181610e2401528181610eab01528181610f4a0152818161119c01528181611bfb015281816122bf015281816124b50152818161257f01528181612e8601528181612f1d015281816132d80152818161336c01528181613550015281816139ed01528181613b5701528181613bce01528181613c5501528181613cf40152818161514401526151e60152615ffd6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806384e883ef116100de578063b49f4afd11610097578063d91b996211610071578063d91b996214610540578063dcc3e06e14610553578063ec342ad01461057a578063fb548427146105a157600080fd5b8063b49f4afd146104ea578063c544df0c146104f2578063c57981b51461051957600080fd5b806384e883ef1461044357806389b96d4d146104565780639736f34814610469578063a2d869b2146104b3578063aaf5eb68146104c8578063b322706b146104d757600080fd5b806338013f021161013057806338013f021461034f57806346c96aac14610382578063668be7f0146103a95780637a12e531146103c95780637c72adf1146103fc57806382bfefc81461041c57600080fd5b806301d61c49146101785780630bf5f590146101b25780630d66951c146101d25780631ffbacb7146102f1578063235052d6146103265780633410fe6e14610346575b600080fd5b61019f7fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc81565b6040519081526020015b60405180910390f35b6101c56101c0366004615767565b6105c8565b6040516101a9919061595f565b6101e56101e0366004615979565b6112b0565b6040516101a99190815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e08083015190820152610200808301519082015261022080830151908201526102408083015190820152610260808301519082015261028080830151908201526102a080830151908201526102c080830151908201526102e091820151918101919091526103000190565b6103046102ff366004615979565b6125fd565b60408051825181526020808401519082015291810151908201526060016101a9565b610339610334366004615767565b6132ab565b6040516101a99190615b02565b61019f61271081565b61036a732880ab155794e7179c9ee2e38200202908c17b4381565b6040516001600160a01b0390911681526020016101a9565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6103bc6103b7366004615b15565b613e2a565b6040516101a99190615b4e565b6103dc6103d7366004615bb0565b613ee1565b6040805194855260208501939093529183015260608201526080016101a9565b61040f61040a366004615b15565b6143f4565b6040516101a99190615bd2565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6103dc610451366004615bb0565b6144a2565b6103dc610464366004615bb0565b6149f6565b610471614e58565b6040516101a99190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b6104bb615140565b6040516101a99190615c27565b61019f670de0b6b3a764000081565b61036a6104e5366004615c74565b6151cd565b61019f615259565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61019f7f000000000000000000000000000000000000000000000000000000000000000081565b6103dc61054e366004615bb0565b61531f565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6105d0615636565b6001600160a01b03831680825260408051634453434160e11b815290516388a68682916004808201926020929091908290030181865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190615c8d565b81602001906001600160a01b031690816001600160a01b031681525050826001600160a01b03166392081a476040518163ffffffff1660e01b8152600401602060405180830381865afa158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190615caa565b60ff166040828101919091525163b9a09fd560e01b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190615c8d565b6001600160a01b0390811660608301819052604051631703e5f960e01b815260048101919091527f000000000000000000000000000000000000000000000000000000000000000090911690631703e5f990602401602060405180830381865afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190615ccd565b151560808201526040805163d16352af60e01b815290516001600160a01b0385169163d16352af9160048083019260009291908290030181865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108599190810190615d36565b8160a00181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa15801561089f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c79190810190615d36565b8160c00181905250826001600160a01b031663b1942b166040518163ffffffff1660e01b8152600401600060405180830381865afa15801561090d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109359190810190615dc1565b60e0820152610942615259565b81610100018181525050670de0b6b3a76400008161010001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190615e73565b6109e69190615ea2565b6109f09190615eb9565b8161012001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190615e73565b15610c025780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190615e73565b60405163b9a09fd560e01b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b559190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919091169063bcd1101490602401602060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190615e73565b610bf390670de0b6b3a7640000615ea2565b610bfd9190615eb9565b610c05565b60005b8161014001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c759190615e73565b15610e155780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190615e73565b61012082015160405163b9a09fd560e01b81526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa158015610d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d709190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152919091169063bcd1101490602401602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc9190615e73565b610e069190615ea2565b610e109190615eb9565b610e18565b60005b816101600181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190615e73565b15610fe1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190615e73565b6040516353e5642360e11b81526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a7cac84690602401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615e73565b610fc0906064615ea2565b610fd290670de0b6b3a7640000615ea2565b610fdc9190615eb9565b610fe4565b60005b8161018001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190615e73565b6101a08201526001600160a01b038216156110de5760208101516040516370a0823160e01b81526001600160a01b038481166004830152909116906370a0823190602401602060405180830381865afa1580156110b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d99190615e73565b6110e1565b60005b6101c08201526001600160a01b03821615611165576040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190615e73565b611168565b60005b6101e08201526001600160a01b038216156112a05760405163b9a09fd560e01b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b9a09fd590602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190615c8d565b60405163211dc32d60e01b81526001600160a01b0384811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830152919091169063211dc32d90604401602060405180830381865afa158015611277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129b9190615e73565b6112a3565b60005b6102008201525b92915050565b6113686040518061030001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611370615259565b816000018181525050670de0b6b3a764000081600001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190615e73565b6114139190615ea2565b61141d9190615eb9565b816020018181525050670de0b6b3a764000081600001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190615e73565b6114bf9190615ea2565b6114c99190615eb9565b8160400181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663466f63116040518163ffffffff1660e01b8152600401602060405180830381865afa158015611530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115549190615e73565b816060018181525050670de0b6b3a764000081600001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b26025aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190615e73565b6115f79190615ea2565b6116019190615eb9565b8160800181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168c9190615e73565b8160a00181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663183c77c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190615e73565b60c0820181905215611a8b57670de0b6b3a764000081602001517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190615e73565b6117be906007615ea2565b6117c89190615ea2565b6117d29190615eb9565b6040828101519051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000092917f00000000000000000000000000000000000000000000000000000000000000009091169063bcd1101490602401602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190615e73565b6118989190615ea2565b6118a29190615eb9565b6020830151604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000092917f00000000000000000000000000000000000000000000000000000000000000009091169063bcd1101490602401602060405180830381865afa15801561193a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195e9190615e73565b6119689190615ea2565b6119729190615eb9565b8351604051632f34440560e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152670de0b6b3a764000092917f00000000000000000000000000000000000000000000000000000000000000009091169063bcd1101490602401602060405180830381865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615e73565b611a359190615ea2565b611a3f9190615eb9565b611a499190615edb565b611a539190615edb565b611a5f9061016d615ea2565b611a6a906064615ea2565b611a7c90670de0b6b3a7640000615ea2565b611a869190615eb9565b611a8e565b60005b8160e00181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b199190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632a33d6b26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b9190615e73565b611ba6906064615ea2565b611bb890670de0b6b3a7640000615ea2565b611bc29190615eb9565b610100820152602081015160a0820151670de0b6b3a764000091611be591615ea2565b611bef9190615eb9565b816101200181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190615c8d565b6001600160a01b03166326cfc17b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615e73565b6101408201526001600160a01b03821615611d80576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190615e73565b611d83565b60005b6101608201526001600160a01b03821615611e27576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190615e73565b611e2a565b60005b6101808201526001600160a01b03821615611ece576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190615e73565b611ed1565b60005b6101a08201526001600160a01b03821615611f9d5760405163211dc32d60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063211dc32d90604401602060405180830381865afa158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190615e73565b611fa0565b60005b6101c08201526001600160a01b0382161561206c5760405163211dc32d60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063211dc32d90604401602060405180830381865afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120679190615e73565b61206f565b60005b6101e08201526001600160a01b0382161561213b5760405163211dc32d60e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063211dc32d90604401602060405180830381865afa158015612112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121369190615e73565b61213e565b60005b6102008201526001600160a01b038216156121e257604051631ef1589960e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690631ef1589990602401602060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd9190615e73565b6121e5565b60005b6102208201526001600160a01b03821615612289576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122849190615e73565b61228c565b60005b6102408201526001600160a01b0382161561232e57604051620be37960e21b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690622f8de490602401602060405180830381865afa158015612305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123299190615e73565b612331565b60005b6102608201526001600160a01b038216156123d557604051634c7ebd3760e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634c7ebd3790602401602060405180830381865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190615e73565b6123d8565b60005b6102808201526001600160a01b0382161561247c57604051632ecd4e7d60e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690632ecd4e7d90602401602060405180830381865afa158015612453573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124779190615e73565b61247f565b60005b6102a08201526001600160a01b0382161561254857604051620be37960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690622f8de490602401602060405180830381865afa1580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125219190615e73565b1161254157806102a0015181610220015161253c9190615eee565b61254b565b600061254b565b60005b6102c08201526001600160a01b038216156125ef57604051639a61df8960e01b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639a61df8990602401602060405180830381865afa1580156125c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ea9190615e73565b6125f2565b60005b6102e0820152919050565b61262160405180606001604052806000815260200160008152602001600081525090565b600061262b615259565b90506001600160a01b038316156129d957670de0b6b3a7640000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c79190615e73565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615e73565b61275b9190615ea2565b6127659190615eb9565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190615e73565b604051631ef1589960e01b81526001600160a01b0388811660048301527f00000000000000000000000000000000000000000000000000000000000000001690631ef1589990602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156128e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129049190615e73565b61290e9190615edb565b6129189190615ea2565b6129229190615eb9565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190615e73565b6129b69190615edb565b6129c09190615edb565b6129ca9083615ea2565b6129d49190615eb9565b6129dc565b60005b82526001600160a01b03831615612e76577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190615e73565b6040516370a0823160e01b81526001600160a01b0385811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015612ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af99190615e73565b670de0b6b3a7640000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190615e73565b604051632f34440560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063bcd1101490602401602060405180830381865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190615e73565b612c389190615ea2565b612c429190615eb9565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccd9190615e73565b604051632f34440560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063bcd1101490602401602060405180830381865afa158015612d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d779190615e73565b612d819190615ea2565b612d8b9190615eb9565b604051632f34440560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063bcd1101490602401602060405180830381865afa158015612e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e359190615e73565b612e3f9190615edb565b612e499190615edb565b612e539085615ea2565b612e5d9190615eb9565b612e679190615ea2565b612e719190615eb9565b612e79565b60005b82602001818152505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa158015612ee2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f0a9190810190615dc1565b90506000805b82518110156131ec5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b9a09fd5858481518110612f5c57612f5c615f01565b60200260200101516040518263ffffffff1660e01b8152600401612f8f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd09190615c8d565b90506000848381518110612fe657612fe6615f01565b60209081029190910101516040516370a0823160e01b81526001600160a01b038a81166004830152909116906370a0823190602401602060405180830381865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190615e73565b11156131d957806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c49190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301528316906370a0823190602401602060405180830381865afa15801561310a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312e9190615e73565b604051632f34440560e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015284169063bcd1101490602401602060405180830381865afa158015613194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b89190615e73565b6131c29190615ea2565b6131cc9190615eb9565b6131d69084615edb565b92505b50806131e481615f17565b915050612f10565b506ec097ce7bc90715b34b9f1000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327f9190615e73565b6132899084615ea2565b6132939190615ea2565b61329d9190615eb9565b604085015250919392505050565b6132b36156da565b6001600160a01b03838116808352604051635462ecad60e11b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000009091169063a8c5d95a90602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615c8d565b6001600160a01b03908116602083015260405163b9a09fd560e01b815284821660048201527f000000000000000000000000000000000000000000000000000000000000000090911690631703e5f990829063b9a09fd590602401602060405180830381865afa1580156133bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e19190615c8d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134499190615ccd565b816040019015159081151581525050826001600160a01b031663d16352af6040518163ffffffff1660e01b8152600401600060405180830381865afa158015613496573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134be9190810190615d36565b8160600181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261352c9190810190615d36565b6080820152604051635462ecad60e11b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8c5d95a90602401602060405180830381865afa158015613597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bb9190615c8d565b6001600160a01b031663c4f59f9b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156135f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136209190810190615dc1565b60a082018190525160009067ffffffffffffffff81111561364357613643615cef565b60405190808252806020026020018201604052801561366c578160200160208202803683370190505b50905060005b8260a0015151811015613734578260a00151818151811061369557613695615f01565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190615caa565b82828151811061371057613710615f01565b60ff909216602092830291909101909101528061372c81615f17565b915050613672565b5060c0820181905260a08201515160009067ffffffffffffffff81111561375d5761375d615cef565b604051908082528060200260200182016040528015613786578160200160208202803683370190505b50905060005b8360a001515181101561395a5783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ff9190615e73565b156139285783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386a9190615e73565b84602001516001600160a01b031663bcd110148660a00151848151811061389357613893615f01565b60200260200101516040518263ffffffff1660e01b81526004016138c691906001600160a01b0391909116815260200190565b602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190615e73565b61391990670de0b6b3a7640000615ea2565b6139239190615eb9565b61392b565b60005b82828151811061393d5761393d615f01565b60209081029190910101528061395281615f17565b91505061378c565b5060e0830181905260a08301515160009067ffffffffffffffff81111561398357613983615cef565b6040519080825280602002602001820160405280156139ac578160200160208202803683370190505b50905060005b8460a0015151811015613b2f576001600160a01b03861615613afd57604051635462ecad60e11b81526001600160a01b0388811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8c5d95a90602401602060405180830381865afa158015613a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a589190615c8d565b6001600160a01b031663211dc32d878760a001518481518110613a7d57613a7d615f01565b60200260200101516040518363ffffffff1660e01b8152600401613ab79291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015613ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af89190615e73565b613b00565b60005b828281518110613b1257613b12615f01565b602090810291909101015280613b2781615f17565b9150506139b2565b5061010084018190526040516353e5642360e11b81526001600160a01b0387811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a7cac84690602401602060405180830381865afa158015613b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc29190615e73565b846101200181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4e9190615e73565b15613d8b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd59190615e73565b6040516353e5642360e11b81526001600160a01b0388811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a7cac84690602401602060405180830381865afa158015613d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5f9190615e73565b613d6a906064615ea2565b613d7c90670de0b6b3a7640000615ea2565b613d869190615eb9565b613d8e565b60005b6101408501526001600160a01b03851615613e185760208401516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa158015613def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e139190615e73565b613e1b565b60005b61016085015250505092915050565b60606000613e388585615eee565b67ffffffffffffffff811115613e5057613e50615cef565b604051908082528060200260200182016040528015613e8957816020015b613e766156da565b815260200190600190039081613e6e5790505b509050845b84811015613ed857613ea8613ea2826151cd565b856132ab565b828281518110613eba57613eba615f01565b60200260200101819052508080613ed090615f17565b915050613e8e565b50949350505050565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f6b9190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fed9190615e73565b613ff79190615edb565b90506140257f0000000000000000000000000000000000000000000000000000000000000000612710615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a79190615e73565b6140b18984615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561410f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141339190615e73565b61413d9085615ea2565b6141479190615eb9565b6141519190615eee565b61415d90612710615ea2565b6141679190615eb9565b94507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141eb9190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061426d9190615e73565b6142779087615edb565b1115614291576000806000809450945094509450506143eb565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431c9190615e73565b6143269087615ea2565b6143309190615eb9565b61434288670de0b6b3a7640000615ea2565b61434c9190615eb9565b61435e90670de0b6b3a7640000615eee565b614369906064615ea2565b93506127106143788789615ea2565b6143829190615eb9565b9250614398612710670de0b6b3a7640000615ea2565b6143aa85670de0b6b3a7640000615edb565b6143b5906064615ea2565b6143c9612710670de0b6b3a7640000615ea2565b6143d39190615eee565b6143dd9089615ea2565b6143e79190615eb9565b9150505b92959194509250565b606060006144028585615eee565b67ffffffffffffffff81111561441a5761441a615cef565b60405190808252806020026020018201604052801561445357816020015b614440615636565b8152602001906001900390816144385790505b509050845b84811015613ed85761447261446c826151cd565b856105c8565b82828151811061448457614484615f01565b6020026020010181905250808061449a90615f17565b915050614458565b6000808080806127106144d57f000000000000000000000000000000000000000000000000000000000000000089615ea2565b6144df9190615eb9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145659190615e73565b90506000826145748a84615edb565b61457e9190615eee565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146029190615e73565b81111561461f5760008060008096509650965096505050506143eb565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa15801561467f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146a39190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147259190615e73565b61472f9190615edb565b90508161473c8483615ea2565b6147469190615eb9565b6147509082615eee565b9750670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147dd9190615e73565b6147e7908c615ea2565b6147f19190615eb9565b61480389670de0b6b3a7640000615ea2565b61480d9190615eb9565b61481f90670de0b6b3a7640000615eee565b61482a906064615ea2565b965061271089670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bb9190615e73565b6148c5908e615ea2565b6148cf9190615eb9565b6148d99190615ea2565b6148e39190615eb9565b95506148f9612710670de0b6b3a7640000615ea2565b61490b88670de0b6b3a7640000615edb565b614916906064615ea2565b61492a612710670de0b6b3a7640000615ea2565b6149349190615eee565b670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561499b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149bf9190615e73565b6149c9908e615ea2565b6149d39190615eb9565b6149dd9190615ea2565b6149e79190615eb9565b94505050505092959194509250565b600080808080612710614a297f000000000000000000000000000000000000000000000000000000000000000089615ea2565b614a339190615eb9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ab99190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b3b9190615e73565b614b459190615edb565b9050600082614b548a84615edb565b614b5e9190615eee565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614be49190615e73565b905081614bf18285615ea2565b614bfb9190615eb9565b614c059082615eee565b9750897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c8a9190615e73565b614c94908a615ea2565b614c9e9190615eb9565b614cb090670de0b6b3a7640000615eee565b614cbb906064615ea2565b9650612710897f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d439190615e73565b614d558d670de0b6b3a7640000615ea2565b614d5f9190615eb9565b614d699190615ea2565b614d739190615eb9565b9550614d89612710670de0b6b3a7640000615ea2565b614d9b88670de0b6b3a7640000615edb565b614da6906064615ea2565b614dba612710670de0b6b3a7640000615ea2565b614dc49190615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e469190615e73565b6149c98d670de0b6b3a7640000615ea2565b614e8a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad6cb8236040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f0c9190615e73565b8160000181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f979190615e73565b8160200181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ffe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150229190615e73565b8160400181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150ad9190615e73565b8160600181815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151389190615e73565b608082015290565b60607f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa1580156151a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526151c89190810190615dc1565b905090565b60405163f0a317eb60e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f0a317eb90602401602060405180830381865afa158015615235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190615c8d565b60006040516396834ad360e01b81527fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc6004820152600090732880ab155794e7179c9ee2e38200202908c17b43906396834ad390602401608060405180830381865afa1580156152cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152f19190615f30565b5190506305f5e10061530f600783900b670de0b6b3a7640000615ea2565b6153199190615eb9565b91505090565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015615385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153a99190615e73565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061542b9190615e73565b6154359190615edb565b90506154637f0000000000000000000000000000000000000000000000000000000000000000612710615eee565b81887f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156154c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e79190615e73565b6154f19190615eee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561554f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155739190615e73565b61557d9085615ea2565b6155879190615eb9565b6155919190615eee565b61559d90612710615ea2565b6155a79190615eb9565b9450847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015615608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061562c9190615e73565b6143429089615ea2565b60405180610220016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff16815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461576457600080fd5b50565b6000806040838503121561577a57600080fd5b82356157858161574f565b915060208301356157958161574f565b809150509250929050565b60005b838110156157bb5781810151838201526020016157a3565b50506000910152565b600081518084526157dc8160208601602086016157a0565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156158295781516001600160a01b031687529582019590820190600101615804565b509495945050505050565b80516001600160a01b031682526000610220602083015161586060208601826001600160a01b03169052565b506040830151615875604086018260ff169052565b50606083015161589060608601826001600160a01b03169052565b5060808301516158a4608086018215159052565b5060a08301518160a08601526158bc828601826157c4565b91505060c083015184820360c08601526158d682826157c4565b91505060e083015184820360e08601526158f082826157f0565b610100858101519087015261012080860151908701526101408086015190870152610160808601519087015261018080860151908701526101a080860151908701526101c080860151908701526101e08086015190870152610200948501519490950193909352509192915050565b6020815260006159726020830184615834565b9392505050565b60006020828403121561598b57600080fd5b81356159728161574f565b600081518084526020808501945080840160005b8381101561582957815160ff16875295820195908201906001016159aa565b600081518084526020808501945080840160005b83811015615829578151875295820195908201906001016159dd565b80516001600160a01b0316825260006101806020830151615a2560208601826001600160a01b03169052565b506040830151615a39604086018215159052565b506060830151816060860152615a51828601826157c4565b91505060808301518482036080860152615a6b82826157c4565b91505060a083015184820360a0860152615a8582826157f0565b91505060c083015184820360c0860152615a9f8282615996565b91505060e083015184820360e0860152615ab982826159c9565b9150506101008084015185830382870152615ad483826159c9565b6101208681015190880152610140808701519088015261016095860151959096019490945250929392505050565b60208152600061597260208301846159f9565b600080600060608486031215615b2a57600080fd5b83359250602084013591506040840135615b438161574f565b809150509250925092565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615b918583516159f9565b94509285019290850190600101615b75565b5092979650505050505050565b60008060408385031215615bc357600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615c15858351615834565b94509285019290850190600101615bf9565b6020808252825182820181905260009190848201906040850190845b81811015615c685783516001600160a01b031683529284019291840191600101615c43565b50909695505050505050565b600060208284031215615c8657600080fd5b5035919050565b600060208284031215615c9f57600080fd5b81516159728161574f565b600060208284031215615cbc57600080fd5b815160ff8116811461597257600080fd5b600060208284031215615cdf57600080fd5b8151801515811461597257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615d2e57615d2e615cef565b604052919050565b600060208284031215615d4857600080fd5b815167ffffffffffffffff80821115615d6057600080fd5b818401915084601f830112615d7457600080fd5b815181811115615d8657615d86615cef565b615d99601f8201601f1916602001615d05565b9150808252856020828501011115615db057600080fd5b613ed88160208401602086016157a0565b60006020808385031215615dd457600080fd5b825167ffffffffffffffff80821115615dec57600080fd5b818501915085601f830112615e0057600080fd5b815181811115615e1257615e12615cef565b8060051b9150615e23848301615d05565b8181529183018401918481019088841115615e3d57600080fd5b938501935b83851015615e675784519250615e578361574f565b8282529385019390850190615e42565b98975050505050505050565b600060208284031215615e8557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112aa576112aa615e8c565b600082615ed657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156112aa576112aa615e8c565b818103818111156112aa576112aa615e8c565b634e487b7160e01b600052603260045260246000fd5b600060018201615f2957615f29615e8c565b5060010190565b600060808284031215615f4257600080fd5b6040516080810167ffffffffffffffff8282108183111715615f6657615f66615cef565b81604052845191508160070b8214615f7d57600080fd5b9082526020840151908082168214615f9457600080fd5b5060208201526040830151600381900b8114615faf57600080fd5b6040820152606092830151928101929092525091905056fea26469706673582212208a89af54be4aff56084fdd166363765ab49416af2a409ac0a103eafa9e3d820a64736f6c63430008130033000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3800000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f20000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806384e883ef116100de578063b49f4afd11610097578063d91b996211610071578063d91b996214610540578063dcc3e06e14610553578063ec342ad01461057a578063fb548427146105a157600080fd5b8063b49f4afd146104ea578063c544df0c146104f2578063c57981b51461051957600080fd5b806384e883ef1461044357806389b96d4d146104565780639736f34814610469578063a2d869b2146104b3578063aaf5eb68146104c8578063b322706b146104d757600080fd5b806338013f021161013057806338013f021461034f57806346c96aac14610382578063668be7f0146103a95780637a12e531146103c95780637c72adf1146103fc57806382bfefc81461041c57600080fd5b806301d61c49146101785780630bf5f590146101b25780630d66951c146101d25780631ffbacb7146102f1578063235052d6146103265780633410fe6e14610346575b600080fd5b61019f7fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc81565b6040519081526020015b60405180910390f35b6101c56101c0366004615767565b6105c8565b6040516101a9919061595f565b6101e56101e0366004615979565b6112b0565b6040516101a99190815181526020808301519082015260408083015190820152606080830151908201526080808301519082015260a0808301519082015260c0808301519082015260e08083015190820152610100808301519082015261012080830151908201526101408083015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526101e08083015190820152610200808301519082015261022080830151908201526102408083015190820152610260808301519082015261028080830151908201526102a080830151908201526102c080830151908201526102e091820151918101919091526103000190565b6103046102ff366004615979565b6125fd565b60408051825181526020808401519082015291810151908201526060016101a9565b610339610334366004615767565b6132ab565b6040516101a99190615b02565b61019f61271081565b61036a732880ab155794e7179c9ee2e38200202908c17b4381565b6040516001600160a01b0390911681526020016101a9565b61036a7f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e81565b6103bc6103b7366004615b15565b613e2a565b6040516101a99190615b4e565b6103dc6103d7366004615bb0565b613ee1565b6040805194855260208501939093529183015260608201526080016101a9565b61040f61040a366004615b15565b6143f4565b6040516101a99190615bd2565b61036a7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b81565b6103dc610451366004615bb0565b6144a2565b6103dc610464366004615bb0565b6149f6565b610471614e58565b6040516101a99190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b6104bb615140565b6040516101a99190615c27565b61019f670de0b6b3a764000081565b61036a6104e5366004615c74565b6151cd565b61019f615259565b61036a7f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081565b61019f7f000000000000000000000000000000000000000000000000000000000000003281565b6103dc61054e366004615bb0565b61531f565b61036a7f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a70762581565b61036a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b61036a7f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f281565b6105d0615636565b6001600160a01b03831680825260408051634453434160e11b815290516388a68682916004808201926020929091908290030181865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190615c8d565b81602001906001600160a01b031690816001600160a01b031681525050826001600160a01b03166392081a476040518163ffffffff1660e01b8152600401602060405180830381865afa158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190615caa565b60ff166040828101919091525163b9a09fd560e01b81526001600160a01b0384811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190615c8d565b6001600160a01b0390811660608301819052604051631703e5f960e01b815260048101919091527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e90911690631703e5f990602401602060405180830381865afa1580156107c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e59190615ccd565b151560808201526040805163d16352af60e01b815290516001600160a01b0385169163d16352af9160048083019260009291908290030181865afa158015610831573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108599190810190615d36565b8160a00181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa15801561089f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c79190810190615d36565b8160c00181905250826001600160a01b031663b1942b166040518163ffffffff1660e01b8152600401600060405180830381865afa15801561090d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109359190810190615dc1565b60e0820152610942615259565b81610100018181525050670de0b6b3a76400008161010001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190615e73565b6109e69190615ea2565b6109f09190615eb9565b8161012001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a609190615e73565b15610c025780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610acb9190615e73565b60405163b9a09fd560e01b81526001600160a01b0385811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b559190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166004830152919091169063bcd1101490602401602060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190615e73565b610bf390670de0b6b3a7640000615ea2565b610bfd9190615eb9565b610c05565b60005b8161014001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c759190615e73565b15610e155780606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce09190615e73565b61012082015160405163b9a09fd560e01b81526001600160a01b0386811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa158015610d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d709190615c8d565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166004830152919091169063bcd1101490602401602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc9190615e73565b610e069190615ea2565b610e109190615eb9565b610e18565b60005b816101600181815250507f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190615e73565b15610fe1577f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2b9190615e73565b6040516353e5642360e11b81526001600160a01b0385811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a7cac84690602401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615e73565b610fc0906064615ea2565b610fd290670de0b6b3a7640000615ea2565b610fdc9190615eb9565b610fe4565b60005b8161018001818152505080606001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190615e73565b6101a08201526001600160a01b038216156110de5760208101516040516370a0823160e01b81526001600160a01b038481166004830152909116906370a0823190602401602060405180830381865afa1580156110b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d99190615e73565b6110e1565b60005b6101c08201526001600160a01b03821615611165576040516370a0823160e01b81526001600160a01b0383811660048301528416906370a0823190602401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190615e73565b611168565b60005b6101e08201526001600160a01b038216156112a05760405163b9a09fd560e01b81526001600160a01b0384811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063b9a09fd590602401602060405180830381865afa1580156111e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112079190615c8d565b60405163211dc32d60e01b81526001600160a01b0384811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166024830152919091169063211dc32d90604401602060405180830381865afa158015611277573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129b9190615e73565b6112a3565b60005b6102008201525b92915050565b6113686040518061030001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b611370615259565b816000018181525050670de0b6b3a764000081600001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114099190615e73565b6114139190615ea2565b61141d9190615eb9565b816020018181525050670de0b6b3a764000081600001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611491573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b59190615e73565b6114bf9190615ea2565b6114c99190615eb9565b8160400181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663466f63116040518163ffffffff1660e01b8152600401602060405180830381865afa158015611530573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115549190615e73565b816060018181525050670de0b6b3a764000081600001517f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663b26025aa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190615e73565b6115f79190615ea2565b6116019190615eb9565b8160800181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168c9190615e73565b8160a00181815250507f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f26001600160a01b031663183c77c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117179190615e73565b60c0820181905215611a8b57670de0b6b3a764000081602001517f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f26001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561178f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b39190615e73565b6117be906007615ea2565b6117c89190615ea2565b6117d29190615eb9565b6040828101519051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a081166004830152670de0b6b3a764000092917f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a7076259091169063bcd1101490602401602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190615e73565b6118989190615ea2565b6118a29190615eb9565b6020830151604051632f34440560e21b81526001600160a01b037f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b81166004830152670de0b6b3a764000092917f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a7076259091169063bcd1101490602401602060405180830381865afa15801561193a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195e9190615e73565b6119689190615ea2565b6119729190615eb9565b8351604051632f34440560e21b81526001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881166004830152670de0b6b3a764000092917f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a7076259091169063bcd1101490602401602060405180830381865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615e73565b611a359190615ea2565b611a3f9190615eb9565b611a499190615edb565b611a539190615edb565b611a5f9061016d615ea2565b611a6a906064615ea2565b611a7c90670de0b6b3a7640000615ea2565b611a869190615eb9565b611a8e565b60005b8160e00181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b199190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316632a33d6b26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9b9190615e73565b611ba6906064615ea2565b611bb890670de0b6b3a7640000615ea2565b611bc29190615eb9565b610100820152602081015160a0820151670de0b6b3a764000091611be591615ea2565b611bef9190615eb9565b816101200181815250507f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663075461726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7b9190615c8d565b6001600160a01b03166326cfc17b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615e73565b6101408201526001600160a01b03821615611d80576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816906370a0823190602401602060405180830381865afa158015611d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7b9190615e73565b611d83565b60005b6101608201526001600160a01b03821615611e27576040516370a0823160e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b16906370a0823190602401602060405180830381865afa158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190615e73565b611e2a565b60005b6101808201526001600160a01b03821615611ece576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a016906370a0823190602401602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190615e73565b611ed1565b60005b6101a08201526001600160a01b03821615611f9d5760405163211dc32d60e01b81526001600160a01b0383811660048301527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38811660248301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063211dc32d90604401602060405180830381865afa158015611f74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f989190615e73565b611fa0565b60005b6101c08201526001600160a01b0382161561206c5760405163211dc32d60e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b811660248301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063211dc32d90604401602060405180830381865afa158015612043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120679190615e73565b61206f565b60005b6101e08201526001600160a01b0382161561213b5760405163211dc32d60e01b81526001600160a01b0383811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0811660248301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063211dc32d90604401602060405180830381865afa158015612112573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121369190615e73565b61213e565b60005b6102008201526001600160a01b038216156121e257604051631ef1589960e01b81526001600160a01b0383811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f21690631ef1589990602401602060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd9190615e73565b6121e5565b60005b6102208201526001600160a01b03821615612289576040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f216906370a0823190602401602060405180830381865afa158015612260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122849190615e73565b61228c565b60005b6102408201526001600160a01b0382161561232e57604051620be37960e21b81526001600160a01b0383811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e1690622f8de490602401602060405180830381865afa158015612305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123299190615e73565b612331565b60005b6102608201526001600160a01b038216156123d557604051634c7ebd3760e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b1690634c7ebd3790602401602060405180830381865afa1580156123ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d09190615e73565b6123d8565b60005b6102808201526001600160a01b0382161561247c57604051632ecd4e7d60e01b81526001600160a01b0383811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b1690632ecd4e7d90602401602060405180830381865afa158015612453573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124779190615e73565b61247f565b60005b6102a08201526001600160a01b0382161561254857604051620be37960e21b81526001600160a01b0383811660048301526000917f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e90911690622f8de490602401602060405180830381865afa1580156124fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125219190615e73565b1161254157806102a0015181610220015161253c9190615eee565b61254b565b600061254b565b60005b6102c08201526001600160a01b038216156125ef57604051639a61df8960e01b81526001600160a01b0383811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e1690639a61df8990602401602060405180830381865afa1580156125c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ea9190615e73565b6125f2565b60005b6102e0820152919050565b61262160405180606001604052806000815260200160008152602001600081525090565b600061262b615259565b90506001600160a01b038316156129d957670de0b6b3a7640000807f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c79190615e73565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a016906370a0823190602401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615e73565b61275b9190615ea2565b6127659190615eb9565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127f09190615e73565b604051631ef1589960e01b81526001600160a01b0388811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f21690631ef1589990602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301527f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b16906370a0823190602401602060405180830381865afa1580156128e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129049190615e73565b61290e9190615edb565b6129189190615ea2565b6129229190615eb9565b6040516370a0823160e01b81526001600160a01b0387811660048301527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816906370a0823190602401602060405180830381865afa158015612988573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ac9190615e73565b6129b69190615edb565b6129c09190615edb565b6129ca9083615ea2565b6129d49190615eb9565b6129dc565b60005b82526001600160a01b03831615612e76577f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f26001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190615e73565b6040516370a0823160e01b81526001600160a01b0385811660048301527f000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f216906370a0823190602401602060405180830381865afa158015612ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af99190615e73565b670de0b6b3a7640000807f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190615e73565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0811660048301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063bcd1101490602401602060405180830381865afa158015612c0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2e9190615e73565b612c389190615ea2565b612c429190615eb9565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccd9190615e73565b604051632f34440560e21b81526001600160a01b037f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b811660048301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063bcd1101490602401602060405180830381865afa158015612d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d779190615e73565b612d819190615ea2565b612d8b9190615eb9565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38811660048301527f0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625169063bcd1101490602401602060405180830381865afa158015612e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e359190615e73565b612e3f9190615edb565b612e499190615edb565b612e539085615ea2565b612e5d9190615eb9565b612e679190615ea2565b612e719190615eb9565b612e79565b60005b82602001818152505060007f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa158015612ee2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f0a9190810190615dc1565b90506000805b82518110156131ec5760007f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663b9a09fd5858481518110612f5c57612f5c615f01565b60200260200101516040518263ffffffff1660e01b8152600401612f8f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd09190615c8d565b90506000848381518110612fe657612fe6615f01565b60209081029190910101516040516370a0823160e01b81526001600160a01b038a81166004830152909116906370a0823190602401602060405180830381865afa158015613038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305c9190615e73565b11156131d957806001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c49190615e73565b6040516370a0823160e01b81526001600160a01b0389811660048301528316906370a0823190602401602060405180830381865afa15801561310a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312e9190615e73565b604051632f34440560e21b81526001600160a01b037f000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a08116600483015284169063bcd1101490602401602060405180830381865afa158015613194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b89190615e73565b6131c29190615ea2565b6131cc9190615eb9565b6131d69084615edb565b92505b50806131e481615f17565b915050612f10565b506ec097ce7bc90715b34b9f1000000000837f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316626c72af6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327f9190615e73565b6132899084615ea2565b6132939190615ea2565b61329d9190615eb9565b604085015250919392505050565b6132b36156da565b6001600160a01b03838116808352604051635462ecad60e11b815260048101919091527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e9091169063a8c5d95a90602401602060405180830381865afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615c8d565b6001600160a01b03908116602083015260405163b9a09fd560e01b815284821660048201527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e90911690631703e5f990829063b9a09fd590602401602060405180830381865afa1580156133bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e19190615c8d565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613425573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134499190615ccd565b816040019015159081151581525050826001600160a01b031663d16352af6040518163ffffffff1660e01b8152600401600060405180830381865afa158015613496573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134be9190810190615d36565b8160600181905250826001600160a01b031663068acc396040518163ffffffff1660e01b8152600401600060405180830381865afa158015613504573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261352c9190810190615d36565b6080820152604051635462ecad60e11b81526001600160a01b0384811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a8c5d95a90602401602060405180830381865afa158015613597573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bb9190615c8d565b6001600160a01b031663c4f59f9b6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156135f8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136209190810190615dc1565b60a082018190525160009067ffffffffffffffff81111561364357613643615cef565b60405190808252806020026020018201604052801561366c578160200160208202803683370190505b50905060005b8260a0015151811015613734578260a00151818151811061369557613695615f01565b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190615caa565b82828151811061371057613710615f01565b60ff909216602092830291909101909101528061372c81615f17565b915050613672565b5060c0820181905260a08201515160009067ffffffffffffffff81111561375d5761375d615cef565b604051908082528060200260200182016040528015613786578160200160208202803683370190505b50905060005b8360a001515181101561395a5783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156137db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ff9190615e73565b156139285783602001516001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613846573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061386a9190615e73565b84602001516001600160a01b031663bcd110148660a00151848151811061389357613893615f01565b60200260200101516040518263ffffffff1660e01b81526004016138c691906001600160a01b0391909116815260200190565b602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190615e73565b61391990670de0b6b3a7640000615ea2565b6139239190615eb9565b61392b565b60005b82828151811061393d5761393d615f01565b60209081029190910101528061395281615f17565b91505061378c565b5060e0830181905260a08301515160009067ffffffffffffffff81111561398357613983615cef565b6040519080825280602002602001820160405280156139ac578160200160208202803683370190505b50905060005b8460a0015151811015613b2f576001600160a01b03861615613afd57604051635462ecad60e11b81526001600160a01b0388811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a8c5d95a90602401602060405180830381865afa158015613a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a589190615c8d565b6001600160a01b031663211dc32d878760a001518481518110613a7d57613a7d615f01565b60200260200101516040518363ffffffff1660e01b8152600401613ab79291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015613ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613af89190615e73565b613b00565b60005b828281518110613b1257613b12615f01565b602090810291909101015280613b2781615f17565b9150506139b2565b5061010084018190526040516353e5642360e11b81526001600160a01b0387811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a7cac84690602401602060405180830381865afa158015613b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc29190615e73565b846101200181815250507f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4e9190615e73565b15613d8b577f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03166396c82e576040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd59190615e73565b6040516353e5642360e11b81526001600160a01b0388811660048301527f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e169063a7cac84690602401602060405180830381865afa158015613d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5f9190615e73565b613d6a906064615ea2565b613d7c90670de0b6b3a7640000615ea2565b613d869190615eb9565b613d8e565b60005b6101408501526001600160a01b03851615613e185760208401516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa158015613def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e139190615e73565b613e1b565b60005b61016085015250505092915050565b60606000613e388585615eee565b67ffffffffffffffff811115613e5057613e50615cef565b604051908082528060200260200182016040528015613e8957816020015b613e766156da565b815260200190600190039081613e6e5790505b509050845b84811015613ed857613ea8613ea2826151cd565b856132ab565b828281518110613eba57613eba615f01565b60200260200101819052508080613ed090615f17565b915050613e8e565b50949350505050565b60008060008060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f6b9190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fed9190615e73565b613ff79190615edb565b90506140257f0000000000000000000000000000000000000000000000000000000000000032612710615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614083573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a79190615e73565b6140b18984615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561410f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141339190615e73565b61413d9085615ea2565b6141479190615eb9565b6141519190615eee565b61415d90612710615ea2565b6141679190615eb9565b94507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141eb9190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061426d9190615e73565b6142779087615edb565b1115614291576000806000809450945094509450506143eb565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061431c9190615e73565b6143269087615ea2565b6143309190615eb9565b61434288670de0b6b3a7640000615ea2565b61434c9190615eb9565b61435e90670de0b6b3a7640000615eee565b614369906064615ea2565b93506127106143788789615ea2565b6143829190615eb9565b9250614398612710670de0b6b3a7640000615ea2565b6143aa85670de0b6b3a7640000615edb565b6143b5906064615ea2565b6143c9612710670de0b6b3a7640000615ea2565b6143d39190615eee565b6143dd9089615ea2565b6143e79190615eb9565b9150505b92959194509250565b606060006144028585615eee565b67ffffffffffffffff81111561441a5761441a615cef565b60405190808252806020026020018201604052801561445357816020015b614440615636565b8152602001906001900390816144385790505b509050845b84811015613ed85761447261446c826151cd565b856105c8565b82828151811061448457614484615f01565b6020026020010181905250808061449a90615f17565b915050614458565b6000808080806127106144d57f000000000000000000000000000000000000000000000000000000000000003289615ea2565b6144df9190615eb9565b905060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145659190615e73565b90506000826145748a84615edb565b61457e9190615eee565b90507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146029190615e73565b81111561461f5760008060008096509650965096505050506143eb565b60007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa15801561467f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146a39190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147259190615e73565b61472f9190615edb565b90508161473c8483615ea2565b6147469190615eb9565b6147509082615eee565b9750670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147dd9190615e73565b6147e7908c615ea2565b6147f19190615eb9565b61480389670de0b6b3a7640000615ea2565b61480d9190615eb9565b61481f90670de0b6b3a7640000615eee565b61482a906064615ea2565b965061271089670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148bb9190615e73565b6148c5908e615ea2565b6148cf9190615eb9565b6148d99190615ea2565b6148e39190615eb9565b95506148f9612710670de0b6b3a7640000615ea2565b61490b88670de0b6b3a7640000615edb565b614916906064615ea2565b61492a612710670de0b6b3a7640000615ea2565b6149349190615eee565b670de0b6b3a76400007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561499b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149bf9190615e73565b6149c9908e615ea2565b6149d39190615eb9565b6149dd9190615ea2565b6149e79190615eb9565b94505050505092959194509250565b600080808080612710614a297f000000000000000000000000000000000000000000000000000000000000003289615ea2565b614a339190615eb9565b905060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ab99190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b3b9190615e73565b614b459190615edb565b9050600082614b548a84615edb565b614b5e9190615eee565b905060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614be49190615e73565b905081614bf18285615ea2565b614bfb9190615eb9565b614c059082615eee565b9750897f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c8a9190615e73565b614c94908a615ea2565b614c9e9190615eb9565b614cb090670de0b6b3a7640000615eee565b614cbb906064615ea2565b9650612710897f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d439190615e73565b614d558d670de0b6b3a7640000615ea2565b614d5f9190615eb9565b614d699190615ea2565b614d739190615eb9565b9550614d89612710670de0b6b3a7640000615ea2565b614d9b88670de0b6b3a7640000615edb565b614da6906064615ea2565b614dba612710670de0b6b3a7640000615ea2565b614dc49190615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e469190615e73565b6149c98d670de0b6b3a7640000615ea2565b614e8a6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663ad6cb8236040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f0c9190615e73565b8160000181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f979190615e73565b8160200181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015614ffe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150229190615e73565b8160400181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150ad9190615e73565b8160600181815250507f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151389190615e73565b608082015290565b60607f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b031663a2d869b26040518163ffffffff1660e01b8152600401600060405180830381865afa1580156151a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526151c89190810190615dc1565b905090565b60405163f0a317eb60e01b8152600481018290526000907f000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e6001600160a01b03169063f0a317eb90602401602060405180830381865afa158015615235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190615c8d565b60006040516396834ad360e01b81527fb2748e718cf3a75b0ca099cb467aea6aa8f7d960b381b3970769b5a2d6be26dc6004820152600090732880ab155794e7179c9ee2e38200202908c17b43906396834ad390602401608060405180830381865afa1580156152cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152f19190615f30565b5190506305f5e10061530f600783900b670de0b6b3a7640000615ea2565b6153199190615eb9565b91505090565b60008060008060007f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663a07878566040518163ffffffff1660e01b8152600401602060405180830381865afa158015615385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153a99190615e73565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663c2b96e9b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015615407573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061542b9190615e73565b6154359190615edb565b90506154637f0000000000000000000000000000000000000000000000000000000000000032612710615eee565b81887f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156154c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e79190615e73565b6154f19190615eee565b7f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b0316631b8f0bbc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561554f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906155739190615e73565b61557d9085615ea2565b6155879190615eb9565b6155919190615eee565b61559d90612710615ea2565b6155a79190615eb9565b9450847f00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b6001600160a01b031663660e16c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015615608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061562c9190615e73565b6143429089615ea2565b60405180610220016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600060ff16815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000151581526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461576457600080fd5b50565b6000806040838503121561577a57600080fd5b82356157858161574f565b915060208301356157958161574f565b809150509250929050565b60005b838110156157bb5781810151838201526020016157a3565b50506000910152565b600081518084526157dc8160208601602086016157a0565b601f01601f19169290920160200192915050565b600081518084526020808501945080840160005b838110156158295781516001600160a01b031687529582019590820190600101615804565b509495945050505050565b80516001600160a01b031682526000610220602083015161586060208601826001600160a01b03169052565b506040830151615875604086018260ff169052565b50606083015161589060608601826001600160a01b03169052565b5060808301516158a4608086018215159052565b5060a08301518160a08601526158bc828601826157c4565b91505060c083015184820360c08601526158d682826157c4565b91505060e083015184820360e08601526158f082826157f0565b610100858101519087015261012080860151908701526101408086015190870152610160808601519087015261018080860151908701526101a080860151908701526101c080860151908701526101e08086015190870152610200948501519490950193909352509192915050565b6020815260006159726020830184615834565b9392505050565b60006020828403121561598b57600080fd5b81356159728161574f565b600081518084526020808501945080840160005b8381101561582957815160ff16875295820195908201906001016159aa565b600081518084526020808501945080840160005b83811015615829578151875295820195908201906001016159dd565b80516001600160a01b0316825260006101806020830151615a2560208601826001600160a01b03169052565b506040830151615a39604086018215159052565b506060830151816060860152615a51828601826157c4565b91505060808301518482036080860152615a6b82826157c4565b91505060a083015184820360a0860152615a8582826157f0565b91505060c083015184820360c0860152615a9f8282615996565b91505060e083015184820360e0860152615ab982826159c9565b9150506101008084015185830382870152615ad483826159c9565b6101208681015190880152610140808701519088015261016095860151959096019490945250929392505050565b60208152600061597260208301846159f9565b600080600060608486031215615b2a57600080fd5b83359250602084013591506040840135615b438161574f565b809150509250925092565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615b918583516159f9565b94509285019290850190600101615b75565b5092979650505050505050565b60008060408385031215615bc357600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015615ba357603f19888603018452615c15858351615834565b94509285019290850190600101615bf9565b6020808252825182820181905260009190848201906040850190845b81811015615c685783516001600160a01b031683529284019291840191600101615c43565b50909695505050505050565b600060208284031215615c8657600080fd5b5035919050565b600060208284031215615c9f57600080fd5b81516159728161574f565b600060208284031215615cbc57600080fd5b815160ff8116811461597257600080fd5b600060208284031215615cdf57600080fd5b8151801515811461597257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715615d2e57615d2e615cef565b604052919050565b600060208284031215615d4857600080fd5b815167ffffffffffffffff80821115615d6057600080fd5b818401915084601f830112615d7457600080fd5b815181811115615d8657615d86615cef565b615d99601f8201601f1916602001615d05565b9150808252856020828501011115615db057600080fd5b613ed88160208401602086016157a0565b60006020808385031215615dd457600080fd5b825167ffffffffffffffff80821115615dec57600080fd5b818501915085601f830112615e0057600080fd5b815181811115615e1257615e12615cef565b8060051b9150615e23848301615d05565b8181529183018401918481019088841115615e3d57600080fd5b938501935b83851015615e675784519250615e578361574f565b8282529385019390850190615e42565b98975050505050505050565b600060208284031215615e8557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176112aa576112aa615e8c565b600082615ed657634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156112aa576112aa615e8c565b818103818111156112aa576112aa615e8c565b634e487b7160e01b600052603260045260246000fd5b600060018201615f2957615f29615e8c565b5060010190565b600060808284031215615f4257600080fd5b6040516080810167ffffffffffffffff8282108183111715615f6657615f66615cef565b81604052845191508160070b8214615f7d57600080fd5b9082526020840151908082168214615f9457600080fd5b5060208201526040830151600381900b8114615faf57600080fd5b6040820152606092830151928101929092525091905056fea26469706673582212208a89af54be4aff56084fdd166363765ab49416af2a409ac0a103eafa9e3d820a64736f6c63430008130033

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

000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3800000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f20000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625

-----Decoded View---------------
Arg [0] : _voter (address): 0xB85213e2be9fd369Eb502532d0Ae9a8Fc1D8883E
Arg [1] : _BASE (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [2] : _TOKEN (address): 0x41408E1510AC6f651FD6D8a142EC1B24bdAF1b5B
Arg [3] : _OTOKEN (address): 0xfd3e3c69698b722c8FC3C20B853DCE35C149F4A0
Arg [4] : _VTOKEN (address): 0xD5dCbDdd672b80EA9179A21B7691A34fb85615F2
Arg [5] : _rewarder (address): 0x2acF851CF6B2b827c4f794433cC5C0aE1A707625

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000b85213e2be9fd369eb502532d0ae9a8fc1d8883e
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [2] : 00000000000000000000000041408e1510ac6f651fd6d8a142ec1b24bdaf1b5b
Arg [3] : 000000000000000000000000fd3e3c69698b722c8fc3c20b853dce35c149f4a0
Arg [4] : 000000000000000000000000d5dcbddd672b80ea9179a21b7691a34fb85615f2
Arg [5] : 0000000000000000000000002acf851cf6b2b827c4f794433cc5c0ae1a707625


Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

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.