false
true
0

Contract Address Details

0x32731365632AEb5945Cb67a49aa3269EA41980e0

Contract Name
DividendDistributor
Creator
0xa8dcd0–3af826 at 0x7e0f64–f0cd00
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25899772
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
DividendDistributor




Optimization enabled
false
Compiler version
v0.8.21+commit.d9974bed




EVM Version
default




Verified at
2024-12-11T03:27:02.061688Z

Constructor Arguments

0x0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d

Arg [0] (address) : 0x2fa878ab3f87cc1c9737fc071108f904c0b0c95d

              

Contract source code

// SPDX-License-Identifier: MIT
/**
      * Welcome to Monsters INC! 
     https://t.me/MonstersINCtoken
     */
pragma solidity 0.8.21;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        if(currentAllowance != type(uint256).max) { 
            require(
                currentAllowance >= amount,
                "ERC20: transfer amount exceeds allowance"
            );
            unchecked {
                _approve(sender, _msgSender(), currentAllowance - amount);
            }
        }
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _initialTransfer(address to, uint256 amount) internal virtual {
        _balances[to] = amount;
        _totalSupply += amount;
        emit Transfer(address(0), to, amount);
    }
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

interface IDividendDistributor {
    function initialize() external;
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _claimAfter) external;
    function setShare(address shareholder, uint256 amount, bool exclude) external;
    function deposit() external payable;
    function claimDividend(address shareholder) external;
    function getUnpaidEarnings(address shareholder) external view returns (uint256);
    function getPaidDividends(address shareholder) external view returns (uint256);
    function getTotalPaid() external view returns (uint256);
    function getClaimTime(address shareholder) external view returns (uint256);
    function getTotalDividends() external view returns (uint256);
    function getTotalDistributed() external view returns (uint256);
    function countShareholders() external view returns (uint256);
    function migrate(address newDistributor) external;
    function process() external;
}

