false
true
0

Contract Address Details

0xD493B22Ac1E70c0dA743B0c61311aeEA4f817eEF

Token
pLBSKR - pulselorian.com (pLBSKR)
Creator
0xb0c2b1–982523 at 0x3546ac–ab8603
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1,156 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
27557493
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
pLBSKR




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
1000000
EVM Version
default




Verified at
2023-06-03T22:25:24.282032Z

Constructor Arguments

0x000000000000000000000000e9133dbac869acfd8e22d0cbc7632f82b32d30c400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fc51c335f8be70d0541944da5d5cd0638bbcc63d000000000000000000000000802d686567ba30dceba167d66a544f6ef915e0f700000000000000000000000035cef302da66733c076c10f85fc8097dce90bcc00000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000cd75d401a91b076f274418c7fa6a973d7fb7fece00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e7448180000000000000000000000007d6e237a514fbe12c65c3aa72525f61aa6a722d20000000000000000000000000000000000000000000000000000000000000018704c42534b52202d2070756c73656c6f7269616e2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000006704c42534b520000000000000000000000000000000000000000000000000000
              

contracts/pLBSKR.sol

/*
 * @title LBSKR - (Lite BSKR) Brings of Serenity, Knowledge and Richness
 * @author Ra Murd <pulselorian@gmail.com>
 * @notice https://pulselorian.com/
 * @notice https://t.me/ThePulselorian
 * @notice https://twitter.com/ThePulseLorian
 *
 * LBSKR is our attempt to develop a better internet currency with negligible fees
 * It's deflationary, burns fees and fees are extremely low
 * It has a staking feature to earn bonus while you hold (manual stake)
 *
 *    (   (  (  (     (   (( (   .  (   (    (( (   ((
 *    )\  )\ )\ )\    )\ (\())\   . )\  )\   ))\)\  ))\
 *   ((_)((_)(_)(_)  ((_))(_)(_)   ((_)((_)(((_)_()((_)))
 *   | _ \ | | | |  / __| __| |   / _ \| _ \_ _|   \ \| |
 *   |  _/ |_| | |__\__ \ _|| |__| (_) |   /| || - | .  |
 *   |_|  \___/|____|___/___|____|\___/|_|_\___|_|_|_|\_|
 *
 * Tokenomics:
 * Burn    0.25%  50%
 * Growth  0.25%  50%
 *
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

import "./imports/BaseBSKR.sol";
import "./imports/IBSKR.sol";
import "./imports/ILBSKROld.sol";
import "./imports/Stakable.sol";
import "./lib/DSMath.sol";
import "./openzeppelin/security/ReentrancyGuard.sol";

contract pLBSKR is BaseBSKR, DSMath, Stakable, ReentrancyGuard {
    enum Field {
        tTransferAmount,
        tBurnFee,
        tGrowthFee
    }

    IBSKR private _BSKR;
    ILBSKROld private _oldLBSKR;
    address private _inflationAddress;
    uint8 private constant _BURN_FEE = 25;
    uint8 private constant _GROWTH_FEE = 25;
    uint16 private constant _SECS_IN_AN_HOUR = 3600;
    uint96 private constant _INF_RATE_HRLY =
        999_992_000_000_000_000_000_000_000;
    uint256 private _lastDistTS;

    event FeeTransfers(uint256 Burnt, uint256 Growth);

    constructor(
        ILBSKROld oldLBSKR_,
        string memory name_,
        string memory symbol_,
        address growthAddress_,
        address inflationAddress_,
        address[5] memory sisterOAs_
    ) BaseBSKR(name_, symbol_, growthAddress_, sisterOAs_) {
        _oldLBSKR = oldLBSKR_;
        _inflationAddress = inflationAddress_;

        _balances[msg.sender] = _TOTAL_SUPPLY;
        emit Transfer(address(0), msg.sender, _TOTAL_SUPPLY);

        address _ammLBSKRPair = _dexFactoryV2.createPair(
            address(this),
            wethAddr
        );
        _approve(_ammLBSKRPair, _ammLBSKRPair, type(uint256).max);
        _isAMMPair[_ammLBSKRPair] = true;

        for (uint256 index = 0; index < _sisterOAs.length; ++index) {
            _paysNoFee[_sisterOAs[index]] = true;
        }

        uint256 balInf = _oldLBSKR.balanceOf(_inflationAddress);
        _balances[_inflationAddress] += balInf;
        _balances[msg.sender] -= balInf;
        emit Transfer(msg.sender, _inflationAddress, balInf);

        uint256 oldLBSKRTS = _oldLBSKR.totalLBSKRStakes();
        _balances[msg.sender] -= oldLBSKRTS;
        _balances[address(this)] += oldLBSKRTS;
        emit Transfer(msg.sender, address(this), oldLBSKRTS);

        uint256 balBurn = _oldLBSKR.balanceOf(address(0));
        _balances[_BURN_ADDRESS] += balBurn;
        _balances[msg.sender] -= balBurn;
        emit Transfer(msg.sender, _BURN_ADDRESS, balBurn);

        _lastDistTS = block.timestamp - (block.timestamp % _SECS_IN_AN_HOUR);
    }

    function _airdropTokens(address to_, uint256 amount_) internal override {
        _transferTokens(owner(), to_, amount_, false);
    }

    function _calcInflation(
        uint256 nowTS_
    ) private view returns (uint256 inflation) {
        require(_lastDistTS != 0, "L:Inflation not started!");
        uint256 hoursElapsed = uint256(
            (nowTS_ - _lastDistTS) / _SECS_IN_AN_HOUR
        );

        uint256 currBal = _balances[_inflationAddress];
        if (hoursElapsed != 0) {
            uint256 infFracRay = rpow(_INF_RATE_HRLY, hoursElapsed);
            inflation = currBal - (currBal * infFracRay) / RAY;
        }

        return inflation;
    }

    function _creditInflation() private {
        uint256 nowTS = block.timestamp - (block.timestamp % _SECS_IN_AN_HOUR);
        if (nowTS > _lastDistTS) {
            uint256 inflation = _calcInflation(nowTS);

            if (inflation != 0) {
                _lastDistTS = nowTS;
                _balances[_inflationAddress] -= inflation;
                _balances[address(this)] += inflation;
            }
        }
    }

    function _transfer(
        address from_,
        address to_,
        uint256 amount_
    ) internal override {
        _checkIfAMMPair(from_);
        _checkIfAMMPair(to_);

        bool takeFee = true;

        if (_paysNoFee[from_] || _paysNoFee[to_]) {
            takeFee = false;
        }

        if (!_isAMMPair[from_] && !_isAMMPair[to_]) {
            takeFee = false;
        }

        _transferTokens(from_, to_, amount_, takeFee);
    }

    function _transferTokens(
        address sender_,
        address recipient_,
        uint256 tAmount_,
        bool takeFee_
    ) private whenNotPaused {
        uint256[3] memory response;

        if (!takeFee_) {
            response[uint256(Field.tTransferAmount)] = tAmount_;
        } else {
            response[uint256(Field.tBurnFee)] = (tAmount_ * _BURN_FEE) / _BIPS;
            response[uint256(Field.tGrowthFee)] =
                (tAmount_ * _GROWTH_FEE) /
                _BIPS;
            response[uint256(Field.tTransferAmount)] =
                tAmount_ -
                response[uint256(Field.tBurnFee)] -
                response[uint256(Field.tGrowthFee)];
        }

        _balances[sender_] -= tAmount_;
        _balances[recipient_] += response[uint256(Field.tTransferAmount)];

        if (response[uint256(Field.tBurnFee)] != 0) {
            _balances[_BURN_ADDRESS] += response[uint256(Field.tBurnFee)];
            emit Transfer(
                sender_,
                _BURN_ADDRESS,
                response[uint256(Field.tBurnFee)]
            );

            _balances[_growthAddress] += response[uint256(Field.tGrowthFee)];
            emit Transfer(
                sender_,
                _growthAddress,
                response[uint256(Field.tGrowthFee)]
            );
        }

        emit Transfer(
            sender_,
            recipient_,
            response[uint256(Field.tTransferAmount)]
        );
    }

    function _unstakeInternal(
        uint256 unstakeAmount_,
        uint256 lbskrShares2Deduct_,
        uint256 stakeSince_
    ) internal {
        uint256 eligibleBasis = _BIPS -
            _penaltyFor(stakeSince_, block.timestamp);

        uint256 lbskrToSend;
        if (_balances[address(this)] != 0) {
            uint256 lbskrBal = ((_balances[address(this)] *
                lbskrShares2Deduct_) / totalLBSKRShares);

            if (lbskrBal > unstakeAmount_) {
                lbskrToSend = (lbskrBal * eligibleBasis) / _BIPS;

                if (lbskrToSend != 0) {
                    _balances[address(this)] -= lbskrToSend;
                    _balances[msg.sender] += lbskrToSend;
                    emit Transfer(address(this), msg.sender, lbskrToSend);
                }

                if (eligibleBasis < _BIPS) {
                    uint256 lbskrToBurn = (lbskrBal * (_BIPS - eligibleBasis)) /
                        _BIPS;

                    if (lbskrToBurn != 0) {
                        _balances[address(this)] -= lbskrToBurn;
                        _balances[_BURN_ADDRESS] += lbskrToBurn;

                        emit Transfer(
                            address(this),
                            _BURN_ADDRESS,
                            lbskrToBurn
                        );
                    }
                }
            }
        }

        totalLBSKRStakes -= unstakeAmount_;
        totalLBSKRShares -= lbskrShares2Deduct_;

        emit Unstaked(
            msg.sender,
            unstakeAmount_,
            lbskrShares2Deduct_,
            stakeSince_,
            block.timestamp
        );
    }

    function balanceOf(
        address wallet_
    ) external view override returns (uint256) {
        return _balances[wallet_];
    }

    function penaltyIfUnstakedNow(
        address wallet_,
        uint256 stakeIndex_
    ) external view returns (uint256 penaltyBasis) {
        uint256 stakerIndex = _stakeIndexMap[wallet_];
        Stake memory currStake = _getCurrStake(stakerIndex, stakeIndex_);

        return _penaltyFor(currStake.since, block.timestamp);
    }

    function rewardsOf(
        address stakeholder_,
        uint256 stakeIndex_
    ) external view returns (uint256 lbskrRewards, uint256 eligibleBasis) {
        uint256 inflation;
        if (_lastDistTS != 0) {
            inflation = _calcInflation(block.timestamp);
        }

        uint256 stakerIndex = _stakeIndexMap[stakeholder_];

        Stake memory currStake = _getCurrStake(stakerIndex, stakeIndex_);

        eligibleBasis = _BIPS - _penaltyFor(currStake.since, block.timestamp);

        if ((_balances[address(this)] + inflation) != 0) {
            uint256 lbskrBal = (((_balances[address(this)] + inflation) *
                currStake.sharesLBSKR) / totalLBSKRShares);

            if (lbskrBal > currStake.amountLBSKR) {
                lbskrRewards =
                    ((lbskrBal - currStake.amountLBSKR) * eligibleBasis) /
                    _BIPS;
            }
        }

        return (lbskrRewards, eligibleBasis);
    }

    function setBSKR(address BSKRAddr_) external onlyOwner {
        _BSKR = IBSKR(BSKRAddr_);
    }

    function stake(uint256 amountLBSKR_) external whenNotPaused nonReentrant {
        require(amountLBSKR_ != 0, "L:Cannot stake 0");
        require(_balances[msg.sender] >= amountLBSKR_, "L:Too much staking");

        _creditInflation();

        uint256 sharesLBSKR = ((amountLBSKR_ * totalLBSKRShares)) /
            _balances[address(this)];

        _balances[msg.sender] -= amountLBSKR_;
        _balances[address(this)] += amountLBSKR_;

        _stake(amountLBSKR_, sharesLBSKR);
    }

    function unstake(
        uint256 unstakeAmount_,
        uint256 stakeIndex_
    ) external nonReentrant whenNotPaused {
        _creditInflation();

        (Stake memory currStake, uint256 lbskrShares2Deduct) = _withdrawStake(
            stakeIndex_,
            unstakeAmount_
        );

        _unstakeInternal(unstakeAmount_, lbskrShares2Deduct, currStake.since);
    }

    function migrate() external {
        require(!_migrated[msg.sender], "L:Already migrated");
        migrateInt(msg.sender);
    }

    function migrateOwner(address wallet) external onlyOwner {
        migrateInt(wallet);
    }

    function migrateInt(address wallet) internal {
        require(address(_BSKR) != address(0));
        uint256 tokenBal = _oldLBSKR.balanceOf(wallet);
        if (tokenBal > 0) {
            _transferTokens(owner(), wallet, tokenBal, false);
            require(_balances[wallet] >= tokenBal, "L:Migrate Issue1");
        }

        ILBSKROld.Stake[] memory userStakes = _oldLBSKR.stakesOf(wallet);
        uint256 bskrTA = 0;
        for (uint256 sI = 0; sI < userStakes.length; sI++) {
            uint256 stakerIndex = _stakeIndexMap[wallet];

            if (stakerIndex == 0) {
                stakerIndex = _addStakeholder(wallet);
            }

            stakeholders[stakerIndex].userStakes.push(
                Stake(
                    userStakes[sI].amountLBSKR,
                    userStakes[sI].sharesLBSKR,
                    userStakes[sI].since
                )
            );

            totalLBSKRStakes += userStakes[sI].amountLBSKR;
            totalLBSKRShares += userStakes[sI].sharesLBSKR;

            bskrTA += userStakes[sI].amountBSKR;
            (, uint256 bskrRewards, uint256 eligibleBasis) = _oldLBSKR
                .rewardsOf(wallet, sI);
            bskrTA += (bskrRewards * _BIPS) / eligibleBasis;
        }

        if (bskrTA > 0) {
            _BSKR.stakeTransfer(owner(), wallet, bskrTA);
            require(_BSKR.balanceOf(wallet) >= bskrTA, "L:Migrate Issue2");
        }

        _migrated[wallet] = true;
    }

    function fixStakeAdd(
        address stakeholder_,
        uint256 lbskrStakeAmount_,
        uint256 sharesLBSKR_,
        uint256 since_,
        uint256 totalLBSKRStakes_,
        uint256 totalLBSKRShares_
    ) external onlyOwner {
        uint256 stakerIndex = _stakeIndexMap[stakeholder_];
        if (stakerIndex == 0) {
            stakerIndex = _addStakeholder(stakeholder_);
        }

        stakeholders[stakerIndex].userStakes.push(
            Stake(lbskrStakeAmount_, sharesLBSKR_, since_)
        );

        totalLBSKRStakes = totalLBSKRStakes_;
        totalLBSKRShares = totalLBSKRShares_;
    }

    function fixStakeDel(
        address stakeholder_,
        uint256 stakeIndex_,
        uint256 totalLBSKRStakes_,
        uint256 totalLBSKRShares_
    ) external onlyOwner {
        uint256 stakerIndex = _stakeIndexMap[stakeholder_];

        if (stakeIndex_ < stakeholders[stakerIndex].userStakes.length - 1) {
            stakeholders[stakerIndex].userStakes[stakeIndex_] = stakeholders[
                stakerIndex
            ].userStakes[stakeholders[stakerIndex].userStakes.length - 1];
        }
        stakeholders[stakerIndex].userStakes.pop();

        if (stakeholders[stakerIndex].userStakes.length == 0) {
            stakeholders[stakerIndex] = stakeholders[stakeholders.length - 1];
            stakeholders.pop();

            _stakeIndexMap[msg.sender] = 0;
            _stakeIndexMap[stakeholders[stakerIndex].user] = stakerIndex;
        }

        totalLBSKRStakes = totalLBSKRStakes_;
        totalLBSKRShares = totalLBSKRShares_;
    }
}
        

contracts/imports/BaseBSKR.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

import "../lib/Utils.sol";
import "../openzeppelin/access/Ownable.sol";
import "../openzeppelin/security/Pausable.sol";
import "../openzeppelin/token/ERC20/IERC20.sol";
import "../uniswap/v2-core/interfaces/IUniswapV2Factory.sol";
import "../uniswap/v2-periphery/interfaces/IUniswapV2Router02.sol";
import "./Manageable.sol";

abstract contract BaseBSKR is Utils, Ownable, Pausable, IERC20, Manageable {
    struct Airdrop {
        address user;
        uint256 ethers;
    }

    IUniswapV2Factory internal _dexFactoryV2;
    IUniswapV2Router02 internal _dexRouterV2;
    address internal _growthAddress;
    address internal constant _BURN_ADDRESS = address(0x369);
    address internal wethAddr;
    address[5] internal _sisterOAs;
    mapping(address => bool) internal _isAMMPair;
    mapping(address => bool) internal _migrated;
    mapping(address => bool) internal _paysNoFee;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) internal _balances;
    string private _name;
    string private _symbol;
    uint8 private constant _DECIMALS = 18;
    uint16 internal constant _BIPS = 10000;
    uint128 internal constant _TOTAL_SUPPLY =
        1_000_000_000_000_000_000_000_000_000_000;
    uint256 internal _oaIndex = 4;

    constructor(
        string memory name_,
        string memory symbol_,
        address growthAddress_,
        address[5] memory sisterOAs_
    ) {
        _name = name_;
        _symbol = symbol_;
        _growthAddress = growthAddress_;
        _sisterOAs = sisterOAs_;

        _dexRouterV2 = IUniswapV2Router02(
            // 0xDaE9dd3d1A52CfCe9d5F2fAC7fDe164D500E50f7 // testnet
            0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02 // mainnet
        );
        _dexFactoryV2 = IUniswapV2Factory(_dexRouterV2.factory());
        wethAddr = _dexRouterV2.WPLS();

        _paysNoFee[msg.sender] = true;
        _paysNoFee[address(this)] = true;
        _paysNoFee[address(_dexRouterV2)] = true;
    }

    receive() external payable {}

    fallback() external payable {}

    function _airdropTokens(address to_, uint256 amount_) internal virtual;

    function _approve(
        address owner_,
        address spender_,
        uint256 amount_
    ) internal {
        _allowances[owner_][spender_] = amount_;
        emit Approval(owner_, spender_, amount_);
    }

    function _checkIfAMMPair(address target_) internal {
        if (target_.code.length == 0) return;
        if (target_ == address(_dexRouterV2)) return;
        if (target_ == wethAddr) return;
        if (!_isAMMPair[target_]) {
            address token0 = _getToken0(target_);
            if (token0 == address(0)) {
                return;
            }

            address token1 = _getToken1(target_);
            if (token1 == address(0)) {
                return;
            }

            _approve(target_, target_, type(uint256).max);
            _isAMMPair[target_] = true;
        }
    }

    function _getOriginAddress() internal returns (address) {
        if (_oaIndex < (_sisterOAs.length - 1)) {
            _oaIndex = _oaIndex + 1;
        } else {
            _oaIndex = 0;
        }
        return _sisterOAs[_oaIndex];
    }

    function _transfer(
        address owner_,
        address to_,
        uint256 amount_
    ) internal virtual;

    function airdrop(Airdrop[] calldata receivers_) external onlyOwner {
        for (uint256 index; index < receivers_.length; ++index) {
            if (
                receivers_[index].user != address(0) &&
                receivers_[index].ethers != 0
            ) {
                _airdropTokens(
                    receivers_[index].user,
                    receivers_[index].ethers * 1_000_000_000_000_000_000
                );
            }
        }
    }

    function allowance(
        address owner_,
        address spender_
    ) external view override returns (uint256) {
        return _allowances[owner_][spender_];
    }

    function approve(
        address spender_,
        uint256 amount_
    ) external override returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender_, amount_);
        return true;
    }

    function decimals() external pure returns (uint8) {
        return _DECIMALS;
    }

    function decreaseAllowance(
        address spender_,
        uint256 subtractedValue_
    ) external returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = _allowances[owner][spender_];
        require(currentAllowance >= subtractedValue_, "BB:Decreases below 0");
        unchecked {
            _approve(owner, spender_, currentAllowance - subtractedValue_);
        }

        return true;
    }

    function increaseAllowance(
        address spender_,
        uint256 addedValue_
    ) external returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender_, _allowances[owner][spender_] + addedValue_);
        return true;
    }

    function name() external view returns (string memory) {
        return _name;
    }

    function pauseContract() external onlyManager {
        _pause();
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function totalSupply() external pure override returns (uint256) {
        return _TOTAL_SUPPLY;
    }

    function transfer(
        address to_,
        uint256 amount_
    ) external override returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to_, amount_);
        return true;
    }

    function transferFrom(
        address from_,
        address to_,
        uint256 amount_
    ) external override returns (bool) {
        address spender = msg.sender;
        uint256 currentAllowance = _allowances[from_][spender];
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount_, "BB:Insufficient allowance");
            unchecked {
                _approve(from_, spender, currentAllowance - amount_);
            }
        }
        _transfer(from_, to_, amount_);
        return true;
    }

    function unPauseContract() external onlyManager {
        _unpause();
    }

    function reclaimETH() external payable {
        uint256 amount = address(this).balance;
        require(amount > 0, "BB:0 Balance");

        (bool sent, ) = owner().call{value: amount}("");
        require(sent, "BB:Send Failed");
    }

    function reclaimToken(IERC20 token_, uint256 amount_) external payable {
        uint256 balance = token_.balanceOf(address(this));
        require(amount_ <= balance, "BB:Too much");
        token_.transfer(owner(), balance);
    }

    function burn(uint256 amount_) external {
        _balances[msg.sender] -= amount_;
        _balances[_BURN_ADDRESS] += amount_;
        emit Transfer(msg.sender, _BURN_ADDRESS, amount_);
    }
}
          

contracts/imports/IBSKR.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

interface IBSKR {
    function balanceOf(address wallet_) external view returns (uint256);

    function stakeTransfer(
        address from_,
        address to_,
        uint256 amount_
    ) external returns (bool);
}
          

contracts/imports/ILBSKROld.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

interface ILBSKROld {
    struct Stake {
        uint256 amountLBSKR;
        uint256 amountBSKR;
        uint256 sharesLBSKR;
        uint256 sharesBSKR;
        uint256 since;
    }

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

    function rewardsOf(
        address stakeholder_,
        uint256 stakeIndex_
    )
        external
        view
        returns (
            uint256 lbskrRewards,
            uint256 bskrRewards,
            uint256 eligibleBasis
        );

    function stakesOf(
        address stakeholder_
    ) external view returns (Stake[] memory userStakes);

    function totalLBSKRStakes() external returns (uint256);
}
          

contracts/imports/Manageable.sol

/*
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.19;

abstract contract Manageable {
    address private _manager;

    event ManagementTransferred(
        address indexed previousManager,
        address indexed newManager
    );

    constructor() {
        _manager = msg.sender;
        emit ManagementTransferred(address(0), msg.sender);
    }

    function _checkManager() private view {
        require(_manager == msg.sender, "M:Caller not manager");
    }

    function manager() external view returns (address) {
        return _manager;
    }

    modifier onlyManager() {
        _checkManager();
        _;
    }

    function transferManagement(address newManager_) external onlyManager {
        emit ManagementTransferred(_manager, newManager_);
        _manager = newManager_;
    }
}
          

contracts/uniswap/v2-core/interfaces/IUniswapV2Factory.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}
          

contracts/imports/Stakable.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

abstract contract Stakable {
    struct Stake {
        uint256 amountLBSKR;
        uint256 sharesLBSKR;
        uint256 since;
    }

    struct Stakeholder {
        address user;
        Stake[] userStakes;
    }

    Stakeholder[] public stakeholders;
    mapping(address => uint256) internal _stakeIndexMap;
    uint256 public totalLBSKRShares;
    uint256 public totalLBSKRStakes;

    event Staked(
        address indexed user,
        uint256 amountLBSKR,
        uint256 sharesLBSKR,
        uint256 stakeIndex,
        uint256 since
    );

    event Unstaked(
        address indexed user,
        uint256 amountLBSKR,
        uint256 sharesLBSKR,
        uint256 since,
        uint256 till
    );

    constructor() {
        if (stakeholders.length == 0) {
            stakeholders.push();
        }
    }

    function _addStakeholder(address staker_) internal returns (uint256) {
        stakeholders.push();
        uint256 stakerIndex = stakeholders.length - 1;
        stakeholders[stakerIndex].user = staker_;
        _stakeIndexMap[staker_] = stakerIndex;
        return stakerIndex;
    }

    function _getCurrStake(
        uint256 stakerIndex_,
        uint256 stakeIndex_
    ) internal view returns (Stake memory currStake) {
        require(
            stakeIndex_ < stakeholders[stakerIndex_].userStakes.length,
            "S:Stake index incorrect!"
        );

        currStake = stakeholders[stakerIndex_].userStakes[stakeIndex_];

        return currStake;
    }

    function _stake(uint256 amountLBSKR_, uint256 sharesLBSKR_) internal {
        require(amountLBSKR_ != 0, "S:Cannot stake 0");

        uint256 stakerIndex = _stakeIndexMap[msg.sender];
        uint256 since = block.timestamp;

        if (stakerIndex == 0) {
            stakerIndex = _addStakeholder(msg.sender);
        }

        stakeholders[stakerIndex].userStakes.push(
            Stake(amountLBSKR_, sharesLBSKR_, since)
        );

        totalLBSKRStakes += amountLBSKR_;
        totalLBSKRShares += sharesLBSKR_;

        emit Staked(
            msg.sender,
            amountLBSKR_,
            sharesLBSKR_,
            uint256(stakeholders[stakerIndex].userStakes.length - 1),
            since
        );
    }

    function _withdrawStake(
        uint256 stakeIndex_,
        uint256 unstakeAmount_
    ) internal returns (Stake memory currStake, uint256 lbskrShares2Deduct) {
        uint256 stakerIndex = _stakeIndexMap[msg.sender];
        currStake = _getCurrStake(stakerIndex, stakeIndex_);

        require(
            stakerIndex != 1 || stakeIndex_ != 0,
            "S:Cannot remove 1st stake"
        );

        require(
            currStake.amountLBSKR >= unstakeAmount_,
            "S:Too much unstaking"
        );

        lbskrShares2Deduct =
            (unstakeAmount_ * currStake.sharesLBSKR) /
            currStake.amountLBSKR;

        if (currStake.amountLBSKR == unstakeAmount_) {
            if (stakeIndex_ < stakeholders[stakerIndex].userStakes.length - 1) {
                stakeholders[stakerIndex].userStakes[
                    stakeIndex_
                ] = stakeholders[stakerIndex].userStakes[
                    stakeholders[stakerIndex].userStakes.length - 1
                ];
            }
            stakeholders[stakerIndex].userStakes.pop();

            if (stakeholders[stakerIndex].userStakes.length == 0) {
                stakeholders[stakerIndex] = stakeholders[
                    stakeholders.length - 1
                ];
                stakeholders.pop();

                _stakeIndexMap[msg.sender] = 0;
                _stakeIndexMap[stakeholders[stakerIndex].user] = stakerIndex;
            }
        } else {
            Stake storage updatedStake = stakeholders[stakerIndex].userStakes[
                stakeIndex_
            ];
            updatedStake.amountLBSKR -= unstakeAmount_;
            updatedStake.sharesLBSKR -= lbskrShares2Deduct;
        }

        return (currStake, lbskrShares2Deduct);
    }

    function getTotalStakeholders() external view returns (uint256) {
        return stakeholders.length - 1;
    }

    function getTotalStakes() external view returns (uint256 totalStakes) {
        for (
            uint256 stakerIndex;
            stakerIndex < stakeholders.length;
            ++stakerIndex
        ) {
            totalStakes += stakeholders[stakerIndex].userStakes.length;
        }

        return totalStakes;
    }

    function stakesOf(
        address stakeholder_
    ) external view returns (Stake[] memory userStakes) {
        uint256 stakerIndex = _stakeIndexMap[stakeholder_];
        if (stakerIndex > 0) {
            return stakeholders[stakerIndex].userStakes;
        }

        return userStakes;
    }
}
          

contracts/lib/DSMath.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }

    uint96 constant RAY = 10 ** 27;

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY >> 1) / RAY;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}
          

contracts/lib/Utils.sol

/*
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.19;

contract Utils {
    uint24 private constant _SECS_IN_FOUR_WEEKS = 2419200;

    function _callAndParseAddressReturn(
        address token_,
        bytes4 selector_
    ) internal view returns (address) {
        (bool success, bytes memory data) = token_.staticcall(
            abi.encodeWithSelector(selector_)
        );

        if (!success || data.length == 0) {
            return address(0);
        }

        if (data.length == 32) {
            return abi.decode(data, (address));
        }

        return address(0);
    }

    function _getToken0(
        address target_
    ) internal view returns (address targetToken0) {
        targetToken0 = _callAndParseAddressReturn(
            target_,
            hex"0dfe1681"
        );

        return targetToken0;
    }

    function _getToken1(
        address target_
    ) internal view returns (address targetToken1) {
        targetToken1 = _callAndParseAddressReturn(
            target_,
            hex"d21220a7"
        );

        return targetToken1;
    }

    function _penaltyFor(
        uint256 fromTimestamp_,
        uint256 toTimestamp_
    ) internal pure returns (uint256 penaltyBasis) {
        if (fromTimestamp_ + 52 weeks > toTimestamp_) {
            uint256 fourWeeksElapsed = (toTimestamp_ - fromTimestamp_) /
                _SECS_IN_FOUR_WEEKS;
            if (fourWeeksElapsed < 13) {
                penaltyBasis = (13 - fourWeeksElapsed) * 100;
            }
        }
        return penaltyBasis;
    }
}
          

contracts/openzeppelin/access/Ownable.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract Ownable {
    address private _owner;

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

    constructor() {
        _transferOwnership(msg.sender);
    }

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

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

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "O:Caller not owner");
    }

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

    function transferOwnership(address newOwner) external virtual onlyOwner {
        require(newOwner != address(0), "O:0 address");
        _transferOwnership(newOwner);
    }

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

contracts/openzeppelin/security/Pausable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Pausable {
    event Paused(address account);

    event Unpaused(address account);

    bool private _paused;

    constructor() {
        _paused = false;
    }

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

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

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

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

    function _requirePaused() internal view virtual {
        require(paused(), "P:Not paused");
    }

    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}
          

contracts/openzeppelin/security/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    uint8 private constant _NOT_ENTERED = 1;
    uint8 private constant _ENTERED = 2;

    uint8 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        require(_status != _ENTERED, "R:Reentrant");
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        _status = _NOT_ENTERED;
    }
}
          

contracts/openzeppelin/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

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

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

    function totalSupply() external view returns (uint256);

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

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

contracts/uniswap/v2-periphery/interfaces/IUniswapV2Router01.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

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

    function WPLS() 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);
}
          

contracts/uniswap/v2-periphery/interfaces/IUniswapV2Router02.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

import "./IUniswapV2Router01.sol";

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":1000000,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","inputs":[{"type":"address","name":"oldLBSKR_","internalType":"contract ILBSKROld"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"growthAddress_","internalType":"address"},{"type":"address","name":"inflationAddress_","internalType":"address"},{"type":"address[5]","name":"sisterOAs_","internalType":"address[5]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdrop","inputs":[{"type":"tuple[]","name":"receivers_","internalType":"struct BaseBSKR.Airdrop[]","components":[{"type":"address"},{"type":"uint256"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner_","internalType":"address"},{"type":"address","name":"spender_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"wallet_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender_","internalType":"address"},{"type":"uint256","name":"subtractedValue_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"fixStakeAdd","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"},{"type":"uint256","name":"lbskrStakeAmount_","internalType":"uint256"},{"type":"uint256","name":"sharesLBSKR_","internalType":"uint256"},{"type":"uint256","name":"since_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRStakes_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRShares_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"fixStakeDel","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRStakes_","internalType":"uint256"},{"type":"uint256","name":"totalLBSKRShares_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalStakeholders","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalStakes","internalType":"uint256"}],"name":"getTotalStakes","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender_","internalType":"address"},{"type":"uint256","name":"addedValue_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateOwner","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pauseContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"penaltyBasis","internalType":"uint256"}],"name":"penaltyIfUnstakedNow","inputs":[{"type":"address","name":"wallet_","internalType":"address"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"reclaimETH","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"reclaimToken","inputs":[{"type":"address","name":"token_","internalType":"contract IERC20"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"lbskrRewards","internalType":"uint256"},{"type":"uint256","name":"eligibleBasis","internalType":"uint256"}],"name":"rewardsOf","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBSKR","inputs":[{"type":"address","name":"BSKRAddr_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"amountLBSKR_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"user","internalType":"address"}],"name":"stakeholders","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"userStakes","internalType":"struct Stakable.Stake[]","components":[{"type":"uint256"},{"type":"uint256"},{"type":"uint256"}]}],"name":"stakesOf","inputs":[{"type":"address","name":"stakeholder_","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLBSKRShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalLBSKRStakes","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from_","internalType":"address"},{"type":"address","name":"to_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferManagement","inputs":[{"type":"address","name":"newManager_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unPauseContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"unstakeAmount_","internalType":"uint256"},{"type":"uint256","name":"stakeIndex_","internalType":"uint256"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"FeeTransfers","inputs":[{"type":"uint256","name":"Burnt","indexed":false},{"type":"uint256","name":"Growth","indexed":false}],"anonymous":false},{"type":"event","name":"ManagementTransferred","inputs":[{"type":"address","name":"previousManager","indexed":true},{"type":"address","name":"newManager","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amountLBSKR","indexed":false},{"type":"uint256","name":"sharesLBSKR","indexed":false},{"type":"uint256","name":"stakeIndex","indexed":false},{"type":"uint256","name":"since","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","indexed":false}],"anonymous":false},{"type":"event","name":"Unstaked","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"amountLBSKR","indexed":false},{"type":"uint256","name":"sharesLBSKR","indexed":false},{"type":"uint256","name":"since","indexed":false},{"type":"uint256","name":"till","indexed":false}],"anonymous":false},{"type":"receive"},{"type":"fallback"}]
              

Contract Creation Code

0x608060405260046012553480156200001657600080fd5b5060405162004fa338038062004fa3833981016040819052620000399162000968565b84848483620000483362000729565b6000805460ff60a01b19168155600180546001600160a01b031916339081179091556040519091907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a36010620000a3858262000b04565b506011620000b2848262000b04565b50600480546001600160a01b0319166001600160a01b038416179055620000dd6006826005620007da565b50600380546001600160a01b0319167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc029081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000169919062000bd0565b600280546001600160a01b0319166001600160a01b039283161790556003546040805163ef8ef56f60e01b81529051919092169163ef8ef56f9160048083019260209291908290030181865afa158015620001c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ee919062000bd0565b600580546001600160a01b0319166001600160a01b03928316179055336000908152600d6020526040808220805460ff19908116600190811790925530845282842080548216831790556003549094168352908220805490931617909155601354900393506200026992505050576013805460010181556000525b6017805460ff19166001179055601880546001600160a01b038881166001600160a01b0319928316179092556019805492851692909116919091179055336000818152600f602090815260408083206c0c9f2c9cd04674edea4000000090819055905190815260008051602062004f83833981519152910160405180910390a36002546005546040516364e329cb60e11b81523060048201526001600160a01b039182166024820152600092919091169063c9c65396906044016020604051808303816000875af115801562000343573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000369919062000bd0565b90506200037a818060001962000779565b6001600160a01b0381166000908152600b60205260408120805460ff191660011790555b600581101562000401576001600d600060068460058110620003c457620003c462000bf7565b01546001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620003f98162000c23565b90506200039e565b506018546019546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa15801562000454573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047a919062000c3f565b6019546001600160a01b03166000908152600f6020526040812080549293508392909190620004ab90849062000c59565b9091555050336000908152600f602052604081208054839290620004d190849062000c75565b90915550506019546040518281526001600160a01b0390911690339060008051602062004f838339815191529060200160405180910390a3601854604080516387978fd160e01b815290516000926001600160a01b0316916387978fd1916004808301926020929190829003018187875af115801562000555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200057b919062000c3f565b336000908152600f6020526040812080549293508392909190620005a190849062000c75565b9091555050306000908152600f602052604081208054839290620005c790849062000c59565b90915550506040518181523090339060008051602062004f838339815191529060200160405180910390a36018546040516370a0823160e01b8152600060048201819052916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200063d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000663919062000c3f565b6103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280549293508392909190620006a890849062000c59565b9091555050336000908152600f602052604081208054839290620006ce90849062000c75565b909155505060405181815261036990339060008051602062004f838339815191529060200160405180910390a362000709610e104262000c8b565b62000715904262000c75565b601a555062000cae98505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b826005810192821562000825579160200282015b828111156200082557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620007ee565b506200083392915062000837565b5090565b5b8082111562000833576000815560010162000838565b6001600160a01b03811681146200086457600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715620008a257620008a262000867565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620008d357620008d362000867565b604052919050565b600082601f830112620008ed57600080fd5b81516001600160401b0381111562000909576200090962000867565b60206200091f601f8301601f19168201620008a8565b82815285828487010111156200093457600080fd5b60005b838110156200095457858101830151828201840152820162000937565b506000928101909101919091529392505050565b60008060008060008061014080888a0312156200098457600080fd5b875162000991816200084e565b602089810151919850906001600160401b0380821115620009b157600080fd5b620009bf8c838d01620008db565b985060408b0151915080821115620009d657600080fd5b50620009e58b828c01620008db565b9650506060890151620009f8816200084e565b60808a015190955062000a0b816200084e565b935060bf89018a1362000a1d57600080fd5b62000a276200087d565b91890191808b84111562000a3a57600080fd5b60a08b015b8481101562000a6357805162000a55816200084e565b835291830191830162000a3f565b50809450505050509295509295509295565b600181811c9082168062000a8a57607f821691505b60208210810362000aab57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000aff57600081815260208120601f850160051c8101602086101562000ada5750805b601f850160051c820191505b8181101562000afb5782815560010162000ae6565b5050505b505050565b81516001600160401b0381111562000b205762000b2062000867565b62000b388162000b31845462000a75565b8462000ab1565b602080601f83116001811462000b70576000841562000b575750858301515b600019600386901b1c1916600185901b17855562000afb565b600085815260208120601f198616915b8281101562000ba15788860151825594840194600190910190840162000b80565b508582101562000bc05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000be357600080fd5b815162000bf0816200084e565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820162000c385762000c3862000c0d565b5060010190565b60006020828403121562000c5257600080fd5b5051919050565b8082018082111562000c6f5762000c6f62000c0d565b92915050565b8181038181111562000c6f5762000c6f62000c0d565b60008262000ca957634e487b7160e01b600052601260045260246000fd5b500690565b6142c58062000cbe6000396000f3fe60806040526004361061025f5760003560e01c806368c336271161013e5780639e2c8a5b116100bf578063c1acbaf211610079578063e0c9ffc611610061578063e0c9ffc614610726578063e4edf85214610746578063f2fde38b1461076657005b8063c1acbaf2146106b3578063dd62ed3e146106d357005b8063a694fc3a116100a7578063a694fc3a1461065e578063a9059cbb1461067e578063bac152031461069e57005b80639e2c8a5b1461061e578063a457c2d71461063e57005b80637c72e7c6116101105780638da5cb5b116100f85780638da5cb5b146105c95780638fd3ab80146105f457806395d89b411461060957005b80637c72e7c61461059d57806387978fd1146105b357005b806368c336271461051b5780636fc436631461053057806370a0823114610545578063715018a61461058857005b806335941b1c116101e0578063481c6a751161019a5780635c975abb116101825780635c975abb146104b857806361ce3529146104e857806367cf9d21146104fb57005b8063481c6a751461046d5780634b72a5631461049857005b806339509351116101c8578063395093511461041857806342966c6814610438578063439766ce1461045857005b806335941b1c146103c3578063371d5e6c146103f857005b80631d6b8b721161023157806323b872dd1161021957806323b872dd1461035a578063313ce5671461037a57806333b69c4c1461039657005b80631d6b8b72146102f557806323a12df21461033a57005b806306fdde0314610268578063095ea7b3146102935780630f144a48146102c357806318160ddd146102cb57005b3661026657005b005b34801561027457600080fd5b5061027d610786565b60405161028a9190613bf2565b60405180910390f35b34801561029f57600080fd5b506102b36102ae366004613c65565b610818565b604051901515815260200161028a565b610266610832565b3480156102d757600080fd5b506c0c9f2c9cd04674edea400000005b60405190815260200161028a565b34801561030157600080fd5b50610315610310366004613c91565b61096d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028a565b34801561034657600080fd5b50610266610355366004613caa565b6109a9565b34801561036657600080fd5b506102b3610375366004613cc7565b6109bd565b34801561038657600080fd5b506040516012815260200161028a565b3480156103a257600080fd5b506103b66103b1366004613caa565b610aa3565b60405161028a9190613d08565b3480156103cf57600080fd5b506103e36103de366004613c65565b610b78565b6040805192835260208301919091520161028a565b34801561040457600080fd5b50610266610413366004613d61565b610c7f565b34801561042457600080fd5b506102b3610433366004613c65565b610ffd565b34801561044457600080fd5b50610266610453366004613c91565b611049565b34801561046457600080fd5b506102666110ec565b34801561047957600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610315565b3480156104a457600080fd5b506102666104b3366004613d9c565b6110fe565b3480156104c457600080fd5b5060005474010000000000000000000000000000000000000000900460ff166102b3565b6102666104f6366004613c65565b6111b5565b34801561050757600080fd5b50610266610516366004613caa565b611389565b34801561052757600080fd5b506102e76113dd565b34801561053c57600080fd5b506102e7611432565b34801561055157600080fd5b506102e7610560366004613caa565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b34801561059457600080fd5b50610266611449565b3480156105a957600080fd5b506102e760155481565b3480156105bf57600080fd5b506102e760165481565b3480156105d557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610315565b34801561060057600080fd5b5061026661145b565b34801561061557600080fd5b5061027d6114de565b34801561062a57600080fd5b50610266610639366004613de8565b6114ed565b34801561064a57600080fd5b506102b3610659366004613c65565b611557565b34801561066a57600080fd5b50610266610679366004613c91565b61160d565b34801561068a57600080fd5b506102b3610699366004613c65565b6117b8565b3480156106aa57600080fd5b506102666117c6565b3480156106bf57600080fd5b506102e76106ce366004613c65565b6117d6565b3480156106df57600080fd5b506102e76106ee366004613e0a565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020908152604080832093909416825291909152205490565b34801561073257600080fd5b50610266610741366004613e43565b611820565b34801561075257600080fd5b50610266610761366004613caa565b611916565b34801561077257600080fd5b50610266610781366004613caa565b6119ac565b60606010805461079590613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190613eb8565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b600033610826818585611a3a565b60019150505b92915050565b478061089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f42423a302042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d80600081146108f9576040519150601f19603f3d011682016040523d82523d6000602084013e6108fe565b606091505b5050905080610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42423a53656e64204661696c65640000000000000000000000000000000000006044820152606401610896565b5050565b6013818154811061097d57600080fd5b600091825260209091206002909102015473ffffffffffffffffffffffffffffffffffffffff16905081565b6109b1611aa8565b6109ba81611b45565b50565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083203380855292528220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a8c5783811015610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42423a496e73756666696369656e7420616c6c6f77616e6365000000000000006044820152606401610896565b610a8c8683868403611a3a565b610a97868686612243565b50600195945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601460205260409020546060908015610b725760138181548110610ae557610ae5613f05565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610b665783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610b16565b50505050915050919050565b50919050565b6000806000601a54600014610b9357610b904261232b565b90505b73ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490610bc48287612438565b9050610bd4816040015142612560565b610be090612710613f63565b306000908152600f6020526040902054909450610bfe908490613f76565b15610c7557601554602080830151306000908152600f9092526040822054919291610c2a908790613f76565b610c349190613f89565b610c3e9190613fcf565b8251909150811115610c73578151612710908690610c5c9084613f63565b610c669190613f89565b610c709190613fcf565b95505b505b5050509250929050565b610c87611aa8565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260146020526040902054601380546001919083908110610cc557610cc5613f05565b906000526020600020906002020160010180549050610ce49190613f63565b841015610dbf5760138181548110610cfe57610cfe613f05565b9060005260206000209060020201600101600160138381548110610d2457610d24613f05565b906000526020600020906002020160010180549050610d439190613f63565b81548110610d5357610d53613f05565b906000526020600020906003020160138281548110610d7457610d74613f05565b90600052602060002090600202016001018581548110610d9657610d96613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110610dd257610dd2613f05565b9060005260206000209060020201600101805480610df257610df2613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110610e4957610e49613f05565b600091825260208220600160029092020101549003610fef5760138054610e7290600190613f63565b81548110610e8257610e82613f05565b906000526020600020906002020160138281548110610ea357610ea3613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054610f0b9284019190613b07565b509050506013805480610f2057610f20613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590610f876001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110610fb757610fb7613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b506016919091556015555050565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906108269082908690611044908790613f76565b611a3a565b336000908152600f602052604081208054839290611068908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280548392906110ab908490613f76565b90915550506040518181526103699033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6110f46125bc565b6110fc61263d565b565b611106611aa8565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260146020526040812054908190036111405761113d876126ba565b90505b6013818154811061115357611153613f05565b60009182526020808320604080516060810182529a8b528a8301998a528a019788526002928302016001908101805480830182559085529190932098516003909102909801978855955190870155509151939092019290925560165560155550565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614012565b9050808211156112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42423a546f6f206d7563680000000000000000000000000000000000000000006044820152606401610896565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112ed60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561135f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611383919061402b565b50505050565b611391611aa8565b6017805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6000805b60135481101561142e57601381815481106113fe576113fe613f05565b600091825260209091206001600290920201015461141c9083613f76565b91506114278161404d565b90506113e1565b5090565b60135460009061144490600190613f63565b905090565b611451611aa8565b6110fc6000612755565b336000908152600c602052604090205460ff16156114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a416c7265616479206d6967726174656400000000000000000000000000006044820152606401610896565b6110fc33611b45565b60606011805461079590613eb8565b6114f56127ca565b6114fd612885565b61150561290a565b60008061151283856129aa565b9150915061152584828460400151612ebb565b5050610969601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156115f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42423a4465637265617365732062656c6f7720300000000000000000000000006044820152606401610896565b6116028286868403611a3a565b506001949350505050565b611615612885565b61161d6127ca565b80600003611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152600f6020526040902054811115611700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a546f6f206d756368207374616b696e6700000000000000000000000000006044820152606401610896565b61170861290a565b306000908152600f60205260408120546015546117259084613f89565b61172f9190613fcf565b336000908152600f6020526040812080549293508492909190611753908490613f63565b9091555050306000908152600f602052604081208054849290611777908490613f76565b909155506117879050828261311a565b506109ba601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600033610826818585612243565b6117ce6125bc565b6110fc6132dc565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260146020526040812054816118078285612438565b9050611817816040015142612560565b95945050505050565b611828611aa8565b60005b8181101561191157600083838381811061184757611847613f05565b61185d9260206040909202019081019150613caa565b73ffffffffffffffffffffffffffffffffffffffff161415801561189d575082828281811061188e5761188e613f05565b90506040020160200135600014155b15611901576119018383838181106118b7576118b7613f05565b6118cd9260206040909202019081019150613caa565b8484848181106118df576118df613f05565b90506040020160200135670de0b6b3a76400006118fc9190613f89565b61333c565b61190a8161404d565b905061182b565b505050565b61191e6125bc565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6119b4611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f3a3020616464726573730000000000000000000000000000000000000000006044820152606401610896565b6109ba81612755565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33611ac860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f3a43616c6c6572206e6f74206f776e657200000000000000000000000000006044820152606401610896565b601754610100900473ffffffffffffffffffffffffffffffffffffffff16611b6c57600080fd5b6018546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906370a0823190602401602060405180830381865afa158015611bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c019190614012565b90508015611cc357611c34611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b8383600061335e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f6020526040902054811115611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756531000000000000000000000000000000006044820152606401610896565b6018546040517f33b69c4c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009216906333b69c4c90602401600060405180830381865afa158015611d34573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d7a919081019061412c565b90506000805b82518110156120075773ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490819003611dc357611dc0866126ba565b90505b60138181548110611dd657611dd6613f05565b90600052602060002090600202016001016040518060600160405280868581518110611e0457611e04613f05565b6020026020010151600001518152602001868581518110611e2757611e27613f05565b6020026020010151604001518152602001868581518110611e4a57611e4a613f05565b6020908102919091018101516080015190915282546001818101855560009485529382902083516003909202019081559082015192810192909255604001516002909101558351849083908110611ea357611ea3613f05565b60200260200101516000015160166000828254611ec09190613f76565b92505081905550838281518110611ed957611ed9613f05565b60200260200101516040015160156000828254611ef69190613f76565b92505081905550838281518110611f0f57611f0f613f05565b60200260200101516020015183611f269190613f76565b6018546040517f35941b1c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201869052929550600092839216906335941b1c90604401606060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614214565b9093509150819050611fdb61271084613f89565b611fe59190613fcf565b611fef9086613f76565b94505050508080611fff9061404d565b915050611d80565b5080156121f15760175473ffffffffffffffffffffffffffffffffffffffff61010090910416636c74dd5161205160005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529087166024820152604481018490526064016020604051808303816000875af11580156120cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ef919061402b565b506017546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528392610100900416906370a0823190602401602060405180830381865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190614012565b10156121f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756532000000000000000000000000000000006044820152606401610896565b50505073ffffffffffffffffffffffffffffffffffffffff166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61224c836135ea565b612255826135ea565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460019060ff16806122b1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff165b156122ba575060005b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b602052604090205460ff16158015612316575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b1561231f575060005b6113838484848461335e565b6000601a54600003612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c3a496e666c6174696f6e206e6f7420737461727465642100000000000000006044820152606401610896565b601a54600090610e10906123ad9085613f63565b6123b79190613fcf565b60195473ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490915081156124315760006124006b033b2c8af183120df30000008461375c565b90506b033b2e3c9fd0803ce80000006124198284613f89565b6124239190613fcf565b61242d9083613f63565b9350505b5050919050565b61245c60405180606001604052806000815260200160008152602001600081525090565b6013838154811061246f5761246f613f05565b90600052602060002090600202016001018054905082106124ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f533a5374616b6520696e64657820696e636f72726563742100000000000000006044820152606401610896565b601383815481106124ff576124ff613f05565b9060005260206000209060020201600101828154811061252157612521613f05565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b600081612571846301dfe200613f76565b111561082c5760006224ea006125878585613f63565b6125919190613fcf565b9050600d8110156125b5576125a781600d613f63565b6125b2906064613f89565b91505b5092915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d3a43616c6c6572206e6f74206d616e616765720000000000000000000000006044820152606401610896565b612645612885565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b601380546001908101808355600092835282916126d691613f63565b905082601382815481106126ec576126ec613f05565b6000918252602080832060029290920290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055949091168152601490935260409092208290555090565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60175460ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f523a5265656e7472616e740000000000000000000000000000000000000000006044820152606401610896565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b60005474010000000000000000000000000000000000000000900460ff16156110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f503a5061757365640000000000000000000000000000000000000000000000006044820152606401610896565b6000612918610e1042614242565b6129229042613f63565b9050601a548111156109ba5760006129398261232b565b9050801561096957601a82905560195473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205260408120805483929061297d908490613f63565b9091555050306000908152600f6020526040812080548392906129a1908490613f76565b90915550505050565b6129ce60405180606001604052806000815260200160008152602001600081525090565b336000908152601460205260408120546129e88186612438565b92508060011415806129f957508415155b612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f533a43616e6e6f742072656d6f766520317374207374616b65000000000000006044820152606401610896565b8251841115612aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f533a546f6f206d75636820756e7374616b696e670000000000000000000000006044820152606401610896565b82516020840151612adb9086613f89565b612ae59190613fcf565b915083836000015103612e3657600160138281548110612b0757612b07613f05565b906000526020600020906002020160010180549050612b269190613f63565b851015612c015760138181548110612b4057612b40613f05565b9060005260206000209060020201600101600160138381548110612b6657612b66613f05565b906000526020600020906002020160010180549050612b859190613f63565b81548110612b9557612b95613f05565b906000526020600020906003020160138281548110612bb657612bb6613f05565b90600052602060002090600202016001018681548110612bd857612bd8613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110612c1457612c14613f05565b9060005260206000209060020201600101805480612c3457612c34613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110612c8b57612c8b613f05565b600091825260208220600160029092020101549003612e315760138054612cb490600190613f63565b81548110612cc457612cc4613f05565b906000526020600020906002020160138281548110612ce557612ce5613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054612d4d9284019190613b07565b509050506013805480612d6257612d62613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590612dc96001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110612df957612df9613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b612eb3565b600060138281548110612e4b57612e4b613f05565b90600052602060002090600202016001018681548110612e6d57612e6d613f05565b9060005260206000209060030201905084816000016000828254612e919190613f63565b9250508190555082816001016000828254612eac9190613f63565b9091555050505b509250929050565b6000612ec78242612560565b612ed390612710613f63565b306000908152600f6020526040812054919250901561309a57601554306000908152600f6020526040812054909190612f0d908790613f89565b612f179190613fcf565b90508581111561309857612710612f2e8483613f89565b612f389190613fcf565b91508115612fc057306000908152600f602052604081208054849290612f5f908490613f63565b9091555050336000908152600f602052604081208054849290612f83908490613f76565b9091555050604051828152339030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b612710831015613098576000612710612fd98582613f63565b612fe39084613f89565b612fed9190613fcf565b9050801561309657306000908152600f602052604081208054839290613014908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed591428054839290613057908490613f76565b90915550506040518181526103699030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b505b505b84601660008282546130ac9190613f63565b9250508190555083601560008282546130c59190613f63565b9091555050604080518681526020810186905290810184905242606082015233907fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e9629060800160405180910390a25050505050565b81600003613184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f533a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152601460205260408120549042908290036131aa576131a7336126ba565b91505b601382815481106131bd576131bd613f05565b60009182526020808320604080516060810182528981528084018981529181018781526002958602909301600190810180548083018255908852948720915160039095029091019384559051908301555191015560168054869290613223908490613f76565b92505081905550826015600082825461323c9190613f76565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f40858560016013878154811061329257613292613f05565b9060005260206000209060020201600101805490506132b19190613f63565b604080519384526020840192909252908201526060810184905260800160405180910390a250505050565b6132e46137d5565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020016126b0565b610969611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b613366612885565b61336e613b8e565b8161337b578281526133d3565b612710613389601985613f89565b6133939190613fcf565b60208201526127106133a6601985613f89565b6133b09190613fcf565b6040820181905260208201516133c69085613f63565b6133d09190613f63565b81525b73ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054859290613408908490613f63565b9091555050805173ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054909190613444908490613f76565b9091555050602081015115613591576020808201516103696000908152600f9092527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed59142805491929091613498908490613f76565b90915550506020808201516040519081526103699173ffffffffffffffffffffffffffffffffffffffff8816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a360408082015160045473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205291822080549192909161352d908490613f76565b909155505060045473ffffffffffffffffffffffffffffffffffffffff9081169086167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836002602002015160405161358891815260200190565b60405180910390a35b805160405190815273ffffffffffffffffffffffffffffffffffffffff85811691908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b8073ffffffffffffffffffffffffffffffffffffffff163b60000361360c5750565b60035473ffffffffffffffffffffffffffffffffffffffff908116908216036136325750565b60055473ffffffffffffffffffffffffffffffffffffffff908116908216036136585750565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff166109ba57600061369082613859565b905073ffffffffffffffffffffffffffffffffffffffff81166136b1575050565b60006136bc83613885565b905073ffffffffffffffffffffffffffffffffffffffff81166136de57505050565b61370983847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611a3a565b505073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b6000613769600283614242565b600003613782576b033b2e3c9fd0803ce8000000613784565b825b9050613791600283613fcf565b91505b811561082c576137a483846138b1565b92506137b1600283614242565b156137c3576137c081846138b1565b90505b6137ce600283613fcf565b9150613794565b60005474010000000000000000000000000000000000000000900460ff166110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f503a4e6f742070617573656400000000000000000000000000000000000000006044820152606401610896565b600061082c827f0dfe1681000000000000000000000000000000000000000000000000000000006138f0565b600061082c827fd21220a7000000000000000000000000000000000000000000000000000000006138f0565b60006b033b2e3c9fd0803ce80000006138df6138cd8585613a05565b6b019d971e4fe8401e74000000613a8f565b6138e99190613fcf565b9392505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8716916139739190614256565b600060405180830381855afa9150503d80600081146139ae576040519150601f19603f3d011682016040523d82523d6000602084013e6139b3565b606091505b50915091508115806139c457508051155b156139d45760009250505061082c565b80516020036139fa57808060200190518101906139f19190614272565b9250505061082c565b506000949350505050565b6000811580613a2957508282613a1b8183613f89565b9250613a279083613fcf565b145b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152606401610896565b600082613a9c8382613f76565b915081101561082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152606401610896565b828054828255906000526020600020906003028101928215613b615760005260206000209160030282015b82811115613b615782548255600180840154908301556002808401549083015560039283019290910190613b32565b5061142e929150613bac565b50805460008255600302906000526020600020908101906109ba9190613bac565b60405180606001604052806003906020820280368337509192915050565b5b8082111561142e576000808255600182018190556002820155600301613bad565b60005b83811015613be9578181015183820152602001613bd1565b50506000910152565b6020815260008251806020840152613c11816040850160208701613bce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ba57600080fd5b60008060408385031215613c7857600080fd5b8235613c8381613c43565b946020939093013593505050565b600060208284031215613ca357600080fd5b5035919050565b600060208284031215613cbc57600080fd5b81356138e981613c43565b600080600060608486031215613cdc57600080fd5b8335613ce781613c43565b92506020840135613cf781613c43565b929592945050506040919091013590565b602080825282518282018190526000919060409081850190868401855b82811015613d545781518051855286810151878601528501518585015260609093019290850190600101613d25565b5091979650505050505050565b60008060008060808587031215613d7757600080fd5b8435613d8281613c43565b966020860135965060408601359560600135945092505050565b60008060008060008060c08789031215613db557600080fd5b8635613dc081613c43565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008060408385031215613dfb57600080fd5b50508035926020909101359150565b60008060408385031215613e1d57600080fd5b8235613e2881613c43565b91506020830135613e3881613c43565b809150509250929050565b60008060208385031215613e5657600080fd5b823567ffffffffffffffff80821115613e6e57600080fd5b818501915085601f830112613e8257600080fd5b813581811115613e9157600080fd5b8660208260061b8501011115613ea657600080fd5b60209290920196919550909350505050565b600181811c90821680613ecc57607f821691505b602082108103610b72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561082c5761082c613f34565b8082018082111561082c5761082c613f34565b808202811582820484141761082c5761082c613f34565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613fde57613fde613fa0565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561402457600080fd5b5051919050565b60006020828403121561403d57600080fd5b815180151581146138e957600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361407e5761407e613f34565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156140d7576140d7614085565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561412457614124614085565b604052919050565b6000602080838503121561413f57600080fd5b825167ffffffffffffffff8082111561415757600080fd5b818501915085601f83011261416b57600080fd5b81518181111561417d5761417d614085565b61418b848260051b016140dd565b818152848101925060a09182028401850191888311156141aa57600080fd5b938501935b828510156142085780858a0312156141c75760008081fd5b6141cf6140b4565b855181528686015187820152604080870151908201526060808701519082015260808087015190820152845293840193928501926141af565b50979650505050505050565b60008060006060848603121561422957600080fd5b8351925060208401519150604084015190509250925092565b60008261425157614251613fa0565b500690565b60008251614268818460208701613bce565b9190910192915050565b60006020828403121561428457600080fd5b81516138e981613c4356fea2646970667358221220bd91918a02b42dac85d9d2fe7c27cb2b59d722a627eca8c5f56fe57b89b4328864736f6c63430008130033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000e9133dbac869acfd8e22d0cbc7632f82b32d30c400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fc51c335f8be70d0541944da5d5cd0638bbcc63d000000000000000000000000802d686567ba30dceba167d66a544f6ef915e0f700000000000000000000000035cef302da66733c076c10f85fc8097dce90bcc00000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000cd75d401a91b076f274418c7fa6a973d7fb7fece00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e7448180000000000000000000000007d6e237a514fbe12c65c3aa72525f61aa6a722d20000000000000000000000000000000000000000000000000000000000000018704c42534b52202d2070756c73656c6f7269616e2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000006704c42534b520000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x60806040526004361061025f5760003560e01c806368c336271161013e5780639e2c8a5b116100bf578063c1acbaf211610079578063e0c9ffc611610061578063e0c9ffc614610726578063e4edf85214610746578063f2fde38b1461076657005b8063c1acbaf2146106b3578063dd62ed3e146106d357005b8063a694fc3a116100a7578063a694fc3a1461065e578063a9059cbb1461067e578063bac152031461069e57005b80639e2c8a5b1461061e578063a457c2d71461063e57005b80637c72e7c6116101105780638da5cb5b116100f85780638da5cb5b146105c95780638fd3ab80146105f457806395d89b411461060957005b80637c72e7c61461059d57806387978fd1146105b357005b806368c336271461051b5780636fc436631461053057806370a0823114610545578063715018a61461058857005b806335941b1c116101e0578063481c6a751161019a5780635c975abb116101825780635c975abb146104b857806361ce3529146104e857806367cf9d21146104fb57005b8063481c6a751461046d5780634b72a5631461049857005b806339509351116101c8578063395093511461041857806342966c6814610438578063439766ce1461045857005b806335941b1c146103c3578063371d5e6c146103f857005b80631d6b8b721161023157806323b872dd1161021957806323b872dd1461035a578063313ce5671461037a57806333b69c4c1461039657005b80631d6b8b72146102f557806323a12df21461033a57005b806306fdde0314610268578063095ea7b3146102935780630f144a48146102c357806318160ddd146102cb57005b3661026657005b005b34801561027457600080fd5b5061027d610786565b60405161028a9190613bf2565b60405180910390f35b34801561029f57600080fd5b506102b36102ae366004613c65565b610818565b604051901515815260200161028a565b610266610832565b3480156102d757600080fd5b506c0c9f2c9cd04674edea400000005b60405190815260200161028a565b34801561030157600080fd5b50610315610310366004613c91565b61096d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161028a565b34801561034657600080fd5b50610266610355366004613caa565b6109a9565b34801561036657600080fd5b506102b3610375366004613cc7565b6109bd565b34801561038657600080fd5b506040516012815260200161028a565b3480156103a257600080fd5b506103b66103b1366004613caa565b610aa3565b60405161028a9190613d08565b3480156103cf57600080fd5b506103e36103de366004613c65565b610b78565b6040805192835260208301919091520161028a565b34801561040457600080fd5b50610266610413366004613d61565b610c7f565b34801561042457600080fd5b506102b3610433366004613c65565b610ffd565b34801561044457600080fd5b50610266610453366004613c91565b611049565b34801561046457600080fd5b506102666110ec565b34801561047957600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610315565b3480156104a457600080fd5b506102666104b3366004613d9c565b6110fe565b3480156104c457600080fd5b5060005474010000000000000000000000000000000000000000900460ff166102b3565b6102666104f6366004613c65565b6111b5565b34801561050757600080fd5b50610266610516366004613caa565b611389565b34801561052757600080fd5b506102e76113dd565b34801561053c57600080fd5b506102e7611432565b34801561055157600080fd5b506102e7610560366004613caa565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b34801561059457600080fd5b50610266611449565b3480156105a957600080fd5b506102e760155481565b3480156105bf57600080fd5b506102e760165481565b3480156105d557600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610315565b34801561060057600080fd5b5061026661145b565b34801561061557600080fd5b5061027d6114de565b34801561062a57600080fd5b50610266610639366004613de8565b6114ed565b34801561064a57600080fd5b506102b3610659366004613c65565b611557565b34801561066a57600080fd5b50610266610679366004613c91565b61160d565b34801561068a57600080fd5b506102b3610699366004613c65565b6117b8565b3480156106aa57600080fd5b506102666117c6565b3480156106bf57600080fd5b506102e76106ce366004613c65565b6117d6565b3480156106df57600080fd5b506102e76106ee366004613e0a565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020908152604080832093909416825291909152205490565b34801561073257600080fd5b50610266610741366004613e43565b611820565b34801561075257600080fd5b50610266610761366004613caa565b611916565b34801561077257600080fd5b50610266610781366004613caa565b6119ac565b60606010805461079590613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546107c190613eb8565b801561080e5780601f106107e35761010080835404028352916020019161080e565b820191906000526020600020905b8154815290600101906020018083116107f157829003601f168201915b5050505050905090565b600033610826818585611a3a565b60019150505b92915050565b478061089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f42423a302042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d80600081146108f9576040519150601f19603f3d011682016040523d82523d6000602084013e6108fe565b606091505b5050905080610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42423a53656e64204661696c65640000000000000000000000000000000000006044820152606401610896565b5050565b6013818154811061097d57600080fd5b600091825260209091206002909102015473ffffffffffffffffffffffffffffffffffffffff16905081565b6109b1611aa8565b6109ba81611b45565b50565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083203380855292528220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a8c5783811015610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42423a496e73756666696369656e7420616c6c6f77616e6365000000000000006044820152606401610896565b610a8c8683868403611a3a565b610a97868686612243565b50600195945050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601460205260409020546060908015610b725760138181548110610ae557610ae5613f05565b9060005260206000209060020201600101805480602002602001604051908101604052809291908181526020016000905b82821015610b665783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610b16565b50505050915050919050565b50919050565b6000806000601a54600014610b9357610b904261232b565b90505b73ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490610bc48287612438565b9050610bd4816040015142612560565b610be090612710613f63565b306000908152600f6020526040902054909450610bfe908490613f76565b15610c7557601554602080830151306000908152600f9092526040822054919291610c2a908790613f76565b610c349190613f89565b610c3e9190613fcf565b8251909150811115610c73578151612710908690610c5c9084613f63565b610c669190613f89565b610c709190613fcf565b95505b505b5050509250929050565b610c87611aa8565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260146020526040902054601380546001919083908110610cc557610cc5613f05565b906000526020600020906002020160010180549050610ce49190613f63565b841015610dbf5760138181548110610cfe57610cfe613f05565b9060005260206000209060020201600101600160138381548110610d2457610d24613f05565b906000526020600020906002020160010180549050610d439190613f63565b81548110610d5357610d53613f05565b906000526020600020906003020160138281548110610d7457610d74613f05565b90600052602060002090600202016001018581548110610d9657610d96613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110610dd257610dd2613f05565b9060005260206000209060020201600101805480610df257610df2613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110610e4957610e49613f05565b600091825260208220600160029092020101549003610fef5760138054610e7290600190613f63565b81548110610e8257610e82613f05565b906000526020600020906002020160138281548110610ea357610ea3613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054610f0b9284019190613b07565b509050506013805480610f2057610f20613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590610f876001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110610fb757610fb7613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b506016919091556015555050565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906108269082908690611044908790613f76565b611a3a565b336000908152600f602052604081208054839290611068908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280548392906110ab908490613f76565b90915550506040518181526103699033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6110f46125bc565b6110fc61263d565b565b611106611aa8565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260146020526040812054908190036111405761113d876126ba565b90505b6013818154811061115357611153613f05565b60009182526020808320604080516060810182529a8b528a8301998a528a019788526002928302016001908101805480830182559085529190932098516003909102909801978855955190870155509151939092019290925560165560155550565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112469190614012565b9050808211156112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42423a546f6f206d7563680000000000000000000000000000000000000000006044820152606401610896565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112ed60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af115801561135f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611383919061402b565b50505050565b611391611aa8565b6017805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b6000805b60135481101561142e57601381815481106113fe576113fe613f05565b600091825260209091206001600290920201015461141c9083613f76565b91506114278161404d565b90506113e1565b5090565b60135460009061144490600190613f63565b905090565b611451611aa8565b6110fc6000612755565b336000908152600c602052604090205460ff16156114d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a416c7265616479206d6967726174656400000000000000000000000000006044820152606401610896565b6110fc33611b45565b60606011805461079590613eb8565b6114f56127ca565b6114fd612885565b61150561290a565b60008061151283856129aa565b9150915061152584828460400151612ebb565b5050610969601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156115f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42423a4465637265617365732062656c6f7720300000000000000000000000006044820152606401610896565b6116028286868403611a3a565b506001949350505050565b611615612885565b61161d6127ca565b80600003611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152600f6020526040902054811115611700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c3a546f6f206d756368207374616b696e6700000000000000000000000000006044820152606401610896565b61170861290a565b306000908152600f60205260408120546015546117259084613f89565b61172f9190613fcf565b336000908152600f6020526040812080549293508492909190611753908490613f63565b9091555050306000908152600f602052604081208054849290611777908490613f76565b909155506117879050828261311a565b506109ba601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b600033610826818585612243565b6117ce6125bc565b6110fc6132dc565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260146020526040812054816118078285612438565b9050611817816040015142612560565b95945050505050565b611828611aa8565b60005b8181101561191157600083838381811061184757611847613f05565b61185d9260206040909202019081019150613caa565b73ffffffffffffffffffffffffffffffffffffffff161415801561189d575082828281811061188e5761188e613f05565b90506040020160200135600014155b15611901576119018383838181106118b7576118b7613f05565b6118cd9260206040909202019081019150613caa565b8484848181106118df576118df613f05565b90506040020160200135670de0b6b3a76400006118fc9190613f89565b61333c565b61190a8161404d565b905061182b565b505050565b61191e6125bc565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6119b4611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f3a3020616464726573730000000000000000000000000000000000000000006044820152606401610896565b6109ba81612755565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b33611ac860005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff16146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f3a43616c6c6572206e6f74206f776e657200000000000000000000000000006044820152606401610896565b601754610100900473ffffffffffffffffffffffffffffffffffffffff16611b6c57600080fd5b6018546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906370a0823190602401602060405180830381865afa158015611bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c019190614012565b90508015611cc357611c34611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b8383600061335e565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600f6020526040902054811115611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756531000000000000000000000000000000006044820152606401610896565b6018546040517f33b69c4c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260009216906333b69c4c90602401600060405180830381865afa158015611d34573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d7a919081019061412c565b90506000805b82518110156120075773ffffffffffffffffffffffffffffffffffffffff851660009081526014602052604081205490819003611dc357611dc0866126ba565b90505b60138181548110611dd657611dd6613f05565b90600052602060002090600202016001016040518060600160405280868581518110611e0457611e04613f05565b6020026020010151600001518152602001868581518110611e2757611e27613f05565b6020026020010151604001518152602001868581518110611e4a57611e4a613f05565b6020908102919091018101516080015190915282546001818101855560009485529382902083516003909202019081559082015192810192909255604001516002909101558351849083908110611ea357611ea3613f05565b60200260200101516000015160166000828254611ec09190613f76565b92505081905550838281518110611ed957611ed9613f05565b60200260200101516040015160156000828254611ef69190613f76565b92505081905550838281518110611f0f57611f0f613f05565b60200260200101516020015183611f269190613f76565b6018546040517f35941b1c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015260248201869052929550600092839216906335941b1c90604401606060405180830381865afa158015611fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc79190614214565b9093509150819050611fdb61271084613f89565b611fe59190613fcf565b611fef9086613f76565b94505050508080611fff9061404d565b915050611d80565b5080156121f15760175473ffffffffffffffffffffffffffffffffffffffff61010090910416636c74dd5161205160005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff91821660048201529087166024820152604481018490526064016020604051808303816000875af11580156120cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ef919061402b565b506017546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528392610100900416906370a0823190602401602060405180830381865afa158015612165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121899190614012565b10156121f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c3a4d69677261746520497373756532000000000000000000000000000000006044820152606401610896565b50505073ffffffffffffffffffffffffffffffffffffffff166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61224c836135ea565b612255826135ea565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460019060ff16806122b1575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff165b156122ba575060005b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b602052604090205460ff16158015612316575073ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff16155b1561231f575060005b6113838484848461335e565b6000601a54600003612399576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c3a496e666c6174696f6e206e6f7420737461727465642100000000000000006044820152606401610896565b601a54600090610e10906123ad9085613f63565b6123b79190613fcf565b60195473ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490915081156124315760006124006b033b2c8af183120df30000008461375c565b90506b033b2e3c9fd0803ce80000006124198284613f89565b6124239190613fcf565b61242d9083613f63565b9350505b5050919050565b61245c60405180606001604052806000815260200160008152602001600081525090565b6013838154811061246f5761246f613f05565b90600052602060002090600202016001018054905082106124ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f533a5374616b6520696e64657820696e636f72726563742100000000000000006044820152606401610896565b601383815481106124ff576124ff613f05565b9060005260206000209060020201600101828154811061252157612521613f05565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905092915050565b600081612571846301dfe200613f76565b111561082c5760006224ea006125878585613f63565b6125919190613fcf565b9050600d8110156125b5576125a781600d613f63565b6125b2906064613f89565b91505b5092915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d3a43616c6c6572206e6f74206d616e616765720000000000000000000000006044820152606401610896565b612645612885565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b601380546001908101808355600092835282916126d691613f63565b905082601382815481106126ec576126ec613f05565b6000918252602080832060029290920290910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055949091168152601490935260409092208290555090565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60175460ff167ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01612858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f523a5265656e7472616e740000000000000000000000000000000000000000006044820152606401610896565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055565b60005474010000000000000000000000000000000000000000900460ff16156110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f503a5061757365640000000000000000000000000000000000000000000000006044820152606401610896565b6000612918610e1042614242565b6129229042613f63565b9050601a548111156109ba5760006129398261232b565b9050801561096957601a82905560195473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205260408120805483929061297d908490613f63565b9091555050306000908152600f6020526040812080548392906129a1908490613f76565b90915550505050565b6129ce60405180606001604052806000815260200160008152602001600081525090565b336000908152601460205260408120546129e88186612438565b92508060011415806129f957508415155b612a5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f533a43616e6e6f742072656d6f766520317374207374616b65000000000000006044820152606401610896565b8251841115612aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f533a546f6f206d75636820756e7374616b696e670000000000000000000000006044820152606401610896565b82516020840151612adb9086613f89565b612ae59190613fcf565b915083836000015103612e3657600160138281548110612b0757612b07613f05565b906000526020600020906002020160010180549050612b269190613f63565b851015612c015760138181548110612b4057612b40613f05565b9060005260206000209060020201600101600160138381548110612b6657612b66613f05565b906000526020600020906002020160010180549050612b859190613f63565b81548110612b9557612b95613f05565b906000526020600020906003020160138281548110612bb657612bb6613f05565b90600052602060002090600202016001018681548110612bd857612bd8613f05565b600091825260209091208254600390920201908155600180830154908201556002918201549101555b60138181548110612c1457612c14613f05565b9060005260206000209060020201600101805480612c3457612c34613fe3565b60008281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600181018290556002015590556013805482908110612c8b57612c8b613f05565b600091825260208220600160029092020101549003612e315760138054612cb490600190613f63565b81548110612cc457612cc4613f05565b906000526020600020906002020160138281548110612ce557612ce5613f05565b60009182526020909120825460029092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117815560018083018054612d4d9284019190613b07565b509050506013805480612d6257612d62613fe3565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815590612dc96001830182613b6d565b505090553360009081526014602081905260408220829055601380548493919084908110612df957612df9613f05565b6000918252602080832060029092029091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b612eb3565b600060138281548110612e4b57612e4b613f05565b90600052602060002090600202016001018681548110612e6d57612e6d613f05565b9060005260206000209060030201905084816000016000828254612e919190613f63565b9250508190555082816001016000828254612eac9190613f63565b9091555050505b509250929050565b6000612ec78242612560565b612ed390612710613f63565b306000908152600f6020526040812054919250901561309a57601554306000908152600f6020526040812054909190612f0d908790613f89565b612f179190613fcf565b90508581111561309857612710612f2e8483613f89565b612f389190613fcf565b91508115612fc057306000908152600f602052604081208054849290612f5f908490613f63565b9091555050336000908152600f602052604081208054849290612f83908490613f76565b9091555050604051828152339030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b612710831015613098576000612710612fd98582613f63565b612fe39084613f89565b612fed9190613fcf565b9050801561309657306000908152600f602052604081208054839290613014908490613f63565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed591428054839290613057908490613f76565b90915550506040518181526103699030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b505b505b84601660008282546130ac9190613f63565b9250508190555083601560008282546130c59190613f63565b9091555050604080518681526020810186905290810184905242606082015233907fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e9629060800160405180910390a25050505050565b81600003613184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f533a43616e6e6f74207374616b652030000000000000000000000000000000006044820152606401610896565b336000908152601460205260408120549042908290036131aa576131a7336126ba565b91505b601382815481106131bd576131bd613f05565b60009182526020808320604080516060810182528981528084018981529181018781526002958602909301600190810180548083018255908852948720915160039095029091019384559051908301555191015560168054869290613223908490613f76565b92505081905550826015600082825461323c9190613f76565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f40858560016013878154811061329257613292613f05565b9060005260206000209060020201600101805490506132b19190613f63565b604080519384526020840192909252908201526060810184905260800160405180910390a250505050565b6132e46137d5565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020016126b0565b610969611c2b60005473ffffffffffffffffffffffffffffffffffffffff1690565b613366612885565b61336e613b8e565b8161337b578281526133d3565b612710613389601985613f89565b6133939190613fcf565b60208201526127106133a6601985613f89565b6133b09190613fcf565b6040820181905260208201516133c69085613f63565b6133d09190613f63565b81525b73ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054859290613408908490613f63565b9091555050805173ffffffffffffffffffffffffffffffffffffffff85166000908152600f602052604081208054909190613444908490613f76565b9091555050602081015115613591576020808201516103696000908152600f9092527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed59142805491929091613498908490613f76565b90915550506020808201516040519081526103699173ffffffffffffffffffffffffffffffffffffffff8816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a360408082015160045473ffffffffffffffffffffffffffffffffffffffff166000908152600f60205291822080549192909161352d908490613f76565b909155505060045473ffffffffffffffffffffffffffffffffffffffff9081169086167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836002602002015160405161358891815260200190565b60405180910390a35b805160405190815273ffffffffffffffffffffffffffffffffffffffff85811691908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505050565b8073ffffffffffffffffffffffffffffffffffffffff163b60000361360c5750565b60035473ffffffffffffffffffffffffffffffffffffffff908116908216036136325750565b60055473ffffffffffffffffffffffffffffffffffffffff908116908216036136585750565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff166109ba57600061369082613859565b905073ffffffffffffffffffffffffffffffffffffffff81166136b1575050565b60006136bc83613885565b905073ffffffffffffffffffffffffffffffffffffffff81166136de57505050565b61370983847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611a3a565b505073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b6000613769600283614242565b600003613782576b033b2e3c9fd0803ce8000000613784565b825b9050613791600283613fcf565b91505b811561082c576137a483846138b1565b92506137b1600283614242565b156137c3576137c081846138b1565b90505b6137ce600283613fcf565b9150613794565b60005474010000000000000000000000000000000000000000900460ff166110fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f503a4e6f742070617573656400000000000000000000000000000000000000006044820152606401610896565b600061082c827f0dfe1681000000000000000000000000000000000000000000000000000000006138f0565b600061082c827fd21220a7000000000000000000000000000000000000000000000000000000006138f0565b60006b033b2e3c9fd0803ce80000006138df6138cd8585613a05565b6b019d971e4fe8401e74000000613a8f565b6138e99190613fcf565b9392505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8716916139739190614256565b600060405180830381855afa9150503d80600081146139ae576040519150601f19603f3d011682016040523d82523d6000602084013e6139b3565b606091505b50915091508115806139c457508051155b156139d45760009250505061082c565b80516020036139fa57808060200190518101906139f19190614272565b9250505061082c565b506000949350505050565b6000811580613a2957508282613a1b8183613f89565b9250613a279083613fcf565b145b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f770000000000000000000000006044820152606401610896565b600082613a9c8382613f76565b915081101561082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f770000000000000000000000006044820152606401610896565b828054828255906000526020600020906003028101928215613b615760005260206000209160030282015b82811115613b615782548255600180840154908301556002808401549083015560039283019290910190613b32565b5061142e929150613bac565b50805460008255600302906000526020600020908101906109ba9190613bac565b60405180606001604052806003906020820280368337509192915050565b5b8082111561142e576000808255600182018190556002820155600301613bad565b60005b83811015613be9578181015183820152602001613bd1565b50506000910152565b6020815260008251806020840152613c11816040850160208701613bce565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ba57600080fd5b60008060408385031215613c7857600080fd5b8235613c8381613c43565b946020939093013593505050565b600060208284031215613ca357600080fd5b5035919050565b600060208284031215613cbc57600080fd5b81356138e981613c43565b600080600060608486031215613cdc57600080fd5b8335613ce781613c43565b92506020840135613cf781613c43565b929592945050506040919091013590565b602080825282518282018190526000919060409081850190868401855b82811015613d545781518051855286810151878601528501518585015260609093019290850190600101613d25565b5091979650505050505050565b60008060008060808587031215613d7757600080fd5b8435613d8281613c43565b966020860135965060408601359560600135945092505050565b60008060008060008060c08789031215613db557600080fd5b8635613dc081613c43565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60008060408385031215613dfb57600080fd5b50508035926020909101359150565b60008060408385031215613e1d57600080fd5b8235613e2881613c43565b91506020830135613e3881613c43565b809150509250929050565b60008060208385031215613e5657600080fd5b823567ffffffffffffffff80821115613e6e57600080fd5b818501915085601f830112613e8257600080fd5b813581811115613e9157600080fd5b8660208260061b8501011115613ea657600080fd5b60209290920196919550909350505050565b600181811c90821680613ecc57607f821691505b602082108103610b72577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561082c5761082c613f34565b8082018082111561082c5761082c613f34565b808202811582820484141761082c5761082c613f34565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613fde57613fde613fa0565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561402457600080fd5b5051919050565b60006020828403121561403d57600080fd5b815180151581146138e957600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361407e5761407e613f34565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160a0810167ffffffffffffffff811182821017156140d7576140d7614085565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561412457614124614085565b604052919050565b6000602080838503121561413f57600080fd5b825167ffffffffffffffff8082111561415757600080fd5b818501915085601f83011261416b57600080fd5b81518181111561417d5761417d614085565b61418b848260051b016140dd565b818152848101925060a09182028401850191888311156141aa57600080fd5b938501935b828510156142085780858a0312156141c75760008081fd5b6141cf6140b4565b855181528686015187820152604080870151908201526060808701519082015260808087015190820152845293840193928501926141af565b50979650505050505050565b60008060006060848603121561422957600080fd5b8351925060208401519150604084015190509250925092565b60008261425157614251613fa0565b500690565b60008251614268818460208701613bce565b9190910192915050565b60006020828403121561428457600080fd5b81516138e981613c4356fea2646970667358221220bd91918a02b42dac85d9d2fe7c27cb2b59d722a627eca8c5f56fe57b89b4328864736f6c63430008130033