S Price: $0.789276 (+0.99%)

Contract

0x3D9411fBe9B0f7b7D55eedD3AE718bCDAC0Ae9ED

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...20641822024-12-31 7:43:2117 days ago1735631001IN
0x3D9411fB...DAC0Ae9ED
0 S0.000031721.1

Latest 1 internal transaction

Parent Transaction Hash Block From To
21061842024-12-31 19:51:0616 days ago1735674666
0x3D9411fB...DAC0Ae9ED
 Contract Creation0 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PresaleDapp

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1 runs

Other Settings:
london EvmVersion, MIT license
File 1 of 1 : presaleDappRegular.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
//pragma experimental ABIEncoderV2;
//import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol";



/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {

    function decimals() external view returns(uint8);


    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns(bool);

    /**
     * @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);
}


interface ERC20 {

    function name() external pure returns(string memory);

    function symbol() external pure returns(string memory);

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

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

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

    function totalSupply() external view returns(uint256);

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

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

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

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



/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address public owner;
    //address public voter;

    event OwnershipRenounced(address indexed previousOwner);
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );


    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() {
        owner = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

/*
    modifier onlyVoter() {
        require(msg.sender == voter);
        _;
    }
    */
    /**
     * @dev Allows the current owner to relinquish control of the contract.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function transferOwnership(address _newOwner) public onlyOwner {
        _transferOwnership(_newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address _newOwner) internal {
        require(_newOwner != address(0));
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}


interface LPToken {

    function sync() external;

}
// pragma solidity >=0.5.0;

interface UniswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);


    function getPair(address tokenA, address tokenB) external view returns(address pair);


    function createPair(address tokenA, address tokenB) external returns(address pair);


}


// pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns(string memory);

    function symbol() external pure returns(string memory);

    function decimals() external pure returns(uint8);

    function totalSupply() external view returns(uint);

    function balanceOf(address owner) external view returns(uint);

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

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

    function transfer(address to, uint value) external returns(bool);

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


}

// pragma solidity >=0.6.2;

interface UniswapRouter02 {
    function factory() external pure returns(address);

    function WETH() external pure returns(address);
    function WBNB() external pure returns(address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns(uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns(uint amountToken, uint amountETH, uint liquidity);

    function addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns(uint amountToken, uint amountETH, uint liquidity);



    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns(uint[] memory amounts);
    function swapExactBNBForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns(uint[] memory amounts);




   // function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns(uint amountOut);

   // function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns(uint amountIn);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns(uint[] memory amounts);

    function getAmountsIn(uint amountOut, address[] calldata path) external view returns(uint[] memory amounts);
}









interface lpLockDeployerInterface {

    function createLPLocker(address _lockingToken, uint256 _lockerEndTimeStamp, string memory _logo, uint256 _lockingAmount) external payable returns (address);


}



contract Consts {
   // uint constant TOKEN_DECIMALS = 18;
   // uint8 constant TOKEN_DECIMALS_UINT8 = 18;
   // uint constant TOKEN_DECIMAL_MULTIPLIER = 10 ** TOKEN_DECIMALS;
   // bool constant CONTINUE_MINTING = false;
   // uint256 constant minPlatTokenReq = 1000 * TOKEN_DECIMAL_MULTIPLIER;
   // uint256 constant airdropTokenPercentage = 2;
}

contract DefiCrowdsale is Consts, Ownable

    

{
    event TokenPurchase(
        address indexed purchaser,
        address indexed beneficiary,
        uint256 value,
        uint256 amount
    );
    event Closed();
    event RefundsEnabled();
    event Refunded(address indexed beneficiary, uint256 weiAmount);
    event claimedBack(address indexed beneficiary, uint256 weiAmount);
    event Finalized();
    event Initialized();
    event TimesChanged(uint startTime, uint endTime, uint oldStartTime, uint oldEndTime);

    string public presaleType = "IDO";

    mapping(address => uint256) public contributors;
    mapping(address => uint256) public contributorsTracker;
    mapping(address => uint256) public contributorsClaim;
    mapping(address => uint256) public contributorsRefundAnytime;
    mapping(address => uint256) public contributorsPayoutNumber;    
    mapping(uint256 => address) public contributorsAddressTracker;
    mapping(address => bool) public contributed;
    mapping(address => bool) public anytimeRefunded;
    mapping(address => bool) public whitelist;
    mapping(uint256 => address) public AddWhitelistTracker;
    //mapping(uint256 => address) public RemoveWhitelistTracker;

    uint256 public contributorCount;
    uint256 public AddWhitelistNumber;
    uint256 public RemoveWhitelistNumber;
    uint256 public presaleGoalReachedTime = 0;
    uint256 public buyRate;
    uint256[2] __min_max_eth;
    uint256 public soft_cap;
    uint256 public hard_cap;
    uint256 public startTime;
    uint256 public endTime;
    uint256 public weiRaised;
    uint256 public whitelistCoolOff = 600;
    uint256 public finalizeTimeout = 600; //604800;  //time for presale owner to finalize
    uint256 public disabledWhitelistTime;
    uint public teamFeePer = 2; // team fees percentage

    bool public initialized = false;
    bool public Preaslefinalized = false;
    bool public whitelistEnabled;
    bool public whitelistDisabledInitiated;
    bool public isFinalized;
    bool public finalizeValid;
    bool public vestingEnabled;
    bool public refundEnabled;
    bool public alternateFee;

    uint256 public MaxAllowedContribution;
    uint256 public numberOfVest;
    uint256 public finalizedTime;
    uint256 public vestingPeriod;
    uint256 public uniswapPercentage;
    uint256 public uniswapRate;
    uint256 public extraAmountPerVal;
    uint256 public nativeMultiplier = 20;
    uint256 public burnLockPeriod = 1209600;
    uint256 public totalTokenRequired;

   // address[] public AddWhitelistTrackerArray;
   // address[] public RemoveWhitelistTrackerArray;
    address public token;
    address public presaleCreator;
    address public feeContract;
    address public referrerAddr;
    address[3] public altAssets;
   // address public uniswapDapAddress;
    

    
    // address[] teamAddresses;
    // uint256[] teamAmounts;
    // uint256[] teamFreezeTimes;
    //uint256 totalTeamTokensMinted;

    constructor(address _token, uint256 _rate, uint256[2] memory start_end_time, address[2] memory targetWallets, uint256[2] memory soft_hard_cap, uint256[2] memory _min_max_eth, uint256[2] memory _UniRatePercentage, uint _teamFeePer, uint256[2] memory _extraAmountPer_lockTime, uint256 _nativeMul, address[5] memory _lpLockDepAndRouter_AltAssets)
    


    //Crowdsale(_rate, targetWallets[0], ERC20(token), _min_max_eth[1])
    //TimedCrowdsale(start_end_time[0] > now ? start_end_time[0] : now, start_end_time[1])
    //CappedCrowdsale(soft_hard_cap[1] * TOKEN_DECIMAL_MULTIPLIER)

    //RefundableCrowdsale(soft_hard_cap[0] * TOKEN_DECIMAL_MULTIPLIER, teamFees, _UniPercentage, targetWallets[1])

    {
        //  require((_govUniPercentage[0] >= 0) && (_govUniPercentage[0] <= 100), "Governance amount is outside of governance limits");
        
        __min_max_eth = _min_max_eth;
        soft_cap = soft_hard_cap[0];
        hard_cap = soft_hard_cap[1];
        startTime = start_end_time[0];
        endTime = start_end_time[1];
        token = _token;
        MaxAllowedContribution = _min_max_eth[1];
        presaleCreator = targetWallets[0];
        feeContract = targetWallets[1];
        teamFeePer = _teamFeePer;
        uniswapPercentage = _UniRatePercentage[1];
        //uniswapRate = _UniRatePercentage[0] * 10**IERC20(token).decimals();
        uniswapRate = _UniRatePercentage[0];
        //buyRate = _rate * 10**IERC20(token).decimals();
        buyRate = _rate;
        extraAmountPerVal = _extraAmountPer_lockTime[0] + 100;
        nativeMultiplier = _nativeMul;
        lpLockDeployer = _lpLockDepAndRouter_AltAssets[0];
        ROUTER_ADDRESS = _lpLockDepAndRouter_AltAssets[1];
        locktime = _extraAmountPer_lockTime[1];
        totalTokenRequired = ((buyRate*hard_cap + uniswapRate*((hard_cap*uniswapPercentage)/100))/(10 ** 18)) * (teamFeePer+100) / 100;
        altAssets[0] = _lpLockDepAndRouter_AltAssets[2];
        altAssets[1] = _lpLockDepAndRouter_AltAssets[3];
        altAssets[2] = _lpLockDepAndRouter_AltAssets[4];


            validPairPartner[altAssets[0]] = true;
            validPairPartner[altAssets[1]] = true;
            validPairPartner[altAssets[2]] = true;
  

    }



    function checkContributorValidity(address contributor_addr) public view returns(uint256) {

        return contributors[contributor_addr];

    }

    function checkRate() public view returns(uint256) {

        return buyRate;

    }

    function minEthContribution() public view returns(uint256) {

        return __min_max_eth[0];

    }

    function maxEthContribution() public view returns(uint256) {

        return __min_max_eth[1];

    }



    function presaleStartTime() public view returns(uint256) {

        return startTime;

    }

    function presaleEndTime() public view returns(uint256) {

        return endTime;

    }

    function mintForPlatform(address _platform, address _referrer, uint256 _refPer, bool tokenFeeToRef) public onlyOwner returns(bool) {
        if(!alternateFee){
            require(_platform != address(0), "platform addr cant be zero");
            uint256 platFee = (weiRaised*buyRate*teamFeePer)/(100 ether);
            uint256 refFee;
            if(tokenFeeToRef){
                refFee = platFee*_refPer/100;
                ERC20(token).transfer(_platform, platFee - (refFee));
                ERC20(token).transfer(_referrer, refFee);
            }
            else{

                ERC20(token).transfer(_platform, platFee);

            }
        }
        return true;
    }

/*
    function mintForUniswap(address uniswapDep) public onlyOwner {
        uint256 tokenFee = (weiRaised*uniswapRate*uniswapPercentage*extraAmountPerVal)/(10000 ether);
        require(uniswapDep != address(0x0),"uniswapDep addr cannot be zero");
        require(ERC20(token).transfer(uniswapDep, tokenFee),"unable to mint for uniDep from presale");
    }
*/


    //   function resetUserEthAmount(address contributor_addr) onlyOwner public {

    //    contributors[contributor_addr] = 0;


    //}




    /**
     * @dev override hasClosed to add minimal value logic
     * @return true if remained to achieve less than minimal
     */
    function hasClosed() public view returns(bool) {
        bool remainValue = (hard_cap - weiRaised) < __min_max_eth[0];
        return (block.timestamp > endTime) || remainValue;
    }



    function CheckSoftCap() public view returns(uint256) {

        return soft_cap;
    }

    function CheckHardCap() public view returns(uint256) {

        return hard_cap;
    }


    function CheckTotalEthRaised() public view returns(uint256) {

        return weiRaised;
    }




    /*
     * @dev override purchase validation to add extra value logic.
     * @return true if sended more than minimal value
     */
    function _preValidatePurchase(
        address _beneficiary,
        uint256 _weiAmount
    )
    internal {

        require(msg.value >= __min_max_eth[0]);
        // require(msg.value >= 0);

        require(msg.value <= (__min_max_eth[1])); // it should be 10% in mainnet launch ***********************
        // require(msg.value <= 1000000000000000000);
        require((weiRaised + _weiAmount) <= hard_cap,"contribution reaching over hcap");
        require(_beneficiary != address(0));
        require(_weiAmount != 0);

    }



    function addToWhitelist(address WhitelistAddress) public onlyOwner {

    //    require(!whitelist[WhitelistAddress], "already whitelisted");
        whitelist[WhitelistAddress] = true;
        AddWhitelistTracker[AddWhitelistNumber] = WhitelistAddress;
        AddWhitelistNumber++;


    }


    function removeFromWhitelist(address WhitelistAddress) public onlyOwner {

        require(whitelist[WhitelistAddress], "not in whitelist!");
        whitelist[WhitelistAddress] = false;
        //RemoveWhitelistTracker[RemoveWhitelistNumber] = WhitelistAddress;
        //RemoveWhitelistNumber++;

    }


    function enableWhitelist() public onlyOwner {

        require(!whitelistEnabled, "whitelist already enabled");
        whitelistEnabled = true;


    }


    function disableWhitelist() public onlyOwner {

        require(whitelistEnabled, "whitelist already disabled");
        whitelistEnabled = false;
        disabledWhitelistTime = block.timestamp + whitelistCoolOff;
        whitelistDisabledInitiated = true;
    }


    function getAddlist() public view returns(address[] memory){

        address[] memory AddList = new address[](AddWhitelistNumber);  
        for (uint256 i = 0; i < AddWhitelistNumber; i++) {

            if(whitelist[AddWhitelistTracker[i]]){
                AddList[i] = AddWhitelistTracker[i];
            }
            else {

                AddList[i] = address(0x0);                
            }

        }

    return AddList;

    }

/*
    function getRemovelist() public view returns(address[] memory) {

        address[] memory RemoveList = new address[](RemoveWhitelistNumber); 
        for (uint256 i = 0; i < RemoveWhitelistNumber; i++) {

            RemoveList[i] = RemoveWhitelistTracker[i];


        }

    return RemoveList;
    

    }
    */
/*
    function getPresaleDataAddr() view returns(address[] memory, uint256[7] memory) {

        address[] memory PresaleDataAddr = new address[](AddWhitelistNumber); 
        for (uint256 i = 0; i < AddWhitelistNumber; i++) {

            PresaleDataAddr[i] = AddWhitelistTracker[i];  //******************************************** NEED UPDATE TO ADD CORRECT ADDRESS DATA***************************************************


        }

    return (PresaleDataAddr,getPresaleDataUint());
    

    }
*/    


    /**
     * @dev fallback function ***DO NOT OVERRIDE***
     */
    receive() external payable {

        require(block.timestamp > disabledWhitelistTime, "In whitelist disabled cool Off");
        require(!anytimeRefunded[msg.sender], "User used anytime refund!"); //checking if user refunded from this presale at anytime

        if (whitelistEnabled) {

            require(whitelist[msg.sender], "user not whitelisted");

        }
        require(contributors[msg.sender] <= (MaxAllowedContribution - msg.value),"contribution over max allowed");
        buyTokens(msg.sender);
        contributors[msg.sender] += msg.value;
        contributorsTracker[msg.sender] += msg.value;
        if(!contributed[msg.sender]){
            contributorsAddressTracker[contributorCount] = msg.sender;
            contributed[msg.sender] = true;
            contributorCount++;
        }
    }


    /**
     * @dev low level token purchase ***DO NOT OVERRIDE***
     * @param _beneficiary Address performing the token purchase
     */
    function buyTokens(address _beneficiary) internal {
        require(msg.sender == tx.origin,"can't contribute via contracts");
        require(block.timestamp > disabledWhitelistTime, "In whitelist disabled cool Off internal");
        require (block.timestamp >= startTime && block.timestamp < endTime,"IDO not active");
        require(!anytimeRefunded[msg.sender], "User used anytime refund!"); //checking if user refunded from this presale at anytime
        if (whitelistEnabled) {

            require(whitelist[msg.sender], "user not whitelisted");

        }
        uint256 weiAmount = msg.value;
        _preValidatePurchase(_beneficiary, weiAmount);

        // calculate token amount to be created
        uint256 tokens = _getTokenAmount(weiAmount);

        // update state
        weiRaised += weiAmount;

        //_processPurchase(_beneficiary, tokens);
        emit TokenPurchase(
            msg.sender,
            _beneficiary,
            weiAmount,
            tokens
        );

       // _updatePurchasingState(_beneficiary, weiAmount);

        //_forwardFunds();
        //_postValidatePurchase(_beneficiary, weiAmount);



    }

    function _getTokenAmount(uint256 _weiAmount)
    internal view returns(uint256) {
        return _weiAmount*buyRate/(1 ether);
        // return _weiAmount.mul(rate);
    }


    function claimTokens() public {
        require(!refundEnabled,"presale was refunded");
        require(!vestingEnabled,"please use vesting method to claim");
        require(isFinalized, "Not Finalized yet!");
        require(finalizeValid, "presale Failed!"); //checking if presale succeeded or not
        require(!(contributors[msg.sender] == 0), "user has no more tokens to claim!");
        uint256 tokenValue = (uint256(contributors[msg.sender]) * (uint256(buyRate))) / (1 ether);
        // uint256 tokenValueDecimalOptimized = (tokenValue.mul(10 ** uint256(seeDecimals(token)))).div(1 ether);
        contributors[msg.sender] = 0;
        ERC20(token).transfer(msg.sender, tokenValue);
        contributorsClaim[msg.sender] = tokenValue;

    }

    function vestToken() public {
        // require(!tokenDropFlag,"can't vest when token drop enabled!");
        require(!refundEnabled,"presale was refunded");       
        require(vestingEnabled,"vesting not enabled");
        require(isFinalized, "Not Finalized yet!");
        require(finalizeValid, "presale Failed!"); //checking if presale succeeded or not
        require(!(contributors[msg.sender] == 0), "user has no more tokens to claim!");       
        require(contributorsPayoutNumber[msg.sender] < numberOfVest,"all tokens vested");
        uint256 CurrentPayoutRounds = (((block.timestamp) - (finalizedTime)) / (vestingPeriod)) + (1);  // need to add 1 to allow partial token vest right away after presale
         if (CurrentPayoutRounds >= numberOfVest){
            CurrentPayoutRounds = numberOfVest;
        }
      
        uint256 userPayoutRounds = CurrentPayoutRounds - (contributorsPayoutNumber[msg.sender]);
        require(userPayoutRounds > 0 && userPayoutRounds <= numberOfVest,"not in user claim window");

        contributorsPayoutNumber[msg.sender] = CurrentPayoutRounds;
        
        uint256 tokenValue = (((uint256(contributorsTracker[msg.sender]) * (uint256(buyRate))) / (1 ether)) * (userPayoutRounds)) / (numberOfVest);
        // uint256 tokenValueDecimalOptimized = (tokenValue.mul(10 ** uint256(seeDecimals(token)))).div(1 ether);
        uint256 totalTokensLeftForUser = (uint256(contributors[msg.sender]) * (uint256(buyRate))) / (1 ether);
        require(tokenValue <= totalTokensLeftForUser,"can't claim more than allowed");
        uint256 contributionsClaiming = contributorsTracker[msg.sender] * (userPayoutRounds) / (numberOfVest);
        if(contributionsClaiming >= contributors[msg.sender]){
            contributors[msg.sender] = 0;
        }
        else{
            contributors[msg.sender] = contributors[msg.sender] - (contributionsClaiming);
        }
        ERC20(token).transfer(msg.sender, tokenValue);
        contributorsClaim[msg.sender] = contributorsClaim[msg.sender] + (tokenValue);       

    }

    function enableVesting(uint256 _numOfVest, uint256 _vestingPeriod) public{
        require(_numOfVest > 1,"num of vest has to be grtr than 1");
        require(_vestingPeriod > 0,"vesting period invalid");   
        require(block.timestamp < startTime - (600),"can't enable vest after presale start");    
        require(!vestingEnabled,"vesting already enabled");
        //require(!tokenDropFlag, "can't enable vest when airdrop is on");    
        require(msg.sender == presaleCreator);  // checking for presale owner address

        vestingEnabled = true;
        numberOfVest = _numOfVest;
        vestingPeriod = _vestingPeriod;
    }

    function disableVesting() public {
        require(msg.sender == presaleCreator); 
        require(vestingEnabled,"vesting already disabled");
        require(!isFinalized,"presale already finalized");
        vestingEnabled = false;

    }   
    
    function claimRefund() public {
        require(isFinalized, "not finalized");
        require(!(goalReached()) || !finalizeValid, "goal reached or presale succeeded");

        refund(msg.sender);
    }



    function claimRefundAnytime() public {
        require(!anytimeRefunded[msg.sender], "already refunded!");
        uint256 userContributed = contributors[msg.sender];
        require(userContributed > 0, "nothing to claim");
        require(!isFinalized, "already finalized!");
        require(!finalizeValid, "already succesfully finalized");
        require(block.timestamp < endTime - (finalizeTimeout), "withdrawal window expired!");
        // require(!goalReached() || !finalizeValid,"goal reached");
        contributorsRefundAnytime[msg.sender] = userContributed; // added for V3 -- need to check
        weiRaised = weiRaised - (userContributed); // Subtract from total eth raised


        anytimeRefunded[msg.sender] = true;
        refundAnytime(msg.sender,userContributed);

    }
    function refund(address investor) internal { //have to see if onlyOwner works
        require(refundEnabled,"refund not enabled");
        uint256 depositedValue = contributors[investor];
        require(depositedValue > 0, "User has no investment to claim");
        contributors[investor] = 0;
        payable(investor).call{value:depositedValue}("");
        emit Refunded(investor, depositedValue);
    }

    function refundAnytime(address investor, uint256 _contributed) internal { // have to see if onlyOwner works
        //require(state == State.Refunding);
        //uint256 depositedValue = contributors[investor];
        //require(depositedValue > 0, "User has no investment to claim");
        uint256 penalty = _contributed*(20)/(100);
        uint256 refundValue = _contributed - (penalty);

        contributors[investor] = 0; // added for V3 -- need to check
        contributorsTracker[investor] = 0; // added for V3 -- need to check
        payable(address(feeContract)).call{value:penalty}("");
        payable(investor).call{value:refundValue}("");
        emit claimedBack(investor, _contributed);
    }

    function finalize(address[2] memory __finalizeInfo, uint256 refPer, bool validFinalize) onlyOwner public returns(bool) {
        require(!isFinalized,"already finalized");
        require(hasClosed(),"not closed");
        referrerAddr = __finalizeInfo[0];
        presaleCreator = __finalizeInfo[1];
       // uniswapDapAddress = __finalizeInfo[2];
        finalizeValid = validFinalize;
        if (goalReached() && finalizeValid) {
            close(presaleCreator, referrerAddr, refPer);

        } else {
            enableRefunds();
        }

        finalizedTime = block.timestamp;

        emit Finalized();

        isFinalized = true;
        /*
        if(tokenDropFlag && finalizeValid){
            tokenDrop();
        }
        */
        return true;


    }

    function finalizeAnytime(address[2] memory __finalizeInfo, bool validFinalize) onlyOwner public returns(bool) {
        require(!isFinalized, "presale already finalized");
        //   require(hasClosed());
        referrerAddr = __finalizeInfo[0];
        presaleCreator = __finalizeInfo[1];
       // uniswapDapAddress = __finalizeInfo[2];
        finalizeValid = validFinalize;
        enableRefunds();
        emit Finalized();

        isFinalized = true;



        return true;


    }

    function enableRefunds() internal {

        refundEnabled = true;
        emit RefundsEnabled();
    }


    function getBackTokens() public {

       // require(block.timestamp > closingTime.add(burnDeltaTime), "cannot withdraw yet");
        require(msg.sender == presaleCreator, "initiator is not presale owner!");
       // require(hasClosed(), "presale not closed!");
        require(isFinalized, "presale not finalized!");
        require(!finalizeValid, "finalize was valid");

        require(IERC20(token).transfer(presaleCreator, IERC20(token).balanceOf(address(this))),"cannot transfer token back");

    }

        function burnUnsoldTokens() public {

       // require(block.timestamp > closingTime.add(burnDeltaTime), "cannot withdraw yet");
        require(msg.sender == presaleCreator, "initiator is not presale owner!");
        require(block.timestamp > (finalizedTime + burnLockPeriod));
       // require(hasClosed(), "presale not closed!");
        require(isFinalized, "presale not finalized!");
        require(finalizeValid, "finalize was valid");
        uint256 tokenUnsold = (((hard_cap-weiRaised)*uniswapRate*uniswapPercentage*extraAmountPerVal)/(10000 ether)) + ((hard_cap-weiRaised)*buyRate);
        require(IERC20(token).transfer(dead, tokenUnsold),"cannot transfer token to dead");

    }

    function selectNativeOnlyFee() public {

        require(msg.sender == presaleCreator, "initiator is not presale owner!");
        require(!isFinalized, "presale already finalized!");
        alternateFee = true;
        teamFeePer = (teamFeePer * nativeMultiplier)/10;

    }
    function close(address __Creator, address _referrerAddr, uint256 _refPer) internal {
        require(!isFinalized,"presale already finalized");
        emit Closed();

        uint256 feesAmount = (address(this).balance * teamFeePer) / (100);
        if(_refPer > 0){
            uint256 refAmount = (feesAmount * _refPer) / (100);
            payable(address(_referrerAddr)).call{value:refAmount}("");
            payable(address(feeContract)).call{value:(feesAmount - refAmount)}("");
        }
        else{

            payable(address(feeContract)).call{value:feesAmount}("");

        }
        

        uint256 uniswapAmount = (address(this).balance * uniswapPercentage) / (100);
        // uint256 GoverningAmount = address(this).balance.mul(gov).div(100);

        require(address(this).balance >= uniswapAmount, "Not Enough Fund to Transfer");
        //  require(address(this).balance > GoverningAmount, "Not Enough Fund to Transfer");

        //payable(__uniswapDep).transfer(uniswapAmount);
        AddLiquidity((weiRaised*uniswapRate*uniswapPercentage*extraAmountPerVal)/(10000 ether),uniswapAmount);
        // __GovContract.transfer(GoverningAmount);
        if(address(this).balance != 0){
            payable(address(__Creator)).call{value:address(this).balance}("");
        }

    }

    function goalReached() public view returns(bool) {

        return weiRaised >= soft_cap;

    }
    function presaleEnded() public view returns(bool) {

        return block.timestamp > endTime;

    }

// DATA functions for UI to fetch and read

        function getPresaleData() public view returns(uint256[10] memory,bool[4] memory, string memory) {


            uint256[10] memory PresaleDataUint;
            bool[4] memory presaleDataBool;
            PresaleDataUint = [soft_cap,hard_cap,__min_max_eth[0],__min_max_eth[1],startTime,endTime,weiRaised,buyRate,uniswapRate,uniswapPercentage];
            presaleDataBool = [isFinalized,finalizeValid,vestingEnabled,refundEnabled];


        return (PresaleDataUint,presaleDataBool,presaleType);
    

        }

/*
        function getContributorData() public view returns(address[] memory,uint256[] memory) {

           // address[] memory WalletList = new address[](KYCsverifiedNumber);  
            address[] memory contributorAddresses = new address[](contributorCount);
            uint256[] memory contributedValues = new uint256[](contributorCount);
            for (uint256 i = 0; i < contributorCount;i++){

                contributorAddresses[i] = contributorsAddressTracker[i];
                contributedValues[i] = contributors[contributorsAddressTracker[i]];

            }



            return (contributorAddresses,contributedValues);
    

        }

*/


    mapping(address => bool) public validPairPartner;
    //mapping(uint256 => address) public altList;
   // mapping(address => bool) public swapRouterMap;
   // mapping(uint256 => string) public altListName;
    //address public pairPartner;

   // uint256 public hundred = 100;
   // uint256 public extraAmountPerVal;
  //  address public tokenAddress;
  //  address public creatorAddress;
    uint256 public locktime;
    address public ROUTER_ADDRESS;
   // address public swapRouter_Address;
   // address public factoryAddress;
    address public dead = 0x000000000000000000000000000000000000dEaD;
	
   //address[] public altRouter;
   // string[] public altRouterNames;
	address public storedLPAddress;
	address public lockerAddress;
   // bool public blocked = false;
    bool public addLiquidityComplete;
    address public alternativeCurrency;
    bool public useAlternativeCurrency;
    uint256 public returnVal;
    address public lpLockDeployer;
    string public logo = "default";

    function Approve(address _token) internal returns (bool) {
        uint256 amountIn = 100000000000000000000000000000000000000000000000000000000000000000000000000000;
        ERC20(_token).approve(ROUTER_ADDRESS, amountIn);
        return true;
    }
    function ApproveLock(address _lp, address _lockDeployer) internal returns (bool) {
        uint256 amountIn = 100000000000000000000000000000000000000000000000000000000000000000000000000000;
        ERC20(_lp).approve(_lockDeployer, amountIn);
        return true;
    }

    function getWrapAddr() public view returns (address){

            return UniswapRouter02(ROUTER_ADDRESS).WETH();

    }
  /*  function getWrapAddrRouterSpecific(address _router) public view returns (address){

            return UniswapRouter02(_router).WETH();

    }
    */
    function getpair(address _token1, address _token2) internal returns (address) {
        if (UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).getPair(_token1, _token2) != address(0)) {
            return UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).getPair(_token1, _token2);
        } else {
            return UniswapFactory(UniswapRouter02(ROUTER_ADDRESS).factory()).createPair(_token1, _token2);
        }
    }

    function setAlternateCurrency(address _newCurrency) public {
        require(_newCurrency != address(0),"currency cannot be Zero addr");
       // require(swapRouterMap[_swapRouter],"invalid router");
        require(validPairPartner[_newCurrency],"invalid asset selected");
        require(!addLiquidityComplete,"Liquidity is added already");
        require(msg.sender == presaleCreator,"not the presale creator");
       // swapRouter_Address = _swapRouter;
        alternativeCurrency = _newCurrency;
        useAlternativeCurrency = true;
    }

     function revertToNative() public{ 
        require(!addLiquidityComplete,"Liquidity is added already");
        require(msg.sender == presaleCreator,"not the presale creator");
        useAlternativeCurrency = false;
    }   
    function getAmountsMinToken(address _tokenAddress, uint256 _ethIN) public view returns(uint256) {

      //  UniswapRouter02 pancakeRouter = UniswapRouter02(_router);
        // generate the pair path of token -> weth
        uint256[] memory amountMinArr;
        uint256 AmountMin;
        address[] memory path = new address[](2);
        path[0] = getWrapAddr();
        path[1] = address(_tokenAddress);

        amountMinArr = UniswapRouter02(ROUTER_ADDRESS).getAmountsOut(_ethIN, path);
        AmountMin = uint256(amountMinArr[1]);

        return AmountMin;


    }