contract DividendDistributor is IDividendDistributor, Ownable {

    address public _token;
    IERC20 public immutable reward;
    address public immutable ETH;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    address[] public shareholders;
    mapping (address => uint256) public shareholderIndexes;
    mapping (address => uint256) public shareholderClaims;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public unclaimed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 30 seconds;
    uint256 public minDistribution = 1;
    uint256 public gas = 800000;
    uint256 public currentIndex;

    address constant routerAddress = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
    IDexRouter constant dexRouter = IDexRouter(routerAddress);
    uint256 public slippage = 98;

    bool public initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }
    
    function getTotalDividends() external view override returns (uint256) {
        return totalDividends;
    }
    function getTotalDistributed() external view override returns (uint256) {
        return totalDistributed;
    }

    constructor (address rwd) {
        reward = IERC20(rwd);
        aprv();
        ETH = dexRouter.WPLS();
    }

    function aprv() public {
        reward.approve(routerAddress, type(uint256).max);
    }
    
    function initialize() external override initialization {
        _token = msg.sender;
    }
    
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _gas) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        gas = _gas;
    }

    function setShare(address shareholder, uint256 amount, bool exclude) external override onlyToken {
        uint256 currentShare = shares[shareholder].amount;
        if(amount > 0 && currentShare == 0){
            addShareholder(shareholder);
            shares[shareholder].totalExcluded = getCumulativeDividends(amount);
            shareholderClaims[shareholder] = block.timestamp;
        }else if(amount == 0 && currentShare > 0){
            removeShareholder(shareholder);
        }

        uint256 unpaid = getUnpaidEarnings(shareholder);
        if(currentShare > 0 && !exclude){
            if(unpaid > 0) {
                if(shouldDistribute(shareholder, unpaid)) {
                    distributeDividend(shareholder, unpaid);
                } else {
                    unclaimed += unpaid;
                }
            }
        }
        
        totalShares = (totalShares - currentShare) + amount;
        
        shares[shareholder].amount = amount;
        
        shares[shareholder].totalExcluded = getCumulativeDividends(amount);
    }

    function deposit() external payable override {
        uint256 amount;
        if(address(reward) != ETH) {
        address[] memory path = new address[](2);
        path[0] = dexRouter.WPLS();
        path[1] = address(reward);

        uint256 spend = address(this).balance;
        uint256[] memory amountsout = dexRouter.getAmountsOut(spend, path);

        uint256 curBal = reward.balanceOf(address(this));

        dexRouter.swapExactETHForTokens{value: spend}(
            amountsout[1] * slippage / 100,
            path,
            address(this),
            block.timestamp
        );

        amount = reward.balanceOf(address(this)) - curBal;
        } else {
            amount = msg.value;
        }
        totalDividends += amount;
        if(totalShares > 0)
            if(dividendsPerShare == 0)
                dividendsPerShare = (dividendsPerShareAccuracyFactor * totalDividends) / totalShares;
            else
                dividendsPerShare += ((dividendsPerShareAccuracyFactor * amount) / totalShares);
    }

    function extractUnclaimed() external onlyOwner {
        uint256 uncl = unclaimed;
        unclaimed = 0;
        reward.transfer(msg.sender, uncl);
    }

    function extractLostETH() external onlyOwner {
        bool success;
        (success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    function setSlippage(uint256 _slip) external onlyOwner {
        require(_slip <= 100, "Min slippage reached");
        require(_slip >= 50, "Probably too much slippage");
        slippage = _slip;
    }

    function migrate(address newDistributor) external onlyToken {
        DividendDistributor newD = DividendDistributor(newDistributor);
        require(!newD.initialized(), "Already initialized");
        bool success;
        (success, ) = newDistributor.call{value: address(this).balance}("");
        reward.transfer(newDistributor, reward.balanceOf(address(this)));
        require(success, "Transfer failed");
    }

    function shouldDistribute(address shareholder, uint256 unpaidEarnings) internal view returns (bool) {
       return shareholderClaims[shareholder] + minPeriod < block.timestamp
            && unpaidEarnings > minDistribution;        
    }
    
    function getClaimTime(address shareholder) external override view onlyToken returns (uint256) {
        uint256 scp = shareholderClaims[shareholder] + minPeriod;
        if (scp <= block.timestamp) {
            return 0;
        } else {
            return scp - block.timestamp;
        }
    }

    function distributeDividend(address shareholder, uint256 unpaidEarnings) internal {
        if(shares[shareholder].amount == 0){ return; }

        if(unpaidEarnings > 0){
            totalDistributed = totalDistributed + unpaidEarnings;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised += unpaidEarnings;
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            if(address(reward) == ETH) {
                bool success;
                (success, ) = shareholder.call{value: unpaidEarnings}("");
            } else
                reward.transfer(shareholder, unpaidEarnings);
        }
    }

    function process() public override {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }
            
            uint256 unpaid = getUnpaidEarnings(shareholders[currentIndex]);
            if(shouldDistribute(shareholders[currentIndex], unpaid)){
                distributeDividend(shareholders[currentIndex], unpaid);
            }

            gasUsed = gasUsed + (gasLeft - gasleft());
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function claimDividend(address shareholder) external override onlyToken {
        uint256 unpaid = getUnpaidEarnings(shareholder);
        require(shouldDistribute(shareholder, unpaid), "Dividends not available yet");
        distributeDividend(shareholder, unpaid);
    }

    function processClaim(address shareholder) external onlyOwner {
        uint256 unpaid = getUnpaidEarnings(shareholder);
        require(shouldDistribute(shareholder, unpaid), "Dividends not available yet");
        distributeDividend(shareholder, unpaid);
    }

    function getUnpaidEarnings(address shareholder) public view override returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }
    
    function getPaidDividends(address shareholder) external view override onlyToken returns (uint256) {
        return shares[shareholder].totalRealised;
    }
    
    function getTotalPaid() external view override onlyToken returns (uint256) {
        return totalDistributed;
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        if(share == 0){ return 0; }
        return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor;
    }

    function countShareholders() public view returns(uint256) {
        return shareholders.length;
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

interface ILpPair {
    function sync() external;
}

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

    function WPLS() external pure returns (address);

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

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

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
    
    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 getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

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

contract MonstersINC is ERC20, Ownable {
    IDexRouter public immutable dexRouter;
    address public lpPair;

    mapping(address => uint256) public walletProtection;
    bool public protectionDisabled = false;

    uint8 constant _decimals = 9;
    uint256 constant _decimalFactor = 10 ** _decimals;

    bool private swapping;
    uint256 public swapTokensAtAmount;
    uint256 public maxSwapTokens;

    IDividendDistributor public distributor;
    address public taxCollector;
    uint256 public taxSplit = 100;
    bool public autoProcess = true;

    bool public swapEnabled = true;

    uint256 public tradingActiveTime;

    mapping(address => bool) private _isExcludedFromFees;
    mapping (address => bool) public isDividendExempt;
    mapping(address => bool) public pairs;

    event SetPair(address indexed pair, bool indexed value);
    event ExcludeFromFees(address indexed account, bool isExcluded);

    constructor(string memory name, string memory ticker, uint256 supply, address reward) ERC20(name, ticker) {
        address routerAddress = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
        dexRouter = IDexRouter(routerAddress);

        _approve(msg.sender, routerAddress, type(uint256).max);
        _approve(address(this), routerAddress, type(uint256).max);

        uint256 totalSupply = supply * _decimalFactor;

        swapTokensAtAmount = (totalSupply * 1) / 1000000;
        maxSwapTokens = (totalSupply * 5) / 1000;

        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);

        isDividendExempt[routerAddress] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(0xdead)] = true;

        _initialTransfer(msg.sender, totalSupply);

        DividendDistributor dist = new DividendDistributor(reward);
        setDistributor(address(dist), false);
    }

    receive() external payable {}

    function decimals() public pure override returns (uint8) {
        return 9;
    }

    function updateSwapTokens(uint256 atAmount, uint256 maxAmount) external onlyOwner {
        require(maxAmount <= (totalSupply() * 1) / 100, "Max swap cannot be higher than 1% supply.");
        swapTokensAtAmount = atAmount;
        maxSwapTokens = maxAmount;
    }

    function setTaxCollector(address wallet) external onlyOwner {
        taxCollector = wallet;
    }

    function toggleSwap() external onlyOwner {
        swapEnabled = !swapEnabled;
    }

    function toggleProcess() external onlyOwner {
        autoProcess = !autoProcess;
    }

    function setPair(address pair, bool value) external {
        require(pair != lpPair, "The pair cannot be removed from pairs");
        require(msg.sender == owner() || msg.sender == taxCollector, "Unauthorised");

        pairs[pair] = value;
        setDividendExempt(pair, true);
        emit SetPair(pair, value);
    }

    function getFees() public pure returns (uint256) {
        return 2;
    }

    function setSplit(uint256 _split) external onlyOwner {
        require (_split <= 100);
        taxSplit = _split;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setDividendExempt(address holder, bool exempt) public onlyOwner {
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0, true);
        }else{
            distributor.setShare(holder, balanceOf(holder), false);
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if(tradingActiveTime == 0) {
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet active");
            super._transfer(from, to, amount);
        }
        else {
            if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                uint256 fees = 0;
                uint256 _f = getFees();

                fees = (amount * _f) / 100;
                
                if (fees > 0) {
                    super._transfer(from, address(this), fees);
                }

                if (swapEnabled && !swapping && pairs[to]) {
                    swapping = true;
                    swapBack(amount);
                    swapping = false;
                }

                amount -= fees;
            }

            super._transfer(from, to, amount);

            if(autoProcess){ try distributor.process() {} catch {} }
        }

        _beforeTokenTransfer(from, to);

        if(!isDividendExempt[from]){ try distributor.setShare(from, balanceOf(from), false) {} catch {} }
        if(!isDividendExempt[to]){ try distributor.setShare(to, balanceOf(to), false) {} catch {} }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WPLS();

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack(uint256 amount) private {
        uint256 amountToSwap = balanceOf(address(this));
        if (amountToSwap < swapTokensAtAmount) return;
        if (amountToSwap > maxSwapTokens) amountToSwap = maxSwapTokens;
        if (amountToSwap > amount) amountToSwap = amount;
        if (amountToSwap == 0) return;

        uint256 ethBalance = address(this).balance;

        swapTokensForEth(amountToSwap);

        uint256 generated = address(this).balance - ethBalance;

        if(generated > 0) {
            uint256 _split = taxSplit * generated / 100;
            if(_split > 0)
                try distributor.deposit{value: _split}() {} catch {}
            if(generated > _split){
                bool success;
                (success, ) = taxCollector.call{value: address(this).balance}("");
            }
        }
    }

    function withdrawTax() external {
        require(msg.sender == owner() || msg.sender == taxCollector, "Unauthorised");
        bool success;
        (success, ) = address(msg.sender).call{value: address(this).balance}("");
    }

    function addLP(uint256 nativeTokens, uint256 pairedTokens, address pairedWith) external payable onlyOwner {
        require(nativeTokens > 0, "No LP tokens specified");
        address ETH = dexRouter.WPLS();

        lpPair = IDexFactory(dexRouter.factory()).createPair(pairedWith, address(this));
        pairs[lpPair] = true;
        isDividendExempt[lpPair] = true;

        super._transfer(msg.sender, address(this), nativeTokens * _decimalFactor);

        if(pairedWith == ETH) {
            dexRouter.addLiquidityETH{value: msg.value}(address(this),balanceOf(address(this)),0,0,msg.sender,block.timestamp);
        }
        else { 
            IERC20Metadata tok = IERC20Metadata(pairedWith);
            //tok.transferFrom(msg.sender, address(this), pairedTokens * (10**tok.decimals()));
            dexRouter.addLiquidity(address(this), pairedWith, balanceOf(address(this)), tok.balanceOf(address(this)),0,0,msg.sender,block.timestamp);
        }
    }

    function launch() external onlyOwner {
        require(tradingActiveTime == 0);
        tradingActiveTime = block.number;
    }

    function setDistributor(address _distributor, bool migrate) public onlyOwner {
        if(migrate) 
            distributor.migrate(_distributor);

        distributor = IDividendDistributor(_distributor);
        distributor.initialize();
    }

    function claimDistributor(address _distributor) external onlyOwner {
        Ownable(_distributor).transferOwnership(msg.sender);
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _claimAfter) external onlyOwner {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution, _claimAfter);
    }

    function manualDeposit() payable external {
        distributor.deposit{value: msg.value}();
    }

    function getPoolStatistics() external view returns (uint256 totalRewards, uint256 totalRewardsPaid, uint256 rewardHolders) {
        totalRewards = distributor.getTotalDividends();
        totalRewardsPaid = distributor.getTotalDistributed();
        rewardHolders = distributor.countShareholders();
    }
    
    function myStatistics(address wallet) external view returns (uint256 reward, uint256 rewardClaimed) {
        reward = distributor.getUnpaidEarnings(wallet);
        rewardClaimed = distributor.getPaidDividends(wallet);
    }
    
    function checkClaimTime(address wallet) external view returns (uint256) {
        return distributor.getClaimTime(wallet);
    }
    
    function claim() external {
        distributor.claimDividend(msg.sender);
    }

    function airdropToWallets(address[] memory wallets, uint256[] memory amountsInTokens, bool dividends) external onlyOwner {
        require(wallets.length == amountsInTokens.length, "Arrays must be the same length");

        for (uint256 i = 0; i < wallets.length; i++) {
            super._transfer(msg.sender, wallets[i], amountsInTokens[i] * _decimalFactor);
            if(dividends)
                distributor.setShare(wallets[i], amountsInTokens[i] * _decimalFactor, false);
        }
    }

    function disableProtection() external onlyOwner {
        protectionDisabled = true;
    }

    function transferProtection(address[] calldata _wallets, uint256 _enabled) external onlyOwner {
        if(_enabled > 0) require(!protectionDisabled, "Disabled");
        for(uint256 i = 0; i < _wallets.length; i++) {
            walletProtection[_wallets[i]] = _enabled;
        }
    }

    function _beforeTokenTransfer(address from, address to) internal view {
        require(walletProtection[from] == 0 || to == owner(), "Wallet protection enabled, please contact support");
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"rwd","internalType":"address"}]},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ETH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_token","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"aprv","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDividend","inputs":[{"type":"address","name":"shareholder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"countShareholders","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentIndex","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"dividendsPerShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"dividendsPerShareAccuracyFactor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"extractLostETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"extractUnclaimed","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gas","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getClaimTime","inputs":[{"type":"address","name":"shareholder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPaidDividends","inputs":[{"type":"address","name":"shareholder","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalDistributed","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalDividends","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalPaid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUnpaidEarnings","inputs":[{"type":"address","name":"shareholder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"initialized","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[{"type":"address","name":"newDistributor","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minDistribution","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"process","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"processClaim","inputs":[{"type":"address","name":"shareholder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"reward","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"},{"type":"uint256","name":"_gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setShare","inputs":[{"type":"address","name":"shareholder","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bool","name":"exclude","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSlippage","inputs":[{"type":"uint256","name":"_slip","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"shareholderClaims","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"shareholderIndexes","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"shareholders","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"totalExcluded","internalType":"uint256"},{"type":"uint256","name":"totalRealised","internalType":"uint256"}],"name":"shares","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"slippage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDistributed","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalDividends","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalShares","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"unclaimed","inputs":[]}]
              

Contract Creation Code

Verify & Publish
0x60c06040526ec097ce7bc90715b34b9f1000000000600b55601e600c556001600d55620c3500600e55606260105534801562000039575f80fd5b5060405162003a3c38038062003a3c83398181016040528101906200005f919062000333565b5f620000706200020e60201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050620001506200021560201b60201c565b73165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001ae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001d4919062000333565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505062000423565b5f33905090565b60805173ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620002889291906200038e565b6020604051808303815f875af1158015620002a5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002cb9190620003f3565b50565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620002fd82620002d2565b9050919050565b6200030f81620002f1565b81146200031a575f80fd5b50565b5f815190506200032d8162000304565b92915050565b5f602082840312156200034b576200034a620002ce565b5b5f6200035a848285016200031d565b91505092915050565b6200036e81620002f1565b82525050565b5f819050919050565b620003888162000374565b82525050565b5f604082019050620003a35f83018562000363565b620003b260208301846200037d565b9392505050565b5f8115159050919050565b620003cf81620003b9565b8114620003da575f80fd5b50565b5f81519050620003ed81620003c4565b92915050565b5f602082840312156200040b576200040a620002ce565b5b5f6200041a84828501620003dd565b91505092915050565b60805160a0516135a3620004995f395f81816112e7015281816117ff015261255b01525f8181610af001528181610ffb015281816116600152818161169d015281816118360152818161198d01528181611a9501528181611bfd0152818161229901528181612592015261263e01526135a35ff3fe608060405260043610610245575f3560e01c8063715018a611610138578063d0e30db0116100b5578063ecd0c0c311610079578063ecd0c0c3146107f9578063efca2eed14610823578063f0fa55a91461084d578063f2fde38b14610875578063f7bf3f311461089d578063ffd49c84146108b357610245565b8063d0e30db01461074b578063d4fda1f214610755578063dabae90b14610791578063e2d2e219146107b9578063e5e1d949146107e357610245565b80639df62df2116100fc5780639df62df214610669578063ab377daa14610693578063c33fb877146106cf578063ce5494bb146106e5578063ce7c2ac21461070d57610245565b8063715018a6146105bf5780638129fc1c146105d55780638322fff2146105eb5780638da5cb5b14610615578063997664d71461063f57610245565b80633cbf8a61116101c657806366817df51161018a57806366817df5146104db578063669416b8146105175780636793141f1461054157806367ee5f091461056b5780636ca7c2161461059557610245565b80633cbf8a611461040b5780633e032a3b146104475780634fab0ae8146104715780635695fa581461049b578063636b8289146104c557610245565b8063228cb7331161020d578063228cb7331461032957806326987b601461035357806328fd31981461037d57806329cc05cf146103b95780633a98ef39146103e157610245565b80630ca61cb11461024957806311ce023d146102715780631329f8621461029b578063158ef93e146102d757806315f7e05e14610301575b5f80fd5b348015610254575f80fd5b5061026f600480360381019061026a91906129fc565b6108dd565b005b34801561027c575f80fd5b5061028561094f565b6040516102929190612a5b565b60405180910390f35b3480156102a6575f80fd5b506102c160048036038101906102bc9190612ace565b610955565b6040516102ce9190612a5b565b60405180910390f35b3480156102e2575f80fd5b506102eb610a21565b6040516102f89190612b13565b60405180910390f35b34801561030c575f80fd5b5061032760048036038101906103229190612ace565b610a33565b005b348015610334575f80fd5b5061033d610aee565b60405161034a9190612b87565b60405180910390f35b34801561035e575f80fd5b50610367610b12565b6040516103749190612a5b565b60405180910390f35b348015610388575f80fd5b506103a3600480360381019061039e9190612ace565b610b18565b6040516103b09190612a5b565b60405180910390f35b3480156103c4575f80fd5b506103df60048036038101906103da9190612bca565b610c1d565b005b3480156103ec575f80fd5b506103f5610e9c565b6040516104029190612a5b565b60405180910390f35b348015610416575f80fd5b50610431600480360381019061042c9190612ace565b610ea2565b60405161043e9190612a5b565b60405180910390f35b348015610452575f80fd5b5061045b610f43565b6040516104689190612a5b565b60405180910390f35b34801561047c575f80fd5b50610485610f49565b6040516104929190612a5b565b60405180910390f35b3480156104a6575f80fd5b506104af610f4f565b6040516104bc9190612a5b565b60405180910390f35b3480156104d0575f80fd5b506104d9610f58565b005b3480156104e6575f80fd5b5061050160048036038101906104fc9190612ace565b611098565b60405161050e9190612a5b565b60405180910390f35b348015610522575f80fd5b5061052b6110ad565b6040516105389190612a5b565b60405180910390f35b34801561054c575f80fd5b506105556110b3565b6040516105629190612a5b565b60405180910390f35b348015610576575f80fd5b5061057f611114565b60405161058c9190612a5b565b60405180910390f35b3480156105a0575f80fd5b506105a961111d565b6040516105b69190612a5b565b60405180910390f35b3480156105ca575f80fd5b506105d3611123565b005b3480156105e0575f80fd5b506105e9611271565b005b3480156105f6575f80fd5b506105ff6112e5565b60405161060c9190612c29565b60405180910390f35b348015610620575f80fd5b50610629611309565b6040516106369190612c29565b60405180910390f35b34801561064a575f80fd5b50610653611330565b6040516106609190612a5b565b60405180910390f35b348015610674575f80fd5b5061067d611336565b60405161068a9190612a5b565b60405180910390f35b34801561069e575f80fd5b506106b960048036038101906106b49190612c42565b611342565b6040516106c69190612c29565b60405180910390f35b3480156106da575f80fd5b506106e361137d565b005b3480156106f0575f80fd5b5061070b60048036038101906107069190612ace565b6114eb565b005b348015610718575f80fd5b50610733600480360381019061072e9190612ace565b6117d6565b60405161074293929190612c6d565b60405180910390f35b6107536117fc565b005b348015610760575f80fd5b5061077b60048036038101906107769190612ace565b611d36565b6040516107889190612a5b565b60405180910390f35b34801561079c575f80fd5b506107b760048036038101906107b29190612ace565b611d4b565b005b3480156107c4575f80fd5b506107cd611e42565b6040516107da9190612a5b565b60405180910390f35b3480156107ee575f80fd5b506107f7611e48565b005b348015610804575f80fd5b5061080d611f89565b60405161081a9190612c29565b60405180910390f35b34801561082e575f80fd5b50610837611fae565b6040516108449190612a5b565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190612c42565b611fb4565b005b348015610880575f80fd5b5061089b60048036038101906108969190612ace565b6120da565b005b3480156108a8575f80fd5b506108b1612297565b005b3480156108be575f80fd5b506108c7612369565b6040516108d49190612a5b565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610935575f80fd5b82600c8190555081600d8190555080600e81905550505050565b600b5481565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ae575f80fd5b5f600c5460045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546109fa9190612ccf565b9050428111610a0c575f915050610a1c565b4281610a189190612d02565b9150505b919050565b60115f9054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8b575f80fd5b5f610a9582610b18565b9050610aa1828261236f565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790612d8f565b60405180910390fd5b610aea82826123d2565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f5481565b5f8060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015403610b67575f9050610c18565b5f610bb060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01546126df565b90505f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050808211610c07575f92505050610c18565b8082610c139190612d02565b925050505b919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c75575f80fd5b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f83118015610cc657505f81145b15610d6857610cd484612712565b610cdd836126df565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055504260045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610d86565b5f83148015610d7657505f81115b15610d8557610d84846127bc565b5b5b5f610d9085610b18565b90505f82118015610d9f575082155b15610de5575f811115610de457610db6858261236f565b15610dca57610dc585826123d2565b610de3565b8060095f828254610ddb9190612ccf565b925050819055505b5b5b8382600654610df49190612d02565b610dfe9190612ccf565b6006819055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0181905550610e51846126df565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055505050505050565b60065481565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610efb575f80fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050919050565b60105481565b600d5481565b5f600854905090565b610f606129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390612df7565b60405180910390fd5b5f60095490505f6009819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611054929190612e15565b6020604051808303815f875af1158015611070573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110949190612e50565b5050565b6004602052805f5260405f205f915090505481565b60095481565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110c575f80fd5b600854905090565b5f600754905090565b600e5481565b61112b6129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90612df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60115f9054906101000a900460ff1615611289575f80fd5b3360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160115f6101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b5f600280549050905090565b60028181548110611351575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60028054905090505f810361139357506114e9565b5f805a90505f5b600e54831080156113aa57508381105b156114e45783600f54106113c0575f600f819055505b5f6114076002600f54815481106113da576113d9612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610b18565b90506114506002600f548154811061142257611421612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261236f565b1561149d5761149c6002600f548154811061146e5761146d612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826123d2565b5b5a836114a99190612d02565b846114b49190612ccf565b93505a9250600f5f8154809291906114cb90612ea8565b919050555081806114db90612ea8565b9250505061139a565b505050505b565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611543575f80fd5b5f8190508073ffffffffffffffffffffffffffffffffffffffff1663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190612e50565b156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90612f39565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff164760405161161990612f84565b5f6040518083038185875af1925050503d805f8114611653576040519150601f19603f3d011682016040523d82523d5f602084013e611658565b606091505b5050809150507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116f49190612c29565b602060405180830381865afa15801561170f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117339190612fac565b6040518363ffffffff1660e01b8152600401611750929190612e15565b6020604051808303815f875af115801561176c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117909190612e50565b50806117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613021565b60405180910390fd5b505050565b6005602052805f5260405f205f91509050805f0154908060010154908060020154905083565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611ca8575f600267ffffffffffffffff81111561188c5761188b61303f565b5b6040519080825280602002602001820160405280156118ba5781602001602082028036833780820191505090505b50905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561191a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061193e9190613080565b815f8151811061195157611950612e7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106119c0576119bf612e7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f4790505f73165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83856040518363ffffffff1660e01b8152600401611a4e929190613162565b5f60405180830381865afa158015611a68573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a9091906132b3565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aec9190612c29565b602060405180830381865afa158015611b07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2b9190612fac565b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff16637ff36ab584606460105486600181518110611b7757611b76612e7b565b5b6020026020010151611b8991906132fa565b611b939190613368565b8730426040518663ffffffff1660e01b8152600401611bb59493929190613398565b5f6040518083038185885af1158015611bd0573d5f803e3d5ffd5b50505050506040513d5f823e3d601f19601f82011682018060405250810190611bf991906132b3565b50807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c549190612c29565b602060405180830381865afa158015611c6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c939190612fac565b611c9d9190612d02565b945050505050611cac565b3490505b8060075f828254611cbd9190612ccf565b925050819055505f6006541115611d33575f600a5403611cff57600654600754600b54611cea91906132fa565b611cf49190613368565b600a81905550611d32565b60065481600b54611d1091906132fa565b611d1a9190613368565b600a5f828254611d2a9190612ccf565b925050819055505b5b50565b6003602052805f5260405f205f915090505481565b611d536129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690612df7565b60405180910390fd5b5f611de982610b18565b9050611df5828261236f565b611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90612d8f565b60405180910390fd5b611e3e82826123d2565b5050565b600a5481565b611e506129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390612df7565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff1647604051611f0190612f84565b5f6040518083038185875af1925050503d805f8114611f3b576040519150601f19603f3d011682016040523d82523d5f602084013e611f40565b606091505b50508091505080611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90613021565b60405180910390fd5b50565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b611fbc6129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f90612df7565b60405180910390fd5b606481111561208c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120839061342c565b60405180910390fd5b60328110156120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790613494565b60405180910390fd5b8060108190555050565b6120e26129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461216e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216590612df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390613522565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612326929190612e15565b6020604051808303815f875af1158015612342573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123669190612e50565b50565b600c5481565b5f42600c5460045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546123bc9190612ccf565b1080156123ca5750600d5482115b905092915050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015403156126db575f8111156126da578060085461242f9190612ccf565b6008819055504260045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f8282546124c69190612ccf565b9250508190555061251560055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01546126df565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff160361263c575f8273ffffffffffffffffffffffffffffffffffffffff16826040516125f190612f84565b5f6040518083038185875af1925050503d805f811461262b576040519150601f19603f3d011682016040523d82523d5f602084013e612630565b606091505b505080915050506126d9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612697929190612e15565b6020604051808303815f875af11580156126b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d79190612e50565b505b5b5b5050565b5f8082036126ef575f905061270d565b600b54600a548361270091906132fa565b61270a9190613368565b90505b919050565b60028054905060035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600281908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260016002805490506127d09190612d02565b815481106127e1576127e0612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548154811061285a57612859612e7b565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060035f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460035f600260016002805490506128f49190612d02565b8154811061290557612904612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600280548061297c5761297b613540565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6129db816129c9565b81146129e5575f80fd5b50565b5f813590506129f6816129d2565b92915050565b5f805f60608486031215612a1357612a126129c1565b5b5f612a20868287016129e8565b9350506020612a31868287016129e8565b9250506040612a42868287016129e8565b9150509250925092565b612a55816129c9565b82525050565b5f602082019050612a6e5f830184612a4c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a9d82612a74565b9050919050565b612aad81612a93565b8114612ab7575f80fd5b50565b5f81359050612ac881612aa4565b92915050565b5f60208284031215612ae357612ae26129c1565b5b5f612af084828501612aba565b91505092915050565b5f8115159050919050565b612b0d81612af9565b82525050565b5f602082019050612b265f830184612b04565b92915050565b5f819050919050565b5f612b4f612b4a612b4584612a74565b612b2c565b612a74565b9050919050565b5f612b6082612b35565b9050919050565b5f612b7182612b56565b9050919050565b612b8181612b67565b82525050565b5f602082019050612b9a5f830184612b78565b92915050565b612ba981612af9565b8114612bb3575f80fd5b50565b5f81359050612bc481612ba0565b92915050565b5f805f60608486031215612be157612be06129c1565b5b5f612bee86828701612aba565b9350506020612bff868287016129e8565b9250506040612c1086828701612bb6565b9150509250925092565b612c2381612a93565b82525050565b5f602082019050612c3c5f830184612c1a565b92915050565b5f60208284031215612c5757612c566129c1565b5b5f612c64848285016129e8565b91505092915050565b5f606082019050612c805f830186612a4c565b612c8d6020830185612a4c565b612c9a6040830184612a4c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612cd9826129c9565b9150612ce4836129c9565b9250828201905080821115612cfc57612cfb612ca2565b5b92915050565b5f612d0c826129c9565b9150612d17836129c9565b9250828203905081811115612d2f57612d2e612ca2565b5b92915050565b5f82825260208201905092915050565b7f4469766964656e6473206e6f7420617661696c61626c652079657400000000005f82015250565b5f612d79601b83612d35565b9150612d8482612d45565b602082019050919050565b5f6020820190508181035f830152612da681612d6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612de1602083612d35565b9150612dec82612dad565b602082019050919050565b5f6020820190508181035f830152612e0e81612dd5565b9050919050565b5f604082019050612e285f830185612c1a565b612e356020830184612a4c565b9392505050565b5f81519050612e4a81612ba0565b92915050565b5f60208284031215612e6557612e646129c1565b5b5f612e7284828501612e3c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612eb2826129c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ee457612ee3612ca2565b5b600182019050919050565b7f416c726561647920696e697469616c697a6564000000000000000000000000005f82015250565b5f612f23601383612d35565b9150612f2e82612eef565b602082019050919050565b5f6020820190508181035f830152612f5081612f17565b9050919050565b5f81905092915050565b50565b5f612f6f5f83612f57565b9150612f7a82612f61565b5f82019050919050565b5f612f8e82612f64565b9150819050919050565b5f81519050612fa6816129d2565b92915050565b5f60208284031215612fc157612fc06129c1565b5b5f612fce84828501612f98565b91505092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61300b600f83612d35565b915061301682612fd7565b602082019050919050565b5f6020820190508181035f83015261303881612fff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8151905061307a81612aa4565b92915050565b5f60208284031215613095576130946129c1565b5b5f6130a28482850161306c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6130dd81612a93565b82525050565b5f6130ee83836130d4565b60208301905092915050565b5f602082019050919050565b5f613110826130ab565b61311a81856130b5565b9350613125836130c5565b805f5b8381101561315557815161313c88826130e3565b9750613147836130fa565b925050600181019050613128565b5085935050505092915050565b5f6040820190506131755f830185612a4c565b81810360208301526131878184613106565b90509392505050565b5f80fd5b5f601f19601f8301169050919050565b6131ad82613194565b810181811067ffffffffffffffff821117156131cc576131cb61303f565b5b80604052505050565b5f6131de6129b8565b90506131ea82826131a4565b919050565b5f67ffffffffffffffff8211156132095761320861303f565b5b602082029050602081019050919050565b5f80fd5b5f61323061322b846131ef565b6131d5565b905080838252602082019050602084028301858111156132535761325261321a565b5b835b8181101561327c57806132688882612f98565b845260208401935050602081019050613255565b5050509392505050565b5f82601f83011261329a57613299613190565b5b81516132aa84826020860161321e565b91505092915050565b5f602082840312156132c8576132c76129c1565b5b5f82015167ffffffffffffffff8111156132e5576132e46129c5565b5b6132f184828501613286565b91505092915050565b5f613304826129c9565b915061330f836129c9565b925082820261331d816129c9565b9150828204841483151761333457613333612ca2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613372826129c9565b915061337d836129c9565b92508261338d5761338c61333b565b5b828204905092915050565b5f6080820190506133ab5f830187612a4c565b81810360208301526133bd8186613106565b90506133cc6040830185612c1a565b6133d96060830184612a4c565b95945050505050565b7f4d696e20736c69707061676520726561636865640000000000000000000000005f82015250565b5f613416601483612d35565b9150613421826133e2565b602082019050919050565b5f6020820190508181035f8301526134438161340a565b9050919050565b7f50726f6261626c7920746f6f206d75636820736c6970706167650000000000005f82015250565b5f61347e601a83612d35565b91506134898261344a565b602082019050919050565b5f6020820190508181035f8301526134ab81613472565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61350c602683612d35565b9150613517826134b2565b604082019050919050565b5f6020820190508181035f83015261353981613500565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea264697066735822122021f86a11cb5a4785b2c69b42db8049cc16a34eb7decb05f7a2a5a0f8d8e924cb64736f6c634300081500330000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d

Deployed ByteCode

0x608060405260043610610245575f3560e01c8063715018a611610138578063d0e30db0116100b5578063ecd0c0c311610079578063ecd0c0c3146107f9578063efca2eed14610823578063f0fa55a91461084d578063f2fde38b14610875578063f7bf3f311461089d578063ffd49c84146108b357610245565b8063d0e30db01461074b578063d4fda1f214610755578063dabae90b14610791578063e2d2e219146107b9578063e5e1d949146107e357610245565b80639df62df2116100fc5780639df62df214610669578063ab377daa14610693578063c33fb877146106cf578063ce5494bb146106e5578063ce7c2ac21461070d57610245565b8063715018a6146105bf5780638129fc1c146105d55780638322fff2146105eb5780638da5cb5b14610615578063997664d71461063f57610245565b80633cbf8a61116101c657806366817df51161018a57806366817df5146104db578063669416b8146105175780636793141f1461054157806367ee5f091461056b5780636ca7c2161461059557610245565b80633cbf8a611461040b5780633e032a3b146104475780634fab0ae8146104715780635695fa581461049b578063636b8289146104c557610245565b8063228cb7331161020d578063228cb7331461032957806326987b601461035357806328fd31981461037d57806329cc05cf146103b95780633a98ef39146103e157610245565b80630ca61cb11461024957806311ce023d146102715780631329f8621461029b578063158ef93e146102d757806315f7e05e14610301575b5f80fd5b348015610254575f80fd5b5061026f600480360381019061026a91906129fc565b6108dd565b005b34801561027c575f80fd5b5061028561094f565b6040516102929190612a5b565b60405180910390f35b3480156102a6575f80fd5b506102c160048036038101906102bc9190612ace565b610955565b6040516102ce9190612a5b565b60405180910390f35b3480156102e2575f80fd5b506102eb610a21565b6040516102f89190612b13565b60405180910390f35b34801561030c575f80fd5b5061032760048036038101906103229190612ace565b610a33565b005b348015610334575f80fd5b5061033d610aee565b60405161034a9190612b87565b60405180910390f35b34801561035e575f80fd5b50610367610b12565b6040516103749190612a5b565b60405180910390f35b348015610388575f80fd5b506103a3600480360381019061039e9190612ace565b610b18565b6040516103b09190612a5b565b60405180910390f35b3480156103c4575f80fd5b506103df60048036038101906103da9190612bca565b610c1d565b005b3480156103ec575f80fd5b506103f5610e9c565b6040516104029190612a5b565b60405180910390f35b348015610416575f80fd5b50610431600480360381019061042c9190612ace565b610ea2565b60405161043e9190612a5b565b60405180910390f35b348015610452575f80fd5b5061045b610f43565b6040516104689190612a5b565b60405180910390f35b34801561047c575f80fd5b50610485610f49565b6040516104929190612a5b565b60405180910390f35b3480156104a6575f80fd5b506104af610f4f565b6040516104bc9190612a5b565b60405180910390f35b3480156104d0575f80fd5b506104d9610f58565b005b3480156104e6575f80fd5b5061050160048036038101906104fc9190612ace565b611098565b60405161050e9190612a5b565b60405180910390f35b348015610522575f80fd5b5061052b6110ad565b6040516105389190612a5b565b60405180910390f35b34801561054c575f80fd5b506105556110b3565b6040516105629190612a5b565b60405180910390f35b348015610576575f80fd5b5061057f611114565b60405161058c9190612a5b565b60405180910390f35b3480156105a0575f80fd5b506105a961111d565b6040516105b69190612a5b565b60405180910390f35b3480156105ca575f80fd5b506105d3611123565b005b3480156105e0575f80fd5b506105e9611271565b005b3480156105f6575f80fd5b506105ff6112e5565b60405161060c9190612c29565b60405180910390f35b348015610620575f80fd5b50610629611309565b6040516106369190612c29565b60405180910390f35b34801561064a575f80fd5b50610653611330565b6040516106609190612a5b565b60405180910390f35b348015610674575f80fd5b5061067d611336565b60405161068a9190612a5b565b60405180910390f35b34801561069e575f80fd5b506106b960048036038101906106b49190612c42565b611342565b6040516106c69190612c29565b60405180910390f35b3480156106da575f80fd5b506106e361137d565b005b3480156106f0575f80fd5b5061070b60048036038101906107069190612ace565b6114eb565b005b348015610718575f80fd5b50610733600480360381019061072e9190612ace565b6117d6565b60405161074293929190612c6d565b60405180910390f35b6107536117fc565b005b348015610760575f80fd5b5061077b60048036038101906107769190612ace565b611d36565b6040516107889190612a5b565b60405180910390f35b34801561079c575f80fd5b506107b760048036038101906107b29190612ace565b611d4b565b005b3480156107c4575f80fd5b506107cd611e42565b6040516107da9190612a5b565b60405180910390f35b3480156107ee575f80fd5b506107f7611e48565b005b348015610804575f80fd5b5061080d611f89565b60405161081a9190612c29565b60405180910390f35b34801561082e575f80fd5b50610837611fae565b6040516108449190612a5b565b60405180910390f35b348015610858575f80fd5b50610873600480360381019061086e9190612c42565b611fb4565b005b348015610880575f80fd5b5061089b60048036038101906108969190612ace565b6120da565b005b3480156108a8575f80fd5b506108b1612297565b005b3480156108be575f80fd5b506108c7612369565b6040516108d49190612a5b565b60405180910390f35b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610935575f80fd5b82600c8190555081600d8190555080600e81905550505050565b600b5481565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109ae575f80fd5b5f600c5460045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546109fa9190612ccf565b9050428111610a0c575f915050610a1c565b4281610a189190612d02565b9150505b919050565b60115f9054906101000a900460ff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a8b575f80fd5b5f610a9582610b18565b9050610aa1828261236f565b610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790612d8f565b60405180910390fd5b610aea82826123d2565b5050565b7f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d81565b600f5481565b5f8060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015403610b67575f9050610c18565b5f610bb060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01546126df565b90505f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050808211610c07575f92505050610c18565b8082610c139190612d02565b925050505b919050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c75575f80fd5b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015490505f83118015610cc657505f81145b15610d6857610cd484612712565b610cdd836126df565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055504260045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550610d86565b5f83148015610d7657505f81115b15610d8557610d84846127bc565b5b5b5f610d9085610b18565b90505f82118015610d9f575082155b15610de5575f811115610de457610db6858261236f565b15610dca57610dc585826123d2565b610de3565b8060095f828254610ddb9190612ccf565b925050819055505b5b5b8382600654610df49190612d02565b610dfe9190612ccf565b6006819055508360055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f0181905550610e51846126df565b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055505050505050565b60065481565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610efb575f80fd5b60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600201549050919050565b60105481565b600d5481565b5f600854905090565b610f606129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe390612df7565b60405180910390fd5b5f60095490505f6009819055507f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611054929190612e15565b6020604051808303815f875af1158015611070573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110949190612e50565b5050565b6004602052805f5260405f205f915090505481565b60095481565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110c575f80fd5b600854905090565b5f600754905090565b600e5481565b61112b6129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90612df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60115f9054906101000a900460ff1615611289575f80fd5b3360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160115f6101000a81548160ff021916908315150217905550565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2781565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b5f600280549050905090565b60028181548110611351575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60028054905090505f810361139357506114e9565b5f805a90505f5b600e54831080156113aa57508381105b156114e45783600f54106113c0575f600f819055505b5f6114076002600f54815481106113da576113d9612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610b18565b90506114506002600f548154811061142257611421612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261236f565b1561149d5761149c6002600f548154811061146e5761146d612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826123d2565b5b5a836114a99190612d02565b846114b49190612ccf565b93505a9250600f5f8154809291906114cb90612ea8565b919050555081806114db90612ea8565b9250505061139a565b505050505b565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611543575f80fd5b5f8190508073ffffffffffffffffffffffffffffffffffffffff1663158ef93e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190612e50565b156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90612f39565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff164760405161161990612f84565b5f6040518083038185875af1925050503d805f8114611653576040519150601f19603f3d011682016040523d82523d5f602084013e611658565b606091505b5050809150507f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb847f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116f49190612c29565b602060405180830381865afa15801561170f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117339190612fac565b6040518363ffffffff1660e01b8152600401611750929190612e15565b6020604051808303815f875af115801561176c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117909190612e50565b50806117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613021565b60405180910390fd5b505050565b6005602052805f5260405f205f91509050805f0154908060010154908060020154905083565b5f7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1614611ca8575f600267ffffffffffffffff81111561188c5761188b61303f565b5b6040519080825280602002602001820160405280156118ba5781602001602082028036833780820191505090505b50905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561191a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061193e9190613080565b815f8151811061195157611950612e7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d816001815181106119c0576119bf612e7b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f4790505f73165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff1663d06ca61f83856040518363ffffffff1660e01b8152600401611a4e929190613162565b5f60405180830381865afa158015611a68573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a9091906132b3565b90505f7f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aec9190612c29565b602060405180830381865afa158015611b07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2b9190612fac565b905073165c3410fc91ef562c50559f7d2289febed552d973ffffffffffffffffffffffffffffffffffffffff16637ff36ab584606460105486600181518110611b7757611b76612e7b565b5b6020026020010151611b8991906132fa565b611b939190613368565b8730426040518663ffffffff1660e01b8152600401611bb59493929190613398565b5f6040518083038185885af1158015611bd0573d5f803e3d5ffd5b50505050506040513d5f823e3d601f19601f82011682018060405250810190611bf991906132b3565b50807f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611c549190612c29565b602060405180830381865afa158015611c6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c939190612fac565b611c9d9190612d02565b945050505050611cac565b3490505b8060075f828254611cbd9190612ccf565b925050819055505f6006541115611d33575f600a5403611cff57600654600754600b54611cea91906132fa565b611cf49190613368565b600a81905550611d32565b60065481600b54611d1091906132fa565b611d1a9190613368565b600a5f828254611d2a9190612ccf565b925050819055505b5b50565b6003602052805f5260405f205f915090505481565b611d536129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd690612df7565b60405180910390fd5b5f611de982610b18565b9050611df5828261236f565b611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90612d8f565b60405180910390fd5b611e3e82826123d2565b5050565b600a5481565b611e506129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390612df7565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff1647604051611f0190612f84565b5f6040518083038185875af1925050503d805f8114611f3b576040519150601f19603f3d011682016040523d82523d5f602084013e611f40565b606091505b50508091505080611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d90613021565b60405180910390fd5b50565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b611fbc6129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f90612df7565b60405180910390fd5b606481111561208c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120839061342c565b60405180910390fd5b60328110156120d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c790613494565b60405180910390fd5b8060108190555050565b6120e26129b1565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461216e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216590612df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d390613522565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663095ea7b373165c3410fc91ef562c50559f7d2289febed552d97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612326929190612e15565b6020604051808303815f875af1158015612342573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123669190612e50565b50565b600c5481565b5f42600c5460045f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546123bc9190612ccf565b1080156123ca5750600d5482115b905092915050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015403156126db575f8111156126da578060085461242f9190612ccf565b6008819055504260045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f8282546124c69190612ccf565b9250508190555061251560055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01546126df565b60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055507f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2773ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff160361263c575f8273ffffffffffffffffffffffffffffffffffffffff16826040516125f190612f84565b5f6040518083038185875af1925050503d805f811461262b576040519150601f19603f3d011682016040523d82523d5f602084013e612630565b606091505b505080915050506126d9565b7f0000000000000000000000002fa878ab3f87cc1c9737fc071108f904c0b0c95d73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401612697929190612e15565b6020604051808303815f875af11580156126b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d79190612e50565b505b5b5b5050565b5f8082036126ef575f905061270d565b600b54600a548361270091906132fa565b61270a9190613368565b90505b919050565b60028054905060035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600281908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260016002805490506127d09190612d02565b815481106127e1576127e0612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548154811061285a57612859612e7b565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060035f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460035f600260016002805490506128f49190612d02565b8154811061290557612904612e7b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550600280548061297c5761297b613540565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b5f33905090565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b6129db816129c9565b81146129e5575f80fd5b50565b5f813590506129f6816129d2565b92915050565b5f805f60608486031215612a1357612a126129c1565b5b5f612a20868287016129e8565b9350506020612a31868287016129e8565b9250506040612a42868287016129e8565b9150509250925092565b612a55816129c9565b82525050565b5f602082019050612a6e5f830184612a4c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612a9d82612a74565b9050919050565b612aad81612a93565b8114612ab7575f80fd5b50565b5f81359050612ac881612aa4565b92915050565b5f60208284031215612ae357612ae26129c1565b5b5f612af084828501612aba565b91505092915050565b5f8115159050919050565b612b0d81612af9565b82525050565b5f602082019050612b265f830184612b04565b92915050565b5f819050919050565b5f612b4f612b4a612b4584612a74565b612b2c565b612a74565b9050919050565b5f612b6082612b35565b9050919050565b5f612b7182612b56565b9050919050565b612b8181612b67565b82525050565b5f602082019050612b9a5f830184612b78565b92915050565b612ba981612af9565b8114612bb3575f80fd5b50565b5f81359050612bc481612ba0565b92915050565b5f805f60608486031215612be157612be06129c1565b5b5f612bee86828701612aba565b9350506020612bff868287016129e8565b9250506040612c1086828701612bb6565b9150509250925092565b612c2381612a93565b82525050565b5f602082019050612c3c5f830184612c1a565b92915050565b5f60208284031215612c5757612c566129c1565b5b5f612c64848285016129e8565b91505092915050565b5f606082019050612c805f830186612a4c565b612c8d6020830185612a4c565b612c9a6040830184612a4c565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612cd9826129c9565b9150612ce4836129c9565b9250828201905080821115612cfc57612cfb612ca2565b5b92915050565b5f612d0c826129c9565b9150612d17836129c9565b9250828203905081811115612d2f57612d2e612ca2565b5b92915050565b5f82825260208201905092915050565b7f4469766964656e6473206e6f7420617661696c61626c652079657400000000005f82015250565b5f612d79601b83612d35565b9150612d8482612d45565b602082019050919050565b5f6020820190508181035f830152612da681612d6d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612de1602083612d35565b9150612dec82612dad565b602082019050919050565b5f6020820190508181035f830152612e0e81612dd5565b9050919050565b5f604082019050612e285f830185612c1a565b612e356020830184612a4c565b9392505050565b5f81519050612e4a81612ba0565b92915050565b5f60208284031215612e6557612e646129c1565b5b5f612e7284828501612e3c565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f612eb2826129c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ee457612ee3612ca2565b5b600182019050919050565b7f416c726561647920696e697469616c697a6564000000000000000000000000005f82015250565b5f612f23601383612d35565b9150612f2e82612eef565b602082019050919050565b5f6020820190508181035f830152612f5081612f17565b9050919050565b5f81905092915050565b50565b5f612f6f5f83612f57565b9150612f7a82612f61565b5f82019050919050565b5f612f8e82612f64565b9150819050919050565b5f81519050612fa6816129d2565b92915050565b5f60208284031215612fc157612fc06129c1565b5b5f612fce84828501612f98565b91505092915050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61300b600f83612d35565b915061301682612fd7565b602082019050919050565b5f6020820190508181035f83015261303881612fff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8151905061307a81612aa4565b92915050565b5f60208284031215613095576130946129c1565b5b5f6130a28482850161306c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6130dd81612a93565b82525050565b5f6130ee83836130d4565b60208301905092915050565b5f602082019050919050565b5f613110826130ab565b61311a81856130b5565b9350613125836130c5565b805f5b8381101561315557815161313c88826130e3565b9750613147836130fa565b925050600181019050613128565b5085935050505092915050565b5f6040820190506131755f830185612a4c565b81810360208301526131878184613106565b90509392505050565b5f80fd5b5f601f19601f8301169050919050565b6131ad82613194565b810181811067ffffffffffffffff821117156131cc576131cb61303f565b5b80604052505050565b5f6131de6129b8565b90506131ea82826131a4565b919050565b5f67ffffffffffffffff8211156132095761320861303f565b5b602082029050602081019050919050565b5f80fd5b5f61323061322b846131ef565b6131d5565b905080838252602082019050602084028301858111156132535761325261321a565b5b835b8181101561327c57806132688882612f98565b845260208401935050602081019050613255565b5050509392505050565b5f82601f83011261329a57613299613190565b5b81516132aa84826020860161321e565b91505092915050565b5f602082840312156132c8576132c76129c1565b5b5f82015167ffffffffffffffff8111156132e5576132e46129c5565b5b6132f184828501613286565b91505092915050565b5f613304826129c9565b915061330f836129c9565b925082820261331d816129c9565b9150828204841483151761333457613333612ca2565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f613372826129c9565b915061337d836129c9565b92508261338d5761338c61333b565b5b828204905092915050565b5f6080820190506133ab5f830187612a4c565b81810360208301526133bd8186613106565b90506133cc6040830185612c1a565b6133d96060830184612a4c565b95945050505050565b7f4d696e20736c69707061676520726561636865640000000000000000000000005f82015250565b5f613416601483612d35565b9150613421826133e2565b602082019050919050565b5f6020820190508181035f8301526134438161340a565b9050919050565b7f50726f6261626c7920746f6f206d75636820736c6970706167650000000000005f82015250565b5f61347e601a83612d35565b91506134898261344a565b602082019050919050565b5f6020820190508181035f8301526134ab81613472565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61350c602683612d35565b9150613517826134b2565b604082019050919050565b5f6020820190508181035f83015261353981613500565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea264697066735822122021f86a11cb5a4785b2c69b42db8049cc16a34eb7decb05f7a2a5a0f8d8e924cb64736f6c63430008150033