false
true
0

Contract Address Details

0x2f28EC133bd2861a166d375145513EEd7F4947B4

Token
PulseMoonR (MOONR)
Creator
0x41c831–d18765 at 0x463ef4–a5abf6
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
2,459 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26063843
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
TOKEN




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
999999
EVM Version
default




Verified at
2023-05-25T14:28:09.660607Z

reflections++.sol

// SPDX-License-Identifier: MIT

/**


__________      .__                     _____                     /\__________ 
\______   \__ __|  |   ______ ____     /     \   ____   ____   ___)/\______   \
 |     ___/  |  \  |  /  ___// __ \   /  \ /  \ /  _ \ /  _ \ /    \ |       _/
 |    |   |  |  /  |__\___ \\  ___/  /    Y    (  <_> |  <_> )   |  \|    |   \
 |____|   |____/|____/____  >\___  > \____|__  /\____/ \____/|___|  /|____|_  /
                          \/     \/          \/                   \/        \/ 



 website: https://pulsemoonr.com

 Why buy Pulse Moon'R?

- No admin keys, pure community-driven control.
- Reflections on steroids, turbocharged rewards and exponential growth.
- Liquidity added only when price rises.
- Buyback and burns otherwise.
- Max holding limited to 1% of supply.
- Trading makes price rise.
- 3% tax on buys and sells to fuel our ecosystem's growth on every transaction.
- 1.5% for liquidity and buybacks.
- 1% distributed to hodlers.
- 0.5% for project growth.

 */

pragma solidity ^0.8.10;

import "./ierc20.sol";
import "./manageable.sol";
import "./safeMath.sol";

interface IContractsManager {
    function find(string memory contractName) external view returns (address, bool);
}

interface IPoolMgmt {
    function updatePoolPriceAvgs() external;
    function tryIncreasePoolDepth() external;
    function addTokensForPoolAccounting(uint256 numTokens) external;
    function trySwapTokenFeesForErc20() external;
    function startPool(uint256 erc20Amount) external;
}

interface IMAddressMgmt {
    function addTokensForMktAccounting(uint256 numTokens) external;
    function transferMkt() external;
}


abstract contract PoolMgmt is Manageable {

    IPoolMgmt public POOL_MGMT;
    IMAddressMgmt public MADDRESS_CONTRACT;
    IERC20 public ERC20_CONTRACT;
    address public UNISWAP_ROUTER;

    mapping(address => bool) internal _isPool;
    mapping(address => bool) internal _isBanned;

    bool public IS_BYPASS_ACTIVE = false;


    /**
     * @dev External function to ban other pools
     */
    function banPool(address poolAddress, bool isBanned) mod_onlyManager external {
        _isBanned[poolAddress] = isBanned;
    }

    /**
     * @dev External function to manage taxing
     */
    function setIsByPassActive(bool value) external mod_onlyManager {
        IS_BYPASS_ACTIVE = value;
    }

    /**
     * @dev External function to manage trading activity
     */
    function startPool(uint256 erc20Amount) external mod_onlyOwner {
        
        
        IS_BYPASS_ACTIVE = true;

        ERC20_CONTRACT.approve(address(POOL_MGMT), erc20Amount);
        POOL_MGMT.startPool(erc20Amount);
        IS_BYPASS_ACTIVE = false;

        updatePoolDepthAndAvgs();
    }


    /**
     * @dev Public function to call all main accounting functions related to pool mgmt
     */
    function updatePoolDepthAndAvgs() public {
        if (!IS_BYPASS_ACTIVE) {

            IS_BYPASS_ACTIVE = true;
            POOL_MGMT.updatePoolPriceAvgs();
            try POOL_MGMT.trySwapTokenFeesForErc20() {} catch {}
            try POOL_MGMT.tryIncreasePoolDepth() {} catch {}
            IS_BYPASS_ACTIVE = false;
        }
    }

    function transferMkt() public {
        IS_BYPASS_ACTIVE = true;
        try MADDRESS_CONTRACT.transferMkt() {} catch {}
        IS_BYPASS_ACTIVE = false;
    }

}