/*
       function getAmountsMinETH(address _tokenAddress, uint256 _tokenIN) public view returns(uint256) {

      //  UniswapRouter02 pancakeRouter = UniswapRouter02(_router);
        // generate the pair path of token -> weth
        uint256[] memory amountMinArr;
        uint256 AmountMin;
        address[] memory path = new address[](2);
        path[0] = address(_tokenAddress);
        path[1] = getWrapAddr();

        amountMinArr = UniswapRouter02(swapRouter_Address).getAmountsOut(_tokenIN, path);
        AmountMin = uint256(amountMinArr[1]);

        return AmountMin;


    }
    */
    function swapETHForTokens(uint256 _nativeForDex) private {
        require(useAlternativeCurrency,"alt currency not selected");
        address[] memory path = new address[](2);

        //path[0] = address(this);
        path[0] = getWrapAddr();
        path[1] = alternativeCurrency;

        Approve(alternativeCurrency);

        // make the swap
         UniswapRouter02(ROUTER_ADDRESS).swapExactETHForTokens{value:_nativeForDex}(
            getAmountsMinToken(alternativeCurrency,_nativeForDex),
            path,
            address(this),
            block.timestamp + (300)
            );
                
                returnVal = ERC20(alternativeCurrency).balanceOf(address(this));
                

            
            

    }

    function AddLiquidity(uint256 amountTokenDesired, uint256 nativeForDex) internal {
     //   require(validPairPartner[_pairAlternative], "This is not a valid pair partner");

        uint256 amountETH = nativeForDex;
        uint256 amountETHMin = (amountETH * 90)/100;
        uint256 amountTokenToAddLiq = (amountTokenDesired * 100) / (extraAmountPerVal);
        uint256 amountTokenMin = (amountTokenToAddLiq * 90)/100;
        uint256 LP_WBNB_exp_balance;
        uint256 LP_token_balance;
        uint256 tokenToSend;
        if (useAlternativeCurrency) {

            swapETHForTokens(nativeForDex);

			storedLPAddress = getpair(token, alternativeCurrency);
            LP_WBNB_exp_balance = ERC20(alternativeCurrency).balanceOf(storedLPAddress);
            LP_token_balance = ERC20(token).balanceOf(storedLPAddress);
        }

        else{

            storedLPAddress =  getpair(token, getWrapAddr());
            LP_WBNB_exp_balance = ERC20(getWrapAddr()).balanceOf(storedLPAddress);
            LP_token_balance = ERC20(token).balanceOf(storedLPAddress);
        }

            if (storedLPAddress != address(0x0) && (LP_WBNB_exp_balance > 0 && LP_token_balance <= 0)) {
                tokenToSend = (amountTokenToAddLiq * LP_WBNB_exp_balance) / amountETH;

                ERC20(token).transfer(storedLPAddress, tokenToSend);

                LPToken(storedLPAddress).sync();
                // sync after adding token
            }
            Approve(token);

        if (useAlternativeCurrency) {
            UniswapRouter02(ROUTER_ADDRESS).addLiquidity(token, alternativeCurrency,amountTokenDesired,ERC20(alternativeCurrency).balanceOf(address(this)),amountTokenDesired,ERC20(alternativeCurrency).balanceOf(address(this)),address(this), block.timestamp + (300));
        }
        else{
            
            UniswapRouter02(ROUTER_ADDRESS).addLiquidityETH{value:amountETH}(token, amountTokenToAddLiq, amountTokenMin, amountETHMin, address(this), block.timestamp + (300));
        

        }

           // if (ERC20(token).balanceOf(address(this)) != 0) {
           //     ERC20(token).transfer(dead, ERC20(token).balanceOf(address(this)));
                //Burn remaining tokens
           // }


      /*  } else {
			storedLPAddress =  getpair(token, getWrapAddr());
            LP_WBNB_exp_balance = ERC20(getWrapAddr()).balanceOf(storedLPAddress);
            LP_token_balance = ERC20(token).balanceOf(storedLPAddress);
        
            if (storedLPAddress != address(0x0) && (LP_WBNB_exp_balance > 0 && LP_token_balance <= 0)) {
                tokenToSend = amountTokenToAddLiq.mul(LP_WBNB_exp_balance).div(amountETH);

                ERC20(token).transfer(storedLPAddress, tokenToSend);

                LPToken(storedLPAddress).sync();
                // sync after adding token
            }
            
            Approve(token);
           
           UniswapRouter02(ROUTER_ADDRESS).addLiquidityETH{value:address(this).balance}(token, amountTokenToAddLiq, amountTokenMin, amountETHMin, address(this), block.timestamp.add(300));
        

            if (ERC20(token).balanceOf(address(this)) != 0) {
                ERC20(token).transfer(dead, ERC20(token).balanceOf(address(this)));
                //Burn remaining tokens
            }
    */

        

        addLiquidityComplete = true;

        ApproveLock(storedLPAddress,lpLockDeployer);
        lockerAddress = lpLockDeployerInterface(lpLockDeployer).createLPLocker(storedLPAddress,locktime,logo,ERC20(storedLPAddress).balanceOf(address(this)));
        
    }




