Merklechain Explorer

Contract Address : 0xE34457a70754657C8B6cc8F5a4470795B96782b1
Overview
Balance
0 Merkle
Tokens
Fetching tokens...
More Info
Contract Name
BigTycoon
Creator
0xb5de20–ad979f at 0xbf6672–10fd9f
Contract name:
BigTycoon




Optimization enabled
true
Compiler version
v0.8.18+commit.87f61d96




Optimization runs
200
EVM Version
default




Verified at
2024-09-11T07:08:38.730685Z

Contract source code

// SPDX-License-Identifier: UNLICENSED         

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;
abstract contract IBigTycoonV2 {

    struct Stake {
        uint package;
        uint share;
        uint duration;
        uint startTimestamp;
        uint endTimestamp;
        bool isWithdrawled;
    }


    struct UserInfo {  
        bool isRestricted;        
        uint directBusiness;
        uint totalStakeUSD;
        uint cappingLimit;
        uint cappingUsed;
        uint levelBonus;
        uint levelBonusUsd;
        uint totalTokenStake;
		uint avlStakingRewardUsd;
		uint avlGrowthStakingRewardUsd;
		uint stakingCheckpoint;
		uint growthCheckpoint;
		Stake[] stakes;
    }

}

interface IBigTycoonV1 {
    function isUserExists(address user) external view returns (bool);
    function registrationExt(address _user, address _refferal) external ;
    function getUserRefferal(address _user) external view returns(address refferal);
    function getPartnerCount(address _user) external view returns(uint);
    function getDirectBusiness(address _user) external view returns(uint);
    function lastUserId() external view  returns(uint);
    function idToAddress(uint id) external view returns(address);
}