abstract contract Reflections is PoolMgmt {

    using SafeMath for uint256;

    mapping (address => uint256) internal _rOwned;
    mapping (address => uint256) internal _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) public isExcludedFromReflections;
    mapping (address => bool) public isExcludedFromFees;
    address[] internal _excluded;

    string public name;
    string public symbol;
    uint8 public decimals = 18;

    uint256 internal constant MAX = ~uint256(0);
    uint256 internal _tTotal;
    uint256 internal _rTotal;
    uint256 internal _tFeeTotal;

    uint256 internal _reflectFeeTemp;
    uint256 public reflectFee;
    uint256 public poolFee;
    uint256 public mktFee;
    uint256 public feeDen;

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

    function totalSupply() public view returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view returns (uint256) {
        if (isExcludedFromReflections[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function setIsExcludedFromFees(address account, bool isExcluded) public mod_onlyManager() {
        isExcludedFromFees[account] = isExcluded;
    } 

    function excludeAccount(address account) public {
        require(_msgSender() == owner() || _msgSender() == address(POOL_MGMT));
        require(!isExcludedFromReflections[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        isExcludedFromReflections[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) public {
        require(_msgSender() == owner() || _msgSender() == address(POOL_MGMT));
        require(isExcludedFromReflections[account], "Account is already included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                isExcludedFromReflections[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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 _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) public view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount) public view returns (uint256, uint256) {
        uint256 tFee = tAmount.mul(reflectFee).div(feeDen);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) public pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() public view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() public view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);       
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }


    function _transfer(address sender, address recipient, uint256 amount) virtual internal {
    }

}

contract TOKEN is Reflections {
    using SafeMath for uint256;

    constructor() {
        construct("PulseMoonR", "MOONR", 1000000, 10, 15, 5, 1000, 1000000);
    }

    //start rate before minting
    uint256 private _stTotal;
    uint256 private _srTotal;
    bool private minted;
    uint256 public holdingLimitNum = 10;
    uint256 private initialHoldings = 220690042 * 10**decimals;
    address public DEAD_ADDRESS = address(0x000000000000000000000000000000000000dEaD);


    function construct(string memory tokenName, string memory tokenSymbol, uint256 supply, uint256 rFee, uint256 pFee, uint256 mFee, uint256 fDen, uint256 divisor) private {
        name = tokenName;
        symbol = tokenSymbol;

        _stTotal = supply * 10**decimals;
        //Supply can be increased by factor of divisor   
        _srTotal = MAX / divisor;
        
        reflectFee = rFee;
        poolFee = pFee;
        mktFee = mFee;
        feeDen = fDen;

        setIsExcludedFromFees(address(this), true);

        _mint(DEAD_ADDRESS, initialHoldings);
    }

        /**
     * @dev External function to register a pool
     */
    function registerPool(address poolAddress, bool isPool) external {
        require(_msgSender() == owner() || _msgSender() == address(POOL_MGMT));
        _isPool[poolAddress] = isPool;
        if(isPool && !isExcludedFromReflections[poolAddress]) excludeAccount(poolAddress);
        if(!isPool && isExcludedFromReflections[poolAddress]) includeAccount(poolAddress);
    }

    function setHoldingLimitNum(uint256 value) external mod_onlyManager() {
        holdingLimitNum = value;
    }

    // Check if the transfer exceeds the maximum threshold
    function checkThreshold(address to, uint256 value, uint256 limitNum) internal view returns (bool) {
        uint256 newBalance = balanceOf(to) + value;
        uint256 threshold = totalSupply().mul(limitNum).div(1000);
        return newBalance <= threshold;
    }

    function _transfer(address sender, address recipient, uint256 amount) override internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");


        //check if sender or recipient are banned pools
        require(!_isBanned[sender] && !_isBanned[recipient], "Pool banned");

         //set the receive amount, which can be affected if the sender or recipient aren't excluded
        uint256 receiveAmount = amount;

        //main exclusions: the contract, the auctions contract, the pool mgmt contract
        //tax bypass may be enabled for specific operations
        if (!isExcludedFromFees[sender] && !isExcludedFromFees[recipient] && !IS_BYPASS_ACTIVE) {
            IS_BYPASS_ACTIVE = true;

            //this is a buy - taxes are used for pool mgmt
            if (_isPool[sender]) {
                
                //update price averages
                POOL_MGMT.updatePoolPriceAvgs();
            }
            //this is a sell - taxes are used for token burning
            else if (_isPool[recipient]) {
               
                //update price averages
                POOL_MGMT.updatePoolPriceAvgs();
                //sell pool tokens for ERC20
                try POOL_MGMT.trySwapTokenFeesForErc20() {} catch {}
                //increase pool depth if needed
                try POOL_MGMT.tryIncreasePoolDepth() {} catch {}

                try MADDRESS_CONTRACT.transferMkt() {} catch {}
            }

            uint256 poolTax = receiveAmount.mul(poolFee).div(feeDen);
            receiveAmount = receiveAmount.sub(poolTax);

            POOL_MGMT.addTokensForPoolAccounting(poolTax);
            _tokenTransfer(sender, address(POOL_MGMT), poolTax);

            uint256 mktTax = receiveAmount.mul(mktFee).div(feeDen);
            receiveAmount = receiveAmount.sub(mktTax);

            MADDRESS_CONTRACT.addTokensForMktAccounting(mktTax);
            _tokenTransfer(sender, address(MADDRESS_CONTRACT), mktTax);

            if(_isPool[sender] || !_isPool[recipient]) {
                //check if the buy increases the token holder above x%
                require(checkThreshold(recipient, receiveAmount, holdingLimitNum), "Recipient can't hold more than limit percentage");
            }

            IS_BYPASS_ACTIVE = false;
        }
        
        _tokenTransfer(sender, recipient, receiveAmount);
    }


    function _tokenTransfer(address sender, address recipient, uint256 amount) private {

        if(isExcludedFromFees[sender] || isExcludedFromFees[recipient]) { _reflectFeeTemp = reflectFee; reflectFee = 0; }

        if (isExcludedFromReflections[sender] && !isExcludedFromReflections[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } 
        else if (!isExcludedFromReflections[sender] && isExcludedFromReflections[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } 
        else if (isExcludedFromReflections[sender] && isExcludedFromReflections[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } 
        else {
            _transferStandard(sender, recipient, amount);
        }

        if(isExcludedFromFees[sender] || isExcludedFromFees[recipient]) reflectFee = _reflectFeeTemp;
    }

    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        uint256 rAmount = 0;

        if(!minted) {
            uint256 rate = _srTotal.div(_stTotal);
            rAmount = amount.mul(rate);
            minted = true;
        }
        else {
            rAmount = amount.mul(_getRate());
        }

        _rTotal = _rTotal.add(rAmount);
        _tTotal = _tTotal.add(amount);

        if (isExcludedFromReflections[account]) {
            _tOwned[account] = _tOwned[account].add(amount);
        }

        _rOwned[account] = _rOwned[account].add(rAmount);
        
        emit Transfer(address(0), account, amount);
    }

    
    /**
     * @dev External function to mint new TOKEN supply
     */
    function mintSupply(address account, uint256 amount) external {
        require(msg.sender == address(POOL_MGMT), "Not authorized");
        _mint(account, amount);
    }
    


    function setContracts(address contractsManager) external mod_onlyOwner {

        //Pool Mgmt
        (address ctr, bool found) = IContractsManager(contractsManager).find("POOL_MGMT");
        require(found, "Contract not found");
        POOL_MGMT = IPoolMgmt(ctr);
        isExcludedFromFees[address(POOL_MGMT)] = true;

        //MAddress contract
        (ctr, found) = IContractsManager(contractsManager).find("MADDRESS_CONTRACT");
        require(found, "Contract not found");
        MADDRESS_CONTRACT = IMAddressMgmt(ctr);
        isExcludedFromFees[address(MADDRESS_CONTRACT)] = true;

        //Uniswap Router
        (ctr, found) = IContractsManager(contractsManager).find("UNISWAP_ROUTER");
        require(found, "Contract not found");
        UNISWAP_ROUTER = ctr;

        //Erc20 contract
        (ctr, found) = IContractsManager(contractsManager).find("ERC20_CONTRACT");
        require(found, "Contract not found");
        ERC20_CONTRACT = IERC20(ctr);
    }
}
        

ierc20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC20 {
    

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) 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);
}
          

manageable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ownable.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an manager) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the manager account will be the one that deploys the contract. This
 * can later be changed with {transferManagership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `mod_onlyManager`, which can be applied to your functions to restrict their use to
 * the manager.
 */
abstract contract Manageable is Ownable {
    address private _manager;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial manager.
     */
    constructor() {
        _transferManagership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the manager.
     */
    modifier mod_onlyManager() {
        _checkManager();
        _;
    }

    /**
     * @dev Returns the address of the current manager.
     */
    function manager() public view virtual returns (address) {
        return _manager;
    }

    /**
     * @dev Throws if the sender is not the manager.
     */
    function _checkManager() internal view virtual {
        require(manager() == _msgSender(), "Manageable: caller is not the manager");
    }

    /**
     * @dev Leaves the contract without manager. It will not be possible to call
     * `mod_onlyManager` functions. Can only be called by the current manager.
     *
     * NOTE: Renouncing managership will leave the contract without an manager,
     * thereby disabling any functionality that is only available to the manager.
     */
    function renounceManagership() public virtual mod_onlyManager {
        _transferManagership(address(0));
    }

    /**
     * @dev Transfers managership of the contract to a new account (`newManager`).
     * Can only be called by the current manager.
     */
    function transferManagership(address newManager) public virtual mod_onlyManager {
        require(newManager != address(0), "Manageable: new manager is the zero address");
        _transferManagership(newManager);
    }

    /**
     * @dev Transfers managership of the contract to a new account (`newManager`).
     * Internal function without access restriction.
     */
    function _transferManagership(address newManager) internal virtual {
        address oldManager = _manager;
        _manager = newManager;
        emit ManagershipTransferred(oldManager, newManager);
    }
}
          

ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `mod_onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier mod_onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `mod_onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual mod_onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual mod_onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

safeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}
          

Contract ABI

[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"ERC20_CONTRACT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"IS_BYPASS_ACTIVE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMAddressMgmt"}],"name":"MADDRESS_CONTRACT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPoolMgmt"}],"name":"POOL_MGMT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"UNISWAP_ROUTER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getCurrentSupply","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getRValues","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"uint256","name":"tFee","internalType":"uint256"},{"type":"uint256","name":"currentRate","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getTValues","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"_getValues","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"banPool","inputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bool","name":"isBanned","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDen","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"holdingLimitNum","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReflections","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintSupply","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mktFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerPool","inputs":[{"type":"address","name":"poolAddress","internalType":"address"},{"type":"bool","name":"isPool","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceManagership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setContracts","inputs":[{"type":"address","name":"contractsManager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHoldingLimitNum","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsByPassActive","inputs":[{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsExcludedFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"isExcluded","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startPool","inputs":[{"type":"uint256","name":"erc20Amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferManagership","inputs":[{"type":"address","name":"newManager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferMkt","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePoolDepthAndAvgs","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"ManagershipTransferred","inputs":[{"type":"address","name":"previousManager","indexed":true},{"type":"address","name":"newManager","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false}]
              

Contract Creation Code

0x60806040526008805460ff19908116909155601180546012921682179055600a601d819055620000309190620009e2565b6200004090630d27767a620009f3565b601e55601f80546001600160a01b03191661dead1790553480156200006457600080fd5b506200007033620000e3565b6200007b3362000133565b620000dd6040518060400160405280600a815260200169283ab639b2a6b7b7b72960b11b8152506040518060400160405280600581526020016426a7a7a72960d91b815250620f4240600a600f60056103e8620f42406200018560201b60201c565b62000c4f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f697e4e68d3879b0dd3414a88905117bac8f0a54b0cd8e7779f909bf1a1cf568390600090a35050565b600f62000193898262000ab2565b506010620001a2888262000ab2565b50601154620001b69060ff16600a620009e2565b620001c29087620009f3565b601a55620001d38160001962000b7e565b601b556016859055601784905560188390556019829055620001f73060016200021c565b601f54601e5462000212916001600160a01b03169062000251565b5050505050505050565b6200022662000474565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b6001600160a01b038216620002ad5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b601c5460009060ff166200030e576000620002db601a54601b54620004e060201b620021191790919060201c565b9050620002f781846200053360201b6200215b1790919060201c565b601c805460ff191660011790559150620003349050565b620003316200031c620005bd565b836200053360201b6200215b1790919060201c565b90505b6200035081601354620005f060201b620022131790919060201c565b6013819055506200037282601254620005f060201b620022131790919060201c565b6012556001600160a01b0383166000908152600c602052604090205460ff1615620003e3576001600160a01b0383166000908152600a6020908152604090912054620003c991849062002213620005f0821b17901c565b6001600160a01b0384166000908152600a60205260409020555b6001600160a01b0383166000908152600960209081526040909120546200041591839062002213620005f0821b17901c565b6001600160a01b0384166000818152600960205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620004679086815260200190565b60405180910390a3505050565b6001546001600160a01b03163314620004de5760405162461bcd60e51b815260206004820152602560248201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616044820152643730b3b2b960d91b6064820152608401620002a4565b565b60006200052a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200065360201b60201c565b90505b92915050565b60008260000362000547575060006200052d565b6000620005558385620009f3565b90508262000564858362000b7e565b146200052a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401620002a4565b60008080620005cb6200068f565b91509150620005e98183620004e060201b620021191790919060201c565b9250505090565b600080620005ff838562000ba1565b9050838110156200052a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620002a4565b60008183620006775760405162461bcd60e51b8152600401620002a4919062000bb7565b50600062000686848662000b7e565b95945050505050565b6013546012546000918291825b600e548110156200080f578260096000600e8481548110620006c257620006c262000c07565b60009182526020808320909101546001600160a01b03168352820192909252604001902054118062000731575081600a6000600e84815481106200070a576200070a62000c07565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156200074857601354601254945094505050509091565b6200079f60096000600e848154811062000766576200076662000c07565b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205485916200228c6200084f821b17901c565b9250620007f8600a6000600e8481548110620007bf57620007bf62000c07565b60009182526020808320909101546001600160a01b0316835282810193909352604090910190205484916200228c6200084f821b17901c565b915080620008068162000c1d565b9150506200069c565b506200082e601254601354620004e060201b620021191790919060201c565b82101562000846576013546012549350935050509091565b90939092509050565b60006200052a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200089960201b60201c565b60008184841115620008c05760405162461bcd60e51b8152600401620002a4919062000bb7565b50600062000686848662000c39565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620009265781600019048211156200090a576200090a620008cf565b808516156200091857918102915b93841c9390800290620008ea565b509250929050565b6000826200093f575060016200052d565b816200094e575060006200052d565b8160018114620009675760028114620009725762000992565b60019150506200052d565b60ff841115620009865762000986620008cf565b50506001821b6200052d565b5060208310610133831016604e8410600b8410161715620009b7575081810a6200052d565b620009c38383620008e5565b8060001904821115620009da57620009da620008cf565b029392505050565b60006200052a60ff8416836200092e565b80820281158282048414176200052d576200052d620008cf565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a3857607f821691505b60208210810362000a5957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000aad57600081815260208120601f850160051c8101602086101562000a885750805b601f850160051c820191505b8181101562000aa95782815560010162000a94565b5050505b505050565b81516001600160401b0381111562000ace5762000ace62000a0d565b62000ae68162000adf845462000a23565b8462000a5f565b602080601f83116001811462000b1e576000841562000b055750858301515b600019600386901b1c1916600185901b17855562000aa9565b600085815260208120601f198616915b8281101562000b4f5788860151825594840194600190910190840162000b2e565b508582101562000b6e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008262000b9c57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200052d576200052d620008cf565b600060208083528351808285015260005b8181101562000be65785810183015185820160400152820162000bc8565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052603260045260246000fd5b60006001820162000c325762000c32620008cf565b5060010190565b818103818111156200052d576200052d620008cf565b613c4e8062000c5f6000396000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c80638da5cb5b116101b2578063d4780e36116100f9578063e742806a116100a2578063f2cc0c181161007c578063f2cc0c181461076e578063f2fde38b14610781578063f84354f114610794578063fbf9bc84146107a757600080fd5b8063e742806a14610732578063e9cabe7f14610745578063ed9442f61461076557600080fd5b8063d9af257b116100d3578063d9af257b146106c0578063dd62ed3e146106c9578063e6375d3e1461070f57600080fd5b8063d4780e3614610652578063d5de6ede1461068d578063d8264920146106a057600080fd5b8063a901d15c1161015b578063c2264c6a11610135578063c2264c6a14610609578063c542eccc14610637578063ccc399091461063f57600080fd5b8063a901d15c146105d0578063a9059cbb146105e3578063adf18693146105f657600080fd5b806395d89b411161018c57806395d89b41146105ad57806397a9d560146105b5578063a457c2d7146105bd57600080fd5b80638da5cb5b1461057e578063941abdc11461059c57806394e10784146105a557600080fd5b80633526c0bd116102815780634fd89f9b1161022a5780636c146d9b116102045780636c146d9b146105525780636f9fedfb1461055a57806370a0823114610563578063715018a61461057657600080fd5b80634fd89f9b146105175780635a2e2f471461051f5780636b9f69b41461053257600080fd5b8063481c6a751161025b578063481c6a75146104b65780634e6fd6c4146104d45780634fbee193146104f457600080fd5b80633526c0bd1461047d57806339509351146104905780634549b039146104a357600080fd5b8063149b3bfa116102e357806323b872dd116102bd57806323b872dd146104385780632d8381191461044b578063313ce5671461045e57600080fd5b8063149b3bfa146103d857806318160ddd1461041d5780631fd8985e1461042557600080fd5b80631190216011610314578063119021601461039357806313114a9d146103bb578063141f3be2146103c357600080fd5b806306fdde031461033b578063089fe6aa14610359578063095ea7b314610370575b600080fd5b6103436107b4565b60405161035091906137db565b60405180910390f35b61036260175481565b604051908152602001610350565b61038361037e366004613869565b610842565b6040519015158152602001610350565b6103a66103a1366004613895565b610859565b60408051928352602083019190915201610350565b601454610362565b6103d66103d13660046138bc565b610898565b005b6002546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610350565b601254610362565b6103d6610433366004613895565b6108f6565b6103836104463660046138f5565b610903565b610362610459366004613895565b610979565b60115461046b9060ff1681565b60405160ff9091168152602001610350565b6103d661048b3660046138bc565b610a2f565b61038361049e366004613869565b610b64565b6103626104b1366004613936565b610ba7565b60015473ffffffffffffffffffffffffffffffffffffffff166103f8565b601f546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61038361050236600461395b565b600d6020526000908152604090205460ff1681565b6103d6610c4c565b6103d661052d36600461395b565b610d1f565b6004546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103d661131f565b61036260165481565b61036261057136600461395b565b611333565b6103d66113b9565b60005473ffffffffffffffffffffffffffffffffffffffff166103f8565b61036260195481565b6103626113cb565b6103436113ee565b6103a66113fb565b6103836105cb366004613869565b6115b1565b6103d66105de366004613895565b61160d565b6103836105f1366004613869565b61179a565b6103d66106043660046138bc565b6117a7565b61061c610617366004613978565b611805565b60408051938452602084019290925290820152606001610350565b6103d6611841565b6103d661064d36600461395b565b6119e0565b610665610660366004613895565b611a94565b604080519586526020860194909452928401919091526060830152608082015260a001610350565b6103d661069b3660046139a4565b611ae0565b6005546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b610362601d5481565b6103626106d73660046139c1565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205490565b61038361071d36600461395b565b600c6020526000908152604090205460ff1681565b6103d6610740366004613869565b611b19565b6003546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61036260185481565b6103d661077c36600461395b565b611ba4565b6103d661078f36600461395b565b611dba565b6103d66107a236600461395b565b611e6e565b6008546103839060ff1681565b600f80546107c1906139ef565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed906139ef565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505081565b600061084f3384846122ce565b5060015b92915050565b600080600061087f6019546108796016548761215b90919063ffffffff16565b90612119565b9050600061088d858361228c565b959194509092505050565b6108a0612482565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108fe612482565b601d55565b6000610910848484612529565b61096f843361096a85604051806060016040528060288152602001613bcc6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600b602090815260408083203384529091529020549190612e12565b6122ce565b5060019392505050565b6000601354821115610a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610a1c6113cb565b9050610a288382612119565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610a82575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a8b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682158015919091179091558190610b11575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b15610b1f57610b1f82611ba4565b80158015610b52575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b15610b6057610b6082611e6e565b5050565b336000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161084f91859061096a9086612213565b6000601254831115610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a09565b81610c33576000610c2584611a94565b509294506108539350505050565b6000610c3e84611a94565b509194506108539350505050565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600354604080517f4fd89f9b000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fd89f9b9160048082019260009290919082900301818387803b158015610ce357600080fd5b505af1925050508015610cf4575060015b50600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d27612e66565b6040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f504f4f4c5f4d474d5400000000000000000000000000000000000000000000006044820152600090819073ffffffffffffffffffffffffffffffffffffffff8416906382b7b500906064016040805180830381865afa158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190613a42565b9150915080610e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6002805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b50090610f3c9060040160208082526011908201527f4d414444524553535f434f4e5452414354000000000000000000000000000000604082015260600190565b6040805180830381865afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190613a42565b909250905080610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6003805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b500906110d2906004016020808252600e908201527f554e49535741505f524f55544552000000000000000000000000000000000000604082015260600190565b6040805180830381865afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190613a42565b90925090508061117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45524332305f434f4e54524143540000000000000000000000000000000000006044820152908416906382b7b500906064016040805180830381865afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a9190613a42565b9092509050806112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b50600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611327612482565b6113316000612ee7565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604081205460ff161561138a575073ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205461085390610979565b6113c1612e66565b6113316000612f5e565b60008060006113d86113fb565b90925090506113e78282612119565b9250505090565b601080546107c1906139ef565b6013546012546000918291825b600e54811015611581578260096000600e848154811061142a5761142a613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411806114af575081600a6000600e848154811061147b5761147b613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156114c557601354601254945094505050509091565b61151860096000600e84815481106114df576114df613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061228c565b925061156d600a6000600e848154811061153457611534613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061228c565b91508061157981613acf565b915050611408565b5060125460135461159191612119565b8210156115a8576013546012549350935050509091565b90939092509050565b600061084f338461096a85604051806060016040528060258152602001613bf460259139336000908152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612e12565b611615612e66565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600480546002546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182169381019390935260248301849052169063095ea7b3906044016020604051808303816000875af11580156116bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e19190613b07565b506002546040517fa901d15c0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a901d15c90602401600060405180830381600087803b15801561174e57600080fd5b505af1158015611762573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055506117979050611841565b50565b600061084f338484612529565b6117af612482565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000808080611814878661215b565b90506000611822878761215b565b90506000611830838361228c565b929992985090965090945050505050565b60085460ff1661133157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600254604080517f7334cccd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691637334cccd9160048082019260009290919082900301818387803b1580156118e257600080fd5b505af11580156118f6573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561196457600080fd5b505af1925050508015611975575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ce357600080fd5b6119e8612482565b73ffffffffffffffffffffffffffffffffffffffff8116611a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4d616e61676561626c653a206e6577206d616e6167657220697320746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a09565b61179781612ee7565b6000806000806000806000611aa888610859565b915091506000611ab66113cb565b90506000806000611ac88c8686611805565b919e909d50909b509599509397509395505050505050565b611ae8612482565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff163314611b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420617574686f72697a65640000000000000000000000000000000000006044820152606401610a09565b610b608282612fd3565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611bf7575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c0057600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff1615611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205415611d115773ffffffffffffffffffffffffffffffffffffffff8116600090815260096020526040902054611cea90610979565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b611dc2612e66565b73ffffffffffffffffffffffffffffffffffffffff8116611e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a09565b61179781612f5e565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611ec1575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611eca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff16611f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a09565b60005b600e54811015610b60578173ffffffffffffffffffffffffffffffffffffffff16600e8281548110611f9057611f90613a71565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361210757600e8054611fc790600190613b24565b81548110611fd757611fd7613a71565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff909216918390811061201057612010613a71565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600a82526040808220829055600c9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600e8054806120ab576120ab613b37565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b8061211181613acf565b915050611f5c565b6000610a2883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131fe565b60008260000361216d57506000610853565b60006121798385613b66565b9050826121868583613b7d565b14610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b6000806122208385613bb8565b905083811015610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a09565b6000610a2883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e12565b73ffffffffffffffffffffffffffffffffffffffff8316612370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8216612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160448201527f6e616765720000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166125cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff821661266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610a09565b600081116126ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205460ff1615801561275b575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205460ff16155b6127c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f506f6f6c2062616e6e65640000000000000000000000000000000000000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d6020526040902054819060ff1615801561281f575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff16155b801561282e575060085460ff16155b15612e0157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff161561291357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b50505050612b38565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff1615612b3857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156129ab57600080fd5b505af11580156129bf573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a2d57600080fd5b505af1925050508015612a3e575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa957600080fd5b505af1925050508015612aba575060015b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fd89f9b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2557600080fd5b505af1925050508015612b36575060015b505b6000612b556019546108796017548561215b90919063ffffffff16565b9050612b61828261228c565b6002546040517f444809f90000000000000000000000000000000000000000000000000000000081526004810184905291935073ffffffffffffffffffffffffffffffffffffffff169063444809f990602401600060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b5050600254612c0b925087915073ffffffffffffffffffffffffffffffffffffffff1683613246565b6000612c286019546108796018548661215b90919063ffffffff16565b9050612c34838261228c565b6003546040517fe3e9f3e90000000000000000000000000000000000000000000000000000000081526004810184905291945073ffffffffffffffffffffffffffffffffffffffff169063e3e9f3e990602401600060405180830381600087803b158015612ca157600080fd5b505af1158015612cb5573d6000803e3d6000fd5b5050600354612cde925088915073ffffffffffffffffffffffffffffffffffffffff1683613246565b73ffffffffffffffffffffffffffffffffffffffff861660009081526006602052604090205460ff1680612d38575073ffffffffffffffffffffffffffffffffffffffff851660009081526006602052604090205460ff16155b15612dd657612d4a8584601d5461346a565b612dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526563697069656e742063616e277420686f6c64206d6f7265207468616e206c60448201527f696d69742070657263656e7461676500000000000000000000000000000000006064820152608401610a09565b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b612e0c848483613246565b50505050565b60008184841115612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b24565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a09565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f697e4e68d3879b0dd3414a88905117bac8f0a54b0cd8e7779f909bf1a1cf568390600090a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a09565b601c5460009060ff166130b6576000613076601a54601b5461211990919063ffffffff16565b9050613082838261215b565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905591506130cb9050565b6130c86130c16113cb565b839061215b565b90505b6013546130d89082612213565b6013556012546130e89083612213565b60125573ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16156131705773ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020546131499083612213565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020546131a09082612213565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600960205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906124759086815260200190565b60008183613239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b7d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff168061329f575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b156132b05760168054601555600090555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16801561330b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b156133205761331b8383836134ab565b613400565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1615801561337b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b1561338b5761331b838383613612565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1680156133e5575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b156133f55761331b8383836136df565b613400838383613769565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff1680613459575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b15613465576015546016555b505050565b6000808361347786611333565b6134819190613bb8565b9050600061349e6103e86108798661349860125490565b9061215b565b9091111595945050505050565b60008060008060006134bc86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a6020526040902054949950929750909550935091506134f9908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613535908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a1660009081526009602052604080822093909355908916815220546135719085612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600960205260409020556135a183826137b7565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161360091815260200190565b60405180910390a35050505050505050565b600080600080600061362386611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613660908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a16600090815260096020908152604080832094909455918a168152600a90915220546136a39083612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320939093556009905220546135719085612213565b60008060008060006136f086611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a60205260409020549499509297509095509350915061372d908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613660908661228c565b600080600080600061377a86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613535908661228c565b6013546137c4908361228c565b6013556014546137d49082612213565b6014555050565b600060208083528351808285015260005b81811015613808578581018301518582016040015282016137ec565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179757600080fd5b6000806040838503121561387c57600080fd5b823561388781613847565b946020939093013593505050565b6000602082840312156138a757600080fd5b5035919050565b801515811461179757600080fd5b600080604083850312156138cf57600080fd5b82356138da81613847565b915060208301356138ea816138ae565b809150509250929050565b60008060006060848603121561390a57600080fd5b833561391581613847565b9250602084013561392581613847565b929592945050506040919091013590565b6000806040838503121561394957600080fd5b8235915060208301356138ea816138ae565b60006020828403121561396d57600080fd5b8135610a2881613847565b60008060006060848603121561398d57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156139b657600080fd5b8135610a28816138ae565b600080604083850312156139d457600080fd5b82356139df81613847565b915060208301356138ea81613847565b600181811c90821680613a0357607f821691505b602082108103613a3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008060408385031215613a5557600080fd5b8251613a6081613847565b60208401519092506138ea816138ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0057613b00613aa0565b5060010190565b600060208284031215613b1957600080fd5b8151610a28816138ae565b8181038181111561085357610853613aa0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808202811582820484141761085357610853613aa0565b600082613bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561085357610853613aa056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220469953e3ef301a25df580c9c1d69f0cac9f9cbdb0a7a8113219dd76cdb0add8464736f6c63430008110033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106103365760003560e01c80638da5cb5b116101b2578063d4780e36116100f9578063e742806a116100a2578063f2cc0c181161007c578063f2cc0c181461076e578063f2fde38b14610781578063f84354f114610794578063fbf9bc84146107a757600080fd5b8063e742806a14610732578063e9cabe7f14610745578063ed9442f61461076557600080fd5b8063d9af257b116100d3578063d9af257b146106c0578063dd62ed3e146106c9578063e6375d3e1461070f57600080fd5b8063d4780e3614610652578063d5de6ede1461068d578063d8264920146106a057600080fd5b8063a901d15c1161015b578063c2264c6a11610135578063c2264c6a14610609578063c542eccc14610637578063ccc399091461063f57600080fd5b8063a901d15c146105d0578063a9059cbb146105e3578063adf18693146105f657600080fd5b806395d89b411161018c57806395d89b41146105ad57806397a9d560146105b5578063a457c2d7146105bd57600080fd5b80638da5cb5b1461057e578063941abdc11461059c57806394e10784146105a557600080fd5b80633526c0bd116102815780634fd89f9b1161022a5780636c146d9b116102045780636c146d9b146105525780636f9fedfb1461055a57806370a0823114610563578063715018a61461057657600080fd5b80634fd89f9b146105175780635a2e2f471461051f5780636b9f69b41461053257600080fd5b8063481c6a751161025b578063481c6a75146104b65780634e6fd6c4146104d45780634fbee193146104f457600080fd5b80633526c0bd1461047d57806339509351146104905780634549b039146104a357600080fd5b8063149b3bfa116102e357806323b872dd116102bd57806323b872dd146104385780632d8381191461044b578063313ce5671461045e57600080fd5b8063149b3bfa146103d857806318160ddd1461041d5780631fd8985e1461042557600080fd5b80631190216011610314578063119021601461039357806313114a9d146103bb578063141f3be2146103c357600080fd5b806306fdde031461033b578063089fe6aa14610359578063095ea7b314610370575b600080fd5b6103436107b4565b60405161035091906137db565b60405180910390f35b61036260175481565b604051908152602001610350565b61038361037e366004613869565b610842565b6040519015158152602001610350565b6103a66103a1366004613895565b610859565b60408051928352602083019190915201610350565b601454610362565b6103d66103d13660046138bc565b610898565b005b6002546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610350565b601254610362565b6103d6610433366004613895565b6108f6565b6103836104463660046138f5565b610903565b610362610459366004613895565b610979565b60115461046b9060ff1681565b60405160ff9091168152602001610350565b6103d661048b3660046138bc565b610a2f565b61038361049e366004613869565b610b64565b6103626104b1366004613936565b610ba7565b60015473ffffffffffffffffffffffffffffffffffffffff166103f8565b601f546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61038361050236600461395b565b600d6020526000908152604090205460ff1681565b6103d6610c4c565b6103d661052d36600461395b565b610d1f565b6004546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b6103d661131f565b61036260165481565b61036261057136600461395b565b611333565b6103d66113b9565b60005473ffffffffffffffffffffffffffffffffffffffff166103f8565b61036260195481565b6103626113cb565b6103436113ee565b6103a66113fb565b6103836105cb366004613869565b6115b1565b6103d66105de366004613895565b61160d565b6103836105f1366004613869565b61179a565b6103d66106043660046138bc565b6117a7565b61061c610617366004613978565b611805565b60408051938452602084019290925290820152606001610350565b6103d6611841565b6103d661064d36600461395b565b6119e0565b610665610660366004613895565b611a94565b604080519586526020860194909452928401919091526060830152608082015260a001610350565b6103d661069b3660046139a4565b611ae0565b6005546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b610362601d5481565b6103626106d73660046139c1565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600b6020908152604080832093909416825291909152205490565b61038361071d36600461395b565b600c6020526000908152604090205460ff1681565b6103d6610740366004613869565b611b19565b6003546103f89073ffffffffffffffffffffffffffffffffffffffff1681565b61036260185481565b6103d661077c36600461395b565b611ba4565b6103d661078f36600461395b565b611dba565b6103d66107a236600461395b565b611e6e565b6008546103839060ff1681565b600f80546107c1906139ef565b80601f01602080910402602001604051908101604052809291908181526020018280546107ed906139ef565b801561083a5780601f1061080f5761010080835404028352916020019161083a565b820191906000526020600020905b81548152906001019060200180831161081d57829003601f168201915b505050505081565b600061084f3384846122ce565b5060015b92915050565b600080600061087f6019546108796016548761215b90919063ffffffff16565b90612119565b9050600061088d858361228c565b959194509092505050565b6108a0612482565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6108fe612482565b601d55565b6000610910848484612529565b61096f843361096a85604051806060016040528060288152602001613bcc6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600b602090815260408083203384529091529020549190612e12565b6122ce565b5060019392505050565b6000601354821115610a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201527f65666c656374696f6e730000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6000610a1c6113cb565b9050610a288382612119565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610a82575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a8b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682158015919091179091558190610b11575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b15610b1f57610b1f82611ba4565b80158015610b52575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b15610b6057610b6082611e6e565b5050565b336000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161084f91859061096a9086612213565b6000601254831115610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a09565b81610c33576000610c2584611a94565b509294506108539350505050565b6000610c3e84611a94565b509194506108539350505050565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600354604080517f4fd89f9b000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691634fd89f9b9160048082019260009290919082900301818387803b158015610ce357600080fd5b505af1925050508015610cf4575060015b50600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610d27612e66565b6040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f504f4f4c5f4d474d5400000000000000000000000000000000000000000000006044820152600090819073ffffffffffffffffffffffffffffffffffffffff8416906382b7b500906064016040805180830381865afa158015610dc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de79190613a42565b9150915080610e52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6002805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b50090610f3c9060040160208082526011908201527f4d414444524553535f434f4e5452414354000000000000000000000000000000604082015260600190565b6040805180830381865afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190613a42565b909250905080610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b6003805473ffffffffffffffffffffffffffffffffffffffff8085167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179092556000908152600d60205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f82b7b500000000000000000000000000000000000000000000000000000000008152908416906382b7b500906110d2906004016020808252600e908201527f554e49535741505f524f55544552000000000000000000000000000000000000604082015260600190565b6040805180830381865afa1580156110ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111129190613a42565b90925090508061117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff848116919091179091556040517f82b7b50000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45524332305f434f4e54524143540000000000000000000000000000000000006044820152908416906382b7b500906064016040805180830381865afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a9190613a42565b9092509050806112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f436f6e7472616374206e6f7420666f756e6400000000000000000000000000006044820152606401610a09565b50600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b611327612482565b6113316000612ee7565b565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604081205460ff161561138a575073ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205461085390610979565b6113c1612e66565b6113316000612f5e565b60008060006113d86113fb565b90925090506113e78282612119565b9250505090565b601080546107c1906139ef565b6013546012546000918291825b600e54811015611581578260096000600e848154811061142a5761142a613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411806114af575081600a6000600e848154811061147b5761147b613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156114c557601354601254945094505050509091565b61151860096000600e84815481106114df576114df613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061228c565b925061156d600a6000600e848154811061153457611534613a71565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061228c565b91508061157981613acf565b915050611408565b5060125460135461159191612119565b8210156115a8576013546012549350935050509091565b90939092509050565b600061084f338461096a85604051806060016040528060258152602001613bf460259139336000908152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190612e12565b611615612e66565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600480546002546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182169381019390935260248301849052169063095ea7b3906044016020604051808303816000875af11580156116bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e19190613b07565b506002546040517fa901d15c0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff9091169063a901d15c90602401600060405180830381600087803b15801561174e57600080fd5b505af1158015611762573d6000803e3d6000fd5b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055506117979050611841565b50565b600061084f338484612529565b6117af612482565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6000808080611814878661215b565b90506000611822878761215b565b90506000611830838361228c565b929992985090965090945050505050565b60085460ff1661133157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600254604080517f7334cccd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff90921691637334cccd9160048082019260009290919082900301818387803b1580156118e257600080fd5b505af11580156118f6573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561196457600080fd5b505af1925050508015611975575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ce357600080fd5b6119e8612482565b73ffffffffffffffffffffffffffffffffffffffff8116611a8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4d616e61676561626c653a206e6577206d616e6167657220697320746865207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610a09565b61179781612ee7565b6000806000806000806000611aa888610859565b915091506000611ab66113cb565b90506000806000611ac88c8686611805565b919e909d50909b509599509397509395505050505050565b611ae8612482565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff163314611b9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420617574686f72697a65640000000000000000000000000000000000006044820152606401610a09565b610b608282612fd3565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611bf7575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c0057600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff1615611c90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604090205415611d115773ffffffffffffffffffffffffffffffffffffffff8116600090815260096020526040902054611cea90610979565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b611dc2612e66565b73ffffffffffffffffffffffffffffffffffffffff8116611e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a09565b61179781612f5e565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611ec1575060025473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611eca57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600c602052604090205460ff16611f59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a09565b60005b600e54811015610b60578173ffffffffffffffffffffffffffffffffffffffff16600e8281548110611f9057611f90613a71565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361210757600e8054611fc790600190613b24565b81548110611fd757611fd7613a71565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff909216918390811061201057612010613a71565b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600a82526040808220829055600c9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600e8054806120ab576120ab613b37565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190555050565b8061211181613acf565b915050611f5c565b6000610a2883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131fe565b60008260000361216d57506000610853565b60006121798385613b66565b9050826121868583613b7d565b14610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f77000000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b6000806122208385613bb8565b905083811015610a28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a09565b6000610a2883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e12565b73ffffffffffffffffffffffffffffffffffffffff8316612370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8216612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600b602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d6160448201527f6e616765720000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166125cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff821661266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610a09565b600081116126ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610a09565b73ffffffffffffffffffffffffffffffffffffffff831660009081526007602052604090205460ff1615801561275b575073ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205460ff16155b6127c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f506f6f6c2062616e6e65640000000000000000000000000000000000000000006044820152606401610a09565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d6020526040902054819060ff1615801561281f575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff16155b801561282e575060085460ff16155b15612e0157600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff161561291357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b50505050612b38565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff1615612b3857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637334cccd6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156129ab57600080fd5b505af11580156129bf573d6000803e3d6000fd5b50505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cea050156040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a2d57600080fd5b505af1925050508015612a3e575060015b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b651ae176040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612aa957600080fd5b505af1925050508015612aba575060015b50600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634fd89f9b6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612b2557600080fd5b505af1925050508015612b36575060015b505b6000612b556019546108796017548561215b90919063ffffffff16565b9050612b61828261228c565b6002546040517f444809f90000000000000000000000000000000000000000000000000000000081526004810184905291935073ffffffffffffffffffffffffffffffffffffffff169063444809f990602401600060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b5050600254612c0b925087915073ffffffffffffffffffffffffffffffffffffffff1683613246565b6000612c286019546108796018548661215b90919063ffffffff16565b9050612c34838261228c565b6003546040517fe3e9f3e90000000000000000000000000000000000000000000000000000000081526004810184905291945073ffffffffffffffffffffffffffffffffffffffff169063e3e9f3e990602401600060405180830381600087803b158015612ca157600080fd5b505af1158015612cb5573d6000803e3d6000fd5b5050600354612cde925088915073ffffffffffffffffffffffffffffffffffffffff1683613246565b73ffffffffffffffffffffffffffffffffffffffff861660009081526006602052604090205460ff1680612d38575073ffffffffffffffffffffffffffffffffffffffff851660009081526006602052604090205460ff16155b15612dd657612d4a8584601d5461346a565b612dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526563697069656e742063616e277420686f6c64206d6f7265207468616e206c60448201527f696d69742070657263656e7461676500000000000000000000000000000000006064820152608401610a09565b5050600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b612e0c848483613246565b50505050565b60008184841115612e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b24565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a09565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f697e4e68d3879b0dd3414a88905117bac8f0a54b0cd8e7779f909bf1a1cf568390600090a35050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a09565b601c5460009060ff166130b6576000613076601a54601b5461211990919063ffffffff16565b9050613082838261215b565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905591506130cb9050565b6130c86130c16113cb565b839061215b565b90505b6013546130d89082612213565b6013556012546130e89083612213565b60125573ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16156131705773ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020546131499083612213565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a60205260409020555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600960205260409020546131a09082612213565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600960205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906124759086815260200190565b60008183613239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0991906137db565b506000612e5d8486613b7d565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff168061329f575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b156132b05760168054601555600090555b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff16801561330b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff16155b156133205761331b8383836134ab565b613400565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1615801561337b575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b1561338b5761331b838383613612565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c602052604090205460ff1680156133e5575073ffffffffffffffffffffffffffffffffffffffff82166000908152600c602052604090205460ff165b156133f55761331b8383836136df565b613400838383613769565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff1680613459575073ffffffffffffffffffffffffffffffffffffffff82166000908152600d602052604090205460ff165b15613465576015546016555b505050565b6000808361347786611333565b6134819190613bb8565b9050600061349e6103e86108798661349860125490565b9061215b565b9091111595945050505050565b60008060008060006134bc86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a6020526040902054949950929750909550935091506134f9908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613535908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a1660009081526009602052604080822093909355908916815220546135719085612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600960205260409020556135a183826137b7565b8673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161360091815260200190565b60405180910390a35050505050505050565b600080600080600061362386611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613660908661228c565b73ffffffffffffffffffffffffffffffffffffffff808a16600090815260096020908152604080832094909455918a168152600a90915220546136a39083612213565b73ffffffffffffffffffffffffffffffffffffffff88166000908152600a60209081526040808320939093556009905220546135719085612213565b60008060008060006136f086611a94565b73ffffffffffffffffffffffffffffffffffffffff8d166000908152600a60205260409020549499509297509095509350915061372d908761228c565b73ffffffffffffffffffffffffffffffffffffffff89166000908152600a6020908152604080832093909355600990522054613660908661228c565b600080600080600061377a86611a94565b73ffffffffffffffffffffffffffffffffffffffff8d1660009081526009602052604090205494995092975090955093509150613535908661228c565b6013546137c4908361228c565b6013556014546137d49082612213565b6014555050565b600060208083528351808285015260005b81811015613808578581018301518582016040015282016137ec565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461179757600080fd5b6000806040838503121561387c57600080fd5b823561388781613847565b946020939093013593505050565b6000602082840312156138a757600080fd5b5035919050565b801515811461179757600080fd5b600080604083850312156138cf57600080fd5b82356138da81613847565b915060208301356138ea816138ae565b809150509250929050565b60008060006060848603121561390a57600080fd5b833561391581613847565b9250602084013561392581613847565b929592945050506040919091013590565b6000806040838503121561394957600080fd5b8235915060208301356138ea816138ae565b60006020828403121561396d57600080fd5b8135610a2881613847565b60008060006060848603121561398d57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156139b657600080fd5b8135610a28816138ae565b600080604083850312156139d457600080fd5b82356139df81613847565b915060208301356138ea81613847565b600181811c90821680613a0357607f821691505b602082108103613a3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008060408385031215613a5557600080fd5b8251613a6081613847565b60208401519092506138ea816138ae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b0057613b00613aa0565b5060010190565b600060208284031215613b1957600080fd5b8151610a28816138ae565b8181038181111561085357610853613aa0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b808202811582820484141761085357610853613aa0565b600082613bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561085357610853613aa056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220469953e3ef301a25df580c9c1d69f0cac9f9cbdb0a7a8113219dd76cdb0add8464736f6c63430008110033