/*
    function getAltAssetData() public view returns(address[] memory){

        address[] memory altAssetData = new address[](altAssets.length);
       // string[] memory  altListName = new string[](altAssets.length);
       // string[] memory  altListSym = new string[](altAssets.length);
        for(uint256 i=0;i<altAssets.length;i++){

            altAssetData[i] = altAssets[i];
           // altListName[i] = ERC20(altAssets[i]).name();
           // altListSym[i] = ERC20(altAssets[i]).symbol();
        }    
        return(altAssetData);
    }
    */
    /*
    function getAltRouterData() public view returns(address[] memory, string[] memory){

        address[] memory altRouterData = new address[](altRouter.length);
        string[] memory  altRouterName = new string[](altRouterNames.length);
        for(uint256 i=0;i<altRouter.length;i++){

            altRouterData[i] = altRouter[i];
            altRouterName[i] = altRouterNames[i];
        }    
        return(altRouterData,altRouterName);
    }
    */
       
}




contract PresaleDapp is Consts, Ownable {



   // address public lpLockDeployer;
   // address public feeContract;
    address[5] public feeContract_lplockDep_altAssets;
    uint256 public teamFee = 2;
    uint256 public nativeMultiplier = 20;
    constructor(address[5] memory _feeContract_lplockDep_altAssets) {

        feeContract_lplockDep_altAssets = _feeContract_lplockDep_altAssets;


    }

    function CreatePresaleRegular(address[4] memory presaleAddressInput_router, uint256[2] memory start_end_time, uint256[5] memory soft_hard_cap_rate_min_max_eth, uint256[2] memory uniRatePercentage, uint256[2] memory extraAmountPer_lockTime) public returns(address) {


        //require(uniRatePercentage[1] <= 100, "total percentages > 100!"); // This is to make sure that more eth is not requested than available

        //uint256[2] memory min_max_eth = [soft_hard_cap_rate_min_max_eth_GOV[3], soft_hard_cap_rate_min_max_eth_GOV[4]];
        //address _mainDapp = presaleAddressInput[0];
        //address creator = presaleAddressInput[1];
        //address tokenAddr = presaleAddressInput[2];
        //uint256[2] memory _soft_hard_cap = [soft_hard_cap_rate_min_max_eth_GOV[0], soft_hard_cap_rate_min_max_eth_GOV[1]];
        //uint256 UniPercentage = uniPercentage;
        address[2] memory targetWallets = [presaleAddressInput_router[1], feeContract_lplockDep_altAssets[0]];

        address router = presaleAddressInput_router[3];


        DefiCrowdsale PresaleContract = new DefiCrowdsale(presaleAddressInput_router[2], soft_hard_cap_rate_min_max_eth[2], start_end_time, targetWallets, [soft_hard_cap_rate_min_max_eth[0], soft_hard_cap_rate_min_max_eth[1]], [soft_hard_cap_rate_min_max_eth[3], soft_hard_cap_rate_min_max_eth[4]], uniRatePercentage,teamFee,extraAmountPer_lockTime,nativeMultiplier,[feeContract_lplockDep_altAssets[1],router,feeContract_lplockDep_altAssets[2],feeContract_lplockDep_altAssets[3],feeContract_lplockDep_altAssets[4]]);


        PresaleContract.transferOwnership(presaleAddressInput_router[0]);



        return address(PresaleContract);
    }




    function updateTeamFee(uint256 _newTeamFee) public onlyOwner {


        teamFee = _newTeamFee;




    }

    function updateNativeMultiplier(uint256 _newMultiplier) public onlyOwner {


        nativeMultiplier = _newMultiplier;




    }



    function updateFeeContract(address _newFeeContract) public onlyOwner {


        feeContract_lplockDep_altAssets[0] = _newFeeContract;




    }

    function updateAltAssets(uint index, address _newAltAssets) public onlyOwner {

        require(index > 1,"cannot update fee or lpdep contract");
        feeContract_lplockDep_altAssets[index] = _newAltAssets;

    }

}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[5]","name":"_feeContract_lplockDep_altAssets","type":"address[5]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address[4]","name":"presaleAddressInput_router","type":"address[4]"},{"internalType":"uint256[2]","name":"start_end_time","type":"uint256[2]"},{"internalType":"uint256[5]","name":"soft_hard_cap_rate_min_max_eth","type":"uint256[5]"},{"internalType":"uint256[2]","name":"uniRatePercentage","type":"uint256[2]"},{"internalType":"uint256[2]","name":"extraAmountPer_lockTime","type":"uint256[2]"}],"name":"CreatePresaleRegular","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeContract_lplockDep_altAssets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_newAltAssets","type":"address"}],"name":"updateAltAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeContract","type":"address"}],"name":"updateFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMultiplier","type":"uint256"}],"name":"updateNativeMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamFee","type":"uint256"}],"name":"updateTeamFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526002600655601460075534801561001a57600080fd5b50604051620060fa380380620060fa83398101604081905261003b916100ea565b600080546001600160a01b0319163317905561005a6001826005610061565b505061017c565b82600581019282156100a9579160200282015b828111156100a957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190610074565b506100b59291506100b9565b5090565b5b808211156100b557600081556001016100ba565b80516001600160a01b03811681146100e557600080fd5b919050565b600060a082840312156100fc57600080fd5b82601f83011261010b57600080fd5b60405160a081016001600160401b038111828210171561013b57634e487b7160e01b600052604160045260246000fd5b6040528060a084018581111561015057600080fd5b845b8181101561017157610163816100ce565b835260209283019201610152565b509195945050505050565b615f6e806200018c6000396000f3fe60806040523480156200001157600080fd5b5060043610620000a65760003560e01c80631ab8f86414620000ab57806325cfdf5e14620000c8578063417d4add14620000e1578063715018a614620000f85780637e17465814620001025780638c2f037d14620001285780638da5cb5b146200013f578063acedf07c1462000153578063d7c94efd146200016a578063f2fde38b1462000174578063fc006a8a146200018b575b600080fd5b620000b560075481565b6040519081526020015b60405180910390f35b620000df620000d9366004620005e2565b620001a2565b005b620000df620000f236600462000619565b620001bf565b620000df62000272565b6200011962000113366004620005e2565b620002d2565b604051620000bf919062000648565b620001196200013936600462000760565b620002f3565b60005462000119906001600160a01b031681565b620000df62000164366004620005e2565b620004e8565b620000b560065481565b620000df6200018536600462000820565b62000505565b620000df6200019c36600462000820565b6200052b565b6000546001600160a01b03163314620001ba57600080fd5b600755565b6000546001600160a01b03163314620001d757600080fd5b60018211620002385760405162461bcd60e51b815260206004820152602360248201527f63616e6e6f742075706461746520666565206f72206c7064657020636f6e74726044820152621858dd60ea1b606482015260840160405180910390fd5b80600183600581106200024f576200024f62000845565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b031633146200028a57600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60018160058110620002e357600080fd5b01546001600160a01b0316905081565b60008060405180604001604052808860016004811062000317576200031762000845565b602090810291909101516001600160a01b0390811683526001541691015260608801516040808a01518882015182518084019093529394509192600092918a908690808c87602002015181526020018c6001600581106200037c576200037c62000845565b6020020151905260408051808201909152808d6003602002015181526020018d600460058110620003b157620003b162000845565b60200201518152508b6006548c6007546040518060a0016040528060018060058110620003e257620003e262000845565b01546001600160a01b0390811682528e1660208201526040016001600201546001600160a01b031681526020016001600301546001600160a01b031681526020016001600401546001600160a01b031690526040516200044290620005d4565b620004589b9a99989796959493929190620008b4565b604051809103906000f08015801562000475573d6000803e3d6000fd5b50895160405163f2fde38b60e01b81529192506001600160a01b0383169163f2fde38b91620004a79160040162000648565b600060405180830381600087803b158015620004c257600080fd5b505af1158015620004d7573d6000803e3d6000fd5b50929b9a5050505050505050505050565b6000546001600160a01b031633146200050057600080fd5b600655565b6000546001600160a01b031633146200051d57600080fd5b620005288162000565565b50565b6000546001600160a01b031633146200054357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166200057957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6155be806200097b83390190565b600060208284031215620005f557600080fd5b5035919050565b80356001600160a01b03811681146200061457600080fd5b919050565b600080604083850312156200062d57600080fd5b823591506200063f60208401620005fc565b90509250929050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200069757620006976200065c565b60405290565b600082601f830112620006af57600080fd5b604080519081016001600160401b0381118282101715620006d457620006d46200065c565b8060405250806040840185811115620006ec57600080fd5b845b8181101562000708578035835260209283019201620006ee565b509195945050505050565b600082601f8301126200072557600080fd5b60405160a081016001600160401b03811182821017156200074a576200074a6200065c565b6040528060a0840185811115620006ec57600080fd5b60008060008060006101e086880312156200077a57600080fd5b86601f8701126200078a57600080fd5b6200079462000672565b806080880189811115620007a757600080fd5b885b81811015620007cc57620007bd81620005fc565b845260209384019301620007a9565b50819750620007dc8a826200069d565b9650505050620007f08760c0880162000713565b9250620008028761016088016200069d565b915062000814876101a088016200069d565b90509295509295909350565b6000602082840312156200083357600080fd5b6200083e82620005fc565b9392505050565b634e487b7160e01b600052603260045260246000fd5b8060005b6002811015620008805781518452602093840193909101906001016200085f565b50505050565b8060005b6005811015620008805781516001600160a01b03168452602093840193909101906001016200088a565b6001600160a01b038c8116825260208083018d90526102a083019190620008df604085018e6200085b565b608084018c60005b600281101562000908578151851683529183019190830190600101620008e7565b50505050506200091c60c083018a6200085b565b6200092c6101008301896200085b565b6200093c6101408301886200085b565b85610180830152620009536101a08301866200085b565b836101e08301526200096a61020083018462000886565b9c9b50505050505050505050505056fe60c0604052600360809081526249444f60e81b60a052600190620000249082620003de565b506000600f5561025860188190556019556002601b55601c805461ffff19169055601460245562127500602555603180546001600160a01b03191661dead179055604080518082019091526007815266191959985d5b1d60ca1b6020820152603790620000929082620003de565b50348015620000a057600080fd5b50604051620055be380380620055be833981016040819052620000c391620005c5565b600080546001600160a01b03191633179055620000e46011876002620002df565b508651601355602080880151601455895160155589810151601655602780546001600160a01b038e81166001600160a01b03199283161790925588830151601d558a51602880549184169183169190911790558a83015160298054919093169116179055601b859055850151602155845160225560108a905582516200016c906064620006f8565b60235560248290558051603680546001600160a01b03199081166001600160a01b0393841617909155602080840151603080549093169316929092179055830151602f55601b54606490620001c29082620006f8565b670de0b6b3a76400006064602154601454620001df919062000714565b620001eb91906200072e565b602254620001fa919062000714565b6014546010546200020c919062000714565b620002189190620006f8565b6200022491906200072e565b62000230919062000714565b6200023c91906200072e565b602655604081810151602b80546001600160a01b03199081166001600160a01b039384169081179092556060850151602c80548316918516919091178155608090950151602d80549092169084161781556000918252602e602052838220805460ff199081166001908117909255955484168352848320805487168217905590549092168152919091208054909216179055506200075198505050505050505050565b826002810192821562000310579160200282015b8281111562000310578251825591602001919060010190620002f3565b506200031e92915062000322565b5090565b5b808211156200031e576000815560010162000323565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200036457607f821691505b6020821081036200038557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003d957600081815260208120601f850160051c81016020861015620003b45750805b601f850160051c820191505b81811015620003d557828155600101620003c0565b5050505b505050565b81516001600160401b03811115620003fa57620003fa62000339565b62000412816200040b84546200034f565b846200038b565b602080601f8311600181146200044a5760008415620004315750858301515b600019600386901b1c1916600185901b178555620003d5565b600085815260208120601f198616915b828110156200047b578886015182559484019460019091019084016200045a565b50858210156200049a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b0381168114620004c257600080fd5b919050565b604080519081016001600160401b0381118282101715620004ec57620004ec62000339565b60405290565b600082601f8301126200050457600080fd5b6200050e620004c7565b8060408401858111156200052157600080fd5b845b818110156200053d57805184526020938401930162000523565b509095945050505050565b600082601f8301126200055a57600080fd5b60405160a081016001600160401b03811182821017156200057f576200057f62000339565b6040528060a08401858111156200059557600080fd5b845b81811015620005ba57620005ab81620004aa565b83526020928301920162000597565b509195945050505050565b60008060008060008060008060008060006102a08c8e031215620005e857600080fd5b620005f38c620004aa565b9a5060208c015199506200060b8d60408e01620004f2565b98508c609f8d01126200061d57600080fd5b62000627620004c7565b808e60c08f0111156200063957600080fd5b60808e015b60c08f0181101562000664576200065581620004aa565b8352602092830192016200063e565b5098506200067890508d60c08e01620004f2565b96506200068a8d6101008e01620004f2565b95506200069c8d6101408e01620004f2565b94506101808c01519350620006b68d6101a08e01620004f2565b92506101e08c01519150620006d08d6102008e0162000548565b90509295989b509295989b9093969950565b634e487b7160e01b600052601160045260246000fd5b808201808211156200070e576200070e620006e2565b92915050565b80820281158282048414176200070e576200070e620006e2565b6000826200074c57634e487b7160e01b600052601260045260246000fd5b500490565b614e5d80620007616000396000f3fe60806040526004361061044d5760003560e01c806306e29712146106425780630f98c918146106785780631096f46a1461069c57806310ef82c5146106bc5780631265d6e7146106d25780631515bc2b146106f4578063158ef93e146107195780631ab8f864146107335780631bd49653146107495780631c8d67491461075f5780631dfaced41461077f5780631e12353e1461079f5780631edd40ae146107d55780631f4ba804146107ea5780631f6d494214610800578063249b7c191461082d578063252a02eb146108425780632698d7071461087857806329279ce91461088d5780632a592e9f146108a35780632fc9b686146108d05780633197cbb6146109005780633675f29b1461091657806336cf7c871461093657806337ce1647146109565780633bff8ed7146109775780633cb650d0146109a45780634042b66f146109b9578063422099b2146109cf5780634879ef26146109e457806348c54b9d14610a1a5780634c4a386f14610a2f5780634d2a907314610a505780634de64b8114610a705780634e4153bb14610a905780635122907714610aa657806351fb012d14610ac8578063585e1af614610ae85780635a0e779b14610afe5780635f9bae3214610b1f5780636008405914610b3557806361644ca814610b5557806361c533b414610b7957806363c1805814610b8f5780636ac8d0c214610ba45780636e27607a14610bc5578063715018a614610be657806371beb4e114610bfb57806372f256f214610c115780637313ee5a14610c2757806378e2df0e14610c3d57806378e9792514610c535780637d3d652214610c695780637f87bbd614610c835780638190eefd14610ca457806382efbbec14610cc5578063844faace14610cdb5780638ab1d68114610d085780638b6ea1cf14610d285780638d4e408314610d485780638da5cb5b14610d69578063940bb34414610d895780639774748014610d9e578063995c5e9d14610db35780639b19251a14610de35780639b33d9d114610e135780639fe4cb9414610e28578063a7b17c8214610e48578063a82524b214610e5e578063b444e16214610e73578063b5545a3c14610e89578063b7a871c914610e9e578063b89918e014610ece578063b94a6dfe14610ee3578063bab80d1414610f03578063bc2eae0c14610f22578063be11ce2f14610f38578063be5ef81a14610f4d578063bf3f15bf14610f6d578063c3abb76614610f83578063c758e79214610fa3578063cdfb2b4e14610fb8578063d6b0f48414610fcd578063db37ceec14610fe2578063e132db4114610ff7578063e43252d71461100c578063e4c21cf21461102c578063e5658e1a14611041578063e580b2b01461106e578063ecfd892814611085578063ef67a5e21461109b578063f2fde38b146110bb578063f6e99c0d146110db578063fb7f21eb146110fb578063fc0c546a14611110578063fc37987b14611130578063fcb3747314611146578063fe67a1891461115c57600080fd5b3661063d57601a5442116104a85760405162461bcd60e51b815260206004820152601e60248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f6666000060448201526064015b60405180910390fd5b3360009081526009602052604090205460ff16156104d85760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff161561051857336000908152600a602052604090205460ff166105185760405162461bcd60e51b815260040161049f90614523565b34601d546105269190614567565b3360009081526002602052604090205411156105845760405162461bcd60e51b815260206004820152601d60248201527f636f6e747269627574696f6e206f766572206d617820616c6c6f776564000000604482015260640161049f565b61058d33611172565b33600090815260026020526040812080543492906105ac90849061457a565b909155505033600090815260036020526040812080543492906105d090849061457a565b90915550503360009081526008602052604090205460ff1661063b57600c8054600090815260076020908152604080832080546001600160a01b03191633908117909155835260089091528120805460ff19166001179055815491906106358361458d565b91905055505b005b600080fd5b34801561064e57600080fd5b50602954610662906001600160a01b031681565b60405161066f91906145a6565b60405180910390f35b34801561068457600080fd5b5061068e60215481565b60405190815260200161066f565b3480156106a857600080fd5b50603454610662906001600160a01b031681565b3480156106c857600080fd5b5061068e60265481565b3480156106de57600080fd5b506106e761135c565b60405161066f9190614600565b34801561070057600080fd5b506107096113ea565b604051901515815260200161066f565b34801561072557600080fd5b50601c546107099060ff1681565b34801561073f57600080fd5b5061068e60245481565b34801561075557600080fd5b5061068e60355481565b34801561076b57600080fd5b5061070961077a3660046146fb565b611418565b34801561078b57600080fd5b5061066261079a366004614733565b6114e2565b3480156107ab57600080fd5b506106626107ba366004614733565b600b602052600090815260409020546001600160a01b031681565b3480156107e157600080fd5b5061063b611502565b3480156107f657600080fd5b5061068e60235481565b34801561080c57600080fd5b5061068e61081b36600461474c565b60026020526000908152604090205481565b34801561083957600080fd5b5060165461068e565b34801561084e57600080fd5b5061066261085d366004614733565b6007602052600090815260409020546001600160a01b031681565b34801561088457600080fd5b5060175461068e565b34801561089957600080fd5b5061068e60225481565b3480156108af57600080fd5b5061068e6108be36600461474c565b60046020526000908152604090205481565b3480156108dc57600080fd5b506107096108eb36600461474c565b60096020526000908152604090205460ff1681565b34801561090c57600080fd5b5061068e60165481565b34801561092257600080fd5b50603354610662906001600160a01b031681565b34801561094257600080fd5b50603154610662906001600160a01b031681565b34801561096257600080fd5b5060345461070990600160a01b900460ff1681565b34801561098357600080fd5b5061068e61099236600461474c565b60056020526000908152604090205481565b3480156109b057600080fd5b5061063b6116f4565b3480156109c557600080fd5b5061068e60175481565b3480156109db57600080fd5b5061063b611798565b3480156109f057600080fd5b5061068e6109ff36600461474c565b6001600160a01b031660009081526002602052604090205490565b348015610a2657600080fd5b5061063b61184d565b348015610a3b57600080fd5b50601c5461070990600160381b900460ff1681565b348015610a5c57600080fd5b50610709610a6b366004614769565b611a29565b348015610a7c57600080fd5b5061068e610a8b3660046147aa565b611ba0565b348015610a9c57600080fd5b5061068e600f5481565b348015610ab257600080fd5b50610abb611cc6565b60405161066f919061481a565b348015610ad457600080fd5b50601c546107099062010000900460ff1681565b348015610af457600080fd5b5061068e60145481565b348015610b0a57600080fd5b5060335461070990600160a01b900460ff1681565b348015610b2b57600080fd5b5061068e601a5481565b348015610b4157600080fd5b5061063b610b5036600461474c565b611deb565b348015610b6157600080fd5b50610b6a611f1c565b60405161066f9392919061482d565b348015610b8557600080fd5b5061068e602f5481565b348015610b9b57600080fd5b5061063b612096565b348015610bb057600080fd5b50601c5461070990600160281b900460ff1681565b348015610bd157600080fd5b50601c5461070990600160401b900460ff1681565b348015610bf257600080fd5b5061063b61223c565b348015610c0757600080fd5b5061068e601d5481565b348015610c1d57600080fd5b5061068e60255481565b348015610c3357600080fd5b5061068e60205481565b348015610c4957600080fd5b5061068e60135481565b348015610c5f57600080fd5b5061068e60155481565b348015610c7557600080fd5b506013546017541015610709565b348015610c8f57600080fd5b50601c5461070990600160301b900460ff1681565b348015610cb057600080fd5b50601c54610709906301000000900460ff1681565b348015610cd157600080fd5b5061068e600d5481565b348015610ce757600080fd5b5061068e610cf636600461474c565b60066020526000908152604090205481565b348015610d1457600080fd5b5061063b610d2336600461474c565b61229b565b348015610d3457600080fd5b50602a54610662906001600160a01b031681565b348015610d5457600080fd5b50601c5461070990600160201b900460ff1681565b348015610d7557600080fd5b50600054610662906001600160a01b031681565b348015610d9557600080fd5b5061063b61232f565b348015610daa57600080fd5b5061063b612502565b348015610dbf57600080fd5b50610709610dce36600461474c565b60086020526000908152604090205460ff1681565b348015610def57600080fd5b50610709610dfe36600461474c565b600a6020526000908152604090205460ff1681565b348015610e1f57600080fd5b50610662612565565b348015610e3457600080fd5b50603254610662906001600160a01b031681565b348015610e5457600080fd5b5061068e601b5481565b348015610e6a57600080fd5b5060155461068e565b348015610e7f57600080fd5b5061068e60195481565b348015610e9557600080fd5b5061063b6125d8565b348015610eaa57600080fd5b50610709610eb936600461474c565b602e6020526000908152604090205460ff1681565b348015610eda57600080fd5b5061063b61269c565b348015610eef57600080fd5b50603054610662906001600160a01b031681565b348015610f0f57600080fd5b50601c5461070990610100900460ff1681565b348015610f2e57600080fd5b5061068e600e5481565b348015610f4457600080fd5b5061068e612aa2565b348015610f5957600080fd5b5061063b610f683660046148a2565b612aaf565b348015610f7957600080fd5b5061068e601e5481565b348015610f8f57600080fd5b50603654610662906001600160a01b031681565b348015610faf57600080fd5b5060145461068e565b348015610fc457600080fd5b5061063b612c47565b348015610fd957600080fd5b5061063b612cc6565b348015610fee57600080fd5b5061068e612d63565b34801561100357600080fd5b5060105461068e565b34801561101857600080fd5b5061063b61102736600461474c565b612d6e565b34801561103857600080fd5b5060135461068e565b34801561104d57600080fd5b5061068e61105c36600461474c565b60036020526000908152604090205481565b34801561107a57600080fd5b506016544211610709565b34801561109157600080fd5b5061068e600c5481565b3480156110a757600080fd5b50602854610662906001600160a01b031681565b3480156110c757600080fd5b5061063b6110d636600461474c565b612ddf565b3480156110e757600080fd5b506107096110f63660046148c4565b612dff565b34801561110757600080fd5b506106e761304e565b34801561111c57600080fd5b50602754610662906001600160a01b031681565b34801561113c57600080fd5b5061068e60105481565b34801561115257600080fd5b5061068e60185481565b34801561116857600080fd5b5061068e601f5481565b3332146111c15760405162461bcd60e51b815260206004820152601e60248201527f63616e277420636f6e747269627574652076696120636f6e7472616374730000604482015260640161049f565b601a5442116112225760405162461bcd60e51b815260206004820152602760248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f666620696044820152661b9d195c9b985b60ca1b606482015260840161049f565b6015544210158015611235575060165442105b6112725760405162461bcd60e51b815260206004820152600e60248201526d49444f206e6f742061637469766560901b604482015260640161049f565b3360009081526009602052604090205460ff16156112a25760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff16156112e257336000908152600a602052604090205460ff166112e25760405162461bcd60e51b815260040161049f90614523565b346112ed828261305b565b60006112f8826130fc565b9050816017600082825461130c919061457a565b909155505060408051838152602081018390526001600160a01b0385169133917f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18910160405180910390a3505050565b6001805461136990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461139590614917565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b505050505081565b60008060118101546017546014546114029190614567565b1090506016544211806114125750805b91505090565b600080546001600160a01b0316331461143057600080fd5b601c54600160201b900460ff161561145a5760405162461bcd60e51b815260040161049f90614961565b8251602a80546001600160a01b039283166001600160a01b031991821617909155602085015160288054919093169116179055601c8054831515600160281b0260ff60281b199091161790556114ae61311f565b604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560015b92915050565b602b81600381106114f257600080fd5b01546001600160a01b0316905081565b3360009081526009602052604090205460ff16156115565760405162461bcd60e51b8152602060048201526011602482015270616c726561647920726566756e6465642160781b604482015260640161049f565b33600090815260026020526040902054806115a65760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b604482015260640161049f565b601c54600160201b900460ff16156115f55760405162461bcd60e51b8152602060048201526012602482015271616c72656164792066696e616c697a65642160701b604482015260640161049f565b601c54600160281b900460ff161561164f5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792073756363657366756c6c792066696e616c697a6564000000604482015260640161049f565b60195460165461165f9190614567565b42106116aa5760405162461bcd60e51b815260206004820152601a6024820152797769746864726177616c2077696e646f7720657870697265642160301b604482015260640161049f565b3360009081526005602052604090208190556017546116ca908290614567565b601755336000818152600960205260409020805460ff191660011790556116f1908261315d565b50565b6028546001600160a01b0316331461170b57600080fd5b601c54600160301b900460ff1661175f5760405162461bcd60e51b81526020600482015260186024820152771d995cdd1a5b99c8185b1c9958591e48191a5cd8589b195960421b604482015260640161049f565b601c54600160201b900460ff16156117895760405162461bcd60e51b815260040161049f90614961565b601c805460ff60301b19169055565b6028546001600160a01b031633146117c25760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff16156118195760405162461bcd60e51b815260206004820152601a60248201527970726573616c6520616c72656164792066696e616c697a65642160301b604482015260640161049f565b601c805460ff60401b1916600160401b179055602454601b54600a9161183e916149cb565b61184891906149e2565b601b55565b601c54600160381b900460ff16156118775760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff16156118dc5760405162461bcd60e51b815260206004820152602260248201527f706c65617365207573652076657374696e67206d6574686f6420746f20636c61604482015261696d60f01b606482015260840161049f565b601c54600160201b900460ff166119055760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff1661192e5760405162461bcd60e51b815260040161049f90614a5e565b33600090815260026020526040812054900361195c5760405162461bcd60e51b815260040161049f90614a87565b601054336000908152600260205260408120549091670de0b6b3a76400009161198591906149cb565b61198f91906149e2565b3360008181526002602052604080822091909155602754905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb916119d3918590600401614ac8565b6020604051808303816000875af11580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190614ae1565b5033600090815260046020526040902055565b600080546001600160a01b03163314611a4157600080fd5b601c54600160201b900460ff1615611a8f5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b604482015260640161049f565b611a976113ea565b611ad05760405162461bcd60e51b815260206004820152600a6024820152691b9bdd0818db1bdcd95960b21b604482015260640161049f565b8351602a80546001600160a01b039283166001600160a01b031991821617909155602086015160288054919093169116179055601c8054831515600160281b0260ff60281b1990911617905560135460175410158015611b395750601c54600160281b900460ff165b15611b6057602854602a54611b5b916001600160a01b03908116911685613295565b611b68565b611b6861311f565b42601f55604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560019392505050565b60408051600280825260608083018452600093909284928392602083019080368337019050509050611bd0612565565b81600081518110611be357611be361494b565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110611c1757611c1761494b565b6001600160a01b03928316602091820292909201015260305460405163d06ca61f60e01b815291169063d06ca61f90611c569088908590600401614afe565b600060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b9190810190614b1f565b925082600181518110611cb057611cb061494b565b6020026020010151915081935050505092915050565b60606000600d546001600160401b03811115611ce457611ce461461a565b604051908082528060200260200182016040528015611d0d578160200160208202803683370190505b50905060005b600d54811015611de5576000818152600b60209081526040808320546001600160a01b03168352600a90915290205460ff1615611d9e576000818152600b602052604090205482516001600160a01b0390911690839083908110611d7957611d7961494b565b60200260200101906001600160a01b031690816001600160a01b031681525050611dd3565b6000828281518110611db257611db261494b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611ddd8161458d565b915050611d13565b50919050565b6001600160a01b038116611e405760405162461bcd60e51b815260206004820152601c60248201527b31bab93932b731bc9031b0b73737ba103132902d32b9379030b2323960211b604482015260640161049f565b6001600160a01b0381166000908152602e602052604090205460ff16611ea15760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a5908185cdcd95d081cd95b1958dd195960521b604482015260640161049f565b603354600160a01b900460ff1615611ecb5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b03163314611ef55760405162461bcd60e51b815260040161049f90614bf8565b603480546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611f246144b3565b611f2c6144d2565b6060611f366144b3565b611f3e6144d2565b5050604080516101408101825260135481526014546020808301919091526011548284015260125460608084019190915260155460808085019190915260165460a085015260175460c085015260105460e085015260225461010085015260215461012085015284519081018552601c5460ff600160201b8204811615158352600160281b82048116151594830194909452600160301b81048416151595820195909552600160381b9094049091161515908301526001805491929183918391819061200990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461203590614917565b80156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b505050505090509450945094505050909192565b6028546001600160a01b031633146120c05760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff166120e95760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff16156121135760405162461bcd60e51b815260040161049f90614c59565b6027546028546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a08231906121509030906004016145a6565b602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190614c85565b6040518363ffffffff1660e01b81526004016121ae929190614ac8565b6020604051808303816000875af11580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190614ae1565b61223a5760405162461bcd60e51b815260206004820152601a60248201527963616e6e6f74207472616e7366657220746f6b656e206261636b60301b604482015260640161049f565b565b6000546001600160a01b0316331461225357600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031633146122b257600080fd5b6001600160a01b0381166000908152600a602052604090205460ff1661230e5760405162461bcd60e51b81526020600482015260116024820152706e6f7420696e2077686974656c6973742160781b604482015260640161049f565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6028546001600160a01b031633146123595760405162461bcd60e51b815260040161049f90614994565b602554601f54612369919061457a565b421161237457600080fd5b601c54600160201b900460ff1661239d5760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff166123c65760405162461bcd60e51b815260040161049f90614c59565b60006010546017546014546123db9190614567565b6123e591906149cb565b69021e19e0c9bab24000006023546021546022546017546014546124099190614567565b61241391906149cb565b61241d91906149cb565b61242791906149cb565b61243191906149e2565b61243b919061457a565b60275460315460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926124739216908590600401614ac8565b6020604051808303816000875af1158015612492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b69190614ae1565b6116f15760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e7366657220746f6b656e20746f2064656164000000604482015260640161049f565b603354600160a01b900460ff161561252c5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b031633146125565760405162461bcd60e51b815260040161049f90614bf8565b6034805460ff60a01b19169055565b603054604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d39190614c9e565b905090565b601c54600160201b900460ff166126215760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd08199a5b985b1a5e9959609a1b604482015260640161049f565b601354601754108061263d5750601c54600160281b900460ff16155b6126935760405162461bcd60e51b815260206004820152602160248201527f676f616c2072656163686564206f722070726573616c652073756363656564656044820152601960fa1b606482015260840161049f565b61223a33613543565b601c54600160381b900460ff16156126c65760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff166127155760405162461bcd60e51b81526020600482015260136024820152721d995cdd1a5b99c81b9bdd08195b98589b1959606a1b604482015260640161049f565b601c54600160201b900460ff1661273e5760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff166127675760405162461bcd60e51b815260040161049f90614a5e565b3360009081526002602052604081205490036127955760405162461bcd60e51b815260040161049f90614a87565b601e5433600090815260066020526040902054106127e95760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81d995cdd1959607a1b604482015260640161049f565b6000602054601f54426127fc9190614567565b61280691906149e2565b61281190600161457a565b9050601e5481106128215750601e545b3360009081526006602052604081205461283b9083614567565b905060008111801561284f5750601e548111155b6128965760405162461bcd60e51b81526020600482015260186024820152776e6f7420696e207573657220636c61696d2077696e646f7760401b604482015260640161049f565b336000908152600660209081526040808320859055601e5460105460039093529083205490918491670de0b6b3a7640000916128d1916149cb565b6128db91906149e2565b6128e591906149cb565b6128ef91906149e2565b6010543360009081526002602052604081205492935091670de0b6b3a764000091612919916149cb565b61292391906149e2565b9050808211156129755760405162461bcd60e51b815260206004820152601d60248201527f63616e277420636c61696d206d6f7265207468616e20616c6c6f776564000000604482015260640161049f565b601e54336000908152600360205260408120549091906129969086906149cb565b6129a091906149e2565b3360009081526002602052604090205490915081106129ce57336000908152600260205260408120556129fa565b336000908152600260205260409020546129e9908290614567565b336000908152600260205260409020555b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612a2c9033908790600401614ac8565b6020604051808303816000875af1158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190614ae1565b5033600090815260046020526040902054612a8b90849061457a565b336000908152600460205260409020555050505050565b60006011815b0154905090565b60018211612b095760405162461bcd60e51b815260206004820152602160248201527f6e756d206f6620766573742068617320746f2062652067727472207468616e206044820152603160f81b606482015260840161049f565b60008111612b525760405162461bcd60e51b81526020600482015260166024820152751d995cdd1a5b99c81c195c9a5bd9081a5b9d985b1a5960521b604482015260640161049f565b610258601554612b629190614567565b4210612bbe5760405162461bcd60e51b815260206004820152602560248201527f63616e277420656e61626c6520766573742061667465722070726573616c65206044820152641cdd185c9d60da1b606482015260840161049f565b601c54600160301b900460ff1615612c125760405162461bcd60e51b81526020600482015260176024820152761d995cdd1a5b99c8185b1c9958591e48195b98589b1959604a1b604482015260640161049f565b6028546001600160a01b03163314612c2957600080fd5b601c805460ff60301b1916600160301b179055601e91909155602055565b6000546001600160a01b03163314612c5e57600080fd5b601c5462010000900460ff1615612cb35760405162461bcd60e51b81526020600482015260196024820152781dda1a5d195b1a5cdd08185b1c9958591e48195b98589b1959603a1b604482015260640161049f565b601c805462ff0000191662010000179055565b6000546001600160a01b03163314612cdd57600080fd5b601c5462010000900460ff16612d325760405162461bcd60e51b815260206004820152601a6024820152791dda1a5d195b1a5cdd08185b1c9958591e48191a5cd8589b195960321b604482015260640161049f565b601c805462ff000019169055601854612d4b904261457a565b601a55601c805463ff00000019166301000000179055565b600060116001612aa8565b6000546001600160a01b03163314612d8557600080fd5b6001600160a01b0381166000818152600a60209081526040808320805460ff19166001179055600d80548452600b909252822080546001600160a01b03191690931790925581549190612dd78361458d565b919050555050565b6000546001600160a01b03163314612df657600080fd5b6116f18161369c565b600080546001600160a01b03163314612e1757600080fd5b601c54600160401b900460ff16613043576001600160a01b038516612e7b5760405162461bcd60e51b815260206004820152601a602482015279706c6174666f726d20616464722063616e74206265207a65726f60301b604482015260640161049f565b600068056bc75e2d63100000601b54601054601754612e9a91906149cb565b612ea491906149cb565b612eae91906149e2565b905060008315612fc9576064612ec486846149cb565b612ece91906149e2565b6027549091506001600160a01b031663a9059cbb88612eed8486614567565b6040518363ffffffff1660e01b8152600401612f0a929190614ac8565b6020604051808303816000875af1158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614ae1565b5060275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f809089908590600401614ac8565b6020604051808303816000875af1158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc39190614ae1565b50613040565b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612ffb908a908690600401614ac8565b6020604051808303816000875af115801561301a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303e9190614ae1565b505b50505b506001949350505050565b6037805461136990614917565b60115434101561306a57600080fd5b60125434111561307957600080fd5b6014548160175461308a919061457a565b11156130d85760405162461bcd60e51b815260206004820152601f60248201527f636f6e747269627574696f6e207265616368696e67206f766572206863617000604482015260640161049f565b6001600160a01b0382166130eb57600080fd5b806000036130f857600080fd5b5050565b6000670de0b6b3a76400006010548361311591906149cb565b6114dc91906149e2565b601c805460ff60381b1916600160381b1790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b6000606461316c8360146149cb565b61317691906149e2565b905060006131848284614567565b6001600160a01b0385811660009081526002602090815260408083208390556003909152808220829055602954905193945090911691849181818185875af1925050503d80600081146131f3576040519150601f19603f3d011682016040523d82523d6000602084013e6131f8565b606091505b50506040516001600160a01b03861691508290600081818185875af1925050503d8060008114613244576040519150601f19603f3d011682016040523d82523d6000602084013e613249565b606091505b505050836001600160a01b03167f7e77c11526f6439d832e432cabb72ef2aaa7e1677ca8b9509c14df61fba190d28460405161328791815260200190565b60405180910390a250505050565b601c54600160201b900460ff16156132bf5760405162461bcd60e51b815260040161049f90614961565b6040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a160006064601b54476132fa91906149cb565b61330491906149e2565b905081156133da576000606461331a84846149cb565b61332491906149e2565b9050836001600160a01b03168160405160006040518083038185875af1925050503d8060008114613371576040519150601f19603f3d011682016040523d82523d6000602084013e613376565b606091505b50506029546001600160a01b031690506133908284614567565b604051600081818185875af1925050503d80600081146133cc576040519150601f19603f3d011682016040523d82523d6000602084013e6133d1565b606091505b50505050613430565b6029546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613427576040519150601f19603f3d011682016040523d82523d6000602084013e61342c565b606091505b5050505b600060646021544761344291906149cb565b61344c91906149e2565b90508047101561349c5760405162461bcd60e51b815260206004820152601b60248201527a2737ba1022b737bab3b410233ab732103a37902a3930b739b332b960291b604482015260640161049f565b6134e469021e19e0c9bab24000006023546021546022546017546134c091906149cb565b6134ca91906149cb565b6134d491906149cb565b6134de91906149e2565b8261370a565b471561353c576040516001600160a01b038616904790600081818185875af1925050503d8060008114613533576040519150601f19603f3d011682016040523d82523d6000602084013e613538565b606091505b5050505b5050505050565b601c54600160381b900460ff166135915760405162461bcd60e51b81526020600482015260126024820152711c99599d5b99081b9bdd08195b98589b195960721b604482015260640161049f565b6001600160a01b038116600090815260026020526040902054806135f75760405162461bcd60e51b815260206004820152601f60248201527f5573657220686173206e6f20696e766573746d656e7420746f20636c61696d00604482015260640161049f565b6001600160a01b03821660008181526002602052604080822082905551839181818185875af1925050503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b505050816001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161369091815260200190565b60405180910390a25050565b6001600160a01b0381166136af57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000606461371a83605a6149cb565b61372491906149e2565b9050600060235485606461373891906149cb565b61374291906149e2565b90506000606461375383605a6149cb565b61375d91906149e2565b90506000806000603460149054906101000a900460ff16156138a15761378288613edd565b60275460345461379e916001600160a01b0390811691166140d5565b603280546001600160a01b0319166001600160a01b039283169081179091556034546040516370a0823160e01b81529216916370a08231916137e2916004016145a6565b602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a08231926138599216906004016145a6565b602060405180830381865afa158015613876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389a9190614c85565b91506139d2565b6027546138be906001600160a01b03166138b9612565565b6140d5565b603280546001600160a01b0319166001600160a01b03929092169190911790556138e6612565565b6032546040516370a0823160e01b81526001600160a01b03928316926370a0823192613917929116906004016145a6565b602060405180830381865afa158015613934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139589190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a082319261398e9216906004016145a6565b602060405180830381865afa1580156139ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cf9190614c85565b91505b6032546001600160a01b0316158015906139f557506000831180156139f5575081155b15613af45786613a0584876149cb565b613a0f91906149e2565b60275460325460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92613a479216908590600401614ac8565b6020604051808303816000875af1158015613a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8a9190614ae1565b50603260009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613adb57600080fd5b505af1158015613aef573d6000803e3d6000fd5b505050505b602754613b09906001600160a01b0316614383565b50603454600160a01b900460ff1615613cda576030546027546034546040516370a0823160e01b81526001600160a01b039384169363e8e337009381169216908d9082906370a0823190613b619030906004016145a6565b602060405180830381865afa158015613b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba29190614c85565b8e603460009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613be491906145a6565b602060405180830381865afa158015613c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c259190614c85565b30613c324261012c61457a565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015613cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd29190614cbb565b505050613d9b565b6030546027546001600160a01b039182169163f305d719918a911688888b30613d054261012c61457a565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015613d72573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d979190614cbb565b5050505b6033805460ff60a01b1916600160a01b179055603254603654613dca916001600160a01b039081169116614423565b50603654603254602f546040516370a0823160e01b81526001600160a01b0393841693638a4e6e569316919060379083906370a0823190613e0f9030906004016145a6565b602060405180830381865afa158015613e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e509190614c85565b6040518563ffffffff1660e01b8152600401613e6f9493929190614ce9565b6020604051808303816000875af1158015613e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb29190614c9e565b603380546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b603454600160a01b900460ff16613f325760405162461bcd60e51b8152602060048201526019602482015278185b1d0818dd5c9c995b98de481b9bdd081cd95b1958dd1959603a1b604482015260640161049f565b604080516002808252606082018352600092602083019080368337019050509050613f5b612565565b81600081518110613f6e57613f6e61494b565b6001600160a01b039283166020918202929092010152603454825191169082906001908110613f9f57613f9f61494b565b6001600160a01b039283166020918202929092010152603454613fc29116614383565b506030546034546001600160a01b0391821691637ff36ab5918591613fe8911682611ba0565b8430613ff64261012c61457a565b6040518663ffffffff1660e01b81526004016140159493929190614db8565b60006040518083038185885af1158015614033573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261405c9190810190614b1f565b506034546040516370a0823160e01b81526001600160a01b03909116906370a082319061408d9030906004016145a6565b602060405180830381865afa1580156140aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ce9190614c85565b6035555050565b6000806001600160a01b0316603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141589190614c9e565b6001600160a01b031663e6a4390585856040518363ffffffff1660e01b8152600401614185929190614ded565b602060405180830381865afa1580156141a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c69190614c9e565b6001600160a01b0316146142c057603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424b9190614c9e565b6001600160a01b031663e6a4390584846040518363ffffffff1660e01b8152600401614278929190614ded565b602060405180830381865afa158015614295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b99190614c9e565b90506114dc565b603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143379190614c9e565b6001600160a01b031663c9c6539684846040518363ffffffff1660e01b8152600401614364929190614ded565b6020604051808303816000875af1158015614295573d6000803e3d6000fd5b60305460405163095ea7b360e01b81526000917606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b916001600160a01b038581169263095ea7b3926143d692909116908590600401614ac8565b6020604051808303816000875af11580156143f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144199190614ae1565b5060019392505050565b60405163095ea7b360e01b81526000907606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b906001600160a01b0385169063095ea7b3906144709086908590600401614ac8565b6020604051808303816000875af115801561448f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130439190614ae1565b604051806101400160405280600a906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60208082526019908201527855736572207573656420616e7974696d6520726566756e642160381b604082015260600190565b6020808252601490820152731d5cd95c881b9bdd081dda1a5d195b1a5cdd195960621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156114dc576114dc614551565b808201808211156114dc576114dc614551565b60006001820161459f5761459f614551565b5060010190565b6001600160a01b0391909116815260200190565b6000815180845260005b818110156145e0576020818501810151868301820152016145c4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061461360208301846145ba565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156146585761465861461a565b604052919050565b6001600160a01b03811681146116f157600080fd5b600082601f83011261468657600080fd5b604080519081016001600160401b03811182821017156146a8576146a861461a565b80604052508060408401858111156146bf57600080fd5b845b818110156146e25780356146d481614660565b8352602092830192016146c1565b509195945050505050565b80151581146116f157600080fd5b6000806060838503121561470e57600080fd5b6147188484614675565b91506040830135614728816146ed565b809150509250929050565b60006020828403121561474557600080fd5b5035919050565b60006020828403121561475e57600080fd5b813561461381614660565b60008060006080848603121561477e57600080fd5b6147888585614675565b925060408401359150606084013561479f816146ed565b809150509250925092565b600080604083850312156147bd57600080fd5b82356147c881614660565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561480f5781516001600160a01b0316875295820195908201906001016147ea565b509495945050505050565b60208152600061461360208301846147d6565b60006101e08286835b600a811015614855578151835260209283019290910190600101614836565b50505061014083018560005b60048110156148825781511515835260209283019290910190600101614861565b505050806101c0840152614898818401856145ba565b9695505050505050565b600080604083850312156148b557600080fd5b50508035926020909101359150565b600080600080608085870312156148da57600080fd5b84356148e581614660565b935060208501356148f581614660565b925060408501359150606085013561490c816146ed565b939692955090935050565b600181811c9082168061492b57607f821691505b602082108103611de557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601990820152781c1c995cd85b1948185b1c9958591e48199a5b985b1a5e9959603a1b604082015260600190565b6020808252601f908201527f696e69746961746f72206973206e6f742070726573616c65206f776e65722100604082015260600190565b80820281158282048414176114dc576114dc614551565b6000826149ff57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601490820152731c1c995cd85b19481dd85cc81c99599d5b99195960621b604082015260600190565b6020808252601290820152714e6f742046696e616c697a6564207965742160701b604082015260600190565b6020808252600f908201526e70726573616c65204661696c65642160881b604082015260600190565b60208082526021908201527f7573657220686173206e6f206d6f726520746f6b656e7320746f20636c61696d6040820152602160f81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614af357600080fd5b8151614613816146ed565b828152604060208201526000614b1760408301846147d6565b949350505050565b60006020808385031215614b3257600080fd5b82516001600160401b0380821115614b4957600080fd5b818501915085601f830112614b5d57600080fd5b815181811115614b6f57614b6f61461a565b8060051b9150614b80848301614630565b8181529183018401918481019088841115614b9a57600080fd5b938501935b83851015614bb857845182529385019390850190614b9f565b98975050505050505050565b6020808252601a90820152794c697175696469747920697320616464656420616c726561647960301b604082015260600190565b6020808252601790820152763737ba103a343290383932b9b0b6329031b932b0ba37b960491b604082015260600190565b60208082526016908201527570726573616c65206e6f742066696e616c697a65642160501b604082015260600190565b602080825260129082015271199a5b985b1a5e99481dd85cc81d985b1a5960721b604082015260600190565b600060208284031215614c9757600080fd5b5051919050565b600060208284031215614cb057600080fd5b815161461381614660565b600080600060608486031215614cd057600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03851681526020808201859052608060408301528354600091908290600181811c9082811680614d2157607f831692505b8583108103614d3e57634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015614d5d5760018114614d7357614d9e565b60ff198616825284151560051b82019650614d9e565b60008c81526020902060005b86811015614d9857815484820152908501908901614d7f565b83019750505b505050505050809250505082606083015295945050505050565b848152608060208201526000614dd160808301866147d6565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039283168152911660208201526040019056fe6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b17681a26469706673582212202f9f138143131bea58395a3db980dac951446c43ef745ff4f7e706fe998173e264736f6c63430008110033a2646970667358221220fd793be96e6dc95f7b6f7eddc507ce53a033415bb67b2fa476fe5dfc0a0b731064736f6c634300081100330000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620000a65760003560e01c80631ab8f86414620000ab57806325cfdf5e14620000c8578063417d4add14620000e1578063715018a614620000f85780637e17465814620001025780638c2f037d14620001285780638da5cb5b146200013f578063acedf07c1462000153578063d7c94efd146200016a578063f2fde38b1462000174578063fc006a8a146200018b575b600080fd5b620000b560075481565b6040519081526020015b60405180910390f35b620000df620000d9366004620005e2565b620001a2565b005b620000df620000f236600462000619565b620001bf565b620000df62000272565b6200011962000113366004620005e2565b620002d2565b604051620000bf919062000648565b620001196200013936600462000760565b620002f3565b60005462000119906001600160a01b031681565b620000df62000164366004620005e2565b620004e8565b620000b560065481565b620000df6200018536600462000820565b62000505565b620000df6200019c36600462000820565b6200052b565b6000546001600160a01b03163314620001ba57600080fd5b600755565b6000546001600160a01b03163314620001d757600080fd5b60018211620002385760405162461bcd60e51b815260206004820152602360248201527f63616e6e6f742075706461746520666565206f72206c7064657020636f6e74726044820152621858dd60ea1b606482015260840160405180910390fd5b80600183600581106200024f576200024f62000845565b0180546001600160a01b0319166001600160a01b03929092169190911790555050565b6000546001600160a01b031633146200028a57600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b60018160058110620002e357600080fd5b01546001600160a01b0316905081565b60008060405180604001604052808860016004811062000317576200031762000845565b602090810291909101516001600160a01b0390811683526001541691015260608801516040808a01518882015182518084019093529394509192600092918a908690808c87602002015181526020018c6001600581106200037c576200037c62000845565b6020020151905260408051808201909152808d6003602002015181526020018d600460058110620003b157620003b162000845565b60200201518152508b6006548c6007546040518060a0016040528060018060058110620003e257620003e262000845565b01546001600160a01b0390811682528e1660208201526040016001600201546001600160a01b031681526020016001600301546001600160a01b031681526020016001600401546001600160a01b031690526040516200044290620005d4565b620004589b9a99989796959493929190620008b4565b604051809103906000f08015801562000475573d6000803e3d6000fd5b50895160405163f2fde38b60e01b81529192506001600160a01b0383169163f2fde38b91620004a79160040162000648565b600060405180830381600087803b158015620004c257600080fd5b505af1158015620004d7573d6000803e3d6000fd5b50929b9a5050505050505050505050565b6000546001600160a01b031633146200050057600080fd5b600655565b6000546001600160a01b031633146200051d57600080fd5b620005288162000565565b50565b6000546001600160a01b031633146200054357600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166200057957600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6155be806200097b83390190565b600060208284031215620005f557600080fd5b5035919050565b80356001600160a01b03811681146200061457600080fd5b919050565b600080604083850312156200062d57600080fd5b823591506200063f60208401620005fc565b90509250929050565b6001600160a01b0391909116815260200190565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b03811182821017156200069757620006976200065c565b60405290565b600082601f830112620006af57600080fd5b604080519081016001600160401b0381118282101715620006d457620006d46200065c565b8060405250806040840185811115620006ec57600080fd5b845b8181101562000708578035835260209283019201620006ee565b509195945050505050565b600082601f8301126200072557600080fd5b60405160a081016001600160401b03811182821017156200074a576200074a6200065c565b6040528060a0840185811115620006ec57600080fd5b60008060008060006101e086880312156200077a57600080fd5b86601f8701126200078a57600080fd5b6200079462000672565b806080880189811115620007a757600080fd5b885b81811015620007cc57620007bd81620005fc565b845260209384019301620007a9565b50819750620007dc8a826200069d565b9650505050620007f08760c0880162000713565b9250620008028761016088016200069d565b915062000814876101a088016200069d565b90509295509295909350565b6000602082840312156200083357600080fd5b6200083e82620005fc565b9392505050565b634e487b7160e01b600052603260045260246000fd5b8060005b6002811015620008805781518452602093840193909101906001016200085f565b50505050565b8060005b6005811015620008805781516001600160a01b03168452602093840193909101906001016200088a565b6001600160a01b038c8116825260208083018d90526102a083019190620008df604085018e6200085b565b608084018c60005b600281101562000908578151851683529183019190830190600101620008e7565b50505050506200091c60c083018a6200085b565b6200092c6101008301896200085b565b6200093c6101408301886200085b565b85610180830152620009536101a08301866200085b565b836101e08301526200096a61020083018462000886565b9c9b50505050505050505050505056fe60c0604052600360809081526249444f60e81b60a052600190620000249082620003de565b506000600f5561025860188190556019556002601b55601c805461ffff19169055601460245562127500602555603180546001600160a01b03191661dead179055604080518082019091526007815266191959985d5b1d60ca1b6020820152603790620000929082620003de565b50348015620000a057600080fd5b50604051620055be380380620055be833981016040819052620000c391620005c5565b600080546001600160a01b03191633179055620000e46011876002620002df565b508651601355602080880151601455895160155589810151601655602780546001600160a01b038e81166001600160a01b03199283161790925588830151601d558a51602880549184169183169190911790558a83015160298054919093169116179055601b859055850151602155845160225560108a905582516200016c906064620006f8565b60235560248290558051603680546001600160a01b03199081166001600160a01b0393841617909155602080840151603080549093169316929092179055830151602f55601b54606490620001c29082620006f8565b670de0b6b3a76400006064602154601454620001df919062000714565b620001eb91906200072e565b602254620001fa919062000714565b6014546010546200020c919062000714565b620002189190620006f8565b6200022491906200072e565b62000230919062000714565b6200023c91906200072e565b602655604081810151602b80546001600160a01b03199081166001600160a01b039384169081179092556060850151602c80548316918516919091178155608090950151602d80549092169084161781556000918252602e602052838220805460ff199081166001908117909255955484168352848320805487168217905590549092168152919091208054909216179055506200075198505050505050505050565b826002810192821562000310579160200282015b8281111562000310578251825591602001919060010190620002f3565b506200031e92915062000322565b5090565b5b808211156200031e576000815560010162000323565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200036457607f821691505b6020821081036200038557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003d957600081815260208120601f850160051c81016020861015620003b45750805b601f850160051c820191505b81811015620003d557828155600101620003c0565b5050505b505050565b81516001600160401b03811115620003fa57620003fa62000339565b62000412816200040b84546200034f565b846200038b565b602080601f8311600181146200044a5760008415620004315750858301515b600019600386901b1c1916600185901b178555620003d5565b600085815260208120601f198616915b828110156200047b578886015182559484019460019091019084016200045a565b50858210156200049a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b0381168114620004c257600080fd5b919050565b604080519081016001600160401b0381118282101715620004ec57620004ec62000339565b60405290565b600082601f8301126200050457600080fd5b6200050e620004c7565b8060408401858111156200052157600080fd5b845b818110156200053d57805184526020938401930162000523565b509095945050505050565b600082601f8301126200055a57600080fd5b60405160a081016001600160401b03811182821017156200057f576200057f62000339565b6040528060a08401858111156200059557600080fd5b845b81811015620005ba57620005ab81620004aa565b83526020928301920162000597565b509195945050505050565b60008060008060008060008060008060006102a08c8e031215620005e857600080fd5b620005f38c620004aa565b9a5060208c015199506200060b8d60408e01620004f2565b98508c609f8d01126200061d57600080fd5b62000627620004c7565b808e60c08f0111156200063957600080fd5b60808e015b60c08f0181101562000664576200065581620004aa565b8352602092830192016200063e565b5098506200067890508d60c08e01620004f2565b96506200068a8d6101008e01620004f2565b95506200069c8d6101408e01620004f2565b94506101808c01519350620006b68d6101a08e01620004f2565b92506101e08c01519150620006d08d6102008e0162000548565b90509295989b509295989b9093969950565b634e487b7160e01b600052601160045260246000fd5b808201808211156200070e576200070e620006e2565b92915050565b80820281158282048414176200070e576200070e620006e2565b6000826200074c57634e487b7160e01b600052601260045260246000fd5b500490565b614e5d80620007616000396000f3fe60806040526004361061044d5760003560e01c806306e29712146106425780630f98c918146106785780631096f46a1461069c57806310ef82c5146106bc5780631265d6e7146106d25780631515bc2b146106f4578063158ef93e146107195780631ab8f864146107335780631bd49653146107495780631c8d67491461075f5780631dfaced41461077f5780631e12353e1461079f5780631edd40ae146107d55780631f4ba804146107ea5780631f6d494214610800578063249b7c191461082d578063252a02eb146108425780632698d7071461087857806329279ce91461088d5780632a592e9f146108a35780632fc9b686146108d05780633197cbb6146109005780633675f29b1461091657806336cf7c871461093657806337ce1647146109565780633bff8ed7146109775780633cb650d0146109a45780634042b66f146109b9578063422099b2146109cf5780634879ef26146109e457806348c54b9d14610a1a5780634c4a386f14610a2f5780634d2a907314610a505780634de64b8114610a705780634e4153bb14610a905780635122907714610aa657806351fb012d14610ac8578063585e1af614610ae85780635a0e779b14610afe5780635f9bae3214610b1f5780636008405914610b3557806361644ca814610b5557806361c533b414610b7957806363c1805814610b8f5780636ac8d0c214610ba45780636e27607a14610bc5578063715018a614610be657806371beb4e114610bfb57806372f256f214610c115780637313ee5a14610c2757806378e2df0e14610c3d57806378e9792514610c535780637d3d652214610c695780637f87bbd614610c835780638190eefd14610ca457806382efbbec14610cc5578063844faace14610cdb5780638ab1d68114610d085780638b6ea1cf14610d285780638d4e408314610d485780638da5cb5b14610d69578063940bb34414610d895780639774748014610d9e578063995c5e9d14610db35780639b19251a14610de35780639b33d9d114610e135780639fe4cb9414610e28578063a7b17c8214610e48578063a82524b214610e5e578063b444e16214610e73578063b5545a3c14610e89578063b7a871c914610e9e578063b89918e014610ece578063b94a6dfe14610ee3578063bab80d1414610f03578063bc2eae0c14610f22578063be11ce2f14610f38578063be5ef81a14610f4d578063bf3f15bf14610f6d578063c3abb76614610f83578063c758e79214610fa3578063cdfb2b4e14610fb8578063d6b0f48414610fcd578063db37ceec14610fe2578063e132db4114610ff7578063e43252d71461100c578063e4c21cf21461102c578063e5658e1a14611041578063e580b2b01461106e578063ecfd892814611085578063ef67a5e21461109b578063f2fde38b146110bb578063f6e99c0d146110db578063fb7f21eb146110fb578063fc0c546a14611110578063fc37987b14611130578063fcb3747314611146578063fe67a1891461115c57600080fd5b3661063d57601a5442116104a85760405162461bcd60e51b815260206004820152601e60248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f6666000060448201526064015b60405180910390fd5b3360009081526009602052604090205460ff16156104d85760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff161561051857336000908152600a602052604090205460ff166105185760405162461bcd60e51b815260040161049f90614523565b34601d546105269190614567565b3360009081526002602052604090205411156105845760405162461bcd60e51b815260206004820152601d60248201527f636f6e747269627574696f6e206f766572206d617820616c6c6f776564000000604482015260640161049f565b61058d33611172565b33600090815260026020526040812080543492906105ac90849061457a565b909155505033600090815260036020526040812080543492906105d090849061457a565b90915550503360009081526008602052604090205460ff1661063b57600c8054600090815260076020908152604080832080546001600160a01b03191633908117909155835260089091528120805460ff19166001179055815491906106358361458d565b91905055505b005b600080fd5b34801561064e57600080fd5b50602954610662906001600160a01b031681565b60405161066f91906145a6565b60405180910390f35b34801561068457600080fd5b5061068e60215481565b60405190815260200161066f565b3480156106a857600080fd5b50603454610662906001600160a01b031681565b3480156106c857600080fd5b5061068e60265481565b3480156106de57600080fd5b506106e761135c565b60405161066f9190614600565b34801561070057600080fd5b506107096113ea565b604051901515815260200161066f565b34801561072557600080fd5b50601c546107099060ff1681565b34801561073f57600080fd5b5061068e60245481565b34801561075557600080fd5b5061068e60355481565b34801561076b57600080fd5b5061070961077a3660046146fb565b611418565b34801561078b57600080fd5b5061066261079a366004614733565b6114e2565b3480156107ab57600080fd5b506106626107ba366004614733565b600b602052600090815260409020546001600160a01b031681565b3480156107e157600080fd5b5061063b611502565b3480156107f657600080fd5b5061068e60235481565b34801561080c57600080fd5b5061068e61081b36600461474c565b60026020526000908152604090205481565b34801561083957600080fd5b5060165461068e565b34801561084e57600080fd5b5061066261085d366004614733565b6007602052600090815260409020546001600160a01b031681565b34801561088457600080fd5b5060175461068e565b34801561089957600080fd5b5061068e60225481565b3480156108af57600080fd5b5061068e6108be36600461474c565b60046020526000908152604090205481565b3480156108dc57600080fd5b506107096108eb36600461474c565b60096020526000908152604090205460ff1681565b34801561090c57600080fd5b5061068e60165481565b34801561092257600080fd5b50603354610662906001600160a01b031681565b34801561094257600080fd5b50603154610662906001600160a01b031681565b34801561096257600080fd5b5060345461070990600160a01b900460ff1681565b34801561098357600080fd5b5061068e61099236600461474c565b60056020526000908152604090205481565b3480156109b057600080fd5b5061063b6116f4565b3480156109c557600080fd5b5061068e60175481565b3480156109db57600080fd5b5061063b611798565b3480156109f057600080fd5b5061068e6109ff36600461474c565b6001600160a01b031660009081526002602052604090205490565b348015610a2657600080fd5b5061063b61184d565b348015610a3b57600080fd5b50601c5461070990600160381b900460ff1681565b348015610a5c57600080fd5b50610709610a6b366004614769565b611a29565b348015610a7c57600080fd5b5061068e610a8b3660046147aa565b611ba0565b348015610a9c57600080fd5b5061068e600f5481565b348015610ab257600080fd5b50610abb611cc6565b60405161066f919061481a565b348015610ad457600080fd5b50601c546107099062010000900460ff1681565b348015610af457600080fd5b5061068e60145481565b348015610b0a57600080fd5b5060335461070990600160a01b900460ff1681565b348015610b2b57600080fd5b5061068e601a5481565b348015610b4157600080fd5b5061063b610b5036600461474c565b611deb565b348015610b6157600080fd5b50610b6a611f1c565b60405161066f9392919061482d565b348015610b8557600080fd5b5061068e602f5481565b348015610b9b57600080fd5b5061063b612096565b348015610bb057600080fd5b50601c5461070990600160281b900460ff1681565b348015610bd157600080fd5b50601c5461070990600160401b900460ff1681565b348015610bf257600080fd5b5061063b61223c565b348015610c0757600080fd5b5061068e601d5481565b348015610c1d57600080fd5b5061068e60255481565b348015610c3357600080fd5b5061068e60205481565b348015610c4957600080fd5b5061068e60135481565b348015610c5f57600080fd5b5061068e60155481565b348015610c7557600080fd5b506013546017541015610709565b348015610c8f57600080fd5b50601c5461070990600160301b900460ff1681565b348015610cb057600080fd5b50601c54610709906301000000900460ff1681565b348015610cd157600080fd5b5061068e600d5481565b348015610ce757600080fd5b5061068e610cf636600461474c565b60066020526000908152604090205481565b348015610d1457600080fd5b5061063b610d2336600461474c565b61229b565b348015610d3457600080fd5b50602a54610662906001600160a01b031681565b348015610d5457600080fd5b50601c5461070990600160201b900460ff1681565b348015610d7557600080fd5b50600054610662906001600160a01b031681565b348015610d9557600080fd5b5061063b61232f565b348015610daa57600080fd5b5061063b612502565b348015610dbf57600080fd5b50610709610dce36600461474c565b60086020526000908152604090205460ff1681565b348015610def57600080fd5b50610709610dfe36600461474c565b600a6020526000908152604090205460ff1681565b348015610e1f57600080fd5b50610662612565565b348015610e3457600080fd5b50603254610662906001600160a01b031681565b348015610e5457600080fd5b5061068e601b5481565b348015610e6a57600080fd5b5060155461068e565b348015610e7f57600080fd5b5061068e60195481565b348015610e9557600080fd5b5061063b6125d8565b348015610eaa57600080fd5b50610709610eb936600461474c565b602e6020526000908152604090205460ff1681565b348015610eda57600080fd5b5061063b61269c565b348015610eef57600080fd5b50603054610662906001600160a01b031681565b348015610f0f57600080fd5b50601c5461070990610100900460ff1681565b348015610f2e57600080fd5b5061068e600e5481565b348015610f4457600080fd5b5061068e612aa2565b348015610f5957600080fd5b5061063b610f683660046148a2565b612aaf565b348015610f7957600080fd5b5061068e601e5481565b348015610f8f57600080fd5b50603654610662906001600160a01b031681565b348015610faf57600080fd5b5060145461068e565b348015610fc457600080fd5b5061063b612c47565b348015610fd957600080fd5b5061063b612cc6565b348015610fee57600080fd5b5061068e612d63565b34801561100357600080fd5b5060105461068e565b34801561101857600080fd5b5061063b61102736600461474c565b612d6e565b34801561103857600080fd5b5060135461068e565b34801561104d57600080fd5b5061068e61105c36600461474c565b60036020526000908152604090205481565b34801561107a57600080fd5b506016544211610709565b34801561109157600080fd5b5061068e600c5481565b3480156110a757600080fd5b50602854610662906001600160a01b031681565b3480156110c757600080fd5b5061063b6110d636600461474c565b612ddf565b3480156110e757600080fd5b506107096110f63660046148c4565b612dff565b34801561110757600080fd5b506106e761304e565b34801561111c57600080fd5b50602754610662906001600160a01b031681565b34801561113c57600080fd5b5061068e60105481565b34801561115257600080fd5b5061068e60185481565b34801561116857600080fd5b5061068e601f5481565b3332146111c15760405162461bcd60e51b815260206004820152601e60248201527f63616e277420636f6e747269627574652076696120636f6e7472616374730000604482015260640161049f565b601a5442116112225760405162461bcd60e51b815260206004820152602760248201527f496e2077686974656c6973742064697361626c656420636f6f6c204f666620696044820152661b9d195c9b985b60ca1b606482015260840161049f565b6015544210158015611235575060165442105b6112725760405162461bcd60e51b815260206004820152600e60248201526d49444f206e6f742061637469766560901b604482015260640161049f565b3360009081526009602052604090205460ff16156112a25760405162461bcd60e51b815260040161049f906144f0565b601c5462010000900460ff16156112e257336000908152600a602052604090205460ff166112e25760405162461bcd60e51b815260040161049f90614523565b346112ed828261305b565b60006112f8826130fc565b9050816017600082825461130c919061457a565b909155505060408051838152602081018390526001600160a01b0385169133917f623b3804fa71d67900d064613da8f94b9617215ee90799290593e1745087ad18910160405180910390a3505050565b6001805461136990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461139590614917565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b505050505081565b60008060118101546017546014546114029190614567565b1090506016544211806114125750805b91505090565b600080546001600160a01b0316331461143057600080fd5b601c54600160201b900460ff161561145a5760405162461bcd60e51b815260040161049f90614961565b8251602a80546001600160a01b039283166001600160a01b031991821617909155602085015160288054919093169116179055601c8054831515600160281b0260ff60281b199091161790556114ae61311f565b604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560015b92915050565b602b81600381106114f257600080fd5b01546001600160a01b0316905081565b3360009081526009602052604090205460ff16156115565760405162461bcd60e51b8152602060048201526011602482015270616c726561647920726566756e6465642160781b604482015260640161049f565b33600090815260026020526040902054806115a65760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b604482015260640161049f565b601c54600160201b900460ff16156115f55760405162461bcd60e51b8152602060048201526012602482015271616c72656164792066696e616c697a65642160701b604482015260640161049f565b601c54600160281b900460ff161561164f5760405162461bcd60e51b815260206004820152601d60248201527f616c72656164792073756363657366756c6c792066696e616c697a6564000000604482015260640161049f565b60195460165461165f9190614567565b42106116aa5760405162461bcd60e51b815260206004820152601a6024820152797769746864726177616c2077696e646f7720657870697265642160301b604482015260640161049f565b3360009081526005602052604090208190556017546116ca908290614567565b601755336000818152600960205260409020805460ff191660011790556116f1908261315d565b50565b6028546001600160a01b0316331461170b57600080fd5b601c54600160301b900460ff1661175f5760405162461bcd60e51b81526020600482015260186024820152771d995cdd1a5b99c8185b1c9958591e48191a5cd8589b195960421b604482015260640161049f565b601c54600160201b900460ff16156117895760405162461bcd60e51b815260040161049f90614961565b601c805460ff60301b19169055565b6028546001600160a01b031633146117c25760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff16156118195760405162461bcd60e51b815260206004820152601a60248201527970726573616c6520616c72656164792066696e616c697a65642160301b604482015260640161049f565b601c805460ff60401b1916600160401b179055602454601b54600a9161183e916149cb565b61184891906149e2565b601b55565b601c54600160381b900460ff16156118775760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff16156118dc5760405162461bcd60e51b815260206004820152602260248201527f706c65617365207573652076657374696e67206d6574686f6420746f20636c61604482015261696d60f01b606482015260840161049f565b601c54600160201b900460ff166119055760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff1661192e5760405162461bcd60e51b815260040161049f90614a5e565b33600090815260026020526040812054900361195c5760405162461bcd60e51b815260040161049f90614a87565b601054336000908152600260205260408120549091670de0b6b3a76400009161198591906149cb565b61198f91906149e2565b3360008181526002602052604080822091909155602754905163a9059cbb60e01b81529293506001600160a01b03169163a9059cbb916119d3918590600401614ac8565b6020604051808303816000875af11580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190614ae1565b5033600090815260046020526040902055565b600080546001600160a01b03163314611a4157600080fd5b601c54600160201b900460ff1615611a8f5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b604482015260640161049f565b611a976113ea565b611ad05760405162461bcd60e51b815260206004820152600a6024820152691b9bdd0818db1bdcd95960b21b604482015260640161049f565b8351602a80546001600160a01b039283166001600160a01b031991821617909155602086015160288054919093169116179055601c8054831515600160281b0260ff60281b1990911617905560135460175410158015611b395750601c54600160281b900460ff165b15611b6057602854602a54611b5b916001600160a01b03908116911685613295565b611b68565b611b6861311f565b42601f55604051600080516020614e0883398151915290600090a150601c805460ff60201b1916600160201b17905560019392505050565b60408051600280825260608083018452600093909284928392602083019080368337019050509050611bd0612565565b81600081518110611be357611be361494b565b60200260200101906001600160a01b031690816001600160a01b0316815250508581600181518110611c1757611c1761494b565b6001600160a01b03928316602091820292909201015260305460405163d06ca61f60e01b815291169063d06ca61f90611c569088908590600401614afe565b600060405180830381865afa158015611c73573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c9b9190810190614b1f565b925082600181518110611cb057611cb061494b565b6020026020010151915081935050505092915050565b60606000600d546001600160401b03811115611ce457611ce461461a565b604051908082528060200260200182016040528015611d0d578160200160208202803683370190505b50905060005b600d54811015611de5576000818152600b60209081526040808320546001600160a01b03168352600a90915290205460ff1615611d9e576000818152600b602052604090205482516001600160a01b0390911690839083908110611d7957611d7961494b565b60200260200101906001600160a01b031690816001600160a01b031681525050611dd3565b6000828281518110611db257611db261494b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80611ddd8161458d565b915050611d13565b50919050565b6001600160a01b038116611e405760405162461bcd60e51b815260206004820152601c60248201527b31bab93932b731bc9031b0b73737ba103132902d32b9379030b2323960211b604482015260640161049f565b6001600160a01b0381166000908152602e602052604090205460ff16611ea15760405162461bcd60e51b81526020600482015260166024820152751a5b9d985b1a5908185cdcd95d081cd95b1958dd195960521b604482015260640161049f565b603354600160a01b900460ff1615611ecb5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b03163314611ef55760405162461bcd60e51b815260040161049f90614bf8565b603480546001600160a81b0319166001600160a01b0390921691909117600160a01b179055565b611f246144b3565b611f2c6144d2565b6060611f366144b3565b611f3e6144d2565b5050604080516101408101825260135481526014546020808301919091526011548284015260125460608084019190915260155460808085019190915260165460a085015260175460c085015260105460e085015260225461010085015260215461012085015284519081018552601c5460ff600160201b8204811615158352600160281b82048116151594830194909452600160301b81048416151595820195909552600160381b9094049091161515908301526001805491929183918391819061200990614917565b80601f016020809104026020016040519081016040528092919081815260200182805461203590614917565b80156120825780601f1061205757610100808354040283529160200191612082565b820191906000526020600020905b81548152906001019060200180831161206557829003601f168201915b505050505090509450945094505050909192565b6028546001600160a01b031633146120c05760405162461bcd60e51b815260040161049f90614994565b601c54600160201b900460ff166120e95760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff16156121135760405162461bcd60e51b815260040161049f90614c59565b6027546028546040516370a0823160e01b81526001600160a01b039283169263a9059cbb92169083906370a08231906121509030906004016145a6565b602060405180830381865afa15801561216d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121919190614c85565b6040518363ffffffff1660e01b81526004016121ae929190614ac8565b6020604051808303816000875af11580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190614ae1565b61223a5760405162461bcd60e51b815260206004820152601a60248201527963616e6e6f74207472616e7366657220746f6b656e206261636b60301b604482015260640161049f565b565b6000546001600160a01b0316331461225357600080fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2600080546001600160a01b0319169055565b6000546001600160a01b031633146122b257600080fd5b6001600160a01b0381166000908152600a602052604090205460ff1661230e5760405162461bcd60e51b81526020600482015260116024820152706e6f7420696e2077686974656c6973742160781b604482015260640161049f565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6028546001600160a01b031633146123595760405162461bcd60e51b815260040161049f90614994565b602554601f54612369919061457a565b421161237457600080fd5b601c54600160201b900460ff1661239d5760405162461bcd60e51b815260040161049f90614c29565b601c54600160281b900460ff166123c65760405162461bcd60e51b815260040161049f90614c59565b60006010546017546014546123db9190614567565b6123e591906149cb565b69021e19e0c9bab24000006023546021546022546017546014546124099190614567565b61241391906149cb565b61241d91906149cb565b61242791906149cb565b61243191906149e2565b61243b919061457a565b60275460315460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb926124739216908590600401614ac8565b6020604051808303816000875af1158015612492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b69190614ae1565b6116f15760405162461bcd60e51b815260206004820152601d60248201527f63616e6e6f74207472616e7366657220746f6b656e20746f2064656164000000604482015260640161049f565b603354600160a01b900460ff161561252c5760405162461bcd60e51b815260040161049f90614bc4565b6028546001600160a01b031633146125565760405162461bcd60e51b815260040161049f90614bf8565b6034805460ff60a01b19169055565b603054604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa1580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d39190614c9e565b905090565b601c54600160201b900460ff166126215760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd08199a5b985b1a5e9959609a1b604482015260640161049f565b601354601754108061263d5750601c54600160281b900460ff16155b6126935760405162461bcd60e51b815260206004820152602160248201527f676f616c2072656163686564206f722070726573616c652073756363656564656044820152601960fa1b606482015260840161049f565b61223a33613543565b601c54600160381b900460ff16156126c65760405162461bcd60e51b815260040161049f90614a04565b601c54600160301b900460ff166127155760405162461bcd60e51b81526020600482015260136024820152721d995cdd1a5b99c81b9bdd08195b98589b1959606a1b604482015260640161049f565b601c54600160201b900460ff1661273e5760405162461bcd60e51b815260040161049f90614a32565b601c54600160281b900460ff166127675760405162461bcd60e51b815260040161049f90614a5e565b3360009081526002602052604081205490036127955760405162461bcd60e51b815260040161049f90614a87565b601e5433600090815260066020526040902054106127e95760405162461bcd60e51b8152602060048201526011602482015270185b1b081d1bdad95b9cc81d995cdd1959607a1b604482015260640161049f565b6000602054601f54426127fc9190614567565b61280691906149e2565b61281190600161457a565b9050601e5481106128215750601e545b3360009081526006602052604081205461283b9083614567565b905060008111801561284f5750601e548111155b6128965760405162461bcd60e51b81526020600482015260186024820152776e6f7420696e207573657220636c61696d2077696e646f7760401b604482015260640161049f565b336000908152600660209081526040808320859055601e5460105460039093529083205490918491670de0b6b3a7640000916128d1916149cb565b6128db91906149e2565b6128e591906149cb565b6128ef91906149e2565b6010543360009081526002602052604081205492935091670de0b6b3a764000091612919916149cb565b61292391906149e2565b9050808211156129755760405162461bcd60e51b815260206004820152601d60248201527f63616e277420636c61696d206d6f7265207468616e20616c6c6f776564000000604482015260640161049f565b601e54336000908152600360205260408120549091906129969086906149cb565b6129a091906149e2565b3360009081526002602052604090205490915081106129ce57336000908152600260205260408120556129fa565b336000908152600260205260409020546129e9908290614567565b336000908152600260205260409020555b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612a2c9033908790600401614ac8565b6020604051808303816000875af1158015612a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6f9190614ae1565b5033600090815260046020526040902054612a8b90849061457a565b336000908152600460205260409020555050505050565b60006011815b0154905090565b60018211612b095760405162461bcd60e51b815260206004820152602160248201527f6e756d206f6620766573742068617320746f2062652067727472207468616e206044820152603160f81b606482015260840161049f565b60008111612b525760405162461bcd60e51b81526020600482015260166024820152751d995cdd1a5b99c81c195c9a5bd9081a5b9d985b1a5960521b604482015260640161049f565b610258601554612b629190614567565b4210612bbe5760405162461bcd60e51b815260206004820152602560248201527f63616e277420656e61626c6520766573742061667465722070726573616c65206044820152641cdd185c9d60da1b606482015260840161049f565b601c54600160301b900460ff1615612c125760405162461bcd60e51b81526020600482015260176024820152761d995cdd1a5b99c8185b1c9958591e48195b98589b1959604a1b604482015260640161049f565b6028546001600160a01b03163314612c2957600080fd5b601c805460ff60301b1916600160301b179055601e91909155602055565b6000546001600160a01b03163314612c5e57600080fd5b601c5462010000900460ff1615612cb35760405162461bcd60e51b81526020600482015260196024820152781dda1a5d195b1a5cdd08185b1c9958591e48195b98589b1959603a1b604482015260640161049f565b601c805462ff0000191662010000179055565b6000546001600160a01b03163314612cdd57600080fd5b601c5462010000900460ff16612d325760405162461bcd60e51b815260206004820152601a6024820152791dda1a5d195b1a5cdd08185b1c9958591e48191a5cd8589b195960321b604482015260640161049f565b601c805462ff000019169055601854612d4b904261457a565b601a55601c805463ff00000019166301000000179055565b600060116001612aa8565b6000546001600160a01b03163314612d8557600080fd5b6001600160a01b0381166000818152600a60209081526040808320805460ff19166001179055600d80548452600b909252822080546001600160a01b03191690931790925581549190612dd78361458d565b919050555050565b6000546001600160a01b03163314612df657600080fd5b6116f18161369c565b600080546001600160a01b03163314612e1757600080fd5b601c54600160401b900460ff16613043576001600160a01b038516612e7b5760405162461bcd60e51b815260206004820152601a602482015279706c6174666f726d20616464722063616e74206265207a65726f60301b604482015260640161049f565b600068056bc75e2d63100000601b54601054601754612e9a91906149cb565b612ea491906149cb565b612eae91906149e2565b905060008315612fc9576064612ec486846149cb565b612ece91906149e2565b6027549091506001600160a01b031663a9059cbb88612eed8486614567565b6040518363ffffffff1660e01b8152600401612f0a929190614ac8565b6020604051808303816000875af1158015612f29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4d9190614ae1565b5060275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f809089908590600401614ac8565b6020604051808303816000875af1158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc39190614ae1565b50613040565b60275460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612ffb908a908690600401614ac8565b6020604051808303816000875af115801561301a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303e9190614ae1565b505b50505b506001949350505050565b6037805461136990614917565b60115434101561306a57600080fd5b60125434111561307957600080fd5b6014548160175461308a919061457a565b11156130d85760405162461bcd60e51b815260206004820152601f60248201527f636f6e747269627574696f6e207265616368696e67206f766572206863617000604482015260640161049f565b6001600160a01b0382166130eb57600080fd5b806000036130f857600080fd5b5050565b6000670de0b6b3a76400006010548361311591906149cb565b6114dc91906149e2565b601c805460ff60381b1916600160381b1790556040517f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8990600090a1565b6000606461316c8360146149cb565b61317691906149e2565b905060006131848284614567565b6001600160a01b0385811660009081526002602090815260408083208390556003909152808220829055602954905193945090911691849181818185875af1925050503d80600081146131f3576040519150601f19603f3d011682016040523d82523d6000602084013e6131f8565b606091505b50506040516001600160a01b03861691508290600081818185875af1925050503d8060008114613244576040519150601f19603f3d011682016040523d82523d6000602084013e613249565b606091505b505050836001600160a01b03167f7e77c11526f6439d832e432cabb72ef2aaa7e1677ca8b9509c14df61fba190d28460405161328791815260200190565b60405180910390a250505050565b601c54600160201b900460ff16156132bf5760405162461bcd60e51b815260040161049f90614961565b6040517f1cdde67b72a90f19919ac732a437ac2f7a10fc128d28c2a6e525d89ce5cd9d3a90600090a160006064601b54476132fa91906149cb565b61330491906149e2565b905081156133da576000606461331a84846149cb565b61332491906149e2565b9050836001600160a01b03168160405160006040518083038185875af1925050503d8060008114613371576040519150601f19603f3d011682016040523d82523d6000602084013e613376565b606091505b50506029546001600160a01b031690506133908284614567565b604051600081818185875af1925050503d80600081146133cc576040519150601f19603f3d011682016040523d82523d6000602084013e6133d1565b606091505b50505050613430565b6029546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613427576040519150601f19603f3d011682016040523d82523d6000602084013e61342c565b606091505b5050505b600060646021544761344291906149cb565b61344c91906149e2565b90508047101561349c5760405162461bcd60e51b815260206004820152601b60248201527a2737ba1022b737bab3b410233ab732103a37902a3930b739b332b960291b604482015260640161049f565b6134e469021e19e0c9bab24000006023546021546022546017546134c091906149cb565b6134ca91906149cb565b6134d491906149cb565b6134de91906149e2565b8261370a565b471561353c576040516001600160a01b038616904790600081818185875af1925050503d8060008114613533576040519150601f19603f3d011682016040523d82523d6000602084013e613538565b606091505b5050505b5050505050565b601c54600160381b900460ff166135915760405162461bcd60e51b81526020600482015260126024820152711c99599d5b99081b9bdd08195b98589b195960721b604482015260640161049f565b6001600160a01b038116600090815260026020526040902054806135f75760405162461bcd60e51b815260206004820152601f60248201527f5573657220686173206e6f20696e766573746d656e7420746f20636c61696d00604482015260640161049f565b6001600160a01b03821660008181526002602052604080822082905551839181818185875af1925050503d806000811461364d576040519150601f19603f3d011682016040523d82523d6000602084013e613652565b606091505b505050816001600160a01b03167fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06518260405161369091815260200190565b60405180910390a25050565b6001600160a01b0381166136af57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000606461371a83605a6149cb565b61372491906149e2565b9050600060235485606461373891906149cb565b61374291906149e2565b90506000606461375383605a6149cb565b61375d91906149e2565b90506000806000603460149054906101000a900460ff16156138a15761378288613edd565b60275460345461379e916001600160a01b0390811691166140d5565b603280546001600160a01b0319166001600160a01b039283169081179091556034546040516370a0823160e01b81529216916370a08231916137e2916004016145a6565b602060405180830381865afa1580156137ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138239190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a08231926138599216906004016145a6565b602060405180830381865afa158015613876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389a9190614c85565b91506139d2565b6027546138be906001600160a01b03166138b9612565565b6140d5565b603280546001600160a01b0319166001600160a01b03929092169190911790556138e6612565565b6032546040516370a0823160e01b81526001600160a01b03928316926370a0823192613917929116906004016145a6565b602060405180830381865afa158015613934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139589190614c85565b6027546032546040516370a0823160e01b81529295506001600160a01b03918216926370a082319261398e9216906004016145a6565b602060405180830381865afa1580156139ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cf9190614c85565b91505b6032546001600160a01b0316158015906139f557506000831180156139f5575081155b15613af45786613a0584876149cb565b613a0f91906149e2565b60275460325460405163a9059cbb60e01b81529293506001600160a01b039182169263a9059cbb92613a479216908590600401614ac8565b6020604051808303816000875af1158015613a66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8a9190614ae1565b50603260009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613adb57600080fd5b505af1158015613aef573d6000803e3d6000fd5b505050505b602754613b09906001600160a01b0316614383565b50603454600160a01b900460ff1615613cda576030546027546034546040516370a0823160e01b81526001600160a01b039384169363e8e337009381169216908d9082906370a0823190613b619030906004016145a6565b602060405180830381865afa158015613b7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ba29190614c85565b8e603460009054906101000a90046001600160a01b03166001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401613be491906145a6565b602060405180830381865afa158015613c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c259190614c85565b30613c324261012c61457a565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015613cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd29190614cbb565b505050613d9b565b6030546027546001600160a01b039182169163f305d719918a911688888b30613d054261012c61457a565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015613d72573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613d979190614cbb565b5050505b6033805460ff60a01b1916600160a01b179055603254603654613dca916001600160a01b039081169116614423565b50603654603254602f546040516370a0823160e01b81526001600160a01b0393841693638a4e6e569316919060379083906370a0823190613e0f9030906004016145a6565b602060405180830381865afa158015613e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e509190614c85565b6040518563ffffffff1660e01b8152600401613e6f9493929190614ce9565b6020604051808303816000875af1158015613e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eb29190614c9e565b603380546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b603454600160a01b900460ff16613f325760405162461bcd60e51b8152602060048201526019602482015278185b1d0818dd5c9c995b98de481b9bdd081cd95b1958dd1959603a1b604482015260640161049f565b604080516002808252606082018352600092602083019080368337019050509050613f5b612565565b81600081518110613f6e57613f6e61494b565b6001600160a01b039283166020918202929092010152603454825191169082906001908110613f9f57613f9f61494b565b6001600160a01b039283166020918202929092010152603454613fc29116614383565b506030546034546001600160a01b0391821691637ff36ab5918591613fe8911682611ba0565b8430613ff64261012c61457a565b6040518663ffffffff1660e01b81526004016140159493929190614db8565b60006040518083038185885af1158015614033573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261405c9190810190614b1f565b506034546040516370a0823160e01b81526001600160a01b03909116906370a082319061408d9030906004016145a6565b602060405180830381865afa1580156140aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140ce9190614c85565b6035555050565b6000806001600160a01b0316603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614134573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141589190614c9e565b6001600160a01b031663e6a4390585856040518363ffffffff1660e01b8152600401614185929190614ded565b602060405180830381865afa1580156141a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141c69190614c9e565b6001600160a01b0316146142c057603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061424b9190614c9e565b6001600160a01b031663e6a4390584846040518363ffffffff1660e01b8152600401614278929190614ded565b602060405180830381865afa158015614295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142b99190614c9e565b90506114dc565b603060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614313573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143379190614c9e565b6001600160a01b031663c9c6539684846040518363ffffffff1660e01b8152600401614364929190614ded565b6020604051808303816000875af1158015614295573d6000803e3d6000fd5b60305460405163095ea7b360e01b81526000917606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b916001600160a01b038581169263095ea7b3926143d692909116908590600401614ac8565b6020604051808303816000875af11580156143f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144199190614ae1565b5060019392505050565b60405163095ea7b360e01b81526000907606e8aff4357fd6c8924f7875b89f9cf5f554c3db737e95604d1b906001600160a01b0385169063095ea7b3906144709086908590600401614ac8565b6020604051808303816000875af115801561448f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130439190614ae1565b604051806101400160405280600a906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60208082526019908201527855736572207573656420616e7974696d6520726566756e642160381b604082015260600190565b6020808252601490820152731d5cd95c881b9bdd081dda1a5d195b1a5cdd195960621b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156114dc576114dc614551565b808201808211156114dc576114dc614551565b60006001820161459f5761459f614551565b5060010190565b6001600160a01b0391909116815260200190565b6000815180845260005b818110156145e0576020818501810151868301820152016145c4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061461360208301846145ba565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156146585761465861461a565b604052919050565b6001600160a01b03811681146116f157600080fd5b600082601f83011261468657600080fd5b604080519081016001600160401b03811182821017156146a8576146a861461a565b80604052508060408401858111156146bf57600080fd5b845b818110156146e25780356146d481614660565b8352602092830192016146c1565b509195945050505050565b80151581146116f157600080fd5b6000806060838503121561470e57600080fd5b6147188484614675565b91506040830135614728816146ed565b809150509250929050565b60006020828403121561474557600080fd5b5035919050565b60006020828403121561475e57600080fd5b813561461381614660565b60008060006080848603121561477e57600080fd5b6147888585614675565b925060408401359150606084013561479f816146ed565b809150509250925092565b600080604083850312156147bd57600080fd5b82356147c881614660565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561480f5781516001600160a01b0316875295820195908201906001016147ea565b509495945050505050565b60208152600061461360208301846147d6565b60006101e08286835b600a811015614855578151835260209283019290910190600101614836565b50505061014083018560005b60048110156148825781511515835260209283019290910190600101614861565b505050806101c0840152614898818401856145ba565b9695505050505050565b600080604083850312156148b557600080fd5b50508035926020909101359150565b600080600080608085870312156148da57600080fd5b84356148e581614660565b935060208501356148f581614660565b925060408501359150606085013561490c816146ed565b939692955090935050565b600181811c9082168061492b57607f821691505b602082108103611de557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6020808252601990820152781c1c995cd85b1948185b1c9958591e48199a5b985b1a5e9959603a1b604082015260600190565b6020808252601f908201527f696e69746961746f72206973206e6f742070726573616c65206f776e65722100604082015260600190565b80820281158282048414176114dc576114dc614551565b6000826149ff57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601490820152731c1c995cd85b19481dd85cc81c99599d5b99195960621b604082015260600190565b6020808252601290820152714e6f742046696e616c697a6564207965742160701b604082015260600190565b6020808252600f908201526e70726573616c65204661696c65642160881b604082015260600190565b60208082526021908201527f7573657220686173206e6f206d6f726520746f6b656e7320746f20636c61696d6040820152602160f81b606082015260800190565b6001600160a01b03929092168252602082015260400190565b600060208284031215614af357600080fd5b8151614613816146ed565b828152604060208201526000614b1760408301846147d6565b949350505050565b60006020808385031215614b3257600080fd5b82516001600160401b0380821115614b4957600080fd5b818501915085601f830112614b5d57600080fd5b815181811115614b6f57614b6f61461a565b8060051b9150614b80848301614630565b8181529183018401918481019088841115614b9a57600080fd5b938501935b83851015614bb857845182529385019390850190614b9f565b98975050505050505050565b6020808252601a90820152794c697175696469747920697320616464656420616c726561647960301b604082015260600190565b6020808252601790820152763737ba103a343290383932b9b0b6329031b932b0ba37b960491b604082015260600190565b60208082526016908201527570726573616c65206e6f742066696e616c697a65642160501b604082015260600190565b602080825260129082015271199a5b985b1a5e99481dd85cc81d985b1a5960721b604082015260600190565b600060208284031215614c9757600080fd5b5051919050565b600060208284031215614cb057600080fd5b815161461381614660565b600080600060608486031215614cd057600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b03851681526020808201859052608060408301528354600091908290600181811c9082811680614d2157607f831692505b8583108103614d3e57634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015614d5d5760018114614d7357614d9e565b60ff198616825284151560051b82019650614d9e565b60008c81526020902060005b86811015614d9857815484820152908501908901614d7f565b83019750505b505050505050809250505082606083015295945050505050565b848152608060208201526000614dd160808301866147d6565b6001600160a01b03949094166040830152506060015292915050565b6001600160a01b039283168152911660208201526040019056fe6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b17681a26469706673582212202f9f138143131bea58395a3db980dac951446c43ef745ff4f7e706fe998173e264736f6c63430008110033a2646970667358221220fd793be96e6dc95f7b6f7eddc507ce53a033415bb67b2fa476fe5dfc0a0b731064736f6c63430008110033

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

0000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d403889400000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894

-----Decoded View---------------
Arg [0] : _feeContract_lplockDep_altAssets (address[5]): 0x0FEbB541Ef3632925cD67DAf9e82CdC8Ec7a71ef,0xa27eA368c4198a288eb552D642B1E5aCc29912D4,0x29219dd400f2Bf60E5a23d13Be72B486D4038894,0x29219dd400f2Bf60E5a23d13Be72B486D4038894,0x29219dd400f2Bf60E5a23d13Be72B486D4038894

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000febb541ef3632925cd67daf9e82cdc8ec7a71ef
Arg [1] : 000000000000000000000000a27ea368c4198a288eb552d642b1e5acc29912d4
Arg [2] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [3] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894
Arg [4] : 00000000000000000000000029219dd400f2bf60e5a23d13be72b486d4038894


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
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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