pragma solidity ^0.8.0;
abstract contract Pausable is Context {
    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;

    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    modifier whenPaused() {
        _requirePaused();
        _;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }

    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

pragma solidity ^0.8.0;
contract Initializable {

    bool private _initialized;

    bool private _initializing;

    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

pragma solidity ^0.8.0;
abstract contract Ownable is Context {   
    address private _owner;

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

    function ownable(address _newowner) internal {
        _transferOwnership(_newowner);
    }


    modifier onlyOwner() {
        _checkOwner();
        _;
    }


    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;
interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view 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.8.0;
contract BigTycoon is IBigTycoonV2, Initializable, Ownable, Pausable {
    address public oprator;
    uint public TIME_STEP;
    uint public PERCENT_DIVIDER;
    uint public LASTLEVEL;
    uint public cronUserIndex;
	uint public perCronUsers;
    uint public mBTYCPrice;
    address public mBTYC;
    IBigTycoonV1 public  btycStakingV1;

    mapping(uint8 => uint) public levelBonusShares;
    mapping(uint8 => uint) public growthLevelBonusShares;
    mapping(uint8 => uint) public packages;
    mapping(uint8 => uint) public stakingRewards;
    mapping(uint8 => uint) public capping;

    uint public IT_FEE;
    uint public ADMIN_FEE;
    uint public stakingDuration;

    mapping(address => UserInfo) public userinfo;
    uint public newCappingMult;
    uint public newCappingDiv;
    
    event StakedV2(address indexed user, uint package, uint amount, uint share, uint price , uint duration, uint transactionType);
    event LevelIncomeV2(address indexed sender, address receiver, uint level,uint grossAmountUsd, uint grossAmount,uint amountUsd,uint amount,bool islappsed);
    event GrowthLvlStakeV2(address indexed sender, address receiver, uint level,uint package, uint amount, uint share, uint growthShare);
    event ClaimStakingRewardV2( address indexed user, uint grossAmount,uint IT_deduct,uint admin_deduct,uint amountUsd,uint amount);
    event GrowthClaimRewardV2(address indexed user, uint grossAmount,uint IT_deduct,uint admin_deduct,uint amountUsd, uint amount);
    event WithdrawStakedTokenV2(address indexed user, uint amountUSD, uint amount);
    event FeeWithdrawedV2(address token ,address to ,uint IT_FEE,uint ADMIN_FEE);
    event RankAndRewardClaimV2(address indexed user, uint grossAmount ,uint IT_deduct,uint admin_deduct,uint amount );
    event Test(address indexed refferal, bool cond1 ,bool cond2 ,uint share);
    modifier onlyOprator {
        require(_msgSender()==oprator,"caller is not oprator!");
        _;
    }

    function initialize(address _owner,  address _BtycStakingV1, address _token , uint _price) external initializer {
        levelBonusShares[1] = 1000;
        levelBonusShares[2] = 300;
        levelBonusShares[3] = 200;
        levelBonusShares[4] = 100;
        levelBonusShares[5] = 100;
        levelBonusShares[6] = 50;
        levelBonusShares[7] = 50;
        levelBonusShares[8] = 30;
        levelBonusShares[9] = 25;
        levelBonusShares[10] = 25;
        levelBonusShares[11] = 20;
        levelBonusShares[12] = 20;
        levelBonusShares[13] = 20;
        levelBonusShares[14] = 20;
        levelBonusShares[15] = 20;
        levelBonusShares[16] = 20;
        levelBonusShares[17] = 20;
        levelBonusShares[18] = 20;
        levelBonusShares[19] = 20;
        levelBonusShares[20] = 20;
        levelBonusShares[21] = 20;

        growthLevelBonusShares[1] = 5000;
        growthLevelBonusShares[2] = 2000;
        growthLevelBonusShares[3] = 1000;
        growthLevelBonusShares[4] = 500;
        growthLevelBonusShares[5] = 500;
        growthLevelBonusShares[6] = 300;
        growthLevelBonusShares[7] = 300;
        growthLevelBonusShares[8] = 200;
        growthLevelBonusShares[9] = 100;
        growthLevelBonusShares[10] = 100;
        growthLevelBonusShares[11] = 50;
        growthLevelBonusShares[12] = 50;
        growthLevelBonusShares[13] = 50;
        growthLevelBonusShares[14] = 50;
        growthLevelBonusShares[15] = 50;
        growthLevelBonusShares[16] = 50;
        growthLevelBonusShares[17] = 50;
        growthLevelBonusShares[18] = 50;
        growthLevelBonusShares[19] = 50;
        growthLevelBonusShares[20] = 50;
        growthLevelBonusShares[21] = 50;

		cronUserIndex = 1;
		perCronUsers = 30;
        stakingDuration = 20;
        packages[1] = 25 * 1e18;
        packages[2] = 50 * 1e18;
        packages[3] = 100 * 1e18;
        packages[4] = 250 * 1e18;
        packages[5] = 500 * 1e18;
        packages[6] = 1000 * 1e18;
        packages[7] = 5000 * 1e18;
        packages[8] = 10000 * 1e18;

        stakingRewards[1] = 300;
        stakingRewards[2] = 400;
        stakingRewards[3] = 500;
        stakingRewards[4] = 600;
        stakingRewards[5] = 700;
        stakingRewards[6] = 800;
        stakingRewards[7] = 900;
        stakingRewards[8] = 1000;

        capping[1] = 4;
        capping[2] = 4;
        capping[3] = 5;
        capping[4] = 6;
        capping[5] = 7;
        capping[6] = 8;
        capping[7] = 9;
        capping[8] = 10;

        ownable(_owner);
        TIME_STEP = 30 days;
        PERCENT_DIVIDER = 10000;
        LASTLEVEL = 21;
        mBTYC = _token;
        mBTYCPrice = _price;
        btycStakingV1 = IBigTycoonV1(_BtycStakingV1);

    }

    function stakeWithRefferal(
        uint package,
        address referrer
    ) external virtual  whenNotPaused {
        // require(package>=packages[1],"Minimum $25 ");
        require(mBTYCPrice !=0 ,"invalid token");
        uint8 packageId = getPackageReturnShare(package);
        require(packageId>0,"Invalid package!");

        uint amount = ((package * 1e18) / mBTYCPrice);
        require(
            IERC20(mBTYC).allowance(_msgSender(), address(this)) >= amount,
            "BigTycoon: ERC20 allowance exceed!"
        );
        require(
            IERC20(mBTYC).balanceOf(_msgSender()) >= amount,
            "BigTycoon: ERC20 low balance!"
        );
        require(
            stakingRewards[packageId] != 0,
            "BigTycoon : package is invalid!"
        );             
        IERC20(mBTYC).transferFrom(_msgSender(), address(this), amount);

        if (!isUserExists(_msgSender())) {
            btycStakingV1.registrationExt(_msgSender(), referrer);
        }
        address refferal = btycStakingV1.getUserRefferal(_msgSender());
        userinfo[refferal].directBusiness += package;
       
        userinfo[_msgSender()].stakes.push(
            Stake(
                package,
                stakingRewards[packageId],
                stakingDuration,              
                block.timestamp,
                block.timestamp + (stakingDuration * TIME_STEP),
                false
            )
        );
        userinfo[_msgSender()].cappingLimit += (package*capping[packageId]);
        userinfo[_msgSender()].totalStakeUSD += package;
        userinfo[_msgSender()].totalTokenStake += amount;

        emit StakedV2(_msgSender(), package, amount, stakingRewards[packageId], mBTYCPrice,stakingDuration,0);

        sendLevelAndGrowthBonus(
            package,
            amount,
            refferal,
            stakingRewards[packageId]
        );
    }

    function sendLevelAndGrowthBonus(
        uint256 package,
        uint256 amount,
        address referrer,
        uint share
    ) internal {
        for (uint8 i = 1; i <= LASTLEVEL; i++) {
            if (referrer != address(0)) {
                uint _levelBonus = (amount * levelBonusShares[i]) /PERCENT_DIVIDER;
                uint _levelUsd = (package * levelBonusShares[i]) /PERCENT_DIVIDER;

                uint itfee = (_levelBonus * 5) / 100;
                uint adminfee = ((_levelBonus-itfee) * 5) / 100;
                uint itfeeUSd = (_levelUsd * 5) / 100;
                uint adminfeeUSd = ((_levelUsd-itfeeUSd) * 5) / 100;
                IT_FEE += itfeeUSd;
                ADMIN_FEE += adminfeeUSd;
                if(userinfo[referrer].cappingLimit==0) {
                    userinfo[referrer].cappingLimit= 25*1e18;
                }
                if(cappingLimit(referrer) >= (userinfo[referrer].cappingUsed+ _levelUsd)) {
                    IERC20(mBTYC).transfer(referrer, (_levelBonus - (itfee+adminfee)));
                    emit LevelIncomeV2(
                    _msgSender(),
                    referrer,
                    i,
                    _levelUsd,
                    _levelBonus,
                    (_levelUsd - (itfeeUSd+adminfeeUSd)),
                    (_levelBonus - (itfee+adminfee)),
                    false
                );
                userinfo[referrer].levelBonus += (_levelBonus - (itfee+adminfee));
                userinfo[referrer].levelBonusUsd += (_levelUsd - (itfeeUSd+adminfeeUSd));             
                userinfo[referrer].cappingUsed +=  (_levelUsd);
                 } 
                else {
                   uint _package =  cappingLimit(referrer)-userinfo[referrer].cappingUsed;
                    if(_package>0 && cappingLimit(referrer) >= (userinfo[referrer].cappingUsed+ _package)) {
                        IERC20(mBTYC).transfer(referrer,((_package * 1e18) / mBTYCPrice));
                        userinfo[referrer].cappingUsed +=  _package;
                        userinfo[referrer].levelBonus += ((_package * 1e18) / mBTYCPrice);
                        userinfo[referrer].levelBonusUsd += _package;
                        emit LevelIncomeV2(
                            _msgSender(),
                            referrer,
                            i,
                            _package,
                            ((_package * 1e18) / mBTYCPrice),
                            (_levelUsd - (itfeeUSd+adminfeeUSd)),
                            (_levelBonus - (itfee+adminfee)),
                            true

                        );
              
                    }
                }
                emit GrowthLvlStakeV2(
                    _msgSender(),
                    referrer,
                    i,
                    package,
                    amount,
                    share,
                    growthLevelBonusShares[i]
                );

                address refferal = btycStakingV1.getUserRefferal(referrer);
                if (refferal == address(0)) break;
                referrer = refferal;
            }
        }
    }

    function stake(
        uint package
    ) external virtual  whenNotPaused {
        require(isUserExists(_msgSender()),"user not exist");
        uint8 packageId = getPackageReturnShare(package);
        require(packageId>0,"Invalid package!");
        uint amount = (package * 1e18) / mBTYCPrice;
        require(
            IERC20(mBTYC).allowance(_msgSender(), address(this)) >= amount,
            "BigTycoon: ERC20 allowance exceed!"
        );
        require(!userinfo[_msgSender()].isRestricted, "user is restricted!");
        require(
            IERC20(mBTYC).balanceOf(_msgSender()) >= amount,
            "BigTycoon: ERC20 low balance!"
        );
        require(
            stakingRewards[packageId] != 0,
            "BigTycoon : package is invalid!"
        );
        IERC20(mBTYC).transferFrom(_msgSender(), address(this), amount);
        if(userinfo[_msgSender()].stakes.length > 0){
            require(package>=userinfo[_msgSender()].stakes[userinfo[_msgSender()].stakes.length-1].package,"package must be greater than previous package !");
        }
        address refferal = btycStakingV1.getUserRefferal(_msgSender());
        userinfo[refferal].directBusiness += package;
         
        userinfo[_msgSender()].stakes.push(
               
            Stake(
                package,
                stakingRewards[packageId],
                stakingDuration,
                block.timestamp,
                block.timestamp + (stakingDuration * TIME_STEP),
                false
            )
        );
        userinfo[_msgSender()].cappingLimit += (package*capping[packageId]);
        userinfo[_msgSender()].totalStakeUSD += package;
        userinfo[_msgSender()].totalTokenStake += amount;
        emit StakedV2(_msgSender(),  package, amount,  stakingRewards[packageId],mBTYCPrice,stakingDuration, 0);

        sendLevelAndGrowthBonus(
            package,
            amount,
            refferal,
            stakingRewards[packageId]
        );
    }

    function getStakingReward(address user) public view  returns ( uint totalAmount ) {
        for (uint i = 0; i < userinfo[user].stakes.length; i++) {
            Stake memory stake_ = userinfo[user].stakes[i];
            uint256 finish = stake_.endTimestamp;
            if (userinfo[user].stakingCheckpoint < finish) {
                uint256 share = (stake_.package * stake_.share)/PERCENT_DIVIDER;
                uint256 from = stake_.startTimestamp > userinfo[user].stakingCheckpoint? stake_.startTimestamp: userinfo[user].stakingCheckpoint;
                uint256 to = finish < block.timestamp? finish: block.timestamp;
                if (from < to) {
                    totalAmount = totalAmount +(share * (to - from)) /(TIME_STEP);
                }
            }
        }

        return (totalAmount);
   
    }

    function getStakingTotalReward(
        address user
    ) public view  returns ( uint totalAmount ) {
        for (uint i = 0; i < userinfo[user].stakes.length; i++) {
            Stake memory stake_ = userinfo[user].stakes[i];
            uint256 finish = stake_.endTimestamp;
            if (userinfo[user].stakingCheckpoint < finish) {
                uint256 share = (stake_.package * stake_.share) /PERCENT_DIVIDER;
                uint256 from = stake_.startTimestamp > userinfo[user].stakingCheckpoint? stake_.startTimestamp: userinfo[user].stakingCheckpoint;
                uint256 to = finish < block.timestamp? finish: block.timestamp;
                if (from < to) {
                    totalAmount = totalAmount +(share * (to - from)) /(TIME_STEP);
                }
				
            }
        }
        return (totalAmount+userinfo[user].avlStakingRewardUsd);
   
    }
    
    function withdrawStakedToken() external whenNotPaused {
        require(getAvailableForWithdraw(_msgSender())>0,"invalid");
        uint total;

        for (uint i = 0; i < userinfo[_msgSender()].stakes.length; i++) {
            Stake memory stake_ = userinfo[_msgSender()].stakes[i];
            uint256 finish = stake_.startTimestamp+(stake_.duration * TIME_STEP);
            if (block.timestamp >= finish && stake_.isWithdrawled == false) {
                total += stake_.package;
                userinfo[_msgSender()].stakes[i].isWithdrawled = true;
            }
        }

        IERC20(mBTYC).transfer(_msgSender(), (total*1e18)/mBTYCPrice);
        emit WithdrawStakedTokenV2(_msgSender(),total,(total*1e18)/mBTYCPrice);
    }

    function getAvailableForWithdraw(
        address user
    ) public view returns (uint ) {
        uint total;
        for (uint i = 0; i < userinfo[user].stakes.length; i++) {
            Stake memory stake_ = userinfo[user].stakes[i];
            uint256 finish = stake_.startTimestamp+(stake_.duration * TIME_STEP);
            if (block.timestamp >= finish && stake_.isWithdrawled == false) {
                total += stake_.package;
            }
        }
        return total;
    }

    function claim() external whenNotPaused {
        require(!userinfo[_msgSender()].isRestricted, "user is restricted!");
        updateIncome(_msgSender());
		uint stke_amount = userinfo[_msgSender()].avlStakingRewardUsd;
		uint growth_amount = userinfo[_msgSender()].avlGrowthStakingRewardUsd;
        require(stke_amount>0||growth_amount>0,"invalid");
        uint amount = growth_amount+stke_amount;
        uint itfee1 = (stke_amount * 5) / 100;
        uint adminfee1 = ((stke_amount-itfee1) * 5) / 100;
        uint itfee2 = (growth_amount * 5) / 100;
        uint adminfee2 = ((growth_amount-itfee2) * 5) / 100;
        uint itfee =(itfee1+itfee2);
        uint adminfee=(adminfee1+adminfee2);
        IT_FEE += (itfee1+itfee2);
        ADMIN_FEE += (adminfee1+adminfee2);
        userinfo[_msgSender()].avlStakingRewardUsd = 0;
        userinfo[_msgSender()].avlGrowthStakingRewardUsd = 0;
        IERC20(mBTYC).transfer(_msgSender(), (amount-(itfee+adminfee))*1e18/mBTYCPrice);
       
        if(stke_amount>0){
            uint stk = stke_amount-(itfee1+adminfee1);
            emit ClaimStakingRewardV2(_msgSender(), stke_amount,itfee1 ,adminfee1,stk,((stk*1e18)/mBTYCPrice));
        }
        if(growth_amount>0) {
            uint grw = growth_amount-(itfee2+adminfee2);
            emit GrowthClaimRewardV2(_msgSender(), growth_amount,itfee2,adminfee2,grw,((grw*1e18)/mBTYCPrice));
        }
       
       
    }

	function updateIncome(address _user ) public  {
		(uint amount) = getStakingReward(_user);
        uint ucappingLimit = cappingLimit(_user);
         if(ucappingLimit >= (userinfo[_user].cappingUsed+ amount)) {
            userinfo[_user].avlStakingRewardUsd +=(amount);
            userinfo[_user].cappingUsed+=amount;
            } else {
                uint _package;
                if(ucappingLimit > userinfo[_user].cappingUsed)
                    _package =  ucappingLimit - userinfo[_user].cappingUsed;
                else
                    _package =  0;
            
            if(_package>0) {
                userinfo[_user].avlStakingRewardUsd +=(_package);
                userinfo[_user].cappingUsed+=_package;
            }
        }
           
		// userinfo[_user].avlStakingRewardUsd += amount;
		userinfo[_user].stakingCheckpoint = block.timestamp;
		address referrer = btycStakingV1.getUserRefferal(_user);
		for (uint8 i = 1; i <= LASTLEVEL; i++) {
            if (referrer != address(0)) {
                // User storage user = users[referrer];
                if(userinfo[referrer].cappingLimit==0) {
                     userinfo[referrer].cappingLimit= 25*1e18;
                }
                uint reqDirect = i * 2;
                bool cond = i < 5 ? btycStakingV1.getPartnerCount(referrer) >= reqDirect : 10<=btycStakingV1.getPartnerCount(referrer);
                uint direct = i < 5 ?reqDirect:10;
                uint reqBusiness = direct * 100*1e18;
                emit Test(referrer, cond ,reqBusiness <= userinfo[referrer].directBusiness ,i);
                if(cond && reqBusiness <= userinfo[referrer].directBusiness ) {
                    uint _rcappingLimit = cappingLimit(referrer);
                    uint256 _share = ((amount*growthLevelBonusShares[i]) / PERCENT_DIVIDER);
                     if(_rcappingLimit >= (userinfo[referrer].cappingUsed+ _share)) {
                        userinfo[referrer].avlGrowthStakingRewardUsd +=(_share);
                        userinfo[referrer].cappingUsed+=_share;
                     } else {
                         uint _package;
                            if(_rcappingLimit > userinfo[referrer].cappingUsed)
                              _package =  _rcappingLimit-userinfo[referrer].cappingUsed;
                              else 
                              _package = 0;                    
                        if(_package>0) {
                            userinfo[referrer].avlGrowthStakingRewardUsd +=(_package);
                            userinfo[referrer].cappingUsed+=_package;
                        }
                     }
                }
                address _referrer = btycStakingV1.getUserRefferal(referrer);
                if(_referrer == address(0)) break;
                referrer = _referrer;
            }
		} 
	}

	function updateUsersStakingIncome(uint _perCronUsers) public {
        uint lastUserId = btycStakingV1.lastUserId();
		uint count = (cronUserIndex+_perCronUsers)>lastUserId?lastUserId:(cronUserIndex+_perCronUsers);
		for(uint i=cronUserIndex;i <=count; i++) {
             if(userinfo[btycStakingV1.idToAddress(i)].stakes.length>0)
				updateIncome(btycStakingV1.idToAddress(i));
		}
		if(count==lastUserId) {
			cronUserIndex =1;
		} else {
			cronUserIndex =count;
		}
	}

    function getStakingLength(address staker) external view returns (uint) {
        return userinfo[staker].stakes.length;
    }

    function getStakingDetails(
        address user,
        uint index
    ) external view returns (Stake memory) {
        return userinfo[user].stakes[index];
    }

    function getCheckpoints( address _user) external view returns(uint stakeCheckpoint) {
        stakeCheckpoint= userinfo[_user].stakingCheckpoint;
    }

    function getPackageReturnShare(uint packageInUSD) public view returns (uint8) {
       if(packages[1]<=packageInUSD && packages[2]>packageInUSD ) {
        return 1;
       } else if(packages[2]<=packageInUSD && packages[3]>packageInUSD ) {
        return 2;
       } else if(packages[3]<=packageInUSD && packages[4]>packageInUSD ) {
        return 3;
       } else if(packages[4]<=packageInUSD && packages[5]>packageInUSD ) {
        return 4;
       } else if(packages[5]<=packageInUSD && packages[6]>packageInUSD ) {
        return 5;
       } else if(packages[6]<=packageInUSD && packages[7]>packageInUSD ) {
        return 6;
       } else if(packages[7]<=packageInUSD && packages[8]>packageInUSD) {
        return 7;
       } else if(packages[8]<=packageInUSD) {
        return 8;
       } else {
        return 0;
       }
    }

    function isUserExists(address user) public view returns (bool) {
        return btycStakingV1.isUserExists(user);
    }

    function withdrawFee(address token,address _to ) external onlyOwner {
        IERC20(token).transfer(_to, (IT_FEE+ADMIN_FEE)*1e18/mBTYCPrice);
        IT_FEE = 0;
        ADMIN_FEE = 0;
        emit FeeWithdrawedV2(token ,_to ,IT_FEE,ADMIN_FEE);
    }

    function changeLastLevel(uint newLevel) external onlyOwner{
        LASTLEVEL = newLevel;
    }

    function setShareLevelBonus(uint8 _level,uint share ) external onlyOwner {
        levelBonusShares[_level] = share;
    }

    function setCapping(uint8 _level, uint _newCapping ) external  onlyOwner {
        capping[_level] = _newCapping;
    }

    function setNewCapping(uint _newCappingMult, uint _newCappingDiv) external onlyOwner {
        newCappingMult = _newCappingMult;
        newCappingDiv = _newCappingDiv;
    }

    function cappingLimit(address _user) public view returns (uint256) {
        if (userinfo[_user].totalStakeUSD != 0) {
            return
                (userinfo[_user].totalStakeUSD * newCappingMult)/newCappingDiv;
        }
        return (25 * 1e18);
    }
 
    function setBlockOrUnblockUser(address _user, bool _status ) external  onlyOwner {
        userinfo[_user].isRestricted = _status;
    }

    function setShareGrowthLevelBonus(uint8 _level,uint share ) external onlyOwner {
        growthLevelBonusShares[_level] = share;
    }

    function changePercentDivider(uint newDivider) external onlyOwner {
        PERCENT_DIVIDER = newDivider;
    }

    function changeTimestep(uint newTimeStep) external onlyOwner{
        TIME_STEP = newTimeStep;
    }

    function Pause() external onlyOwner {
        _pause();
    }

    function UnPause() external onlyOwner {
        _unpause();
    }

    function updateCronPerUser(uint _numberOfUser) external onlyOprator {
        perCronUsers = _numberOfUser;
    }

    function changeOpratorwallet(address _newWallet) external onlyOwner{
        oprator =_newWallet;
    }

    function updateTokenPrice(uint _priceInUSDT) external onlyOprator {
        require(_priceInUSDT!=0, "price not be zero");
        mBTYCPrice =_priceInUSDT;

    }
    function getAvlReward(address _user) external view returns (uint avlStaking, uint avlGrowth) {
         avlStaking = userinfo[_user].avlStakingRewardUsd;
         avlGrowth = userinfo[_user].avlGrowthStakingRewardUsd;
    }
    
    function claimRankAndReward(address[] calldata _users, uint[]  calldata amounts) external onlyOprator {
        for(uint i=0;i<_users.length;i++){
            if(!userinfo[_users[i]].isRestricted) {
                uint amount = amounts[i];
                uint itfee = amount*5/100;
                uint adminfee = ((amount-itfee)*5)/100;
                IT_FEE += itfee;
                ADMIN_FEE += adminfee;
                IERC20(mBTYC).transfer(_users[i], (amount-(itfee+adminfee)));
                emit RankAndRewardClaimV2(_users[i],  amount , itfee, adminfee, (amount-(itfee+adminfee)));
            }
        }
    }
    
    function withdrawToken(
        address _token,
        address _to,
        uint _amount
    ) external onlyOwner {
        IERC20(_token).transfer(_to, _amount);
    }

    function setShareStakingReward(uint8 _level,uint share ) external onlyOwner {
        stakingRewards[_level] = share;
    }

}                                
        

Contract ABI

[{"type":"event","name":"ClaimStakingRewardV2","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"grossAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"IT_deduct","internalType":"uint256","indexed":false},{"type":"uint256","name":"admin_deduct","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountUsd","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"FeeWithdrawedV2","inputs":[{"type":"address","name":"token","internalType":"address","indexed":false},{"type":"address","name":"to","internalType":"address","indexed":false},{"type":"uint256","name":"IT_FEE","internalType":"uint256","indexed":false},{"type":"uint256","name":"ADMIN_FEE","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GrowthClaimRewardV2","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"grossAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"IT_deduct","internalType":"uint256","indexed":false},{"type":"uint256","name":"admin_deduct","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountUsd","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GrowthLvlStakeV2","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"receiver","internalType":"address","indexed":false},{"type":"uint256","name":"level","internalType":"uint256","indexed":false},{"type":"uint256","name":"package","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"share","internalType":"uint256","indexed":false},{"type":"uint256","name":"growthShare","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LevelIncomeV2","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"receiver","internalType":"address","indexed":false},{"type":"uint256","name":"level","internalType":"uint256","indexed":false},{"type":"uint256","name":"grossAmountUsd","internalType":"uint256","indexed":false},{"type":"uint256","name":"grossAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountUsd","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"bool","name":"islappsed","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RankAndRewardClaimV2","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"grossAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"IT_deduct","internalType":"uint256","indexed":false},{"type":"uint256","name":"admin_deduct","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"StakedV2","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"package","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"share","internalType":"uint256","indexed":false},{"type":"uint256","name":"price","internalType":"uint256","indexed":false},{"type":"uint256","name":"duration","internalType":"uint256","indexed":false},{"type":"uint256","name":"transactionType","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Test","inputs":[{"type":"address","name":"refferal","internalType":"address","indexed":true},{"type":"bool","name":"cond1","internalType":"bool","indexed":false},{"type":"bool","name":"cond2","internalType":"bool","indexed":false},{"type":"uint256","name":"share","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WithdrawStakedTokenV2","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"amountUSD","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"ADMIN_FEE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"IT_FEE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"LASTLEVEL","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PERCENT_DIVIDER","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"Pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"TIME_STEP","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"UnPause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IBigTycoonV1"}],"name":"btycStakingV1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"capping","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cappingLimit","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeLastLevel","inputs":[{"type":"uint256","name":"newLevel","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeOpratorwallet","inputs":[{"type":"address","name":"_newWallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changePercentDivider","inputs":[{"type":"uint256","name":"newDivider","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTimestep","inputs":[{"type":"uint256","name":"newTimeStep","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimRankAndReward","inputs":[{"type":"address[]","name":"_users","internalType":"address[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cronUserIndex","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAvailableForWithdraw","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"avlStaking","internalType":"uint256"},{"type":"uint256","name":"avlGrowth","internalType":"uint256"}],"name":"getAvlReward","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"stakeCheckpoint","internalType":"uint256"}],"name":"getCheckpoints","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"getPackageReturnShare","inputs":[{"type":"uint256","name":"packageInUSD","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct IBigTycoonV2.Stake","components":[{"type":"uint256","name":"package","internalType":"uint256"},{"type":"uint256","name":"share","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint256","name":"startTimestamp","internalType":"uint256"},{"type":"uint256","name":"endTimestamp","internalType":"uint256"},{"type":"bool","name":"isWithdrawled","internalType":"bool"}]}],"name":"getStakingDetails","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getStakingLength","inputs":[{"type":"address","name":"staker","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalAmount","internalType":"uint256"}],"name":"getStakingReward","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalAmount","internalType":"uint256"}],"name":"getStakingTotalReward","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"growthLevelBonusShares","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_BtycStakingV1","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_price","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isUserExists","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"levelBonusShares","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"mBTYC","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mBTYCPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"newCappingDiv","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"newCappingMult","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"oprator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"packages","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"perCronUsers","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBlockOrUnblockUser","inputs":[{"type":"address","name":"_user","internalType":"address"},{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCapping","inputs":[{"type":"uint8","name":"_level","internalType":"uint8"},{"type":"uint256","name":"_newCapping","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNewCapping","inputs":[{"type":"uint256","name":"_newCappingMult","internalType":"uint256"},{"type":"uint256","name":"_newCappingDiv","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setShareGrowthLevelBonus","inputs":[{"type":"uint8","name":"_level","internalType":"uint8"},{"type":"uint256","name":"share","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setShareLevelBonus","inputs":[{"type":"uint8","name":"_level","internalType":"uint8"},{"type":"uint256","name":"share","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setShareStakingReward","inputs":[{"type":"uint8","name":"_level","internalType":"uint8"},{"type":"uint256","name":"share","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"package","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stakeWithRefferal","inputs":[{"type":"uint256","name":"package","internalType":"uint256"},{"type":"address","name":"referrer","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakingDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakingRewards","inputs":[{"type":"uint8","name":"","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateCronPerUser","inputs":[{"type":"uint256","name":"_numberOfUser","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateIncome","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTokenPrice","inputs":[{"type":"uint256","name":"_priceInUSDT","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateUsersStakingIncome","inputs":[{"type":"uint256","name":"_perCronUsers","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isRestricted","internalType":"bool"},{"type":"uint256","name":"directBusiness","internalType":"uint256"},{"type":"uint256","name":"totalStakeUSD","internalType":"uint256"},{"type":"uint256","name":"cappingLimit","internalType":"uint256"},{"type":"uint256","name":"cappingUsed","internalType":"uint256"},{"type":"uint256","name":"levelBonus","internalType":"uint256"},{"type":"uint256","name":"levelBonusUsd","internalType":"uint256"},{"type":"uint256","name":"totalTokenStake","internalType":"uint256"},{"type":"uint256","name":"avlStakingRewardUsd","internalType":"uint256"},{"type":"uint256","name":"avlGrowthStakingRewardUsd","internalType":"uint256"},{"type":"uint256","name":"stakingCheckpoint","internalType":"uint256"},{"type":"uint256","name":"growthCheckpoint","internalType":"uint256"}],"name":"userinfo","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawFee","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"address","name":"_to","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawStakedToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061038e5760003560e01c80638005a7de116101de578063cf244a891161010f578063f0103da0116100ad578063f50847071161007c578063f5084707146108e3578063f69e9b8b1461090f578063f7c24aa314610922578063f8ec4d6d1461093557600080fd5b8063f0103da014610885578063f0b7cc2214610898578063f2facf4c146108ab578063f2fde38b146108d057600080fd5b8063d13b6ff1116100e9578063d13b6ff1146107f6578063d74491c114610809578063e4a1f4d11461081c578063e7ca349c1461083c57600080fd5b8063cf244a89146107bd578063cf756fdf146107d0578063d04fa3d6146107e357600080fd5b8063a694fc3a1161017c578063bc48565011610156578063bc48565014610716578063c2a846a714610777578063c537d5e71461078a578063c879c6d8146107aa57600080fd5b8063a694fc3a146106dd578063baf0921a146106f0578063bbd2c8ef1461070357600080fd5b806390a71056116101b857806390a71056146105e25780639446ec9f146105eb578063a4deb91d146106b7578063a6562a68146106ca57600080fd5b80638005a7de146105ba578063869eac93146105c35780638da5cb5b146105cb57600080fd5b80633747a1a2116102c35780635c975abb11610261578063715018a611610230578063715018a61461058357806378f4d4131461058b5780637cae3b371461059e5780637dbbb8f6146105a757600080fd5b80635c975abb14610543578063676c0d771461055557806369844283146105685780636985a0221461057b57600080fd5b80634469ed141161029d5780634469ed14146105065780634e71d92d1461050f578063509222cd146105175780635abc2f5b1461053a57600080fd5b80633747a1a2146104cb5780633f4b0a73146104de578063438cd2d3146104fe57600080fd5b80630fc8deca1161033057806329fc7bd81161030a57806329fc7bd8146104a75780632dd4f9b0146104b057806332bc298c146104b95780633739037f146104c257600080fd5b80630fc8deca1461045557806313079e2f1461046857806324ae16e61461049457600080fd5b8063037140de1161036c578063037140de146103ee578063043a73dd146104015780630466a29c1461040a578063059473d11461042a57600080fd5b806301b81ac51461039357806301e33667146103a8578063029e26f9146103bb575b600080fd5b6103a66103a13660046148c2565b61093e565b005b6103a66103b63660046148fb565b610971565b6103db6103c936600461494d565b600b6020526000908152604090205481565b6040519081526020015b60405180910390f35b6103a66103fc36600461496f565b6109f2565b6103db60145481565b6103db61041836600461494d565b600d6020526000908152604090205481565b60085461043d906001600160a01b031681565b6040516001600160a01b0390911681526020016103e5565b6103db610463366004614999565b610a10565b6103db610476366004614999565b6001600160a01b03166000908152601260205260409020600a015490565b6103a66104a236600461496f565b610b24565b6103db60035481565b6103db60045481565b6103db60025481565b6103db60065481565b6103a66104d93660046149b6565b610b42565b6103db6104ec36600461494d565b600a6020526000908152604090205481565b6103a6610b4f565b6103db60105481565b6103a6610b61565b61052a610525366004614999565b610f2d565b60405190151581526020016103e5565b6103db60135481565b600054600160b01b900460ff1661052a565b6103a66105633660046149b6565b610fa2565b6103a66105763660046149cf565b61101e565b6103a6611031565b6103a6611041565b6103db610599366004614999565b611053565b6103db60055481565b6103a66105b5366004614999565b6111fe565b6103db60115481565b6103a6611228565b6000546201000090046001600160a01b031661043d565b6103db60075481565b61065c6105f9366004614999565b601260205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b909b015460ff909a169a9899979896979596949593949293919290918c565b604080519c15158d5260208d019b909b52998b019890985260608a0196909652608089019490945260a088019290925260c087015260e0860152610100850152610120840152610140830152610160820152610180016103e5565b6103a66106c53660046149b6565b6114b7565b6103a66106d836600461496f565b6114c4565b6103a66106eb3660046149b6565b6114e2565b6103a66106fe3660046149b6565b611bb3565b6103db610711366004614999565b611beb565b6107296107243660046149f1565b611db7565b6040516103e59190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151151560a083015292915050565b6103a6610785366004614a5b565b611e81565b6103db61079836600461494d565b600e6020526000908152604090205481565b6103a66107b8366004614ac7565b6120fe565b6103a66107cb3660046149b6565b612216565b6103a66107de366004614af5565b6123ef565b6103a66107f13660046149b6565b612eba565b60015461043d906001600160a01b031681565b60095461043d906001600160a01b031681565b6103db61082a36600461494d565b600c6020526000908152604090205481565b61087061084a366004614999565b6001600160a01b0316600090815260126020526040902060088101546009909101549091565b604080519283526020830191909152016103e5565b6103a661089336600461496f565b612ec7565b6103db6108a6366004614999565b612ee5565b6108be6108b93660046149b6565b612f4c565b60405160ff90911681526020016103e5565b6103a66108de366004614999565b6132b3565b6103db6108f1366004614999565b6001600160a01b03166000908152601260205260409020600c015490565b6103a661091d366004614b46565b61332c565b6103a6610930366004614999565b613963565b6103db600f5481565b610946613fc8565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b610979613fc8565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156109c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ec9190614b6b565b50505050565b6109fa613fc8565b60ff9091166000908152600b6020526040902055565b60008060005b6001600160a01b0384166000908152601260205260409020600c0154811015610b1d576001600160a01b0384166000908152601260205260408120600c01805483908110610a6657610a66614b88565b600091825260208083206040805160c081018252600690940290910180548452600181015492840192909252600280830154918401829052600383015460608501526004830154608085015260059092015460ff16151560a08401529054919350610ad19190614bb4565b8260600151610ae09190614bcb565b9050804210158015610af4575060a0820151155b15610b08578151610b059085614bcb565b93505b50508080610b1590614bde565b915050610a16565b5092915050565b610b2c613fc8565b60ff9091166000908152600d6020526040902055565b610b4a613fc8565b600255565b610b57613fc8565b610b5f614029565b565b610b6961407e565b3360009081526012602052604090205460ff1615610bc45760405162461bcd60e51b81526020600482015260136024820152727573657220697320726573747269637465642160681b60448201526064015b60405180910390fd5b610bcd33613963565b336000908152601260205260409020600881015460099091015481151580610bf55750600081115b610c2b5760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610bbb565b6000610c378383614bcb565b905060006064610c48856005614bb4565b610c529190614bf7565b905060006064610c628387614c19565b610c6d906005614bb4565b610c779190614bf7565b905060006064610c88866005614bb4565b610c929190614bf7565b905060006064610ca28388614c19565b610cad906005614bb4565b610cb79190614bf7565b90506000610cc58386614bcb565b90506000610cd38386614bcb565b9050610cdf8487614bcb565b600f6000828254610cf09190614bcb565b90915550610d0090508386614bcb565b60106000828254610d119190614bcb565b90915550503360008181526012602052604081206008808201839055600990910191909155546007546001600160a01b039091169163a9059cbb91610d568587614bcb565b610d60908c614c19565b610d7290670de0b6b3a7640000614bb4565b610d7c9190614bf7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610dc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610deb9190614b6b565b508815610e87576000610dfe8688614bcb565b610e08908b614c19565b9050336001600160a01b03167fe5565d6d373f7dd12ed4484cae782e22d167756b31155d0875bfec70e433c8c78b89898560075487670de0b6b3a7640000610e509190614bb4565b610e5a9190614bf7565b604080519586526020860194909452928401919091526060830152608082015260a00160405180910390a2505b8715610f22576000610e998486614bcb565b610ea3908a614c19565b9050336001600160a01b03167fbcfaee62d3598d0a0ab653ba7e61c625ff326f8cde085d0c74c3a2017bd851dc8a87878560075487670de0b6b3a7640000610eeb9190614bb4565b610ef59190614bf7565b604080519586526020860194909452928401919091526060830152608082015260a00160405180910390a2505b505050505050505050565b60095460405163509222cd60e01b81526001600160a01b038381166004830152600092169063509222cd90602401602060405180830381865afa158015610f78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9c9190614b6b565b92915050565b6001546001600160a01b0316336001600160a01b031614610fd55760405162461bcd60e51b8152600401610bbb90614c2c565b806000036110195760405162461bcd60e51b81526020600482015260116024820152707072696365206e6f74206265207a65726f60781b6044820152606401610bbb565b600755565b611026613fc8565b601391909155601455565b611039613fc8565b610b5f6140cb565b611049613fc8565b610b5f600061410e565b6000805b6001600160a01b0383166000908152601260205260409020600c01548110156111f8576001600160a01b0383166000908152601260205260408120600c018054839081106110a7576110a7614b88565b600091825260208083206040805160c0810182526006909402909101805484526001810154848401526002810154848301526003810154606085015260048101546080850181905260059091015460ff16151560a08501526001600160a01b03891685526012909252909220600a01549092508111156111e357600354602083015183516000929161113891614bb4565b6111429190614bf7565b6001600160a01b0387166000908152601260205260408120600a0154606086015192935090911161118e576001600160a01b0387166000908152601260205260409020600a0154611194565b83606001515b905060004284106111a557426111a7565b835b9050808210156111df576002546111be8383614c19565b6111c89085614bb4565b6111d29190614bf7565b6111dc9088614bcb565b96505b5050505b505080806111f090614bde565b915050611057565b50919050565b611206613fc8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b61123061407e565b600061123b33610a10565b116112725760405162461bcd60e51b81526020600482015260076024820152661a5b9d985b1a5960ca1b6044820152606401610bbb565b6000805b336000908152601260205260409020600c01548110156113b557336000908152601260205260408120600c018054839081106112b4576112b4614b88565b600091825260208083206040805160c081018252600690940290910180548452600181015492840192909252600280830154918401829052600383015460608501526004830154608085015260059092015460ff16151560a0840152905491935061131f9190614bb4565b826060015161132e9190614bcb565b9050804210158015611342575060a0820151155b156113a05781516113539085614bcb565b336000908152601260205260409020600c0180549195506001918590811061137d5761137d614b88565b60009182526020909120600690910201600501805460ff19169115159190911790555b505080806113ad90614bde565b915050611276565b506008546001600160a01b031663a9059cbb336007546113dd85670de0b6b3a7640000614bb4565b6113e79190614bf7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611432573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114569190614b6b565b5060075433907f94f6b8bcd1a7f5d097c302d32dfea3ad43ae3b40c91fdbb46eaa96d218da226890839061149282670de0b6b3a7640000614bb4565b61149c9190614bf7565b6040805192835260208301919091520160405180910390a250565b6114bf613fc8565b600455565b6114cc613fc8565b60ff9091166000908152600e6020526040902055565b6114ea61407e565b6114f333610f2d565b6115305760405162461bcd60e51b815260206004820152600e60248201526d1d5cd95c881b9bdd08195e1a5cdd60921b6044820152606401610bbb565b600061153b82612f4c565b905060008160ff16116115835760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964207061636b6167652160801b6044820152606401610bbb565b60075460009061159b84670de0b6b3a7640000614bb4565b6115a59190614bf7565b60085490915081906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa158015611606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162a9190614c5c565b10156116485760405162461bcd60e51b8152600401610bbb90614c75565b3360009081526012602052604090205460ff161561169e5760405162461bcd60e51b81526020600482015260136024820152727573657220697320726573747269637465642160681b6044820152606401610bbb565b60085481906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190614c5c565b10156117685760405162461bcd60e51b815260206004820152601d60248201527f4269675479636f6f6e3a204552433230206c6f772062616c616e6365210000006044820152606401610bbb565b60ff82166000908152600d602052604081205490036117c95760405162461bcd60e51b815260206004820152601f60248201527f4269675479636f6f6e203a207061636b61676520697320696e76616c696421006044820152606401610bbb565b6008546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018490526064016020604051808303816000875af115801561182e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118529190614b6b565b50336000908152601260205260409020600c01541561191457336000908152601260205260409020600c01805461188b90600190614c19565b8154811061189b5761189b614b88565b9060005260206000209060060201600001548310156119145760405162461bcd60e51b815260206004820152602f60248201527f7061636b616765206d7573742062652067726561746572207468616e2070726560448201526e76696f7573207061636b616765202160881b6064820152608401610bbb565b6009546000906001600160a01b0316633fab7e6d336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561196d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119919190614cb7565b6001600160a01b0381166000908152601260205260408120600101805492935086929091906119c1908490614bcb565b9091555050336000908152601260209081526040808320815160c08101835288815260ff88168552600d8452938290205492840192909252601154908301819052426060840152600254600c90920192916080830191611a219190614bb4565b611a2b9042614bcb565b815260006020918201819052835460018082018655948252828220845160069092020190815583830151948101949094556040808401516002860155606084015160038601556080840151600486015560a0909301516005909401805460ff19169415159490941790935560ff86168352600e9052902054611aad9085614bb4565b3360009081526012602052604081206003018054909190611acf908490614bcb565b90915550503360009081526012602052604081206002018054869290611af6908490614bcb565b90915550503360009081526012602052604081206007018054849290611b1d908490614bcb565b909155505060ff83166000908152600d602090815260408083205460075460115483518a8152948501889052848401929092526060840152608083015260a0820192909252905133917f77fdf2f88bf7d7cd0de4eecf733023fc2a4253bf89af049e63243e4aae81da00919081900360c00190a260ff83166000908152600d60205260409020546109ec90859084908490614169565b6001546001600160a01b0316336001600160a01b031614611be65760405162461bcd60e51b8152600401610bbb90614c2c565b600655565b6000805b6001600160a01b0383166000908152601260205260409020600c0154811015611d90576001600160a01b0383166000908152601260205260408120600c01805483908110611c3f57611c3f614b88565b600091825260208083206040805160c0810182526006909402909101805484526001810154848401526002810154848301526003810154606085015260048101546080850181905260059091015460ff16151560a08501526001600160a01b03891685526012909252909220600a0154909250811115611d7b576003546020830151835160009291611cd091614bb4565b611cda9190614bf7565b6001600160a01b0387166000908152601260205260408120600a01546060860151929350909111611d26576001600160a01b0387166000908152601260205260409020600a0154611d2c565b83606001515b90506000428410611d3d5742611d3f565b835b905080821015611d7757600254611d568383614c19565b611d609085614bb4565b611d6a9190614bf7565b611d749088614bcb565b96505b5050505b50508080611d8890614bde565b915050611bef565b506001600160a01b038216600090815260126020526040902060080154610f9c9082614bcb565b611df26040518060c0016040528060008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6001600160a01b0383166000908152601260205260409020600c01805483908110611e1f57611e1f614b88565b60009182526020918290206040805160c081018252600690930290910180548352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015460ff16151560a0820152905092915050565b6001546001600160a01b0316336001600160a01b031614611eb45760405162461bcd60e51b8152600401610bbb90614c2c565b60005b838110156120f75760126000868684818110611ed557611ed5614b88565b9050602002016020810190611eea9190614999565b6001600160a01b0316815260208101919091526040016000205460ff166120e5576000838383818110611f1f57611f1f614b88565b90506020020135905060006064826005611f399190614bb4565b611f439190614bf7565b905060006064611f538385614c19565b611f5e906005614bb4565b611f689190614bf7565b905081600f6000828254611f7c9190614bcb565b925050819055508060106000828254611f959190614bcb565b90915550506008546001600160a01b031663a9059cbb898987818110611fbd57611fbd614b88565b9050602002016020810190611fd29190614999565b611fdc8486614bcb565b611fe69087614c19565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120559190614b6b565b5087878581811061206857612068614b88565b905060200201602081019061207d9190614999565b6001600160a01b03167fe617e44f22c399ee667972b2f28d54c27ee55bb227bf4af885dced41797156598484846120b48183614bcb565b6120be9089614c19565b60408051948552602085019390935291830152606082015260800160405180910390a25050505b806120ef81614bde565b915050611eb7565b5050505050565b612106613fc8565b816001600160a01b031663a9059cbb82600754601054600f546121299190614bcb565b61213b90670de0b6b3a7640000614bb4565b6121459190614bf7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b49190614b6b565b506000600f8190556010819055604080516001600160a01b038581168252841660208201528082018390526060810192909252517f834ee09362c7b6ee54491583c66552c74f292c59de36869fff9d6cd4750966049181900360800190a15050565b6009546040805163348d448760e01b815290516000926001600160a01b03169163348d44879160048083019260209291908290030181865afa158015612260573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122849190614c5c565b9050600081836005546122979190614bcb565b116122af57826005546122aa9190614bcb565b6122b1565b815b6005549091505b8181116123d657600954604051632a2d0c4760e01b81526004810183905260009160129183916001600160a01b031690632a2d0c4790602401602060405180830381865afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190614cb7565b6001600160a01b031681526020810191909152604001600020600c015411156123c457600954604051632a2d0c4760e01b8152600481018390526123c4916001600160a01b031690632a2d0c4790602401602060405180830381865afa1580156123a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109309190614cb7565b806123ce81614bde565b9150506122b8565b508181036123e8576001600555505050565b6005555050565b600054610100900460ff1680612408575060005460ff16155b61246b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610bbb565b600054610100900460ff1615801561248d576000805461ffff19166101011790555b6103e87fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc781905561012c7fbff4442b8ed600beeb8e26b1279a0f0d14c6edfaec26d968ee13c86f7d4c2ba881905560c87fa856840544dc26124927add067d799967eac11be13e14d82cc281ea46fa3975981905560647fe1eb2b2161a492c07c5a334e48012567cba93ec021043f53c1955516a3c5a8418190557ff35035bc2b01d44bd35a1dcdc552315cffb73da35cfd60570b7b777f98036f9f81905560327f10d9dd018e4cae503383c9f804c1c1603ada5856ee7894375d9b97cd8c8b27db8190557f22e39f61d1e4986b4f116cea9067f62cc77d74dff1780ae9c8b5166d1dd28829819055601e7f2c1fd36ba11b13b555f58753742999069764391f450ca8727fe8a3eeffe6777581905560197f825eb4cda6b8b44578c55770496c59e6dc3cf2235f690bcdaf51a61898ceb2848190557f3e57c57b03145299956be61386751c5b285d460d484d5c2403a6be086d9d6baa5560147fb3569174ca605aeef264a9f01151dace4275a70316034aaf090d8468560f043b8190557f80283cfdc74729ecb224822f7a02837fb1d52df7cc3435ae86bb6e025f6e06fa8190557fc5c2b17ace4fcac005542a0a50d8932fc28b9d50b7e4925e5b7ce40eede0c4478190557f95e5396155afd2ec086edc0518f3069d6ba131fb95388521b3342aebbda916f08190557fcc8dc71342d3ea7c205feea2d040f8f577a07edda8d6b43a4daf11d5e7fd280a8190557f1063e8e27a46602f2cf5efe54a6f37c939566cc93507d4c402b1ab61967baeed8190557fd1bfa665ff0a0ee81f20833500dfc80ed4b576a9d481e6c7f2cd8243b94238e88190557f96c94070a261449c888cfb31ddd6716e50d52e263f7a74a5eeb34ee8b42410168190557f2e60ceb69e96fe6481ce9457171ef3f030bf0150171842d8842b77cad9c3b3558190557ff78db0549aead6621ec87aae05d7bab2ff4f1610fb2a5da9b0d8e5ca932cbe208190557f7206804eee71b1705b2ebdc98e703bf07b0f4c0f02e3e11e04bfaa74de5375868190556113887f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf556107d07fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91634557f64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e8790556101f47f12d0c11577e2f0950f57c455c117796550b79f444811db8ba2f69c57b646c7848190557febae6141bae5521e99e0a8d610356b0f501fea54980b59c84841db43ba7204f48190557f0387e9d1203691d8e3362a7e4c6723de358a4010d7f31ecbec3fbfc61d1c75fc8790557ff5559028dc9ba50d75343c779b2f75e13a84a14662932fc67a486f263ca31a968790557f71f482bdabd1ea844d62c952b094e632959690d7448ca2aab34034ec98569358959095557fe12d5ff10640a555479d85b7ab5f83b5dbd3cf6ac615eec77e24e0984b75a0388490557fc47c2f4ab42fe2617dd76ca1eb9781d09fced5e5671df71824e2f8a8f694e024939093557fe8056e2ed8943b7f61a5f0dc88c79a5a6cec2bb36a7bd11ce130f2961c6320b98290557f765e72d9703c9804ad76c7d0af52f5313041ea56bb31a328e17fea205151b5ea8290557f0a2216aa9bbf8764f3bfb9fafcef7f625aba82383c1a9d14d721124ff30595818290557f7ae97ffc8b2fe6ed730ad82f8c44cc0285c7a97ac189e2d88c56200fe9a501ab8290557faa4a9a284509ef9fb8de5e34389d7f6e999498a23d3df7e6e3cd60371eeb0d088290557f8b7b9f9813a325ff1d1742084c33636aa028a7979ae4249304ff23e03619a4a68290557f4850c7fcd76ef9a9b6af49426db50eab97252f2b3eda6fb3fba71ff8796ec45c8290557ff67afc5d8a9483ebb5641ce5845b29143b497c64e8e700f016cf6767580712858290557fb9afdb88392d364081f976ddee080ff9152db8f126d75c504961a2cbe6e4d6e78290557f4cb01e6f5bc5cfee86272b5048cc519702c0808a5ebc579852135b705a34ba7f8290557f7924575c0da3d0d2bcf77796304685daff98da9e733421fc81c70776f90432c99190915560016005908155600691825560119290925568015af1d78b58c400007fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c556802b5e3af16b18800007f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7205568056bc75e2d631000007fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd755680d8d726b7177a800007f5b84bb9e0f5aa9cc45a8bb66468db5d4816d1e75ff86b5e1f1dd8d144dab809755681b1ae4d6e2ef5000007f2cd9ebf6ff19cdd7ffcc447d7c7d47b5991f5c7392a04512134e765802361fa655683635c9adc5dea000007f980f427e00e74f6d338adfccc7468518c8c8ea00836d0dce98c5fe154e17bf2b5569010f0cf064dd592000007fdae089abd7155aa13ce498edb0d7a7156b783d015031f10c9a3d4f5fcb5189715569021e19e0c9bab24000007f5ff1be3842b54290a9d10674244dae5848d2371b5314790c54805c086586e1df557ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5939093556101907f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249557f26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e2919091556102587fafafe8948a4ed9d478b1e9a5780b119b5edd00ea7d07bc35bef7c814824eb94b556102bc7fa5049387d9cb649c59f4bda666105ba636c2a103d8e2b232ba4d125737cd2149556103207fa48544818c2c710afa9849c61ec9c60e8acdb3eaa2885f33b37e118cc8fd04ac556103847fb91432bedff11256dbe14161d3606a2657bc9dacf8742f6b817d871dd53fb976557f0b705463cf5f7356780ee6e96132d37412c1b5816a4d207b8dcd42c34976745792909255600e60205260047fa7c5ba7114a813b50159add3a36832908dc83db71d0b9a24c2ad0f83be9582078190557f9adb202b1492743bc00c81d33cdc6423fa8c79109027eb6a845391e8fc1f0481557fe0283e559c29e31ee7f56467acc9dd307779c843a883aeeb3bf5c6128c908144919091557fa1d6913cd9e08c872be3e7525cca82e4fc0fc298a783f19022be725b19be685a5560077fb9bec7e2561f624fe753ff070f1599b306cbf59fafd4e8d5a8184a1ea1841bce5560087f92b4482321f41ce3aa65f798bda23d0d12a60fc5f212868a548ddb00aa49de7281905560097f376529bb8a2d41b4a589a133407fc64f3212472dbd74744348be1098bf7ba08d55600052600a7feab6bc3746954d8a0719de62c86ea908d362be2a58c781ada1046727253f9df255612e5b85613320565b62278d006002556127106003556015600455600880546001600160a01b038086166001600160a01b0319928316179092556007849055600980549287169290911691909117905580156120f7576000805461ff00191690555050505050565b612ec2613fc8565b600355565b612ecf613fc8565b60ff9091166000908152600a6020526040902055565b6001600160a01b03811660009081526012602052604081206002015415612f3c576014546013546001600160a01b038416600090815260126020526040902060020154612f329190614bb4565b610f9c9190614bf7565b5068015af1d78b58c40000919050565b60016000908152600c6020527fd421a5181c571bba3f01190c922c3b2a896fc1d84e86c9f17ac10e67ebef8b5c548210801590612fb357506002600052600c6020527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd7205482105b15612fc057506001919050565b6002600052600c6020527f5d6016397a73f5e079297ac5a36fef17b4d9c3831618e63ab105738020ddd72054821080159061302557506003600052600c6020527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd75482105b1561303257506002919050565b6003600052600c6020527fc0da782485e77ae272268ae0a3ff44c1552ecb60b3743924de17a815e0a3cfd754821080159061309757506004600052600c6020527f5b84bb9e0f5aa9cc45a8bb66468db5d4816d1e75ff86b5e1f1dd8d144dab80975482105b156130a457506003919050565b6004600052600c6020527f5b84bb9e0f5aa9cc45a8bb66468db5d4816d1e75ff86b5e1f1dd8d144dab809754821080159061310957506005600052600c6020527f2cd9ebf6ff19cdd7ffcc447d7c7d47b5991f5c7392a04512134e765802361fa65482105b1561311657506004919050565b6005600052600c6020527f2cd9ebf6ff19cdd7ffcc447d7c7d47b5991f5c7392a04512134e765802361fa654821080159061317b57506006600052600c6020527f980f427e00e74f6d338adfccc7468518c8c8ea00836d0dce98c5fe154e17bf2b5482105b1561318857506005919050565b6006600052600c6020527f980f427e00e74f6d338adfccc7468518c8c8ea00836d0dce98c5fe154e17bf2b5482108015906131ed57506007600052600c6020527fdae089abd7155aa13ce498edb0d7a7156b783d015031f10c9a3d4f5fcb5189715482105b156131fa57506006919050565b6007600052600c6020527fdae089abd7155aa13ce498edb0d7a7156b783d015031f10c9a3d4f5fcb51897154821080159061325f57506008600052600c6020527f5ff1be3842b54290a9d10674244dae5848d2371b5314790c54805c086586e1df5482105b1561326c57506007919050565b6008600052600c6020527f5ff1be3842b54290a9d10674244dae5848d2371b5314790c54805c086586e1df5482106132a657506008919050565b506000919050565b919050565b6132bb613fc8565b6001600160a01b0381166133205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bbb565b6133298161410e565b50565b61333461407e565b6007546000036133765760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b6044820152606401610bbb565b600061338183612f4c565b905060008160ff16116133c95760405162461bcd60e51b815260206004820152601060248201526f496e76616c6964207061636b6167652160801b6044820152606401610bbb565b6007546000906133e185670de0b6b3a7640000614bb4565b6133eb9190614bf7565b60085490915081906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa15801561344c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134709190614c5c565b101561348e5760405162461bcd60e51b8152600401610bbb90614c75565b60085481906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156134e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350a9190614c5c565b10156135585760405162461bcd60e51b815260206004820152601d60248201527f4269675479636f6f6e3a204552433230206c6f772062616c616e6365210000006044820152606401610bbb565b60ff82166000908152600d602052604081205490036135b95760405162461bcd60e51b815260206004820152601f60248201527f4269675479636f6f6e203a207061636b61676520697320696e76616c696421006044820152606401610bbb565b6008546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018490526064016020604051808303816000875af115801561361e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136429190614b6b565b5061364c33610f2d565b6136c4576009546001600160a01b031663214c4957336040516001600160e01b031960e084901b1681526001600160a01b0391821660048201529086166024820152604401600060405180830381600087803b1580156136ab57600080fd5b505af11580156136bf573d6000803e3d6000fd5b505050505b6009546000906001600160a01b0316633fab7e6d336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561371d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137419190614cb7565b6001600160a01b038116600090815260126020526040812060010180549293508792909190613771908490614bcb565b9091555050336000908152601260209081526040808320815160c08101835289815260ff88168552600d8452938290205492840192909252601154908301819052426060840152600254600c909201929160808301916137d19190614bb4565b6137db9042614bcb565b815260006020918201819052835460018082018655948252828220845160069092020190815583830151948101949094556040808401516002860155606084015160038601556080840151600486015560a0909301516005909401805460ff19169415159490941790935560ff86168352600e905290205461385d9086614bb4565b336000908152601260205260408120600301805490919061387f908490614bcb565b909155505033600090815260126020526040812060020180548792906138a6908490614bcb565b909155505033600090815260126020526040812060070180548492906138cd908490614bcb565b909155505060ff83166000908152600d602090815260408083205460075460115483518b8152948501889052848401929092526060840152608083015260a0820192909252905133917f77fdf2f88bf7d7cd0de4eecf733023fc2a4253bf89af049e63243e4aae81da00919081900360c00190a260ff83166000908152600d60205260409020546120f790869084908490614169565b600061396e82611053565b9050600061397b83612ee5565b6001600160a01b0384166000908152601260205260409020600401549091506139a5908390614bcb565b8110613a11576001600160a01b038316600090815260126020526040812060080180548492906139d6908490614bcb565b90915550506001600160a01b03831660009081526012602052604081206004018054849290613a06908490614bcb565b90915550613ace9050565b6001600160a01b038316600090815260126020526040812060040154821115613a61576001600160a01b038416600090815260126020526040902060040154613a5a9083614c19565b9050613a65565b5060005b8015613acc576001600160a01b03841660009081526012602052604081206008018054839290613a96908490614bcb565b90915550506001600160a01b03841660009081526012602052604081206004018054839290613ac6908490614bcb565b90915550505b505b6001600160a01b0383811660008181526012602052604080822042600a909101556009549051633fab7e6d60e01b8152600481019390935290921690633fab7e6d90602401602060405180830381865afa158015613b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b549190614cb7565b905060015b6004548160ff16116120f7576001600160a01b03821615613fb6576001600160a01b0382166000908152601260205260408120600301549003613bbf576001600160a01b038216600090815260126020526040902068015af1d78b58c400006003909101555b6000613bcc826002614cd4565b60ff169050600060058360ff1610613c555760095460405163f71b007b60e01b81526001600160a01b0386811660048301529091169063f71b007b90602401602060405180830381865afa158015613c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4c9190614c5c565b600a1115613cc6565b60095460405163f71b007b60e01b81526001600160a01b0386811660048301528492169063f71b007b90602401602060405180830381865afa158015613c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc39190614c5c565b10155b9050600060058460ff1610613cdc57600a613cde565b825b90506000613ced826064614bb4565b613cff90670de0b6b3a7640000614bb4565b6001600160a01b0387166000818152601260209081526040918290206001015482518815158152908511159181019190915260ff891681830152905192935090917f2505725a06ac2da15062017b1aee0809a67669dc808726b414abb38dc801bffe9181900360600190a2828015613d9257506001600160a01b0386166000908152601260205260409020600101548111155b15613f26576000613da287612ee5565b60035460ff88166000908152600b602052604081205492935091613dc6908c614bb4565b613dd09190614bf7565b6001600160a01b038916600090815260126020526040902060040154909150613dfa908290614bcb565b8210613e66576001600160a01b03881660009081526012602052604081206009018054839290613e2b908490614bcb565b90915550506001600160a01b03881660009081526012602052604081206004018054839290613e5b908490614bcb565b90915550613f239050565b6001600160a01b038816600090815260126020526040812060040154831115613eb6576001600160a01b038916600090815260126020526040902060040154613eaf9084614c19565b9050613eba565b5060005b8015613f21576001600160a01b03891660009081526012602052604081206009018054839290613eeb908490614bcb565b90915550506001600160a01b03891660009081526012602052604081206004018054839290613f1b908490614bcb565b90915550505b505b50505b600954604051633fab7e6d60e01b81526001600160a01b0388811660048301526000921690633fab7e6d90602401602060405180830381865afa158015613f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f959190614cb7565b90506001600160a01b038116613faf5750505050506120f7565b9550505050505b80613fc081614cf0565b915050613b59565b6000546001600160a01b0362010000909104163314610b5f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bbb565b61403161484f565b6000805460ff60b01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054600160b01b900460ff1615610b5f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610bbb565b6140d361407e565b6000805460ff60b01b1916600160b01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586140613390565b600080546001600160a01b038381166201000081810262010000600160b01b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60015b6004548160ff16116120f7576001600160a01b0383161561483d5760035460ff82166000908152600a60205260408120549091906141aa9087614bb4565b6141b49190614bf7565b60035460ff84166000908152600a6020526040812054929350916141d89089614bb4565b6141e29190614bf7565b9050600060646141f3846005614bb4565b6141fd9190614bf7565b90506000606461420d8386614c19565b614218906005614bb4565b6142229190614bf7565b905060006064614233856005614bb4565b61423d9190614bf7565b90506000606461424d8387614c19565b614258906005614bb4565b6142629190614bf7565b905081600f60008282546142769190614bcb565b92505081905550806010600082825461428f9190614bcb565b90915550506001600160a01b03891660009081526012602052604081206003015490036142df576001600160a01b038916600090815260126020526040902068015af1d78b58c400006003909101555b6001600160a01b038916600090815260126020526040902060040154614306908690614bcb565b61430f8a612ee5565b106144d3576008546001600160a01b031663a9059cbb8a6143308688614bcb565b61433a908a614c19565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015614385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143a99190614b6b565b50337edb545b3d2b3a0a4e2388a2132b13dc7723425e2daa5a8ca53a91519ec501a58a89888a6143d98789614bcb565b6143e3908c614c19565b6143ed8a8c614bcb565b6143f7908e614c19565b600060405161440c9796959493929190614d0f565b60405180910390a261441e8385614bcb565b6144289087614c19565b6001600160a01b038a1660009081526012602052604081206005018054909190614453908490614bcb565b9091555061446390508183614bcb565b61446d9086614c19565b6001600160a01b038a1660009081526012602052604081206006018054909190614498908490614bcb565b90915550506001600160a01b038916600090815260126020526040812060040180548792906144c8908490614bcb565b909155506147339050565b6001600160a01b0389166000908152601260205260408120600401546144f88b612ee5565b6145029190614c19565b905060008111801561454257506001600160a01b038a16600090815260126020526040902060040154614536908290614bcb565b61453f8b612ee5565b10155b15614731576008546007546001600160a01b039091169063a9059cbb908c9061457385670de0b6b3a7640000614bb4565b61457d9190614bf7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156145c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145ec9190614b6b565b506001600160a01b038a1660009081526012602052604081206004018054839290614618908490614bcb565b909155505060075461463282670de0b6b3a7640000614bb4565b61463c9190614bf7565b6001600160a01b038b1660009081526012602052604081206005018054909190614667908490614bcb565b90915550506001600160a01b038a1660009081526012602052604081206006018054839290614697908490614bcb565b909155503390506001600160a01b03167edb545b3d2b3a0a4e2388a2132b13dc7723425e2daa5a8ca53a91519ec501a58b8a8460075486670de0b6b3a76400006146e19190614bb4565b6146eb9190614bf7565b6146f5888a614bcb565b6146ff908d614c19565b6147098b8d614bcb565b614713908f614c19565b60016040516147289796959493929190614d0f565b60405180910390a25b505b60ff87166000818152600b60209081526040918290205482516001600160a01b038e168152918201939093528082018e9052606081018d9052608081018b905260a08101929092525133917fe362bba79bb472398a20cad21ce72a8f9c2b2c6967ea0bf5e828b8cec786e8e9919081900360c00190a2600954604051633fab7e6d60e01b81526001600160a01b038b811660048301526000921690633fab7e6d90602401602060405180830381865afa1580156147f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148189190614cb7565b90506001600160a01b03811661483457505050505050506120f7565b98505050505050505b8061484781614cf0565b91505061416c565b600054600160b01b900460ff16610b5f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610bbb565b6001600160a01b038116811461332957600080fd5b801515811461332957600080fd5b600080604083850312156148d557600080fd5b82356148e08161489f565b915060208301356148f0816148b4565b809150509250929050565b60008060006060848603121561491057600080fd5b833561491b8161489f565b9250602084013561492b8161489f565b929592945050506040919091013590565b803560ff811681146132ae57600080fd5b60006020828403121561495f57600080fd5b6149688261493c565b9392505050565b6000806040838503121561498257600080fd5b61498b8361493c565b946020939093013593505050565b6000602082840312156149ab57600080fd5b81356149688161489f565b6000602082840312156149c857600080fd5b5035919050565b600080604083850312156149e257600080fd5b50508035926020909101359150565b60008060408385031215614a0457600080fd5b823561498b8161489f565b60008083601f840112614a2157600080fd5b50813567ffffffffffffffff811115614a3957600080fd5b6020830191508360208260051b8501011115614a5457600080fd5b9250929050565b60008060008060408587031215614a7157600080fd5b843567ffffffffffffffff80821115614a8957600080fd5b614a9588838901614a0f565b90965094506020870135915080821115614aae57600080fd5b50614abb87828801614a0f565b95989497509550505050565b60008060408385031215614ada57600080fd5b8235614ae58161489f565b915060208301356148f08161489f565b60008060008060808587031215614b0b57600080fd5b8435614b168161489f565b93506020850135614b268161489f565b92506040850135614b368161489f565b9396929550929360600135925050565b60008060408385031215614b5957600080fd5b8235915060208301356148f08161489f565b600060208284031215614b7d57600080fd5b8151614968816148b4565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610f9c57610f9c614b9e565b80820180821115610f9c57610f9c614b9e565b600060018201614bf057614bf0614b9e565b5060010190565b600082614c1457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610f9c57610f9c614b9e565b60208082526016908201527563616c6c6572206973206e6f74206f707261746f722160501b604082015260600190565b600060208284031215614c6e57600080fd5b5051919050565b60208082526022908201527f4269675479636f6f6e3a20455243323020616c6c6f77616e6365206578636565604082015261642160f01b606082015260800190565b600060208284031215614cc957600080fd5b81516149688161489f565b60ff8181168382160290811690818114610b1d57610b1d614b9e565b600060ff821660ff8103614d0657614d06614b9e565b60010192915050565b6001600160a01b0397909716875260ff95909516602087015260408601939093526060850191909152608084015260a0830152151560c082015260e0019056fea2646970667358221220560b99076717bfaf27743461ea4a415e0212d149d89a17f8a083759be1f62aa264736f6c63430008120033