ETH Price: $2,400.47 (-3.29%)
 

Overview

Max Total Supply

1,000,000 8BTC

Holders

135

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
bullsy.eth
Balance
1,729.218399017 8BTC

Value
$0.00
0x2d1cb5ed13c731604a3f1d48dc206d85fe5e52b1
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ProofFactoryTokenCutter

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : ProofFactoryTokenCutter.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../libraries/Ownable.sol";
import "../libraries/Context.sol";
import "../libraries/ProofFactoryFees.sol";
import "../interfaces/IFACTORY.sol";
import "../interfaces/IDividendDistributor.sol";
import "../interfaces/IUniswapV2Router02.sol";
import "../DividendDistributor.sol";

contract ProofFactoryTokenCutter is Context, IERC20, IERC20Metadata {
    //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects
    IDividendDistributor public dividendDistributor;
    uint256 distributorGas = 500000;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;
    address public proofAdmin;

    bool public restrictWhales = true;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isTxLimitExempt;
    mapping(address => bool) public isDividendExempt;

    uint256 public launchedAt;
    uint256 public revenueFee = 2;

    uint256 public reflectionFee;
    uint256 public lpFee;
    uint256 public devFee;

    uint256 public reflectionFeeOnSell;
    uint256 public lpFeeOnSell;
    uint256 public devFeeOnSell;

    uint256 public totalFee;
    uint256 public totalFeeIfSelling;

    IUniswapV2Router02 public router;
    address public pair;
    address payable public factory;
    address public tokenOwner;
    address payable public devWallet;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public tradingStatus = true;

    mapping(address => bool) private bots;

    uint256 public _maxTxAmount;
    uint256 public _walletMax;
    uint256 public swapThreshold;

    constructor() {
        factory = payable(msg.sender);
    }

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier onlyProofAdmin() {
        require(
            proofAdmin == _msgSender(),
            "Ownable: caller is not the proofAdmin"
        );
        _;
    }

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

    modifier onlyFactory() {
        require(factory == _msgSender(), "Ownable: caller is not the factory");
        _;
    }

    function setBasicData(
        string memory tokenName,
        string memory tokenSymbol,
        uint256 initialSupply,
        uint percentToLP,
        address owner,
        address reflectionToken,
        address routerAddress,
        address initialProofAdmin,
        ProofFactoryFees.allFees memory fees
    ) external onlyFactory {
        _name = tokenName;
        _symbol = tokenSymbol;
        _totalSupply += initialSupply;

        //Initial supply
        require (percentToLP >= 70, "low lp percent");
        uint256 forLP = (initialSupply * percentToLP) / 100; //95%
        uint256 forOwner = initialSupply - forLP; //5%

        _balances[msg.sender] += forLP;
        _balances[owner] += forOwner;

        emit Transfer(address(0), msg.sender, forLP);
        emit Transfer(address(0), owner, forOwner);

        _maxTxAmount = (initialSupply * 5) / 1000;
        _walletMax = (initialSupply * 1) / 100;
        swapThreshold = (initialSupply * 5) / 4000;

        router = IUniswapV2Router02(routerAddress);
        pair = IUniswapV2Factory(router.factory()).createPair(
            router.WETH(),
            address(this)
        );

        _allowances[address(this)][address(router)] = type(uint256).max;

        dividendDistributor = new DividendDistributor(
            routerAddress,
            reflectionToken,
            address(this)
        );

        isFeeExempt[address(this)] = true;
        isFeeExempt[factory] = true;

        isTxLimitExempt[owner] = true;
        isTxLimitExempt[pair] = true;
        isTxLimitExempt[factory] = true;
        isTxLimitExempt[DEAD] = true;
        isTxLimitExempt[ZERO] = true;

        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[ZERO] = true;

        reflectionFee = fees.reflectionFee;
        lpFee = fees.lpFee;
        devFee = fees.devFee;

        reflectionFeeOnSell = fees.reflectionFeeOnSell;
        lpFeeOnSell = fees.lpFeeOnSell;
        devFeeOnSell = fees.devFeeOnSell;

        _calcTotalFee();

        tokenOwner = owner;
        devWallet = payable(owner);
        proofAdmin = initialProofAdmin;
    }

    //proofAdmin functions
    function updateProofAdmin(address newAdmin) external virtual onlyProofAdmin {
        proofAdmin = newAdmin;
    }

    function setBots(address[] memory bots_) external onlyProofAdmin {
        for (uint256 i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
        }
    }

    //Factory functions
    function swapTradingStatus() external onlyFactory {
        tradingStatus = !tradingStatus;
    }

    function setLaunchedAt() external onlyFactory {
        require(launchedAt == 0, "already launched");
        launchedAt = block.timestamp;
    }

    function cancelToken() external onlyFactory {
        isFeeExempt[address(router)] = true;
        isTxLimitExempt[address(router)] = true;
        isTxLimitExempt[tokenOwner] = true;
        tradingStatus = true;
    }

    //Owner functions
    function changeFees(
        uint256 initialReflectionFee,
        uint256 initialReflectionFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external onlyOwner {
        reflectionFee = initialReflectionFee;
        lpFee = initialLpFee;
        devFee = initialDevFee;

        reflectionFeeOnSell = initialReflectionFeeOnSell;
        lpFeeOnSell = initialLpFeeOnSell;
        devFeeOnSell = initialDevFeeOnSell;

        _calcTotalFee();
    }

    function changeTxLimit(uint256 newLimit) external onlyOwner {
        _checkLimit(newLimit);
        _maxTxAmount = newLimit;
    }

    function changeWalletLimit(uint256 newLimit) external onlyOwner {
        _checkLimit(newLimit);
        _walletMax = newLimit;
    }

    function changeRestrictWhales(bool newValue) external onlyOwner {
        restrictWhales = newValue;
    }

    function changeIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function changeIsTxLimitExempt(address holder, bool exempt)
        external
        onlyOwner
    {
        require(launchedAt != 0, "!launched");
        require(block.timestamp >= launchedAt + 24 hours, "too soon");
        isTxLimitExempt[holder] = exempt;
    }

    function changeDistributorGas(uint256 _distributorGas) external onlyOwner {
        distributorGas = _distributorGas;
    }

    function changeMinDistSettings(uint256 _minPeriod, uint256 _minDistLimit) external onlyOwner {
        dividendDistributor.setMinPeriod(_minPeriod);
        dividendDistributor.setMinDistribution(_minDistLimit);
    }

    function reduceProofFee() external onlyOwner {
        require(revenueFee == 2, "!already reduced");
        _checkTimestamp();

        revenueFee = 1;
        _calcTotalFee();
    }

    function formatProofFee() external onlyProofAdmin {
        require (revenueFee > 0, "already reduced");
        _checkTimestamp();

        totalFee -= revenueFee;
        totalFeeIfSelling -= revenueFee;
        revenueFee = 0;
        
    }

    function setDevWallet(address payable newDevWallet) external onlyOwner {
        devWallet = payable(newDevWallet);
    }

    function setOwnerWallet(address payable newOwnerWallet) external onlyOwner {
        tokenOwner = newOwnerWallet;
    }

    function changeSwapBackSettings(
        bool enableSwapBack,
        uint256 newSwapBackLimit
    ) external onlyOwner {
        swapAndLiquifyEnabled = enableSwapBack;
        swapThreshold = newSwapBackLimit;
    }

    function setDistributionCriteria(
        uint256 newMinPeriod_,
        uint256 newMinDistribution_
    ) external onlyOwner {
        dividendDistributor.setDistributionCriteria(
            newMinPeriod_,
            newMinDistribution_
        );
    }

    function delBot(address notbot) external {
        address sender = _msgSender();
        require (sender == proofAdmin || sender == tokenOwner, "Owanble: caller doesn't have permission");
        bots[notbot] = false;
    }

    function getCirculatingSupply() external view returns (uint256) {
        return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() external view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() external view virtual override returns (uint8) {
        return 9;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() external view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     *
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        require(tradingStatus, "!trading");
        require(!bots[sender] && !bots[recipient]);

        if (inSwapAndLiquify) {
            return _basicTransfer(sender, recipient, amount);
        }

        /// MaxTx is applied for only sell and wallet transfer.
        if (sender != pair) {
            require(
                amount <= _maxTxAmount || isTxLimitExempt[sender],
                "Max TX Amount"
            );
        }

        if (!isTxLimitExempt[recipient] && restrictWhales) {
            require(
                _balances[recipient] + amount <= _walletMax + (10*10**9),
                "Max Wallet Amount"
            );
        }
        
        if (
            msg.sender != pair &&
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            _balances[address(this)] >= swapThreshold
        ) {
            swapBack();
        }

        _balances[sender] = _balances[sender] - amount;
        uint256 finalAmount = amount;

        if (sender == pair || recipient == pair) {
            finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient]
                ? takeFee(sender, recipient, amount)
                : amount;
        }
        
        _balances[recipient] = _balances[recipient] + finalAmount;

        // Dividend tracker
        if (!isDividendExempt[sender]) {
            dividendDistributor.setShare(sender, _balances[sender]);
        }

        if (!isDividendExempt[recipient]) {
            dividendDistributor.setShare(recipient, _balances[recipient]);
        }

        dividendDistributor.process(distributorGas);

        emit Transfer(sender, recipient, finalAmount);
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender] - amount;
        _balances[recipient] = _balances[recipient] + amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeApplicable = pair == recipient ? totalFeeIfSelling : totalFee;
        uint256 feeAmount = amount * feeApplicable / 100;

        _balances[address(this)] = _balances[address(this)] + feeAmount;
        emit Transfer(sender, address(this), feeAmount);

        return amount - feeAmount;
    }

    function swapBack() internal lockTheSwap {
        uint256 tokensToLiquify = _balances[address(this)];
        uint256 amountToLiquify = tokensToLiquify * lpFee / totalFee / 2;
        uint256 amountToSwap = tokensToLiquify - amountToLiquify;

        if (amountToSwap == 0 || amountToLiquify == 0) return;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance;
        uint256 devBalance = amountETH * devFee / totalFee;
        uint256 revenueBalance = amountETH * revenueFee / totalFee;

        uint256 amountEthLiquidity = amountETH * lpFee / totalFee / 2;
        uint256 amountEthReflection = amountETH - devBalance - revenueBalance - amountEthLiquidity;

        if (amountETH > 0) {
            if (revenueBalance > 0) { IFACTORY(factory).factoryRevenue{value: revenueBalance}(); }
            if (devBalance > 0) {
                (bool sent,)=devWallet.call{value:devBalance}("");
                require (sent, "ETH transfer failed");
            }
        }

        dividendDistributor.deposit{value: amountEthReflection}();

        if (amountToLiquify > 0) {
            router.addLiquidityETH{value: amountEthLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                0x000000000000000000000000000000000000dEaD,
                block.timestamp
            );
        }
    }

    function _checkLimit(uint256 _newLimit) internal view {
        require(launchedAt != 0, "!launched");
        require(_newLimit >= (_totalSupply * 5) / 1000, "Mmin 0.5% limit");
        require(_newLimit <= (_totalSupply * 3) / 100, "Max 3% limit");
    }

    function _checkTimestamp() internal view {
        require(launchedAt != 0, "!launched");
        require(block.timestamp >= launchedAt + 72 hours, "too soon");
    }

    function _calcTotalFee() internal {
        totalFee = devFee + lpFee + reflectionFee + revenueFee;
        totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell + revenueFee;
        require(totalFee <= 12, "Too high fee");
        require(totalFeeIfSelling <= 17, "Too high fee");
    }

    receive() external payable {}
}

File 2 of 14 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/extensions/IERC20Metadata.sol";

File 3 of 14 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

File 4 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

    /**
     * @dev Moves `amount` tokens from `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 5 of 14 : DividendDistributor.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./libraries/TokenUtils.sol";
import "./interfaces/IDividendDistributor.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "hardhat/console.sol";

contract DividendDistributor is IDividendDistributor {
    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    
    IUniswapV2Router02 router;
    IERC20 public RewardToken;

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

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

    uint256 public minPeriod = 30 minutes;
    uint256 public minDistribution = 1 * (10**18);

    uint256 currentIndex;
    bool initialized;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor(
        address _router,
        address _reflectionToken,
        address token
    ) {
        router = IUniswapV2Router02(_router);
        RewardToken = IERC20(_reflectionToken);
        _token = token;
        uint8 rewardTokenDecimals = TokenUtils.expectDecimals(token);
        uint256 fixedPoint = 10**rewardTokenDecimals;
        minDistribution = 1 * fixedPoint;
    }

    function setDistributionCriteria(
        uint256 _minPeriod,
        uint256 _minDistribution
    ) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function getShareHolders() external view returns (address[] memory) {
        return shareholders;
    }

    function setMinPeriod(uint256 _minPeriod) external onlyToken override {
        minPeriod = _minPeriod;
    }

    function setMinDistribution(uint256 _minDistribution) external onlyToken override {
        minDistribution = _minDistribution;
    }

    function setShare(address shareholder, uint256 amount)
        external
        override
        onlyToken
    {
        if (shares[shareholder].amount > 0) {
            distributeDividend(shareholder);
        }

        if (amount > 0 && shares[shareholder].amount == 0) {
            addShareholder(shareholder);
        } else if (amount == 0 && shares[shareholder].amount > 0) {
            removeShareholder(shareholder);
        }

        totalShares = totalShares - shares[shareholder].amount + amount;
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(
            shares[shareholder].amount
        );
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = RewardToken.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(RewardToken);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: msg.value
        }(0, path, address(this), block.timestamp);

        uint256 amount = RewardToken.balanceOf(address(this)) - balanceBefore;
        totalDividends = totalDividends + amount;
        dividendsPerShare = dividendsPerShare + dividendsPerShareAccuracyFactor * amount / totalShares;
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if (shareholderCount == 0) {
            return;
        }

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

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentIndex >= shareholderCount) {
                currentIndex = 0;
            }

            if (shouldDistribute(shareholders[currentIndex])) {
                distributeDividend(shareholders[currentIndex]);
            }

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

    function shouldDistribute(address shareholder)
        internal
        view
        returns (bool)
    {
        return
            shareholderClaims[shareholder] + minPeriod <= block.timestamp &&
            getUnpaidEarnings(shareholder) >= minDistribution;
    }

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

        uint256 amount = getUnpaidEarnings(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed + amount;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised + amount;
            shares[shareholder].totalExcluded = getCumulativeDividends(
                shares[shareholder].amount
            );
            RewardToken.transfer(shareholder, amount);
        }
    }

    function claimDividend() external {
        require(shouldDistribute(msg.sender), "Too soon. Need to wait!");
        distributeDividend(msg.sender);
    }

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

        uint256 shareholderTotalDividends = getCumulativeDividends(
            shares[shareholder].amount
        );
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) {
            return 0;
        }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }

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

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

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

File 6 of 14 : IDividendDistributor.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

interface IDividendDistributor {
    function setDistributionCriteria(
        uint256 _minPeriod,
        uint256 _minDistribution
    ) external;

    function setShare(address shareholder, uint256 amount) external;

    function deposit() external payable;

    function process(uint256 gas) external;

    function setMinPeriod(uint256 _minPeriod) external;

    function setMinDistribution(uint256 _minDistribution) external;
}

File 7 of 14 : IFACTORY.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

interface IFACTORY {
    function factoryRevenue() external payable;
}

File 8 of 14 : IUniswapV2Factory.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

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

File 9 of 14 : IUniswapV2Router02.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

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

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);
}

File 10 of 14 : Context.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

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

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

File 11 of 14 : Ownable.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

import "./Context.sol";

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 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
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual 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 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);
    }
}

File 12 of 14 : ProofFactoryFees.sol
// SPDX-License-Identifier: None
pragma solidity = 0.8.17;

library ProofFactoryFees {
    struct allFees {
        uint256 reflectionFee;
        uint256 reflectionFeeOnSell;
        uint256 lpFee;
        uint256 lpFeeOnSell;
        uint256 devFee;
        uint256 devFeeOnSell;
    }
}

File 13 of 14 : TokenUtils.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";

/// @title  TokenUtils
/// @author Savvy DeFi
library TokenUtils  {
    /// @dev A safe function to get the decimals of an ERC20 token.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.
    ///
    /// @param token The target token.
    ///
    /// @return The amount of decimals of the token.
    function expectDecimals(address token) internal view returns (uint8) {
        (bool success, bytes memory data) = token.staticcall(
            abi.encodeWithSelector(IERC20Metadata.decimals.selector)
        );

        require (success, "invalid decimals");

        return abi.decode(data, (uint8));
    }   
}

File 14 of 14 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

	function log(uint256 p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
	}

	function log(uint256 p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
	}

	function log(uint256 p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
	}

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributorGas","type":"uint256"}],"name":"changeDistributorGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialReflectionFee","type":"uint256"},{"internalType":"uint256","name":"initialReflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialDevFee","type":"uint256"},{"internalType":"uint256","name":"initialDevFeeOnSell","type":"uint256"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistLimit","type":"uint256"}],"name":"changeMinDistSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"changeRestrictWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapBack","type":"bool"},{"internalType":"uint256","name":"newSwapBackLimit","type":"uint256"}],"name":"changeSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendDistributor","outputs":[{"internalType":"contract IDividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formatProofFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reduceProofFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restrictWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"percentToLP","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"reflectionToken","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"initialProofAdmin","type":"address"},{"components":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"reflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"lpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"devFeeOnSell","type":"uint256"}],"internalType":"struct ProofFactoryFees.allFees","name":"fees","type":"tuple"}],"name":"setBasicData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinPeriod_","type":"uint256"},{"internalType":"uint256","name":"newMinDistribution_","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwnerWallet","type":"address"}],"name":"setOwnerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeIfSelling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateProofAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526207a1206001556007805460ff60a01b1916600160a01b1790556002600c556019805461010160a81b61ffff60a81b1990911617905534801561004657600080fd5b50601780546001600160a01b03191633179055614a68806100686000396000f3fe608060405260043610620003db5760003560e01c8063807c2d9c1162000203578063bf56b3711162000117578063dd62ed3e11620000ad578063f16fd78d1162000078578063f16fd78d1462000b5f578063f887ea401462000b84578063fabe62831462000ba6578063fbd757531462000bcb57600080fd5b8063dd62ed3e1462000ab3578063e4cbd6b31462000afd578063e66b1d1e1462000b22578063ef92e2221462000b4757600080fd5b8063cb29813c11620000ee578063cb29813c1462000a2e578063cc6badb31462000a53578063d4fb9a011462000a6b578063d920334e1462000a8e57600080fd5b8063bf56b37114620009dc578063c45a015514620009f4578063ca987b0e1462000a1657600080fd5b8063a3a2e89e1162000199578063a9059cbb1162000164578063a9059cbb146200094b578063b515566a1462000970578063bad3ea6a1462000995578063bb542ef014620009b757600080fd5b8063a3a2e89e14620008bd578063a3e6761014620008e2578063a457c2d71462000904578063a8aa1b31146200092957600080fd5b80638b42507f11620001da5780638b42507f14620008375780638ea5220f146200086b5780639502c426146200088d57806395d89b4114620008a557600080fd5b8063807c2d9c14620007ef57806383ad799414620008075780638760d539146200081f57600080fd5b806336e4ec6411620002fb578063546a8811116200029157806370a08231116200025c57806370a0823114620007605780637c0ff205146200079a5780637d1db4a514620007b25780637db1342c14620007ca57600080fd5b8063546a881114620006dd57806359a51c3414620006f55780636827e7641462000730578063704ce43e146200074857600080fd5b80633f4218e011620002d25780633f4218e0146200062f5780634355855a146200066357806344de2e4c14620006975780634a74bb0214620006ba57600080fd5b806336e4ec6414620005cd5780633950935114620005e55780633dab5269146200060a57600080fd5b806323b872dd11620003715780632b112e4911620003485780632b112e49146200054d5780632d48e89614620005655780632de22cf8146200058a578063313ce56714620005af57600080fd5b806323b872dd14620004eb57806327193bc41462000510578063273123b7146200052857600080fd5b806316d9962b11620003b257806316d9962b146200047057806318160ddd14620004975780631df4ccfc14620004ae5780631f53ac0214620004c657600080fd5b80630445b66714620003e857806306fdde031462000413578063095ea7b3146200043a57600080fd5b36620003e357005b600080fd5b348015620003f557600080fd5b5062000400601d5481565b6040519081526020015b60405180910390f35b3480156200042057600080fd5b506200042b62000be3565b6040516200040a919062002c80565b3480156200044757600080fd5b506200045f6200045936600462002cf8565b62000c7d565b60405190151581526020016200040a565b3480156200047d57600080fd5b50620004956200048f36600462002d27565b62000c99565b005b348015620004a457600080fd5b5060045462000400565b348015620004bb57600080fd5b506200040060135481565b348015620004d357600080fd5b5062000495620004e536600462002d41565b62000cd4565b348015620004f857600080fd5b506200045f6200050a36600462002d61565b62000d23565b3480156200051d57600080fd5b506200049562000d4e565b3480156200053557600080fd5b50620004956200054736600462002d41565b62000dc6565b3480156200055a57600080fd5b506200040062000e6f565b3480156200057257600080fd5b50620004956200058436600462002da7565b62000ee3565b3480156200059757600080fd5b5062000495620005a936600462002f09565b62000f7c565b348015620005bc57600080fd5b50604051600981526020016200040a565b348015620005da57600080fd5b5062000400600c5481565b348015620005f257600080fd5b506200045f6200060436600462002cf8565b62001537565b3480156200061757600080fd5b50620004956200062936600462002ffb565b6200157a565b3480156200063c57600080fd5b506200045f6200064e36600462002d41565b60086020526000908152604090205460ff1681565b3480156200067057600080fd5b506200045f6200068236600462002d41565b600a6020526000908152604090205460ff1681565b348015620006a457600080fd5b506007546200045f90600160a01b900460ff1681565b348015620006c757600080fd5b506019546200045f90600160a81b900460ff1681565b348015620006ea57600080fd5b5062000495620015c9565b3480156200070257600080fd5b5060075462000717906001600160a01b031681565b6040516001600160a01b0390911681526020016200040a565b3480156200073d57600080fd5b5062000400600f5481565b3480156200075557600080fd5b5062000400600e5481565b3480156200076d57600080fd5b50620004006200077f36600462002d41565b6001600160a01b031660009081526002602052604090205490565b348015620007a757600080fd5b506200040060115481565b348015620007bf57600080fd5b5062000400601b5481565b348015620007d757600080fd5b5062000495620007e936600462002d27565b62001664565b348015620007fc57600080fd5b5062000400601c5481565b3480156200081457600080fd5b5062000400600d5481565b3480156200082c57600080fd5b5062000495620016a1565b3480156200084457600080fd5b506200045f6200085636600462002d41565b60096020526000908152604090205460ff1681565b3480156200087857600080fd5b5060195462000717906001600160a01b031681565b3480156200089a57600080fd5b506200040060125481565b348015620008b257600080fd5b506200042b6200175c565b348015620008ca57600080fd5b5062000495620008dc3660046200301a565b6200176d565b348015620008ef57600080fd5b5060185462000717906001600160a01b031681565b3480156200091157600080fd5b506200045f6200092336600462002cf8565b620017c5565b3480156200093657600080fd5b5060165462000717906001600160a01b031681565b3480156200095857600080fd5b506200045f6200096a36600462002cf8565b62001866565b3480156200097d57600080fd5b50620004956200098f36600462003054565b62001876565b348015620009a257600080fd5b5060005462000717906001600160a01b031681565b348015620009c457600080fd5b5062000495620009d636600462002d41565b62001916565b348015620009e957600080fd5b5062000400600b5481565b34801562000a0157600080fd5b5060175462000717906001600160a01b031681565b34801562000a2357600080fd5b506200040060145481565b34801562000a3b57600080fd5b506200049562000a4d36600462003113565b62001965565b34801562000a6057600080fd5b506200040060105481565b34801562000a7857600080fd5b506019546200045f90600160b01b900460ff1681565b34801562000a9b57600080fd5b506200049562000aad36600462002d27565b620019ba565b34801562000ac057600080fd5b506200040062000ad236600462003157565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801562000b0a57600080fd5b506200049562000b1c36600462002da7565b620019f7565b34801562000b2f57600080fd5b506200049562000b4136600462003195565b62001ab6565b34801562000b5457600080fd5b506200049562001b01565b34801562000b6c57600080fd5b506200049562000b7e36600462002d41565b62001b90565b34801562000b9157600080fd5b5060155462000717906001600160a01b031681565b34801562000bb357600080fd5b506200049562000bc53660046200301a565b62001bdf565b34801562000bd857600080fd5b506200049562001caa565b60606005805462000bf490620031b3565b80601f016020809104026020016040519081016040528092919081815260200182805462000c2290620031b3565b801562000c735780601f1062000c475761010080835404028352916020019162000c73565b820191906000526020600020905b81548152906001019060200180831162000c5557829003601f168201915b5050505050905090565b60003362000c8d81858562001cf8565b60019150505b92915050565b6018546001600160a01b0316331462000ccf5760405162461bcd60e51b815260040162000cc690620031ef565b60405180910390fd5b600155565b6018546001600160a01b0316331462000d015760405162461bcd60e51b815260040162000cc690620031ef565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b60003362000d3385828562001e20565b62000d4085858562001eb7565b5060019150505b9392505050565b6017546001600160a01b0316331462000d7b5760405162461bcd60e51b815260040162000cc69062003224565b600b541562000dc05760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b604482015260640162000cc6565b42600b55565b60075433906001600160a01b031681148062000def57506018546001600160a01b038281169116145b62000e4d5760405162461bcd60e51b815260206004820152602760248201527f4f77616e626c653a2063616c6c657220646f65736e277420686176652070657260448201526636b4b9b9b4b7b760c91b606482015260840162000cc6565b506001600160a01b03166000908152601a60205260409020805460ff19169055565b60026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5461dead60009081527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc5460045491929162000ed291906200327c565b62000ede91906200327c565b905090565b6018546001600160a01b0316331462000f105760405162461bcd60e51b815260040162000cc690620031ef565b6000546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b15801562000f5f57600080fd5b505af115801562000f74573d6000803e3d6000fd5b505050505050565b6017546001600160a01b0316331462000fa95760405162461bcd60e51b815260040162000cc69062003224565b600562000fb78a82620032e1565b50600662000fc68982620032e1565b50866004600082825462000fdb9190620033ae565b90915550506046861015620010245760405162461bcd60e51b815260206004820152600e60248201526d1b1bddc81b1c081c195c98d95b9d60921b604482015260640162000cc6565b6000606462001034888a620033c4565b620010409190620033de565b9050600062001050828a6200327c565b3360009081526002602052604081208054929350849290919062001076908490620033ae565b90915550506001600160a01b03871660009081526002602052604081208054839290620010a5908490620033ae565b9091555050604051828152339060009060008051602062004a138339815191529060200160405180910390a36040518181526001600160a01b0388169060009060008051602062004a138339815191529060200160405180910390a36103e8620011118a6005620033c4565b6200111d9190620033de565b601b5560646200112f8a6001620033c4565b6200113b9190620033de565b601c55610fa06200114e8a6005620033c4565b6200115a9190620033de565b601d55601580546001600160a01b0319166001600160a01b0387169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620011b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011dd919062003401565b6001600160a01b031663c9c65396601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200123f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001265919062003401565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015620012b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012d8919062003401565b601680546001600160a01b0319166001600160a01b03928316179055306000818152600360209081526040808320601554909516835293905282902060001990559051869188916200132a9062002c72565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801562001367573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392831617815530808252600860209081526040808420805460ff199081166001908117909255601780548816875283872080548316841790558e881687526009855283872080548316841790556016805489168852848820805484168517905590548816875283872080548316841790557f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb19307500378580548316841790557fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b8054831684179055549096168552600a8352818520805487168217905592845280842080548616841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548616841790559280527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380549094169091179092558451600d55840151600e556080840151600f55830151601055606083015160115560a0830151601255620014ef62002401565b5050601880546001600160a01b039687166001600160a01b03199182168117909255601980548216909217909155600780549390961692169190911790935550505050505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490919062000c8d908290869062001574908790620033ae565b62001cf8565b6018546001600160a01b03163314620015a75760405162461bcd60e51b815260040162000cc690620031ef565b60198054921515600160a81b0260ff60a81b1990931692909217909155601d55565b6017546001600160a01b03163314620015f65760405162461bcd60e51b815260040162000cc69062003224565b601580546001600160a01b039081166000908152600860209081526040808320805460ff19908116600190811790925595548516845260099092528083208054861683179055601854909316825291902080549092161790556019805460ff60b01b1916600160b01b179055565b6018546001600160a01b03163314620016915760405162461bcd60e51b815260040162000cc690620031ef565b6200169c81620024ef565b601c55565b6007546001600160a01b03163314620016ce5760405162461bcd60e51b815260040162000cc69062003421565b6000600c5411620017145760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c99591d58d959608a1b604482015260640162000cc6565b6200171e620025d9565b600c54601360008282546200173491906200327c565b9091555050600c5460148054600090620017509084906200327c565b90915550506000600c55565b60606006805462000bf490620031b3565b6018546001600160a01b031633146200179a5760405162461bcd60e51b815260040162000cc690620031ef565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909190838110156200184c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000cc6565b6200185b828686840362001cf8565b506001949350505050565b6000336200185b81858562001eb7565b6007546001600160a01b03163314620018a35760405162461bcd60e51b815260040162000cc69062003421565b60005b815181101562001912576001601a6000848481518110620018cb57620018cb62003466565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062001909816200347c565b915050620018a6565b5050565b6018546001600160a01b03163314620019435760405162461bcd60e51b815260040162000cc690620031ef565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6018546001600160a01b03163314620019925760405162461bcd60e51b815260040162000cc690620031ef565b600d869055600e849055600f82905560108590556011839055601281905562000f7462002401565b6018546001600160a01b03163314620019e75760405162461bcd60e51b815260040162000cc690620031ef565b620019f281620024ef565b601b55565b6018546001600160a01b0316331462001a245760405162461bcd60e51b815260040162000cc690620031ef565b60005460405163f821076960e01b8152600481018490526001600160a01b039091169063f821076990602401600060405180830381600087803b15801562001a6b57600080fd5b505af115801562001a80573d6000803e3d6000fd5b5050600054604051635117196160e01b8152600481018590526001600160a01b0390911692506351171961915060240162000f44565b6018546001600160a01b0316331462001ae35760405162461bcd60e51b815260040162000cc690620031ef565b60078054911515600160a01b0260ff60a01b19909216919091179055565b6018546001600160a01b0316331462001b2e5760405162461bcd60e51b815260040162000cc690620031ef565b600c5460021462001b755760405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b604482015260640162000cc6565b62001b7f620025d9565b6001600c5562001b8e62002401565b565b6007546001600160a01b0316331462001bbd5760405162461bcd60e51b815260040162000cc69062003421565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6018546001600160a01b0316331462001c0c5760405162461bcd60e51b815260040162000cc690620031ef565b600b5460000362001c315760405162461bcd60e51b815260040162000cc69062003498565b600b5462001c439062015180620033ae565b42101562001c7f5760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015260640162000cc6565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6017546001600160a01b0316331462001cd75760405162461bcd60e51b815260040162000cc69062003224565b6019805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b03831662001d5c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000cc6565b6001600160a01b03821662001dbf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000cc6565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260036020908152604080832093861683529290522054600019811462001eb1578181101562001ea25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640162000cc6565b62001eb1848484840362001cf8565b50505050565b601954600090600160b01b900460ff1662001f005760405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b604482015260640162000cc6565b6001600160a01b0384166000908152601a602052604090205460ff1615801562001f4357506001600160a01b0383166000908152601a602052604090205460ff16155b62001f4d57600080fd5b601954600160a01b900460ff161562001f755762001f6d8484846200264c565b905062000d47565b6016546001600160a01b0385811691161462001ff357601b548211158062001fb557506001600160a01b03841660009081526009602052604090205460ff165b62001ff35760405162461bcd60e51b815260206004820152600d60248201526c13585e08151608105b5bdd5b9d609a1b604482015260640162000cc6565b6001600160a01b03831660009081526009602052604090205460ff16158015620020265750600754600160a01b900460ff165b15620020aa57601c5462002040906402540be400620033ae565b6001600160a01b03841660009081526002602052604090205462002066908490620033ae565b1115620020aa5760405162461bcd60e51b815260206004820152601160248201527013585e0815d85b1b195d08105b5bdd5b9d607a1b604482015260640162000cc6565b6016546001600160a01b03163314801590620020d05750601954600160a01b900460ff16155b8015620020e65750601954600160a81b900460ff165b8015620021045750601d543060009081526002602052604090205410155b15620021145762002114620026fa565b6001600160a01b0384166000908152600260205260409020546200213a9083906200327c565b6001600160a01b038086166000818152600260205260409020929092556016548492911614806200217857506016546001600160a01b038581169116145b15620021dd576001600160a01b03851660009081526008602052604090205460ff16158015620021c157506001600160a01b03841660009081526008602052604090205460ff16155b620021cd5782620021da565b620021da85858562002bad565b90505b6001600160a01b03841660009081526002602052604090205462002203908290620033ae565b6001600160a01b038086166000908152600260209081526040808320949094559188168152600a909152205460ff16620022b157600080546001600160a01b038781168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b1580156200229757600080fd5b505af1158015620022ac573d6000803e3d6000fd5b505050505b6001600160a01b0384166000908152600a602052604090205460ff166200234c57600080546001600160a01b038681168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b1580156200233257600080fd5b505af115801562002347573d6000803e3d6000fd5b505050505b6000546001546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991620023859160040190815260200190565b600060405180830381600087803b158015620023a057600080fd5b505af1158015620023b5573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b031660008051602062004a1383398151915283604051620023ee91815260200190565b60405180910390a3506001949350505050565b600c54600d54600e54600f54620024199190620033ae565b620024259190620033ae565b620024319190620033ae565b601355600c546010546011546012546200244c9190620033ae565b620024589190620033ae565b620024649190620033ae565b601455601354600c1015620024ab5760405162461bcd60e51b815260206004820152600c60248201526b546f6f20686967682066656560a01b604482015260640162000cc6565b6011601454111562001b8e5760405162461bcd60e51b815260206004820152600c60248201526b546f6f20686967682066656560a01b604482015260640162000cc6565b600b54600003620025145760405162461bcd60e51b815260040162000cc69062003498565b6103e86004546005620025289190620033c4565b620025349190620033de565b811015620025775760405162461bcd60e51b815260206004820152600f60248201526e135b5a5b880c0b8d49481b1a5b5a5d608a1b604482015260640162000cc6565b606460045460036200258a9190620033c4565b620025969190620033de565b811115620025d65760405162461bcd60e51b815260206004820152600c60248201526b13585e080cc9481b1a5b5a5d60a21b604482015260640162000cc6565b50565b600b54600003620025fe5760405162461bcd60e51b815260040162000cc69062003498565b600b5462002610906203f480620033ae565b42101562001b8e5760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015260640162000cc6565b6001600160a01b038316600090815260026020526040812054620026729083906200327c565b6001600160a01b038086166000908152600260205260408082209390935590851681522054620026a4908390620033ae565b6001600160a01b03808516600081815260026020526040908190209390935591519086169060008051602062004a1383398151915290620026e89086815260200190565b60405180910390a35060019392505050565b6019805460ff60a01b1916600160a01b179055306000908152600260208190526040822054601354600e5491939291620027359085620033c4565b620027419190620033de565b6200274d9190620033de565b905060006200275d82846200327c565b90508015806200276b575081155b156200277a5750505062002b9e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110620027b257620027b262003466565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156200280c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002832919062003401565b8160018151811062002848576200284862003466565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac9479062002890908590600090869030904290600401620034bb565b600060405180830381600087803b158015620028ab57600080fd5b505af1158015620028c0573d6000803e3d6000fd5b5050601354600f5447935060009250620028db9084620033c4565b620028e79190620033de565b90506000601354600c5484620028fe9190620033c4565b6200290a9190620033de565b905060006002601354600e5486620029239190620033c4565b6200292f9190620033de565b6200293b9190620033de565b9050600081836200294d86886200327c565b6200295991906200327c565b6200296591906200327c565b9050841562002a87578215620029e157601760009054906101000a90046001600160a01b03166001600160a01b0316639ee25ae4846040518263ffffffff1660e01b81526004016000604051808303818588803b158015620029c657600080fd5b505af1158015620029db573d6000803e3d6000fd5b50505050505b831562002a87576019546040516000916001600160a01b03169086908381818185875af1925050503d806000811462002a37576040519150601f19603f3d011682016040523d82523d6000602084013e62002a3c565b606091505b505090508062002a855760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b604482015260640162000cc6565b505b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801562002ad657600080fd5b505af115801562002aeb573d6000803e3d6000fd5b5050505050600088111562002b945760155460405163f305d71960e01b8152306004820152602481018a9052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990849060c40160606040518083038185885af115801562002b69573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002b9091906200352e565b5050505b5050505050505050505b6019805460ff60a01b19169055565b60165460009081906001600160a01b0385811691161462002bd15760135462002bd5565b6014545b90506000606462002be78386620033c4565b62002bf39190620033de565b3060009081526002602052604090205490915062002c13908290620033ae565b30600081815260026020526040908190209290925590516001600160a01b0388169060008051602062004a138339815191529062002c549085815260200190565b60405180910390a362002c6881856200327c565b9695505050505050565b6114b5806200355e83390190565b600060208083528351808285015260005b8181101562002caf5785810183015185820160400152820162002c91565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114620025d657600080fd5b803562002cf38162002cd0565b919050565b6000806040838503121562002d0c57600080fd5b823562002d198162002cd0565b946020939093013593505050565b60006020828403121562002d3a57600080fd5b5035919050565b60006020828403121562002d5457600080fd5b813562000d478162002cd0565b60008060006060848603121562002d7757600080fd5b833562002d848162002cd0565b9250602084013562002d968162002cd0565b929592945050506040919091013590565b6000806040838503121562002dbb57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562002e0c5762002e0c62002dca565b604052919050565b600082601f83011262002e2657600080fd5b813567ffffffffffffffff81111562002e435762002e4362002dca565b62002e58601f8201601f191660200162002de0565b81815284602083860101111562002e6e57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121562002e9e57600080fd5b60405160c0810181811067ffffffffffffffff8211171562002ec45762002ec462002dca565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060008060008060008060006101c08a8c03121562002f2957600080fd5b893567ffffffffffffffff8082111562002f4257600080fd5b62002f508d838e0162002e14565b9a5060208c013591508082111562002f6757600080fd5b5062002f768c828d0162002e14565b98505060408a0135965060608a0135955060808a013562002f978162002cd0565b945060a08a013562002fa98162002cd0565b935062002fb960c08b0162002ce6565b925062002fc960e08b0162002ce6565b915062002fdb8b6101008c0162002e8b565b90509295985092959850929598565b8035801515811462002cf357600080fd5b600080604083850312156200300f57600080fd5b62002d198362002fea565b600080604083850312156200302e57600080fd5b82356200303b8162002cd0565b91506200304b6020840162002fea565b90509250929050565b600060208083850312156200306857600080fd5b823567ffffffffffffffff808211156200308157600080fd5b818501915085601f8301126200309657600080fd5b813581811115620030ab57620030ab62002dca565b8060051b9150620030be84830162002de0565b8181529183018401918481019088841115620030d957600080fd5b938501935b83851015620031075784359250620030f68362002cd0565b8282529385019390850190620030de565b98975050505050505050565b60008060008060008060c087890312156200312d57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156200316b57600080fd5b8235620031788162002cd0565b915060208301356200318a8162002cd0565b809150509250929050565b600060208284031215620031a857600080fd5b62000d478262002fea565b600181811c90821680620031c857607f821691505b602082108103620031e957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520666163746f604082015261727960f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000c935762000c9362003266565b601f821115620032dc57600081815260208120601f850160051c81016020861015620032bb5750805b601f850160051c820191505b8181101562000f7457828155600101620032c7565b505050565b815167ffffffffffffffff811115620032fe57620032fe62002dca565b62003316816200330f8454620031b3565b8462003292565b602080601f8311600181146200334e5760008415620033355750858301515b600019600386901b1c1916600185901b17855562000f74565b600085815260208120601f198616915b828110156200337f578886015182559484019460019091019084016200335e565b50858210156200339e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000c935762000c9362003266565b808202811582820484141762000c935762000c9362003266565b600082620033fc57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200341457600080fd5b815162000d478162002cd0565b60208082526025908201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660408201526420b236b4b760d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006001820162003491576200349162003266565b5060010190565b602080825260099082015268085b185d5b98da195960ba1b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156200350d5784516001600160a01b031683529383019391830191600101620034e6565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156200354457600080fd5b835192506020840151915060408401519050925092509256fe60806040526ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d553480156200003657600080fd5b50604051620014b5380380620014b58339810160408190526200005991620001ec565b600180546001600160a01b03199081166001600160a01b038681169190911790925560028054821685841617905560008054909116918316919091178155620000ae82620000dd602090811b62000a7517901c565b90506000620000bf82600a6200034b565b9050620000ce81600162000363565b600d5550620003d39350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b038616916200012591906200037d565b600060405180830381855afa9150503d806000811462000162576040519150601f19603f3d011682016040523d82523d6000602084013e62000167565b606091505b509150915081620001b15760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b604482015260640160405180910390fd5b80806020019051810190620001c79190620003ae565b949350505050565b80516001600160a01b0381168114620001e757600080fd5b919050565b6000806000606084860312156200020257600080fd5b6200020d84620001cf565b92506200021d60208501620001cf565b91506200022d60408501620001cf565b90509250925092565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200028d57816000190482111562000271576200027162000236565b808516156200027f57918102915b93841c939080029062000251565b509250929050565b600082620002a65750600162000345565b81620002b55750600062000345565b8160018114620002ce5760028114620002d957620002f9565b600191505062000345565b60ff841115620002ed57620002ed62000236565b50506001821b62000345565b5060208310610133831016604e8410600b84101617156200031e575081810a62000345565b6200032a83836200024c565b806000190482111562000341576200034162000236565b0290505b92915050565b60006200035c60ff84168362000295565b9392505050565b808202811582820484141762000345576200034562000236565b6000825160005b81811015620003a0576020818601810151858301520162000384565b506000920191825250919050565b600060208284031215620003c157600080fd5b815160ff811681146200035c57600080fd5b6110d280620003e36000396000f3fe60806040526004361061011f5760003560e01c8063ce7c2ac2116100a0578063f0fc6bca11610064578063f0fc6bca14610318578063f1e9f1e51461032d578063f821076914610365578063ffb2c47914610385578063ffd49c84146103a557600080fd5b8063ce7c2ac214610260578063d0e30db0146102b7578063d4fda1f2146102bf578063e2d2e219146102ec578063efca2eed1461030257600080fd5b80634fab0ae8116100e75780634fab0ae8146101c557806351171961146101db57806366817df5146101fb5780638477d9f314610228578063997664d71461024a57600080fd5b806311ce023d1461012457806314b6ca961461014d57806328fd31981461016f5780632d48e8961461018f5780633a98ef39146101af575b600080fd5b34801561013057600080fd5b5061013a600b5481565b6040519081526020015b60405180910390f35b34801561015957600080fd5b5061016d610168366004610e21565b6103bb565b005b34801561017b57600080fd5b5061013a61018a366004610e4d565b610533565b34801561019b57600080fd5b5061016d6101aa366004610e71565b6105be565b3480156101bb57600080fd5b5061013a60075481565b3480156101d157600080fd5b5061013a600d5481565b3480156101e757600080fd5b5061016d6101f6366004610e93565b6105e0565b34801561020757600080fd5b5061013a610216366004610e4d565b60056020526000908152604090205481565b34801561023457600080fd5b5061023d6105fc565b6040516101449190610ef0565b34801561025657600080fd5b5061013a60085481565b34801561026c57600080fd5b5061029c61027b366004610e4d565b60066020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610144565b61016d61065e565b3480156102cb57600080fd5b5061013a6102da366004610e4d565b60046020526000908152604090205481565b3480156102f857600080fd5b5061013a600a5481565b34801561030e57600080fd5b5061013a60095481565b34801561032457600080fd5b5061016d6108ef565b34801561033957600080fd5b5060025461034d906001600160a01b031681565b6040516001600160a01b039091168152602001610144565b34801561037157600080fd5b5061016d610380366004610e93565b610954565b34801561039157600080fd5b5061016d6103a0366004610e93565b610970565b3480156103b157600080fd5b5061013a600c5481565b6000546001600160a01b031633146103d257600080fd5b6001600160a01b038216600090815260066020526040902054156103f9576103f982610b54565b60008111801561041f57506001600160a01b038216600090815260066020526040902054155b1561048557600380546001600160a01b0384166000818152600460205260408120839055600183018455929092527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191690911790556104b8565b801580156104aa57506001600160a01b03821660009081526006602052604090205415155b156104b8576104b882610c8d565b6001600160a01b03821660009081526006602052604090205460075482916104df91610f19565b6104e99190610f2c565b6007556001600160a01b038216600090815260066020526040902081905561051081610da2565b6001600160a01b0390921660009081526006602052604090206001019190915550565b6001600160a01b038116600090815260066020526040812054810361055a57506000919050565b6001600160a01b03821660009081526006602052604081205461057c90610da2565b6001600160a01b0384166000908152600660205260409020600101549091508082116105ac575060009392505050565b6105b68183610f19565b949350505050565b6000546001600160a01b031633146105d557600080fd5b600c91909155600d55565b6000546001600160a01b031633146105f757600080fd5b600d55565b6060600380548060200260200160405190810160405280929190818152602001828054801561065457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610636575b5050505050905090565b6000546001600160a01b0316331461067557600080fd5b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190610f3f565b60408051600280825260608201835292935060009290916020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610751573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107759190610f58565b8160008151811061078857610788610f75565b6001600160a01b0392831660209182029290920101526002548251911690829060019081106107b9576107b9610f75565b6001600160a01b03928316602091820292909201015260015460405163b6f9de9560e01b815291169063b6f9de959034906107ff90600090869030904290600401610f8b565b6000604051808303818588803b15801561081857600080fd5b505af115801561082c573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152600094508693506001600160a01b0390911691506370a0823190602401602060405180830381865afa15801561087e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a29190610f3f565b6108ac9190610f19565b9050806008546108bc9190610f2c565b600855600754600b546108d0908390610fc0565b6108da9190610fd7565b600a546108e79190610f2c565b600a55505050565b6108f833610dc5565b6109495760405162461bcd60e51b815260206004820152601760248201527f546f6f20736f6f6e2e204e65656420746f20776169742100000000000000000060448201526064015b60405180910390fd5b61095233610b54565b565b6000546001600160a01b0316331461096b57600080fd5b600c55565b6000546001600160a01b0316331461098757600080fd5b6003546000819003610997575050565b60008060005a90505b84821080156109ae57508383105b15610a6d5783600e54106109c2576000600e555b6109f46003600e54815481106109da576109da610f75565b6000918252602090912001546001600160a01b0316610dc5565b15610a2b57610a2b6003600e5481548110610a1157610a11610f75565b6000918252602090912001546001600160a01b0316610b54565b5a610a368284610f2c565b610a409190610f19565b91505a600e80549192506000610a5583610ff9565b91905055508280610a6590610ff9565b9350506109a0565b505050505b50565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691610abb9190611012565b600060405180830381855afa9150503d8060008114610af6576040519150601f19603f3d011682016040523d82523d6000602084013e610afb565b606091505b509150915081610b405760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b6044820152606401610940565b808060200190518101906105b69190611041565b6001600160a01b0381166000908152600660205260408120549003610b765750565b6000610b8182610533565b90508015610c895780600954610b979190610f2c565b6009556001600160a01b03821660009081526005602090815260408083204290556006909152902060020154610bce908290610f2c565b6001600160a01b0383166000908152600660205260409020600281019190915554610bf890610da2565b6001600160a01b038381166000818152600660205260409081902060010193909355600254925163a9059cbb60e01b815260048101919091526024810184905291169063a9059cbb906044016020604051808303816000875af1158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190611064565b505b5050565b60038054610c9d90600190610f19565b81548110610cad57610cad610f75565b60009182526020808320909101546001600160a01b0384811684526004909252604090922054600380549290931692918110610ceb57610ceb610f75565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260049182905260408120546003805491939291610d3790600190610f19565b81548110610d4757610d47610f75565b60009182526020808320909101546001600160a01b031683528201929092526040019020556003805480610d7d57610d7d611086565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000600b54600a5483610db59190610fc0565b610dbf9190610fd7565b92915050565b600c546001600160a01b03821660009081526005602052604081205490914291610def9190610f2c565b11158015610dbf5750600d54610e0483610533565b101592915050565b6001600160a01b0381168114610a7257600080fd5b60008060408385031215610e3457600080fd5b8235610e3f81610e0c565b946020939093013593505050565b600060208284031215610e5f57600080fd5b8135610e6a81610e0c565b9392505050565b60008060408385031215610e8457600080fd5b50508035926020909101359150565b600060208284031215610ea557600080fd5b5035919050565b600081518084526020808501945080840160005b83811015610ee55781516001600160a01b031687529582019590820190600101610ec0565b509495945050505050565b602081526000610e6a6020830184610eac565b634e487b7160e01b600052601160045260246000fd5b81810381811115610dbf57610dbf610f03565b80820180821115610dbf57610dbf610f03565b600060208284031215610f5157600080fd5b5051919050565b600060208284031215610f6a57600080fd5b8151610e6a81610e0c565b634e487b7160e01b600052603260045260246000fd5b848152608060208201526000610fa46080830186610eac565b6001600160a01b03949094166040830152506060015292915050565b8082028115828204841417610dbf57610dbf610f03565b600082610ff457634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161100b5761100b610f03565b5060010190565b6000825160005b818110156110335760208186018101518583015201611019565b506000920191825250919050565b60006020828403121561105357600080fd5b815160ff81168114610e6a57600080fd5b60006020828403121561107657600080fd5b81518015158114610e6a57600080fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212201cf5dee46f94badc7f6af66de6bb93c3bd84df2a94f8cae5e9389c4c3797b7c064736f6c63430008110033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202250d34f9012943f8e082511b2c6fe03ed9b9800aa9b10c087dbb92ca5edd39564736f6c63430008110033

Deployed Bytecode

0x608060405260043610620003db5760003560e01c8063807c2d9c1162000203578063bf56b3711162000117578063dd62ed3e11620000ad578063f16fd78d1162000078578063f16fd78d1462000b5f578063f887ea401462000b84578063fabe62831462000ba6578063fbd757531462000bcb57600080fd5b8063dd62ed3e1462000ab3578063e4cbd6b31462000afd578063e66b1d1e1462000b22578063ef92e2221462000b4757600080fd5b8063cb29813c11620000ee578063cb29813c1462000a2e578063cc6badb31462000a53578063d4fb9a011462000a6b578063d920334e1462000a8e57600080fd5b8063bf56b37114620009dc578063c45a015514620009f4578063ca987b0e1462000a1657600080fd5b8063a3a2e89e1162000199578063a9059cbb1162000164578063a9059cbb146200094b578063b515566a1462000970578063bad3ea6a1462000995578063bb542ef014620009b757600080fd5b8063a3a2e89e14620008bd578063a3e6761014620008e2578063a457c2d71462000904578063a8aa1b31146200092957600080fd5b80638b42507f11620001da5780638b42507f14620008375780638ea5220f146200086b5780639502c426146200088d57806395d89b4114620008a557600080fd5b8063807c2d9c14620007ef57806383ad799414620008075780638760d539146200081f57600080fd5b806336e4ec6411620002fb578063546a8811116200029157806370a08231116200025c57806370a0823114620007605780637c0ff205146200079a5780637d1db4a514620007b25780637db1342c14620007ca57600080fd5b8063546a881114620006dd57806359a51c3414620006f55780636827e7641462000730578063704ce43e146200074857600080fd5b80633f4218e011620002d25780633f4218e0146200062f5780634355855a146200066357806344de2e4c14620006975780634a74bb0214620006ba57600080fd5b806336e4ec6414620005cd5780633950935114620005e55780633dab5269146200060a57600080fd5b806323b872dd11620003715780632b112e4911620003485780632b112e49146200054d5780632d48e89614620005655780632de22cf8146200058a578063313ce56714620005af57600080fd5b806323b872dd14620004eb57806327193bc41462000510578063273123b7146200052857600080fd5b806316d9962b11620003b257806316d9962b146200047057806318160ddd14620004975780631df4ccfc14620004ae5780631f53ac0214620004c657600080fd5b80630445b66714620003e857806306fdde031462000413578063095ea7b3146200043a57600080fd5b36620003e357005b600080fd5b348015620003f557600080fd5b5062000400601d5481565b6040519081526020015b60405180910390f35b3480156200042057600080fd5b506200042b62000be3565b6040516200040a919062002c80565b3480156200044757600080fd5b506200045f6200045936600462002cf8565b62000c7d565b60405190151581526020016200040a565b3480156200047d57600080fd5b50620004956200048f36600462002d27565b62000c99565b005b348015620004a457600080fd5b5060045462000400565b348015620004bb57600080fd5b506200040060135481565b348015620004d357600080fd5b5062000495620004e536600462002d41565b62000cd4565b348015620004f857600080fd5b506200045f6200050a36600462002d61565b62000d23565b3480156200051d57600080fd5b506200049562000d4e565b3480156200053557600080fd5b50620004956200054736600462002d41565b62000dc6565b3480156200055a57600080fd5b506200040062000e6f565b3480156200057257600080fd5b50620004956200058436600462002da7565b62000ee3565b3480156200059757600080fd5b5062000495620005a936600462002f09565b62000f7c565b348015620005bc57600080fd5b50604051600981526020016200040a565b348015620005da57600080fd5b5062000400600c5481565b348015620005f257600080fd5b506200045f6200060436600462002cf8565b62001537565b3480156200061757600080fd5b50620004956200062936600462002ffb565b6200157a565b3480156200063c57600080fd5b506200045f6200064e36600462002d41565b60086020526000908152604090205460ff1681565b3480156200067057600080fd5b506200045f6200068236600462002d41565b600a6020526000908152604090205460ff1681565b348015620006a457600080fd5b506007546200045f90600160a01b900460ff1681565b348015620006c757600080fd5b506019546200045f90600160a81b900460ff1681565b348015620006ea57600080fd5b5062000495620015c9565b3480156200070257600080fd5b5060075462000717906001600160a01b031681565b6040516001600160a01b0390911681526020016200040a565b3480156200073d57600080fd5b5062000400600f5481565b3480156200075557600080fd5b5062000400600e5481565b3480156200076d57600080fd5b50620004006200077f36600462002d41565b6001600160a01b031660009081526002602052604090205490565b348015620007a757600080fd5b506200040060115481565b348015620007bf57600080fd5b5062000400601b5481565b348015620007d757600080fd5b5062000495620007e936600462002d27565b62001664565b348015620007fc57600080fd5b5062000400601c5481565b3480156200081457600080fd5b5062000400600d5481565b3480156200082c57600080fd5b5062000495620016a1565b3480156200084457600080fd5b506200045f6200085636600462002d41565b60096020526000908152604090205460ff1681565b3480156200087857600080fd5b5060195462000717906001600160a01b031681565b3480156200089a57600080fd5b506200040060125481565b348015620008b257600080fd5b506200042b6200175c565b348015620008ca57600080fd5b5062000495620008dc3660046200301a565b6200176d565b348015620008ef57600080fd5b5060185462000717906001600160a01b031681565b3480156200091157600080fd5b506200045f6200092336600462002cf8565b620017c5565b3480156200093657600080fd5b5060165462000717906001600160a01b031681565b3480156200095857600080fd5b506200045f6200096a36600462002cf8565b62001866565b3480156200097d57600080fd5b50620004956200098f36600462003054565b62001876565b348015620009a257600080fd5b5060005462000717906001600160a01b031681565b348015620009c457600080fd5b5062000495620009d636600462002d41565b62001916565b348015620009e957600080fd5b5062000400600b5481565b34801562000a0157600080fd5b5060175462000717906001600160a01b031681565b34801562000a2357600080fd5b506200040060145481565b34801562000a3b57600080fd5b506200049562000a4d36600462003113565b62001965565b34801562000a6057600080fd5b506200040060105481565b34801562000a7857600080fd5b506019546200045f90600160b01b900460ff1681565b34801562000a9b57600080fd5b506200049562000aad36600462002d27565b620019ba565b34801562000ac057600080fd5b506200040062000ad236600462003157565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801562000b0a57600080fd5b506200049562000b1c36600462002da7565b620019f7565b34801562000b2f57600080fd5b506200049562000b4136600462003195565b62001ab6565b34801562000b5457600080fd5b506200049562001b01565b34801562000b6c57600080fd5b506200049562000b7e36600462002d41565b62001b90565b34801562000b9157600080fd5b5060155462000717906001600160a01b031681565b34801562000bb357600080fd5b506200049562000bc53660046200301a565b62001bdf565b34801562000bd857600080fd5b506200049562001caa565b60606005805462000bf490620031b3565b80601f016020809104026020016040519081016040528092919081815260200182805462000c2290620031b3565b801562000c735780601f1062000c475761010080835404028352916020019162000c73565b820191906000526020600020905b81548152906001019060200180831162000c5557829003601f168201915b5050505050905090565b60003362000c8d81858562001cf8565b60019150505b92915050565b6018546001600160a01b0316331462000ccf5760405162461bcd60e51b815260040162000cc690620031ef565b60405180910390fd5b600155565b6018546001600160a01b0316331462000d015760405162461bcd60e51b815260040162000cc690620031ef565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b60003362000d3385828562001e20565b62000d4085858562001eb7565b5060019150505b9392505050565b6017546001600160a01b0316331462000d7b5760405162461bcd60e51b815260040162000cc69062003224565b600b541562000dc05760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b604482015260640162000cc6565b42600b55565b60075433906001600160a01b031681148062000def57506018546001600160a01b038281169116145b62000e4d5760405162461bcd60e51b815260206004820152602760248201527f4f77616e626c653a2063616c6c657220646f65736e277420686176652070657260448201526636b4b9b9b4b7b760c91b606482015260840162000cc6565b506001600160a01b03166000908152601a60205260409020805460ff19169055565b60026020527fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b5461dead60009081527f6a9609baa168169acaea398c4407efea4be641bb08e21e88806d9836fd9333cc5460045491929162000ed291906200327c565b62000ede91906200327c565b905090565b6018546001600160a01b0316331462000f105760405162461bcd60e51b815260040162000cc690620031ef565b6000546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b15801562000f5f57600080fd5b505af115801562000f74573d6000803e3d6000fd5b505050505050565b6017546001600160a01b0316331462000fa95760405162461bcd60e51b815260040162000cc69062003224565b600562000fb78a82620032e1565b50600662000fc68982620032e1565b50866004600082825462000fdb9190620033ae565b90915550506046861015620010245760405162461bcd60e51b815260206004820152600e60248201526d1b1bddc81b1c081c195c98d95b9d60921b604482015260640162000cc6565b6000606462001034888a620033c4565b620010409190620033de565b9050600062001050828a6200327c565b3360009081526002602052604081208054929350849290919062001076908490620033ae565b90915550506001600160a01b03871660009081526002602052604081208054839290620010a5908490620033ae565b9091555050604051828152339060009060008051602062004a138339815191529060200160405180910390a36040518181526001600160a01b0388169060009060008051602062004a138339815191529060200160405180910390a36103e8620011118a6005620033c4565b6200111d9190620033de565b601b5560646200112f8a6001620033c4565b6200113b9190620033de565b601c55610fa06200114e8a6005620033c4565b6200115a9190620033de565b601d55601580546001600160a01b0319166001600160a01b0387169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620011b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011dd919062003401565b6001600160a01b031663c9c65396601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200123f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001265919062003401565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015620012b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012d8919062003401565b601680546001600160a01b0319166001600160a01b03928316179055306000818152600360209081526040808320601554909516835293905282902060001990559051869188916200132a9062002c72565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801562001367573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b0392831617815530808252600860209081526040808420805460ff199081166001908117909255601780548816875283872080548316841790558e881687526009855283872080548316841790556016805489168852848820805484168517905590548816875283872080548316841790557f960b1051749987b45b5679007fff577a1c2f763ec21c15a6c5eb19307500378580548316841790557fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b8054831684179055549096168552600a8352818520805487168217905592845280842080548616841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80548616841790559280527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e380549094169091179092558451600d55840151600e556080840151600f55830151601055606083015160115560a0830151601255620014ef62002401565b5050601880546001600160a01b039687166001600160a01b03199182168117909255601980548216909217909155600780549390961692169190911790935550505050505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490919062000c8d908290869062001574908790620033ae565b62001cf8565b6018546001600160a01b03163314620015a75760405162461bcd60e51b815260040162000cc690620031ef565b60198054921515600160a81b0260ff60a81b1990931692909217909155601d55565b6017546001600160a01b03163314620015f65760405162461bcd60e51b815260040162000cc69062003224565b601580546001600160a01b039081166000908152600860209081526040808320805460ff19908116600190811790925595548516845260099092528083208054861683179055601854909316825291902080549092161790556019805460ff60b01b1916600160b01b179055565b6018546001600160a01b03163314620016915760405162461bcd60e51b815260040162000cc690620031ef565b6200169c81620024ef565b601c55565b6007546001600160a01b03163314620016ce5760405162461bcd60e51b815260040162000cc69062003421565b6000600c5411620017145760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481c99591d58d959608a1b604482015260640162000cc6565b6200171e620025d9565b600c54601360008282546200173491906200327c565b9091555050600c5460148054600090620017509084906200327c565b90915550506000600c55565b60606006805462000bf490620031b3565b6018546001600160a01b031633146200179a5760405162461bcd60e51b815260040162000cc690620031ef565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909190838110156200184c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000cc6565b6200185b828686840362001cf8565b506001949350505050565b6000336200185b81858562001eb7565b6007546001600160a01b03163314620018a35760405162461bcd60e51b815260040162000cc69062003421565b60005b815181101562001912576001601a6000848481518110620018cb57620018cb62003466565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062001909816200347c565b915050620018a6565b5050565b6018546001600160a01b03163314620019435760405162461bcd60e51b815260040162000cc690620031ef565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6018546001600160a01b03163314620019925760405162461bcd60e51b815260040162000cc690620031ef565b600d869055600e849055600f82905560108590556011839055601281905562000f7462002401565b6018546001600160a01b03163314620019e75760405162461bcd60e51b815260040162000cc690620031ef565b620019f281620024ef565b601b55565b6018546001600160a01b0316331462001a245760405162461bcd60e51b815260040162000cc690620031ef565b60005460405163f821076960e01b8152600481018490526001600160a01b039091169063f821076990602401600060405180830381600087803b15801562001a6b57600080fd5b505af115801562001a80573d6000803e3d6000fd5b5050600054604051635117196160e01b8152600481018590526001600160a01b0390911692506351171961915060240162000f44565b6018546001600160a01b0316331462001ae35760405162461bcd60e51b815260040162000cc690620031ef565b60078054911515600160a01b0260ff60a01b19909216919091179055565b6018546001600160a01b0316331462001b2e5760405162461bcd60e51b815260040162000cc690620031ef565b600c5460021462001b755760405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b604482015260640162000cc6565b62001b7f620025d9565b6001600c5562001b8e62002401565b565b6007546001600160a01b0316331462001bbd5760405162461bcd60e51b815260040162000cc69062003421565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6018546001600160a01b0316331462001c0c5760405162461bcd60e51b815260040162000cc690620031ef565b600b5460000362001c315760405162461bcd60e51b815260040162000cc69062003498565b600b5462001c439062015180620033ae565b42101562001c7f5760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015260640162000cc6565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6017546001600160a01b0316331462001cd75760405162461bcd60e51b815260040162000cc69062003224565b6019805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b03831662001d5c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000cc6565b6001600160a01b03821662001dbf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000cc6565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260036020908152604080832093861683529290522054600019811462001eb1578181101562001ea25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640162000cc6565b62001eb1848484840362001cf8565b50505050565b601954600090600160b01b900460ff1662001f005760405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b604482015260640162000cc6565b6001600160a01b0384166000908152601a602052604090205460ff1615801562001f4357506001600160a01b0383166000908152601a602052604090205460ff16155b62001f4d57600080fd5b601954600160a01b900460ff161562001f755762001f6d8484846200264c565b905062000d47565b6016546001600160a01b0385811691161462001ff357601b548211158062001fb557506001600160a01b03841660009081526009602052604090205460ff165b62001ff35760405162461bcd60e51b815260206004820152600d60248201526c13585e08151608105b5bdd5b9d609a1b604482015260640162000cc6565b6001600160a01b03831660009081526009602052604090205460ff16158015620020265750600754600160a01b900460ff165b15620020aa57601c5462002040906402540be400620033ae565b6001600160a01b03841660009081526002602052604090205462002066908490620033ae565b1115620020aa5760405162461bcd60e51b815260206004820152601160248201527013585e0815d85b1b195d08105b5bdd5b9d607a1b604482015260640162000cc6565b6016546001600160a01b03163314801590620020d05750601954600160a01b900460ff16155b8015620020e65750601954600160a81b900460ff165b8015620021045750601d543060009081526002602052604090205410155b15620021145762002114620026fa565b6001600160a01b0384166000908152600260205260409020546200213a9083906200327c565b6001600160a01b038086166000818152600260205260409020929092556016548492911614806200217857506016546001600160a01b038581169116145b15620021dd576001600160a01b03851660009081526008602052604090205460ff16158015620021c157506001600160a01b03841660009081526008602052604090205460ff16155b620021cd5782620021da565b620021da85858562002bad565b90505b6001600160a01b03841660009081526002602052604090205462002203908290620033ae565b6001600160a01b038086166000908152600260209081526040808320949094559188168152600a909152205460ff16620022b157600080546001600160a01b038781168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b1580156200229757600080fd5b505af1158015620022ac573d6000803e3d6000fd5b505050505b6001600160a01b0384166000908152600a602052604090205460ff166200234c57600080546001600160a01b038681168084526002602052604093849020549351630a5b654b60e11b81526004810191909152602481019390935216906314b6ca9690604401600060405180830381600087803b1580156200233257600080fd5b505af115801562002347573d6000803e3d6000fd5b505050505b6000546001546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991620023859160040190815260200190565b600060405180830381600087803b158015620023a057600080fd5b505af1158015620023b5573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b031660008051602062004a1383398151915283604051620023ee91815260200190565b60405180910390a3506001949350505050565b600c54600d54600e54600f54620024199190620033ae565b620024259190620033ae565b620024319190620033ae565b601355600c546010546011546012546200244c9190620033ae565b620024589190620033ae565b620024649190620033ae565b601455601354600c1015620024ab5760405162461bcd60e51b815260206004820152600c60248201526b546f6f20686967682066656560a01b604482015260640162000cc6565b6011601454111562001b8e5760405162461bcd60e51b815260206004820152600c60248201526b546f6f20686967682066656560a01b604482015260640162000cc6565b600b54600003620025145760405162461bcd60e51b815260040162000cc69062003498565b6103e86004546005620025289190620033c4565b620025349190620033de565b811015620025775760405162461bcd60e51b815260206004820152600f60248201526e135b5a5b880c0b8d49481b1a5b5a5d608a1b604482015260640162000cc6565b606460045460036200258a9190620033c4565b620025969190620033de565b811115620025d65760405162461bcd60e51b815260206004820152600c60248201526b13585e080cc9481b1a5b5a5d60a21b604482015260640162000cc6565b50565b600b54600003620025fe5760405162461bcd60e51b815260040162000cc69062003498565b600b5462002610906203f480620033ae565b42101562001b8e5760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015260640162000cc6565b6001600160a01b038316600090815260026020526040812054620026729083906200327c565b6001600160a01b038086166000908152600260205260408082209390935590851681522054620026a4908390620033ae565b6001600160a01b03808516600081815260026020526040908190209390935591519086169060008051602062004a1383398151915290620026e89086815260200190565b60405180910390a35060019392505050565b6019805460ff60a01b1916600160a01b179055306000908152600260208190526040822054601354600e5491939291620027359085620033c4565b620027419190620033de565b6200274d9190620033de565b905060006200275d82846200327c565b90508015806200276b575081155b156200277a5750505062002b9e565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110620027b257620027b262003466565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156200280c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002832919062003401565b8160018151811062002848576200284862003466565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac9479062002890908590600090869030904290600401620034bb565b600060405180830381600087803b158015620028ab57600080fd5b505af1158015620028c0573d6000803e3d6000fd5b5050601354600f5447935060009250620028db9084620033c4565b620028e79190620033de565b90506000601354600c5484620028fe9190620033c4565b6200290a9190620033de565b905060006002601354600e5486620029239190620033c4565b6200292f9190620033de565b6200293b9190620033de565b9050600081836200294d86886200327c565b6200295991906200327c565b6200296591906200327c565b9050841562002a87578215620029e157601760009054906101000a90046001600160a01b03166001600160a01b0316639ee25ae4846040518263ffffffff1660e01b81526004016000604051808303818588803b158015620029c657600080fd5b505af1158015620029db573d6000803e3d6000fd5b50505050505b831562002a87576019546040516000916001600160a01b03169086908381818185875af1925050503d806000811462002a37576040519150601f19603f3d011682016040523d82523d6000602084013e62002a3c565b606091505b505090508062002a855760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b604482015260640162000cc6565b505b60008054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801562002ad657600080fd5b505af115801562002aeb573d6000803e3d6000fd5b5050505050600088111562002b945760155460405163f305d71960e01b8152306004820152602481018a9052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990849060c40160606040518083038185885af115801562002b69573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062002b9091906200352e565b5050505b5050505050505050505b6019805460ff60a01b19169055565b60165460009081906001600160a01b0385811691161462002bd15760135462002bd5565b6014545b90506000606462002be78386620033c4565b62002bf39190620033de565b3060009081526002602052604090205490915062002c13908290620033ae565b30600081815260026020526040908190209290925590516001600160a01b0388169060008051602062004a138339815191529062002c549085815260200190565b60405180910390a362002c6881856200327c565b9695505050505050565b6114b5806200355e83390190565b600060208083528351808285015260005b8181101562002caf5785810183015185820160400152820162002c91565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114620025d657600080fd5b803562002cf38162002cd0565b919050565b6000806040838503121562002d0c57600080fd5b823562002d198162002cd0565b946020939093013593505050565b60006020828403121562002d3a57600080fd5b5035919050565b60006020828403121562002d5457600080fd5b813562000d478162002cd0565b60008060006060848603121562002d7757600080fd5b833562002d848162002cd0565b9250602084013562002d968162002cd0565b929592945050506040919091013590565b6000806040838503121562002dbb57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562002e0c5762002e0c62002dca565b604052919050565b600082601f83011262002e2657600080fd5b813567ffffffffffffffff81111562002e435762002e4362002dca565b62002e58601f8201601f191660200162002de0565b81815284602083860101111562002e6e57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121562002e9e57600080fd5b60405160c0810181811067ffffffffffffffff8211171562002ec45762002ec462002dca565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060008060008060008060006101c08a8c03121562002f2957600080fd5b893567ffffffffffffffff8082111562002f4257600080fd5b62002f508d838e0162002e14565b9a5060208c013591508082111562002f6757600080fd5b5062002f768c828d0162002e14565b98505060408a0135965060608a0135955060808a013562002f978162002cd0565b945060a08a013562002fa98162002cd0565b935062002fb960c08b0162002ce6565b925062002fc960e08b0162002ce6565b915062002fdb8b6101008c0162002e8b565b90509295985092959850929598565b8035801515811462002cf357600080fd5b600080604083850312156200300f57600080fd5b62002d198362002fea565b600080604083850312156200302e57600080fd5b82356200303b8162002cd0565b91506200304b6020840162002fea565b90509250929050565b600060208083850312156200306857600080fd5b823567ffffffffffffffff808211156200308157600080fd5b818501915085601f8301126200309657600080fd5b813581811115620030ab57620030ab62002dca565b8060051b9150620030be84830162002de0565b8181529183018401918481019088841115620030d957600080fd5b938501935b83851015620031075784359250620030f68362002cd0565b8282529385019390850190620030de565b98975050505050505050565b60008060008060008060c087890312156200312d57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156200316b57600080fd5b8235620031788162002cd0565b915060208301356200318a8162002cd0565b809150509250929050565b600060208284031215620031a857600080fd5b62000d478262002fea565b600181811c90821680620031c857607f821691505b602082108103620031e957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520666163746f604082015261727960f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000c935762000c9362003266565b601f821115620032dc57600081815260208120601f850160051c81016020861015620032bb5750805b601f850160051c820191505b8181101562000f7457828155600101620032c7565b505050565b815167ffffffffffffffff811115620032fe57620032fe62002dca565b62003316816200330f8454620031b3565b8462003292565b602080601f8311600181146200334e5760008415620033355750858301515b600019600386901b1c1916600185901b17855562000f74565b600085815260208120601f198616915b828110156200337f578886015182559484019460019091019084016200335e565b50858210156200339e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000c935762000c9362003266565b808202811582820484141762000c935762000c9362003266565b600082620033fc57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200341457600080fd5b815162000d478162002cd0565b60208082526025908201527f4f776e61626c653a2063616c6c6572206973206e6f74207468652070726f6f6660408201526420b236b4b760d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006001820162003491576200349162003266565b5060010190565b602080825260099082015268085b185d5b98da195960ba1b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156200350d5784516001600160a01b031683529383019391830191600101620034e6565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156200354457600080fd5b835192506020840151915060408401519050925092509256fe60806040526ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d553480156200003657600080fd5b50604051620014b5380380620014b58339810160408190526200005991620001ec565b600180546001600160a01b03199081166001600160a01b038681169190911790925560028054821685841617905560008054909116918316919091178155620000ae82620000dd602090811b62000a7517901c565b90506000620000bf82600a6200034b565b9050620000ce81600162000363565b600d5550620003d39350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b038616916200012591906200037d565b600060405180830381855afa9150503d806000811462000162576040519150601f19603f3d011682016040523d82523d6000602084013e62000167565b606091505b509150915081620001b15760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b604482015260640160405180910390fd5b80806020019051810190620001c79190620003ae565b949350505050565b80516001600160a01b0381168114620001e757600080fd5b919050565b6000806000606084860312156200020257600080fd5b6200020d84620001cf565b92506200021d60208501620001cf565b91506200022d60408501620001cf565b90509250925092565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200028d57816000190482111562000271576200027162000236565b808516156200027f57918102915b93841c939080029062000251565b509250929050565b600082620002a65750600162000345565b81620002b55750600062000345565b8160018114620002ce5760028114620002d957620002f9565b600191505062000345565b60ff841115620002ed57620002ed62000236565b50506001821b62000345565b5060208310610133831016604e8410600b84101617156200031e575081810a62000345565b6200032a83836200024c565b806000190482111562000341576200034162000236565b0290505b92915050565b60006200035c60ff84168362000295565b9392505050565b808202811582820484141762000345576200034562000236565b6000825160005b81811015620003a0576020818601810151858301520162000384565b506000920191825250919050565b600060208284031215620003c157600080fd5b815160ff811681146200035c57600080fd5b6110d280620003e36000396000f3fe60806040526004361061011f5760003560e01c8063ce7c2ac2116100a0578063f0fc6bca11610064578063f0fc6bca14610318578063f1e9f1e51461032d578063f821076914610365578063ffb2c47914610385578063ffd49c84146103a557600080fd5b8063ce7c2ac214610260578063d0e30db0146102b7578063d4fda1f2146102bf578063e2d2e219146102ec578063efca2eed1461030257600080fd5b80634fab0ae8116100e75780634fab0ae8146101c557806351171961146101db57806366817df5146101fb5780638477d9f314610228578063997664d71461024a57600080fd5b806311ce023d1461012457806314b6ca961461014d57806328fd31981461016f5780632d48e8961461018f5780633a98ef39146101af575b600080fd5b34801561013057600080fd5b5061013a600b5481565b6040519081526020015b60405180910390f35b34801561015957600080fd5b5061016d610168366004610e21565b6103bb565b005b34801561017b57600080fd5b5061013a61018a366004610e4d565b610533565b34801561019b57600080fd5b5061016d6101aa366004610e71565b6105be565b3480156101bb57600080fd5b5061013a60075481565b3480156101d157600080fd5b5061013a600d5481565b3480156101e757600080fd5b5061016d6101f6366004610e93565b6105e0565b34801561020757600080fd5b5061013a610216366004610e4d565b60056020526000908152604090205481565b34801561023457600080fd5b5061023d6105fc565b6040516101449190610ef0565b34801561025657600080fd5b5061013a60085481565b34801561026c57600080fd5b5061029c61027b366004610e4d565b60066020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610144565b61016d61065e565b3480156102cb57600080fd5b5061013a6102da366004610e4d565b60046020526000908152604090205481565b3480156102f857600080fd5b5061013a600a5481565b34801561030e57600080fd5b5061013a60095481565b34801561032457600080fd5b5061016d6108ef565b34801561033957600080fd5b5060025461034d906001600160a01b031681565b6040516001600160a01b039091168152602001610144565b34801561037157600080fd5b5061016d610380366004610e93565b610954565b34801561039157600080fd5b5061016d6103a0366004610e93565b610970565b3480156103b157600080fd5b5061013a600c5481565b6000546001600160a01b031633146103d257600080fd5b6001600160a01b038216600090815260066020526040902054156103f9576103f982610b54565b60008111801561041f57506001600160a01b038216600090815260066020526040902054155b1561048557600380546001600160a01b0384166000818152600460205260408120839055600183018455929092527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b03191690911790556104b8565b801580156104aa57506001600160a01b03821660009081526006602052604090205415155b156104b8576104b882610c8d565b6001600160a01b03821660009081526006602052604090205460075482916104df91610f19565b6104e99190610f2c565b6007556001600160a01b038216600090815260066020526040902081905561051081610da2565b6001600160a01b0390921660009081526006602052604090206001019190915550565b6001600160a01b038116600090815260066020526040812054810361055a57506000919050565b6001600160a01b03821660009081526006602052604081205461057c90610da2565b6001600160a01b0384166000908152600660205260409020600101549091508082116105ac575060009392505050565b6105b68183610f19565b949350505050565b6000546001600160a01b031633146105d557600080fd5b600c91909155600d55565b6000546001600160a01b031633146105f757600080fd5b600d55565b6060600380548060200260200160405190810160405280929190818152602001828054801561065457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610636575b5050505050905090565b6000546001600160a01b0316331461067557600080fd5b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190610f3f565b60408051600280825260608201835292935060009290916020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015610751573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107759190610f58565b8160008151811061078857610788610f75565b6001600160a01b0392831660209182029290920101526002548251911690829060019081106107b9576107b9610f75565b6001600160a01b03928316602091820292909201015260015460405163b6f9de9560e01b815291169063b6f9de959034906107ff90600090869030904290600401610f8b565b6000604051808303818588803b15801561081857600080fd5b505af115801561082c573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152600094508693506001600160a01b0390911691506370a0823190602401602060405180830381865afa15801561087e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a29190610f3f565b6108ac9190610f19565b9050806008546108bc9190610f2c565b600855600754600b546108d0908390610fc0565b6108da9190610fd7565b600a546108e79190610f2c565b600a55505050565b6108f833610dc5565b6109495760405162461bcd60e51b815260206004820152601760248201527f546f6f20736f6f6e2e204e65656420746f20776169742100000000000000000060448201526064015b60405180910390fd5b61095233610b54565b565b6000546001600160a01b0316331461096b57600080fd5b600c55565b6000546001600160a01b0316331461098757600080fd5b6003546000819003610997575050565b60008060005a90505b84821080156109ae57508383105b15610a6d5783600e54106109c2576000600e555b6109f46003600e54815481106109da576109da610f75565b6000918252602090912001546001600160a01b0316610dc5565b15610a2b57610a2b6003600e5481548110610a1157610a11610f75565b6000918252602090912001546001600160a01b0316610b54565b5a610a368284610f2c565b610a409190610f19565b91505a600e80549192506000610a5583610ff9565b91905055508280610a6590610ff9565b9350506109a0565b505050505b50565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691610abb9190611012565b600060405180830381855afa9150503d8060008114610af6576040519150601f19603f3d011682016040523d82523d6000602084013e610afb565b606091505b509150915081610b405760405162461bcd60e51b815260206004820152601060248201526f696e76616c696420646563696d616c7360801b6044820152606401610940565b808060200190518101906105b69190611041565b6001600160a01b0381166000908152600660205260408120549003610b765750565b6000610b8182610533565b90508015610c895780600954610b979190610f2c565b6009556001600160a01b03821660009081526005602090815260408083204290556006909152902060020154610bce908290610f2c565b6001600160a01b0383166000908152600660205260409020600281019190915554610bf890610da2565b6001600160a01b038381166000818152600660205260409081902060010193909355600254925163a9059cbb60e01b815260048101919091526024810184905291169063a9059cbb906044016020604051808303816000875af1158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190611064565b505b5050565b60038054610c9d90600190610f19565b81548110610cad57610cad610f75565b60009182526020808320909101546001600160a01b0384811684526004909252604090922054600380549290931692918110610ceb57610ceb610f75565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260049182905260408120546003805491939291610d3790600190610f19565b81548110610d4757610d47610f75565b60009182526020808320909101546001600160a01b031683528201929092526040019020556003805480610d7d57610d7d611086565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000600b54600a5483610db59190610fc0565b610dbf9190610fd7565b92915050565b600c546001600160a01b03821660009081526005602052604081205490914291610def9190610f2c565b11158015610dbf5750600d54610e0483610533565b101592915050565b6001600160a01b0381168114610a7257600080fd5b60008060408385031215610e3457600080fd5b8235610e3f81610e0c565b946020939093013593505050565b600060208284031215610e5f57600080fd5b8135610e6a81610e0c565b9392505050565b60008060408385031215610e8457600080fd5b50508035926020909101359150565b600060208284031215610ea557600080fd5b5035919050565b600081518084526020808501945080840160005b83811015610ee55781516001600160a01b031687529582019590820190600101610ec0565b509495945050505050565b602081526000610e6a6020830184610eac565b634e487b7160e01b600052601160045260246000fd5b81810381811115610dbf57610dbf610f03565b80820180821115610dbf57610dbf610f03565b600060208284031215610f5157600080fd5b5051919050565b600060208284031215610f6a57600080fd5b8151610e6a81610e0c565b634e487b7160e01b600052603260045260246000fd5b848152608060208201526000610fa46080830186610eac565b6001600160a01b03949094166040830152506060015292915050565b8082028115828204841417610dbf57610dbf610f03565b600082610ff457634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161100b5761100b610f03565b5060010190565b6000825160005b818110156110335760208186018101518583015201611019565b506000920191825250919050565b60006020828403121561105357600080fd5b815160ff81168114610e6a57600080fd5b60006020828403121561107657600080fd5b81518015158114610e6a57600080fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212201cf5dee46f94badc7f6af66de6bb93c3bd84df2a94f8cae5e9389c4c3797b7c064736f6c63430008110033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202250d34f9012943f8e082511b2c6fe03ed9b9800aa9b10c087dbb92ca5edd39564736f6c63430008110033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.