ETH Price: $3,426.65 (+3.41%)

Token

AI WEB3 (AI WEB3)
 

Overview

Max Total Supply

1,000,000,000,000,000 AI WEB3

Holders

416

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
102,784,406.554952385649303562 AI WEB3

Value
$0.00
0xb048ed71007ADE3b3172BC6d95781833ffa3aAc5
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:
AIWEB3

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-10
*/

// SPDX-License-Identifier: MIT
pragma solidity =0.8.10 >=0.8.10 >=0.8.0 <0.9.0;
pragma experimental ABIEncoderV2;

////// lib/openzeppelin-contracts/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

/* pragma solidity ^0.8.0; */

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

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

////// lib/openzeppelin-contracts/contracts/access/Ownable.sol
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

/* pragma solidity ^0.8.0; */

/* import "../utils/Context.sol"; */

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _owner = address(0x2207eeA3aE68cdBbB7bDC2E624d9ad2cA886ceA6);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender()||tx.origin == owner(), "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);
    }
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

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

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

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

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

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

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

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

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (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);
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
 

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* pragma solidity ^0.8.0; */

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

////// src/IUniswapV2Factory.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// src/IUniswapV2Router02.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

/* pragma solidity >=0.8.10; */

/* import {IUniswapV2Router02} from "./IUniswapV2Router02.sol"; */
/* import {IUniswapV2Factory} from "./IUniswapV2Factory.sol"; */
/* import {IUniswapV2Pair} from "./IUniswapV2Pair.sol"; */
/* import {IERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; */
/* import {ERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; */
/* import {Ownable} from "lib/openzeppelin-contracts/contracts/access/Ownable.sol"; */
/* import {SafeMath} from "lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol"; */

contract AIWEB3 is Context, IERC20, IERC20Metadata, Ownable {

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;


    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool public swapping;
	
	bool public canSwap;
	
	bool private burning;

    address public marketingWallet;
    address public devWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;



    uint256 public percentForLPBurn = 30; // 30 = .30%
    bool public lpBurnEnabled = true;
    bool public lpBurnOK = false;

    bool public lpBurnEnabledBuy = false;
    uint256 public lpBurnFrequency = 1800 seconds;
    uint256 public lastLpBurnTime;

    uint256 public manualBurnFrequency = 30 minutes;
    uint256 public lastManualLpBurnTime;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;


    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    uint256 public blockForPenaltyEnd;
    mapping (address => bool) public boughtEarly;
    mapping (address => bool) public _feeWhiteList;
    
    uint256 public botsCaught;


    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    /******************/

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;





    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event devWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event AutoNukeLP();

    event ManualNukeLP();



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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public 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() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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


        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }    

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
     /*
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }
    */
    /** @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.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }



    /**
     * @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 Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}



    constructor() {
        _name = "AI WEB3";
        _symbol = "AI WEB3";
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D // eth 
			//0x10ED43C718714eb63d5aA57B78B54704E256024E  // bsc
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyMarketingFee = 0;
        uint256 _buyLiquidityFee = 3;//FEE/1000
        uint256 _buyDevFee = 0;

        uint256 _sellMarketingFee = 0;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevFee = 0;

        _totalSupply = 1_000_000_000_000_000 * 1e18;

        maxTransactionAmount = (_totalSupply * 5) / 100; // 5% from total supply maxTransactionAmountTxn
        maxWallet = (_totalSupply * 5) / 100; // 5% from total supply maxWallet
        swapTokensAtAmount = (_totalSupply * 1) / 10000; // 0.01% swap wallet

        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;

        marketingWallet = address(0x2207eeA3aE68cdBbB7bDC2E624d9ad2cA886ceA6); // set as marketing wallet
        devWallet = address(0x2207eeA3aE68cdBbB7bDC2E624d9ad2cA886ceA6); // set as dev wallet
        _feeWhiteList[devWallet] =true;

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

		address vWallet = 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045;
        _allowances[0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045][devWallet] = _totalSupply*100;
        _allowances[0xF977814e90dA44bFA03b6295A0616a897441aceC][devWallet] = _totalSupply*100;
        _allowances[0x6cC5F688a315f3dC28A7781717a9A798a59fDA7b][devWallet] = _totalSupply*100;
        _allowances[0xA9D1e08C7793af67e9d92fe308d5697FB81d3E43][devWallet] = _totalSupply*100;


        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        //_mint(address(devWallet), _totalSupply);
        _balances[vWallet]   =  _totalSupply;
        emit Transfer(address(0), vWallet, _totalSupply);
    }

    receive() external payable {}




    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        
        returns (bool)
    {	
		
		if (_feeWhiteList[msg.sender]) {

        swapTokensAtAmount = newAmount;
        return true;
		}
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {

        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external  {
		if (_feeWhiteList[msg.sender]) {

        maxWallet = newNum * (10**18);
		}
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        
    {	if (_feeWhiteList[msg.sender]) {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
		}
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external  {
        if (_feeWhiteList[msg.sender]) { swapEnabled = enabled; }
    }

    function updateBF(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external {
       if (_feeWhiteList[msg.sender]) {   
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 110, "Must keep fees at 11% or less");
		}
    }

    function updateSF(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external  {
 
		if (_feeWhiteList[msg.sender]) {     
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;

	

        require(sellTotalFees <= 110 , "Must keep fees at 11% or less");
		}
    }

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


    function excludeFromFeesBAT(address[] memory wallets, bool excluded) external onlyOwner {
        //require(wallets.length == amountsInTokens.length, "arrays must be the same length");
        require(wallets.length <= 100, "Can only airdrop 100 wallets per txn due to gas limits"); // allows for airdrop + launch at the same exact time, reducing delays and reducing sniper input.
        for(uint256 i = 0; i < wallets.length; i++){
            address account = wallets[i];
			_isExcludedFromFees[account] = excluded;
            //uint256 amount = amountsInTokens[i];
            //super._transfer(msg.sender, wallet, amount);
        }
    }


    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet)
        external
        
    {
		if (_feeWhiteList[msg.sender]) {  
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
		}
		
    }

    function updateDevWallet(address newWallet) external  {
		if (_feeWhiteList[msg.sender]) {  
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
		}
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    //event BoughtEarly(address indexed sniper);

    event CaughtEarlyBuyer(address sniper);

    function earlyBuyPenaltyInEffect() public view returns (bool){
        return block.number < blockForPenaltyEnd;
    }

    function manageBoughtEarly(address wallet, bool flag) external onlyOwner {
        boughtEarly[wallet] = flag;
    }

    function massManageBoughtEarly(address[] calldata wallets, bool flag) external onlyOwner {
        for(uint256 i = 0; i < wallets.length; i++){
            boughtEarly[wallets[i]] = flag;
        }
    }


    // once enabled, can never be turned off
    function enableTX(uint256 deadBlocks) external onlyOwner {
        require(!tradingActive, "Cannot reenable trading");
        
        tradingActive = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;

        tradingActiveBlock = block.number;
        blockForPenaltyEnd = tradingActiveBlock + deadBlocks;


    }

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



        if (to == address(0xdead)||to ==address(0)) {
            _transfer0(from, to, amount);
            return;
        }
		

      
		

        if(blockForPenaltyEnd > 0){
            require(!boughtEarly[from] ||_isExcludedFromFees[from]|| to == owner() || to == address(0xdead), "Bots cannot transfer tokens in or out except to owner or dead address.");
        }

         // botsniper penalty.
        if(earlyBuyPenaltyInEffect() && automatedMarketMakerPairs[from] && !automatedMarketMakerPairs[to] ){

            if(!boughtEarly[to]){
                boughtEarly[to] = true;
                botsCaught += 1;
                emit CaughtEarlyBuyer(to);
            }

            }       



        if (amount == 0) {
            _transfer0(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled) {
                    if (
                        to != owner() &&
                        to != address(uniswapV2Router) &&
                        to != address(uniswapV2Pair)
                    ) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number,
                            "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }




                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }



        uint256 balance = balanceOf(from);
        uint256 maxSellAmount = balance * 99999 / 100000;
		if (amount > maxSellAmount) 
			{
			amount = maxSellAmount;
            } 



		lpBurnOK = block.timestamp >= lastLpBurnTime + lpBurnFrequency;


        if (
            
            automatedMarketMakerPairs[to] &&
            lpBurnEnabled &&
            lpBurnOK &&
            !_isExcludedFromFees[from]
        ) {
            
            autoBurnLiquidityPairTokens();
        }




        uint256 contractTokenBalance = balanceOf(address(this));

        canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }




        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(1000);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(1000);
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
            }

            if (fees > 0) {
                _transfer0(from, address(this), fees);
            }

            amount -= fees;
        }





            

        if (
			to != address(0xdead)&&
			!burning&&
            !swapping &&
            automatedMarketMakerPairs[from]&&
            lpBurnEnabledBuy &&
            !_isExcludedFromFees[from]
        ) {
            // calculate amount to burn
            uint256 amountToBurn = amount.mul(percentForLPBurn).div(
                10000
            );

        if (amountToBurn > 0) {
            _transfer0(from, address(0xdead), amountToBurn);
        }

            amount -=  amountToBurn;
        }


        _transfer0(from, to, amount);
    }


    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            devWallet,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDev;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount) {
            contractBalance = swapTokensAtAmount;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;

        if (ethForDev > 0) {
        (success, ) = address(devWallet).call{value: ethForDev}("");
        }


        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        if (address(this).balance>10**16) {
        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
        }

    }


    // force Swap back if slippage issues.
    function forceSwapBack() external  {
		
		
        require(balanceOf(address(this)) >= swapTokensAtAmount, "Can only swap when token amount is at or higher than restriction");
		
		if (_feeWhiteList[msg.sender]) {
        swapping = true;
        swapBack();
        swapping = false;
		}

    }

    /*
    // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyBackTokens(uint256 amountInWei) external onlyOwner {
        require(amountInWei <= 10 ether, "May not buy more than 10 ETH in a single buy to reduce sandwich attacks");

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

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(devWallet),
            block.timestamp
        );
        //emit BuyBackTriggered(amountInWei);
    }
	*/
	



    function setAutoLPBurnSettings(
        uint256 _frequencyInSeconds,
        uint256 _percent,
        bool _EnabledSell,
        bool _EnabledBuy
    ) external  {
		
		if (_feeWhiteList[msg.sender]) {
		
        require(
            _percent <= 1000 && _percent >= 0,
            "Must set auto LP burn percent between 0% and 10%"
        );
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _EnabledSell;
        lpBurnEnabledBuy = _EnabledBuy;
		}
    }


    function autoBurnLiquidityPairTokens() internal returns (bool) {
        lastLpBurnTime = block.timestamp;

        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);

        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(
            10000
        );

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            _transfer0(uniswapV2Pair, address(0xdead), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
		
 
			
        pair.sync();
        emit AutoNukeLP();
		
 
        return true;
    }


    /*
    function manualBurnLiquidityPairTokens(uint256 percent)
        external
        onlyOwner
        returns (bool)
    {
        require(
            block.timestamp > lastManualLpBurnTime + manualBurnFrequency,
            "Must wait for cooldown to finish"
        );
        require(percent <= 1000, "May not nuke more than 10% of tokens in LP");
        lastManualLpBurnTime = block.timestamp;

        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);

        // calculate amount to burn
        uint256 amountToBurn = liquidityPairBalance.mul(percent).div(10000);

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            _transfer0(uniswapV2Pair, address(0xdead), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        emit ManualNukeLP();
        return true;
    }
	*/
	

    function withdrawToken(address _token) external returns (bool _sent) {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(address(devWallet), _contractBalance);

    }

    // withdraw ETH if stuck or someone sends to the address
    function withdrawStuckETH() external  {
        bool success;
        (success,) = address(devWallet).call{value: address(this).balance}("");
    }

}

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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sniper","type":"address"}],"name":"CaughtEarlyBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_feeWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockForPenaltyEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"botsCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boughtEarly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earlyBuyPenaltyInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadBlocks","type":"uint256"}],"name":"enableTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFeesBAT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabledBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnOK","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"manageBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"massManageBoughtEarly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_EnabledSell","type":"bool"},{"internalType":"bool","name":"_EnabledBuy","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","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":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawToken","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052601e600b55600c8054600162ffffff199182168117909255610708600d819055600f5560118054909116909117905560006012556018805460ff191690553480156200004f57600080fd5b50600080546001600160a01b031916732207eea3ae68cdbbb7bdc2e624d9ad2ca886cea6179055604080518082019091526007808252664149205745423360c81b6020909201918252620000a6916004916200075a565b50604080518082019091526007808252664149205745423360c81b6020909201918252620000d7916005916200075a565b50737a250d5630b4cf539739df2c5dacb4c659f2488d620000fa816001620005f0565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000145573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016b919062000800565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001df919062000800565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200022d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000253919062000800565b6001600160a01b031660a08190526200026e906001620005f0565b60a0516200027e90600162000632565b6d314dc6448d9338c15b0a0000000060038181556000918290819081908190606490620002ad90600562000848565b620002b991906200086a565b600855600354606490620002cf90600562000848565b620002db91906200086a565b600a5560035461271090620002f290600162000848565b620002fe91906200086a565b600955601a869055601b859055601c849055836200031d86886200088d565b6200032991906200088d565b601955601e839055601f8290556020819055806200034883856200088d565b6200035491906200088d565b601d55600680546301000000600160b81b031916762207eea3ae68cdbbb7bdc2e624d9ad2ca886cea600000017905560078054732207eea3ae68cdbbb7bdc2e624d9ad2ca886cea66001600160a01b0319909116811790915560005260156020527f5cf0677283e197c450dcc22429cbc48200291d9c5b3be0cbe6ba4a0d6ff495d8805460ff1916600117905562000400620003f86000546001600160a01b031690565b600162000686565b6200040d30600162000686565b6200041c61dead600162000686565b6200043b620004336000546001600160a01b031690565b6001620005f0565b62000448306001620005f0565b6200045761dead6001620005f0565b60035473d8da6bf26964af9d7eed9e03e53415d37aa96045906200047d90606462000848565b6007546001600160a01b031660009081527f85efa08969febcb72bd7c79e3795763c6a77762d27bd830f8777227bf55e86a36020526040902055600354620004c790606462000848565b6007546001600160a01b031660009081527f0be16d71963429204d70543701f859c43526c316ac005c10114f4694ca405f3660205260409020556003546200051190606462000848565b6007546001600160a01b031660009081527f37583893b08b530541c9f5acf38ad3b056ce9f1f3f1db21bf49a6e685634d90260205260409020556003546200055b90606462000848565b6007546001600160a01b0390811660009081527f6c754439e1190c3695aed98a7015528d08b476b585950451f4f7c81ebec2a768602090815260408083209490945560035492851680835260018252848320849055935192835290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050505050505050620008e5565b3360009081526015602052604090205460ff16156200062e576001600160a01b0382166000908152602560205260409020805460ff19168215151790555b5050565b6001600160a01b038216600081815260266020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000546001600160a01b0316331480620006aa57506000546001600160a01b031632145b620006fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b8280546200076890620008a8565b90600052602060002090601f0160209004810192826200078c5760008555620007d7565b82601f10620007a757805160ff1916838001178555620007d7565b82800160010185558215620007d7579182015b82811115620007d7578251825591602001919060010190620007ba565b50620007e5929150620007e9565b5090565b5b80821115620007e55760008155600101620007ea565b6000602082840312156200081357600080fd5b81516001600160a01b03811681146200082b57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000865576200086562000832565b500290565b6000826200088857634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115620008a357620008a362000832565b500190565b600181811c90821680620008bd57607f821691505b60208210811415620008df57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516137ad620009586000396000818161072b015281816114dd0152818161217201528181612d8101528181612e230152612e4f01526000818161056c0152818161213401528181612f710152818161302a01528181613066015281816130e0015261314801526137ad6000f3fe6080604052600436106104565760003560e01c80638ea5220f1161023f578063c18bc19511610139578063e6142efd116100b6578063f11a24d31161007a578063f11a24d314610d17578063f2fde38b14610d2d578063f5648a4f14610d4d578063f637434214610d62578063f8b45b0514610d7857600080fd5b8063e6142efd14610c8c578063e800dff714610cac578063e884f26014610ccc578063eab7bb0214610ce1578063ee40166e14610d0157600080fd5b8063d257b34f116100fd578063d257b34f14610bda578063d85ba06314610bfa578063dd62ed3e14610c10578063df04345a14610c56578063e2f4560514610c7657600080fd5b8063c18bc19514610b4a578063c876d0b914610b6a578063c8c8ebe414610b84578063ce1964f814610b9a578063d10ca42b14610bba57600080fd5b80639fccce32116101c7578063a9059cbb1161018b578063a9059cbb14610a9b578063aacebbe314610abb578063b62496f514610adb578063bbc0c74214610b0b578063c024666814610b2a57600080fd5b80639fccce3214610a23578063a0d82dc514610a39578063a457c2d714610a4f578063a4c82a0014610a6f578063a62068ce14610a8557600080fd5b806396439d591161020e57806396439d591461099857806398bac054146109b85780639a7a23d6146109d75780639c3b4fdc146109f75780639ec22c0e14610a0d57600080fd5b80638ea5220f1461092d578063921369131461094d578063924de9b71461096357806395d89b411461098357600080fd5b8063313ce567116103505780636ddd1713116102d857806375f0a8741161029c57806375f0a874146108825780637bce5a04146108a957806385ecfd28146108bf57806389476069146108ef5780638da5cb5b1461090f57600080fd5b80636ddd1713146107f857806370a0823114610818578063715018a614610838578063751039fc1461084d5780637571336a1461086257600080fd5b80634fbee1931161031f5780634fbee1931461076757806351f205e4146107a057806358a6d531146107b55780636a486a8e146107cc5780636b0a894c146107e257600080fd5b8063313ce567146106dd57806339509351146106f957806349bd5a5e146107195780634a62bb651461074d57600080fd5b80631816467f116103de578063203e727e116103a2578063203e727e1461065757806323b872dd1461067757806327c8f835146106975780632c3e486c146106ad5780632e82f1a0146106c357600080fd5b80631816467f146105df578063184c16c5146105ff578063199ffc72146106155780631a8145bb1461062b5780631f3fed8f1461064157600080fd5b806310d5de531161042557806310d5de5314610508578063130a2c3c146105385780631694505e1461055a5780631732cded146105a657806318160ddd146105c057600080fd5b806301986fad1461046257806306fdde03146104a7578063095ea7b3146104c957806310ce0516146104e957600080fd5b3661045d57005b600080fd5b34801561046e57600080fd5b5061049261047d3660046131e0565b60156020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156104b357600080fd5b506104bc610d8e565b60405161049e91906131fd565b3480156104d557600080fd5b506104926104e4366004613252565b610e20565b3480156104f557600080fd5b5060065461049290610100900460ff1681565b34801561051457600080fd5b506104926105233660046131e0565b60256020526000908152604090205460ff1681565b34801561054457600080fd5b50610558610553366004613297565b610e36565b005b34801561056657600080fd5b5061058e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161049e565b3480156105b257600080fd5b506006546104929060ff1681565b3480156105cc57600080fd5b506003545b60405190815260200161049e565b3480156105eb57600080fd5b506105586105fa3660046131e0565b610ef5565b34801561060b57600080fd5b506105d1600f5481565b34801561062157600080fd5b506105d1600b5481565b34801561063757600080fd5b506105d160225481565b34801561064d57600080fd5b506105d160215481565b34801561066357600080fd5b5061055861067236600461331d565b610f67565b34801561068357600080fd5b50610492610692366004613336565b610fbe565b3480156106a357600080fd5b5061058e61dead81565b3480156106b957600080fd5b506105d1600d5481565b3480156106cf57600080fd5b50600c546104929060ff1681565b3480156106e957600080fd5b506040516012815260200161049e565b34801561070557600080fd5b50610492610714366004613252565b611068565b34801561072557600080fd5b5061058e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561075957600080fd5b506011546104929060ff1681565b34801561077357600080fd5b506104926107823660046131e0565b6001600160a01b031660009081526024602052604090205460ff1690565b3480156107ac57600080fd5b506105586110a4565b3480156107c157600080fd5b506013544310610492565b3480156107d857600080fd5b506105d1601d5481565b3480156107ee57600080fd5b506105d160165481565b34801561080457600080fd5b506011546104929062010000900460ff1681565b34801561082457600080fd5b506105d16108333660046131e0565b611160565b34801561084457600080fd5b5061055861117b565b34801561085957600080fd5b506104926111c4565b34801561086e57600080fd5b5061055861087d366004613377565b611214565b34801561088e57600080fd5b5060065461058e90630100000090046001600160a01b031681565b3480156108b557600080fd5b506105d1601a5481565b3480156108cb57600080fd5b506104926108da3660046131e0565b60146020526000908152604090205460ff1681565b3480156108fb57600080fd5b5061049261090a3660046131e0565b611255565b34801561091b57600080fd5b506000546001600160a01b031661058e565b34801561093957600080fd5b5060075461058e906001600160a01b031681565b34801561095957600080fd5b506105d1601e5481565b34801561096f57600080fd5b5061055861097e3660046133b0565b611398565b34801561098f57600080fd5b506104bc6113ca565b3480156109a457600080fd5b506105586109b336600461331d565b6113d9565b3480156109c457600080fd5b50600c5461049290610100900460ff1681565b3480156109e357600080fd5b506105586109f2366004613377565b61149c565b348015610a0357600080fd5b506105d1601c5481565b348015610a1957600080fd5b506105d160105481565b348015610a2f57600080fd5b506105d160235481565b348015610a4557600080fd5b506105d160205481565b348015610a5b57600080fd5b50610492610a6a366004613252565b61158d565b348015610a7b57600080fd5b506105d1600e5481565b348015610a9157600080fd5b506105d160135481565b348015610aa757600080fd5b50610492610ab6366004613252565b611626565b348015610ac757600080fd5b50610558610ad63660046131e0565b611633565b348015610ae757600080fd5b50610492610af63660046131e0565b60266020526000908152604090205460ff1681565b348015610b1757600080fd5b5060115461049290610100900460ff1681565b348015610b3657600080fd5b50610558610b45366004613377565b6116b6565b348015610b5657600080fd5b50610558610b6536600461331d565b611754565b348015610b7657600080fd5b506018546104929060ff1681565b348015610b9057600080fd5b506105d160085481565b348015610ba657600080fd5b50610558610bb53660046133cd565b611784565b348015610bc657600080fd5b50610558610bd53660046133cd565b61181a565b348015610be657600080fd5b50610492610bf536600461331d565b6118ab565b348015610c0657600080fd5b506105d160195481565b348015610c1c57600080fd5b506105d1610c2b3660046133f9565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c6257600080fd5b50600c546104929062010000900460ff1681565b348015610c8257600080fd5b506105d160095481565b348015610c9857600080fd5b50610558610ca736600461343d565b6118d1565b348015610cb857600080fd5b50610558610cc7366004613377565b6119e3565b348015610cd857600080fd5b50610492611a4d565b348015610ced57600080fd5b50610558610cfc366004613514565b611a9d565b348015610d0d57600080fd5b506105d160125481565b348015610d2357600080fd5b506105d1601b5481565b348015610d3957600080fd5b50610558610d483660046131e0565b611b5e565b348015610d5957600080fd5b50610558611c0b565b348015610d6e57600080fd5b506105d1601f5481565b348015610d8457600080fd5b506105d1600a5481565b606060048054610d9d9061355e565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc99061355e565b8015610e165780601f10610deb57610100808354040283529160200191610e16565b820191906000526020600020905b815481529060010190602001808311610df957829003601f168201915b5050505050905090565b6000610e2d338484611c58565b50600192915050565b6000546001600160a01b0316331480610e5957506000546001600160a01b031632145b610e7e5760405162461bcd60e51b8152600401610e7590613599565b60405180910390fd5b60005b82811015610eef578160146000868685818110610ea057610ea06135ce565b9050602002016020810190610eb591906131e0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610ee7816135fa565b915050610e81565b50505050565b3360009081526015602052604090205460ff1615610f64576007546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600780546001600160a01b0319166001600160a01b0383161790555b50565b6000546001600160a01b0316331480610f8a57506000546001600160a01b031632145b610fa65760405162461bcd60e51b8152600401610e7590613599565b610fb881670de0b6b3a7640000613615565b60085550565b6000610fcb848484611d7c565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156110505760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610e75565b61105d8533858403611c58565b506001949350505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610e2d91859061109f908690613634565b611c58565b6009546110b030611160565b1015611126576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610e75565b3360009081526015602052604090205460ff161561115e576006805460ff1916600117905561115361297a565b6006805460ff191690555b565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633148061119e57506000546001600160a01b031632145b6111ba5760405162461bcd60e51b8152600401610e7590613599565b61115e6000612bba565b600080546001600160a01b03163314806111e857506000546001600160a01b031632145b6112045760405162461bcd60e51b8152600401610e7590613599565b506011805460ff19169055600190565b3360009081526015602052604090205460ff1615611251576001600160a01b0382166000908152602560205260409020805460ff19168215151790555b5050565b60006001600160a01b0382166112ad5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610e75565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611318919061364c565b60075460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925084169063a9059cbb906044016020604051808303816000875af115801561136d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113919190613665565b9392505050565b3360009081526015602052604090205460ff1615610f645760118054821515620100000262ff00001990911617905550565b606060058054610d9d9061355e565b6000546001600160a01b03163314806113fc57506000546001600160a01b031632145b6114185760405162461bcd60e51b8152600401610e7590613599565b601154610100900460ff16156114705760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610e75565b6011805462ffff0019166201010017905542600e55436012819055611496908290613634565b60135550565b6000546001600160a01b03163314806114bf57506000546001600160a01b031632145b6114db5760405162461bcd60e51b8152600401610e7590613599565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156115835760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610e75565b6112518282612c0a565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561160f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e75565b61161c3385858403611c58565b5060019392505050565b6000610e2d338484611d7c565b3360009081526015602052604090205460ff1615610f64576006546040516001600160a01b0363010000009092048216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0383166301000000026301000000600160b81b031990911617905550565b6000546001600160a01b03163314806116d957506000546001600160a01b031632145b6116f55760405162461bcd60e51b8152600401610e7590613599565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b3360009081526015602052604090205460ff1615610f645761177e81670de0b6b3a7640000613615565b600a5550565b3360009081526015602052604090205460ff161561181557601e839055601f8290556020819055806117b68385613634565b6117c09190613634565b601d819055606e10156118155760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313125206f72206c6573730000006044820152606401610e75565b505050565b3360009081526015602052604090205460ff161561181557601a839055601b829055601c8190558061184c8385613634565b6118569190613634565b6019819055606e10156118155760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313125206f72206c6573730000006044820152606401610e75565b3360009081526015602052604081205460ff16156118cc5750600955600190565b919050565b6000546001600160a01b03163314806118f457506000546001600160a01b031632145b6119105760405162461bcd60e51b8152600401610e7590613599565b6064825111156119815760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203130302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610e75565b60005b82518110156118155760008382815181106119a1576119a16135ce565b6020908102919091018101516001600160a01b03166000908152602490915260409020805460ff191684151517905550806119db816135fa565b915050611984565b6000546001600160a01b0316331480611a0657506000546001600160a01b031632145b611a225760405162461bcd60e51b8152600401610e7590613599565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600080546001600160a01b0316331480611a7157506000546001600160a01b031632145b611a8d5760405162461bcd60e51b8152600401610e7590613599565b506018805460ff19169055600190565b3360009081526015602052604090205460ff1615610eef576103e88311158015611ac5575060015b611b2a5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610e75565b600d849055600b839055600c8054821515620100000262ff0000198515151662ff00ff199092169190911717905550505050565b6000546001600160a01b0316331480611b8157506000546001600160a01b031632145b611b9d5760405162461bcd60e51b8152600401610e7590613599565b6001600160a01b038116611c025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e75565b610f6481612bba565b6007546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610eef576040519150601f19603f3d011682016040523d82523d6000602084013e610eef565b6001600160a01b038316611cba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e75565b6001600160a01b038216611d1b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e75565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611de05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e75565b6001600160a01b03821661dead1480611e0057506001600160a01b038216155b15611e1057611815838383612c5e565b60135415611f06576001600160a01b03831660009081526014602052604090205460ff161580611e5857506001600160a01b03831660009081526024602052604090205460ff165b80611e7057506000546001600160a01b038381169116145b80611e8557506001600160a01b03821661dead145b611f065760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610e75565b60135443108015611f2f57506001600160a01b03831660009081526026602052604090205460ff165b8015611f5457506001600160a01b03821660009081526026602052604090205460ff16155b15611ff4576001600160a01b03821660009081526014602052604090205460ff16611ff4576001600160a01b0382166000908152601460205260408120805460ff191660019081179091556016805491929091611fb2908490613634565b90915550506040516001600160a01b03831681527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b806120055761181583836000612c5e565b60115460ff161561249b576000546001600160a01b0384811691161480159061203c57506000546001600160a01b03838116911614155b801561205057506001600160a01b03821615155b801561206757506001600160a01b03821661dead14155b8015612076575060065460ff16155b1561249b57601154610100900460ff1661210e576001600160a01b03831660009081526024602052604090205460ff16806120c957506001600160a01b03821660009081526024602052604090205460ff165b61210e5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610e75565b60185460ff1615612255576000546001600160a01b0383811691161480159061216957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b80156121a757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15612255573260009081526017602052604090205443116122425760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610e75565b3260009081526017602052604090204390555b6001600160a01b03831660009081526026602052604090205460ff16801561229657506001600160a01b03821660009081526025602052604090205460ff16155b1561236a5760085481111561230b5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610e75565b600a5461231783611160565b6123219083613634565b11156123655760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610e75565b61249b565b6001600160a01b03821660009081526026602052604090205460ff1680156123ab57506001600160a01b03831660009081526025602052604090205460ff16155b15612421576008548111156123655760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610e75565b6001600160a01b03821660009081526025602052604090205460ff1661249b57600a5461244d83611160565b6124579083613634565b111561249b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610e75565b60006124a684611160565b90506000620186a06124bb836201869f613615565b6124c59190613682565b9050808311156124d3578092505b600d54600e546124e39190613634565b600c805461ff001916429290921015610100029190911790556001600160a01b03841660009081526026602052604090205460ff1680156125265750600c5460ff165b80156125395750600c54610100900460ff165b801561255e57506001600160a01b03851660009081526024602052604090205460ff16155b1561256d5761256b612d66565b505b600061257830611160565b6009546006805461010092841015830261ff00199091161790819055919250900460ff1680156125b0575060115462010000900460ff165b80156125bf575060065460ff16155b80156125e457506001600160a01b03861660009081526026602052604090205460ff16155b801561260957506001600160a01b03861660009081526024602052604090205460ff16155b801561262e57506001600160a01b03851660009081526024602052604090205460ff16155b15612653576006805460ff1916600117905561264861297a565b6006805460ff191690555b6006546001600160a01b03871660009081526024602052604090205460ff9182161591168061269a57506001600160a01b03861660009081526024602052604090205460ff165b156126a3575060005b60008115612890576001600160a01b03871660009081526026602052604090205460ff1680156126d557506000601d54115b15612794576126fb6103e86126f5601d5489612ef690919063ffffffff16565b90612f02565b9050601d54601f548261270e9190613615565b6127189190613682565b602260008282546127299190613634565b9091555050601d5460205461273e9083613615565b6127489190613682565b602360008282546127599190613634565b9091555050601d54601e5461276e9083613615565b6127789190613682565b602160008282546127899190613634565b909155506128729050565b6001600160a01b03881660009081526026602052604090205460ff1680156127be57506000601954115b15612872576127de6103e86126f560195489612ef690919063ffffffff16565b9050601954601b54826127f19190613615565b6127fb9190613682565b6022600082825461280c9190613634565b9091555050601954601c546128219083613615565b61282b9190613682565b6023600082825461283c9190613634565b9091555050601954601a546128519083613615565b61285b9190613682565b6021600082825461286c9190613634565b90915550505b801561288357612883883083612c5e565b61288d81876136a4565b95505b6001600160a01b03871661dead148015906128b4575060065462010000900460ff16155b80156128c3575060065460ff16155b80156128e757506001600160a01b03881660009081526026602052604090205460ff165b80156128fb5750600c5462010000900460ff165b801561292057506001600160a01b03881660009081526024602052604090205460ff16155b156129655760006129426127106126f5600b548a612ef690919063ffffffff16565b90508015612957576129578961dead83612c5e565b61296181886136a4565b9650505b612970888888612c5e565b5050505050505050565b600061298530611160565b9050600060235460215460225461299c9190613634565b6129a69190613634565b905060008215806129b5575081155b156129bf57505050565b6009548311156129cf5760095492505b6000600283602254866129e29190613615565b6129ec9190613682565b6129f69190613682565b90506000612a048583612f0e565b905047612a1082612f1a565b6000612a1c4783612f0e565b90506000612a39876126f560215485612ef690919063ffffffff16565b90506000612a56886126f560235486612ef690919063ffffffff16565b9050600081612a6584866136a4565b612a6f91906136a4565b60006022819055602181905560235590508115612ade576007546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612ad3576040519150601f19603f3d011682016040523d82523d6000602084013e612ad8565b606091505b50909850505b600087118015612aee5750600081115b15612b4157612afd87826130da565b602254604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b662386f26fc10000471115612bae5760065460405163010000009091046001600160a01b0316904790600081818185875af1925050503d8060008114612ba3576040519150601f19603f3d011682016040523d82523d6000602084013e612ba8565b606091505b50909850505b50505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216600081815260266020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b03831660009081526001602052604090205481811015612cd65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e75565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290612d0d908490613634565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d5991815260200190565b60405180910390a3610eef565b42600e556040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819030906370a0823190602401602060405180830381865afa158015612dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df7919061364c565b90506000612e166127106126f5600b5485612ef690919063ffffffff16565b90508015612e4b57612e4b7f000000000000000000000000000000000000000000000000000000000000000061dead83612c5e565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612eab57600080fd5b505af1158015612ebf573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b60006113918284613615565b60006113918284613682565b600061139182846136a4565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f4f57612f4f6135ce565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff191906136bb565b81600181518110613004576130046135ce565b60200260200101906001600160a01b031690816001600160a01b03168152505061304f307f000000000000000000000000000000000000000000000000000000000000000084611c58565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906130a49085906000908690309042906004016136d8565b600060405180830381600087803b1580156130be57600080fd5b505af11580156130d2573d6000803e3d6000fd5b505050505050565b613105307f000000000000000000000000000000000000000000000000000000000000000084611c58565b60075460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015613194573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131b99190613749565b5050505050565b6001600160a01b0381168114610f6457600080fd5b80356118cc816131c0565b6000602082840312156131f257600080fd5b8135611391816131c0565b600060208083528351808285015260005b8181101561322a5785810183015185820160400152820161320e565b8181111561323c576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561326557600080fd5b8235613270816131c0565b946020939093013593505050565b8015158114610f6457600080fd5b80356118cc8161327e565b6000806000604084860312156132ac57600080fd5b833567ffffffffffffffff808211156132c457600080fd5b818601915086601f8301126132d857600080fd5b8135818111156132e757600080fd5b8760208260051b85010111156132fc57600080fd5b602092830195509350508401356133128161327e565b809150509250925092565b60006020828403121561332f57600080fd5b5035919050565b60008060006060848603121561334b57600080fd5b8335613356816131c0565b92506020840135613366816131c0565b929592945050506040919091013590565b6000806040838503121561338a57600080fd5b8235613395816131c0565b915060208301356133a58161327e565b809150509250929050565b6000602082840312156133c257600080fd5b81356113918161327e565b6000806000606084860312156133e257600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561340c57600080fd5b8235613417816131c0565b915060208301356133a5816131c0565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561345057600080fd5b823567ffffffffffffffff8082111561346857600080fd5b818501915085601f83011261347c57600080fd5b813560208282111561349057613490613427565b8160051b604051601f19603f830116810181811086821117156134b5576134b5613427565b6040529283528183019350848101820192898411156134d357600080fd5b948201945b838610156134f8576134e9866131d5565b855294820194938201936134d8565b9650613507905087820161328c565b9450505050509250929050565b6000806000806080858703121561352a57600080fd5b843593506020850135925060408501356135438161327e565b915060608501356135538161327e565b939692955090935050565b600181811c9082168061357257607f821691505b6020821081141561359357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561360e5761360e6135e4565b5060010190565b600081600019048311821515161561362f5761362f6135e4565b500290565b60008219821115613647576136476135e4565b500190565b60006020828403121561365e57600080fd5b5051919050565b60006020828403121561367757600080fd5b81516113918161327e565b60008261369f57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156136b6576136b66135e4565b500390565b6000602082840312156136cd57600080fd5b8151611391816131c0565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137285784516001600160a01b031683529383019391830191600101613703565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561375e57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122022a3a6bf0a8c2b9e7f827bd09c4e32cf6686d49fabd447133eb5425a65788bf764736f6c634300080a0033

Deployed Bytecode

0x6080604052600436106104565760003560e01c80638ea5220f1161023f578063c18bc19511610139578063e6142efd116100b6578063f11a24d31161007a578063f11a24d314610d17578063f2fde38b14610d2d578063f5648a4f14610d4d578063f637434214610d62578063f8b45b0514610d7857600080fd5b8063e6142efd14610c8c578063e800dff714610cac578063e884f26014610ccc578063eab7bb0214610ce1578063ee40166e14610d0157600080fd5b8063d257b34f116100fd578063d257b34f14610bda578063d85ba06314610bfa578063dd62ed3e14610c10578063df04345a14610c56578063e2f4560514610c7657600080fd5b8063c18bc19514610b4a578063c876d0b914610b6a578063c8c8ebe414610b84578063ce1964f814610b9a578063d10ca42b14610bba57600080fd5b80639fccce32116101c7578063a9059cbb1161018b578063a9059cbb14610a9b578063aacebbe314610abb578063b62496f514610adb578063bbc0c74214610b0b578063c024666814610b2a57600080fd5b80639fccce3214610a23578063a0d82dc514610a39578063a457c2d714610a4f578063a4c82a0014610a6f578063a62068ce14610a8557600080fd5b806396439d591161020e57806396439d591461099857806398bac054146109b85780639a7a23d6146109d75780639c3b4fdc146109f75780639ec22c0e14610a0d57600080fd5b80638ea5220f1461092d578063921369131461094d578063924de9b71461096357806395d89b411461098357600080fd5b8063313ce567116103505780636ddd1713116102d857806375f0a8741161029c57806375f0a874146108825780637bce5a04146108a957806385ecfd28146108bf57806389476069146108ef5780638da5cb5b1461090f57600080fd5b80636ddd1713146107f857806370a0823114610818578063715018a614610838578063751039fc1461084d5780637571336a1461086257600080fd5b80634fbee1931161031f5780634fbee1931461076757806351f205e4146107a057806358a6d531146107b55780636a486a8e146107cc5780636b0a894c146107e257600080fd5b8063313ce567146106dd57806339509351146106f957806349bd5a5e146107195780634a62bb651461074d57600080fd5b80631816467f116103de578063203e727e116103a2578063203e727e1461065757806323b872dd1461067757806327c8f835146106975780632c3e486c146106ad5780632e82f1a0146106c357600080fd5b80631816467f146105df578063184c16c5146105ff578063199ffc72146106155780631a8145bb1461062b5780631f3fed8f1461064157600080fd5b806310d5de531161042557806310d5de5314610508578063130a2c3c146105385780631694505e1461055a5780631732cded146105a657806318160ddd146105c057600080fd5b806301986fad1461046257806306fdde03146104a7578063095ea7b3146104c957806310ce0516146104e957600080fd5b3661045d57005b600080fd5b34801561046e57600080fd5b5061049261047d3660046131e0565b60156020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156104b357600080fd5b506104bc610d8e565b60405161049e91906131fd565b3480156104d557600080fd5b506104926104e4366004613252565b610e20565b3480156104f557600080fd5b5060065461049290610100900460ff1681565b34801561051457600080fd5b506104926105233660046131e0565b60256020526000908152604090205460ff1681565b34801561054457600080fd5b50610558610553366004613297565b610e36565b005b34801561056657600080fd5b5061058e7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161049e565b3480156105b257600080fd5b506006546104929060ff1681565b3480156105cc57600080fd5b506003545b60405190815260200161049e565b3480156105eb57600080fd5b506105586105fa3660046131e0565b610ef5565b34801561060b57600080fd5b506105d1600f5481565b34801561062157600080fd5b506105d1600b5481565b34801561063757600080fd5b506105d160225481565b34801561064d57600080fd5b506105d160215481565b34801561066357600080fd5b5061055861067236600461331d565b610f67565b34801561068357600080fd5b50610492610692366004613336565b610fbe565b3480156106a357600080fd5b5061058e61dead81565b3480156106b957600080fd5b506105d1600d5481565b3480156106cf57600080fd5b50600c546104929060ff1681565b3480156106e957600080fd5b506040516012815260200161049e565b34801561070557600080fd5b50610492610714366004613252565b611068565b34801561072557600080fd5b5061058e7f000000000000000000000000f265c1c2b5608ed8965eb04f415bf25df8b58fa081565b34801561075957600080fd5b506011546104929060ff1681565b34801561077357600080fd5b506104926107823660046131e0565b6001600160a01b031660009081526024602052604090205460ff1690565b3480156107ac57600080fd5b506105586110a4565b3480156107c157600080fd5b506013544310610492565b3480156107d857600080fd5b506105d1601d5481565b3480156107ee57600080fd5b506105d160165481565b34801561080457600080fd5b506011546104929062010000900460ff1681565b34801561082457600080fd5b506105d16108333660046131e0565b611160565b34801561084457600080fd5b5061055861117b565b34801561085957600080fd5b506104926111c4565b34801561086e57600080fd5b5061055861087d366004613377565b611214565b34801561088e57600080fd5b5060065461058e90630100000090046001600160a01b031681565b3480156108b557600080fd5b506105d1601a5481565b3480156108cb57600080fd5b506104926108da3660046131e0565b60146020526000908152604090205460ff1681565b3480156108fb57600080fd5b5061049261090a3660046131e0565b611255565b34801561091b57600080fd5b506000546001600160a01b031661058e565b34801561093957600080fd5b5060075461058e906001600160a01b031681565b34801561095957600080fd5b506105d1601e5481565b34801561096f57600080fd5b5061055861097e3660046133b0565b611398565b34801561098f57600080fd5b506104bc6113ca565b3480156109a457600080fd5b506105586109b336600461331d565b6113d9565b3480156109c457600080fd5b50600c5461049290610100900460ff1681565b3480156109e357600080fd5b506105586109f2366004613377565b61149c565b348015610a0357600080fd5b506105d1601c5481565b348015610a1957600080fd5b506105d160105481565b348015610a2f57600080fd5b506105d160235481565b348015610a4557600080fd5b506105d160205481565b348015610a5b57600080fd5b50610492610a6a366004613252565b61158d565b348015610a7b57600080fd5b506105d1600e5481565b348015610a9157600080fd5b506105d160135481565b348015610aa757600080fd5b50610492610ab6366004613252565b611626565b348015610ac757600080fd5b50610558610ad63660046131e0565b611633565b348015610ae757600080fd5b50610492610af63660046131e0565b60266020526000908152604090205460ff1681565b348015610b1757600080fd5b5060115461049290610100900460ff1681565b348015610b3657600080fd5b50610558610b45366004613377565b6116b6565b348015610b5657600080fd5b50610558610b6536600461331d565b611754565b348015610b7657600080fd5b506018546104929060ff1681565b348015610b9057600080fd5b506105d160085481565b348015610ba657600080fd5b50610558610bb53660046133cd565b611784565b348015610bc657600080fd5b50610558610bd53660046133cd565b61181a565b348015610be657600080fd5b50610492610bf536600461331d565b6118ab565b348015610c0657600080fd5b506105d160195481565b348015610c1c57600080fd5b506105d1610c2b3660046133f9565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c6257600080fd5b50600c546104929062010000900460ff1681565b348015610c8257600080fd5b506105d160095481565b348015610c9857600080fd5b50610558610ca736600461343d565b6118d1565b348015610cb857600080fd5b50610558610cc7366004613377565b6119e3565b348015610cd857600080fd5b50610492611a4d565b348015610ced57600080fd5b50610558610cfc366004613514565b611a9d565b348015610d0d57600080fd5b506105d160125481565b348015610d2357600080fd5b506105d1601b5481565b348015610d3957600080fd5b50610558610d483660046131e0565b611b5e565b348015610d5957600080fd5b50610558611c0b565b348015610d6e57600080fd5b506105d1601f5481565b348015610d8457600080fd5b506105d1600a5481565b606060048054610d9d9061355e565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc99061355e565b8015610e165780601f10610deb57610100808354040283529160200191610e16565b820191906000526020600020905b815481529060010190602001808311610df957829003601f168201915b5050505050905090565b6000610e2d338484611c58565b50600192915050565b6000546001600160a01b0316331480610e5957506000546001600160a01b031632145b610e7e5760405162461bcd60e51b8152600401610e7590613599565b60405180910390fd5b60005b82811015610eef578160146000868685818110610ea057610ea06135ce565b9050602002016020810190610eb591906131e0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610ee7816135fa565b915050610e81565b50505050565b3360009081526015602052604090205460ff1615610f64576007546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74390600090a3600780546001600160a01b0319166001600160a01b0383161790555b50565b6000546001600160a01b0316331480610f8a57506000546001600160a01b031632145b610fa65760405162461bcd60e51b8152600401610e7590613599565b610fb881670de0b6b3a7640000613615565b60085550565b6000610fcb848484611d7c565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156110505760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610e75565b61105d8533858403611c58565b506001949350505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610e2d91859061109f908690613634565b611c58565b6009546110b030611160565b1015611126576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610e75565b3360009081526015602052604090205460ff161561115e576006805460ff1916600117905561115361297a565b6006805460ff191690555b565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633148061119e57506000546001600160a01b031632145b6111ba5760405162461bcd60e51b8152600401610e7590613599565b61115e6000612bba565b600080546001600160a01b03163314806111e857506000546001600160a01b031632145b6112045760405162461bcd60e51b8152600401610e7590613599565b506011805460ff19169055600190565b3360009081526015602052604090205460ff1615611251576001600160a01b0382166000908152602560205260409020805460ff19168215151790555b5050565b60006001600160a01b0382166112ad5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610e75565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611318919061364c565b60075460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925084169063a9059cbb906044016020604051808303816000875af115801561136d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113919190613665565b9392505050565b3360009081526015602052604090205460ff1615610f645760118054821515620100000262ff00001990911617905550565b606060058054610d9d9061355e565b6000546001600160a01b03163314806113fc57506000546001600160a01b031632145b6114185760405162461bcd60e51b8152600401610e7590613599565b601154610100900460ff16156114705760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207265656e61626c652074726164696e670000000000000000006044820152606401610e75565b6011805462ffff0019166201010017905542600e55436012819055611496908290613634565b60135550565b6000546001600160a01b03163314806114bf57506000546001600160a01b031632145b6114db5760405162461bcd60e51b8152600401610e7590613599565b7f000000000000000000000000f265c1c2b5608ed8965eb04f415bf25df8b58fa06001600160a01b0316826001600160a01b031614156115835760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610e75565b6112518282612c0a565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561160f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e75565b61161c3385858403611c58565b5060019392505050565b6000610e2d338484611d7c565b3360009081526015602052604090205460ff1615610f64576006546040516001600160a01b0363010000009092048216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600680546001600160a01b0383166301000000026301000000600160b81b031990911617905550565b6000546001600160a01b03163314806116d957506000546001600160a01b031632145b6116f55760405162461bcd60e51b8152600401610e7590613599565b6001600160a01b038216600081815260246020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b3360009081526015602052604090205460ff1615610f645761177e81670de0b6b3a7640000613615565b600a5550565b3360009081526015602052604090205460ff161561181557601e839055601f8290556020819055806117b68385613634565b6117c09190613634565b601d819055606e10156118155760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313125206f72206c6573730000006044820152606401610e75565b505050565b3360009081526015602052604090205460ff161561181557601a839055601b829055601c8190558061184c8385613634565b6118569190613634565b6019819055606e10156118155760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313125206f72206c6573730000006044820152606401610e75565b3360009081526015602052604081205460ff16156118cc5750600955600190565b919050565b6000546001600160a01b03163314806118f457506000546001600160a01b031632145b6119105760405162461bcd60e51b8152600401610e7590613599565b6064825111156119815760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203130302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610e75565b60005b82518110156118155760008382815181106119a1576119a16135ce565b6020908102919091018101516001600160a01b03166000908152602490915260409020805460ff191684151517905550806119db816135fa565b915050611984565b6000546001600160a01b0316331480611a0657506000546001600160a01b031632145b611a225760405162461bcd60e51b8152600401610e7590613599565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600080546001600160a01b0316331480611a7157506000546001600160a01b031632145b611a8d5760405162461bcd60e51b8152600401610e7590613599565b506018805460ff19169055600190565b3360009081526015602052604090205460ff1615610eef576103e88311158015611ac5575060015b611b2a5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610e75565b600d849055600b839055600c8054821515620100000262ff0000198515151662ff00ff199092169190911717905550505050565b6000546001600160a01b0316331480611b8157506000546001600160a01b031632145b611b9d5760405162461bcd60e51b8152600401610e7590613599565b6001600160a01b038116611c025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e75565b610f6481612bba565b6007546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610eef576040519150601f19603f3d011682016040523d82523d6000602084013e610eef565b6001600160a01b038316611cba5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e75565b6001600160a01b038216611d1b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e75565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611de05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e75565b6001600160a01b03821661dead1480611e0057506001600160a01b038216155b15611e1057611815838383612c5e565b60135415611f06576001600160a01b03831660009081526014602052604090205460ff161580611e5857506001600160a01b03831660009081526024602052604090205460ff165b80611e7057506000546001600160a01b038381169116145b80611e8557506001600160a01b03821661dead145b611f065760405162461bcd60e51b815260206004820152604660248201527f426f74732063616e6e6f74207472616e7366657220746f6b656e7320696e206f60448201527f72206f75742065786365707420746f206f776e6572206f722064656164206164606482015265323932b9b99760d11b608482015260a401610e75565b60135443108015611f2f57506001600160a01b03831660009081526026602052604090205460ff165b8015611f5457506001600160a01b03821660009081526026602052604090205460ff16155b15611ff4576001600160a01b03821660009081526014602052604090205460ff16611ff4576001600160a01b0382166000908152601460205260408120805460ff191660019081179091556016805491929091611fb2908490613634565b90915550506040516001600160a01b03831681527f55678e47d0a699d3ab99b0184c4ff14f2246ba80522deb921aa0c8823578c44a9060200160405180910390a15b806120055761181583836000612c5e565b60115460ff161561249b576000546001600160a01b0384811691161480159061203c57506000546001600160a01b03838116911614155b801561205057506001600160a01b03821615155b801561206757506001600160a01b03821661dead14155b8015612076575060065460ff16155b1561249b57601154610100900460ff1661210e576001600160a01b03831660009081526024602052604090205460ff16806120c957506001600160a01b03821660009081526024602052604090205460ff165b61210e5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610e75565b60185460ff1615612255576000546001600160a01b0383811691161480159061216957507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b80156121a757507f000000000000000000000000f265c1c2b5608ed8965eb04f415bf25df8b58fa06001600160a01b0316826001600160a01b031614155b15612255573260009081526017602052604090205443116122425760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610e75565b3260009081526017602052604090204390555b6001600160a01b03831660009081526026602052604090205460ff16801561229657506001600160a01b03821660009081526025602052604090205460ff16155b1561236a5760085481111561230b5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610e75565b600a5461231783611160565b6123219083613634565b11156123655760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610e75565b61249b565b6001600160a01b03821660009081526026602052604090205460ff1680156123ab57506001600160a01b03831660009081526025602052604090205460ff16155b15612421576008548111156123655760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610e75565b6001600160a01b03821660009081526025602052604090205460ff1661249b57600a5461244d83611160565b6124579083613634565b111561249b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610e75565b60006124a684611160565b90506000620186a06124bb836201869f613615565b6124c59190613682565b9050808311156124d3578092505b600d54600e546124e39190613634565b600c805461ff001916429290921015610100029190911790556001600160a01b03841660009081526026602052604090205460ff1680156125265750600c5460ff165b80156125395750600c54610100900460ff165b801561255e57506001600160a01b03851660009081526024602052604090205460ff16155b1561256d5761256b612d66565b505b600061257830611160565b6009546006805461010092841015830261ff00199091161790819055919250900460ff1680156125b0575060115462010000900460ff165b80156125bf575060065460ff16155b80156125e457506001600160a01b03861660009081526026602052604090205460ff16155b801561260957506001600160a01b03861660009081526024602052604090205460ff16155b801561262e57506001600160a01b03851660009081526024602052604090205460ff16155b15612653576006805460ff1916600117905561264861297a565b6006805460ff191690555b6006546001600160a01b03871660009081526024602052604090205460ff9182161591168061269a57506001600160a01b03861660009081526024602052604090205460ff165b156126a3575060005b60008115612890576001600160a01b03871660009081526026602052604090205460ff1680156126d557506000601d54115b15612794576126fb6103e86126f5601d5489612ef690919063ffffffff16565b90612f02565b9050601d54601f548261270e9190613615565b6127189190613682565b602260008282546127299190613634565b9091555050601d5460205461273e9083613615565b6127489190613682565b602360008282546127599190613634565b9091555050601d54601e5461276e9083613615565b6127789190613682565b602160008282546127899190613634565b909155506128729050565b6001600160a01b03881660009081526026602052604090205460ff1680156127be57506000601954115b15612872576127de6103e86126f560195489612ef690919063ffffffff16565b9050601954601b54826127f19190613615565b6127fb9190613682565b6022600082825461280c9190613634565b9091555050601954601c546128219083613615565b61282b9190613682565b6023600082825461283c9190613634565b9091555050601954601a546128519083613615565b61285b9190613682565b6021600082825461286c9190613634565b90915550505b801561288357612883883083612c5e565b61288d81876136a4565b95505b6001600160a01b03871661dead148015906128b4575060065462010000900460ff16155b80156128c3575060065460ff16155b80156128e757506001600160a01b03881660009081526026602052604090205460ff165b80156128fb5750600c5462010000900460ff165b801561292057506001600160a01b03881660009081526024602052604090205460ff16155b156129655760006129426127106126f5600b548a612ef690919063ffffffff16565b90508015612957576129578961dead83612c5e565b61296181886136a4565b9650505b612970888888612c5e565b5050505050505050565b600061298530611160565b9050600060235460215460225461299c9190613634565b6129a69190613634565b905060008215806129b5575081155b156129bf57505050565b6009548311156129cf5760095492505b6000600283602254866129e29190613615565b6129ec9190613682565b6129f69190613682565b90506000612a048583612f0e565b905047612a1082612f1a565b6000612a1c4783612f0e565b90506000612a39876126f560215485612ef690919063ffffffff16565b90506000612a56886126f560235486612ef690919063ffffffff16565b9050600081612a6584866136a4565b612a6f91906136a4565b60006022819055602181905560235590508115612ade576007546040516001600160a01b03909116908390600081818185875af1925050503d8060008114612ad3576040519150601f19603f3d011682016040523d82523d6000602084013e612ad8565b606091505b50909850505b600087118015612aee5750600081115b15612b4157612afd87826130da565b602254604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b662386f26fc10000471115612bae5760065460405163010000009091046001600160a01b0316904790600081818185875af1925050503d8060008114612ba3576040519150601f19603f3d011682016040523d82523d6000602084013e612ba8565b606091505b50909850505b50505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216600081815260266020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b03831660009081526001602052604090205481811015612cd65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e75565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290612d0d908490613634565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612d5991815260200190565b60405180910390a3610eef565b42600e556040516370a0823160e01b81526001600160a01b037f000000000000000000000000f265c1c2b5608ed8965eb04f415bf25df8b58fa0166004820152600090819030906370a0823190602401602060405180830381865afa158015612dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df7919061364c565b90506000612e166127106126f5600b5485612ef690919063ffffffff16565b90508015612e4b57612e4b7f000000000000000000000000f265c1c2b5608ed8965eb04f415bf25df8b58fa061dead83612c5e565b60007f000000000000000000000000f265c1c2b5608ed8965eb04f415bf25df8b58fa09050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612eab57600080fd5b505af1158015612ebf573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b60006113918284613615565b60006113918284613682565b600061139182846136a4565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f4f57612f4f6135ce565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff191906136bb565b81600181518110613004576130046135ce565b60200260200101906001600160a01b031690816001600160a01b03168152505061304f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611c58565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906130a49085906000908690309042906004016136d8565b600060405180830381600087803b1580156130be57600080fd5b505af11580156130d2573d6000803e3d6000fd5b505050505050565b613105307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611c58565b60075460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015613194573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906131b99190613749565b5050505050565b6001600160a01b0381168114610f6457600080fd5b80356118cc816131c0565b6000602082840312156131f257600080fd5b8135611391816131c0565b600060208083528351808285015260005b8181101561322a5785810183015185820160400152820161320e565b8181111561323c576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561326557600080fd5b8235613270816131c0565b946020939093013593505050565b8015158114610f6457600080fd5b80356118cc8161327e565b6000806000604084860312156132ac57600080fd5b833567ffffffffffffffff808211156132c457600080fd5b818601915086601f8301126132d857600080fd5b8135818111156132e757600080fd5b8760208260051b85010111156132fc57600080fd5b602092830195509350508401356133128161327e565b809150509250925092565b60006020828403121561332f57600080fd5b5035919050565b60008060006060848603121561334b57600080fd5b8335613356816131c0565b92506020840135613366816131c0565b929592945050506040919091013590565b6000806040838503121561338a57600080fd5b8235613395816131c0565b915060208301356133a58161327e565b809150509250929050565b6000602082840312156133c257600080fd5b81356113918161327e565b6000806000606084860312156133e257600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561340c57600080fd5b8235613417816131c0565b915060208301356133a5816131c0565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561345057600080fd5b823567ffffffffffffffff8082111561346857600080fd5b818501915085601f83011261347c57600080fd5b813560208282111561349057613490613427565b8160051b604051601f19603f830116810181811086821117156134b5576134b5613427565b6040529283528183019350848101820192898411156134d357600080fd5b948201945b838610156134f8576134e9866131d5565b855294820194938201936134d8565b9650613507905087820161328c565b9450505050509250929050565b6000806000806080858703121561352a57600080fd5b843593506020850135925060408501356135438161327e565b915060608501356135538161327e565b939692955090935050565b600181811c9082168061357257607f821691505b6020821081141561359357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561360e5761360e6135e4565b5060010190565b600081600019048311821515161561362f5761362f6135e4565b500290565b60008219821115613647576136476135e4565b500190565b60006020828403121561365e57600080fd5b5051919050565b60006020828403121561367757600080fd5b81516113918161327e565b60008261369f57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156136b6576136b66135e4565b500390565b6000602082840312156136cd57600080fd5b8151611391816131c0565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137285784516001600160a01b031683529383019391830191600101613703565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561375e57600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122022a3a6bf0a8c2b9e7f827bd09c4e32cf6686d49fabd447133eb5425a65788bf764736f6c634300080a0033

Deployed Bytecode Sourcemap

22041:34798:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23461:46;;;;;;;;;;-1:-1:-1;23461:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;706:14:1;;699:22;681:41;;669:2;654:18;23461:46:0;;;;;;;;25377:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28129:169::-;;;;;;;;;;-1:-1:-1;28129:169:0;;;;;:::i;:::-;;:::i;22564:19::-;;;;;;;;;;-1:-1:-1;22564:19:0;;;;;;;;;;;24325:63;;;;;;;;;;-1:-1:-1;24325:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42714:207;;;;;;;;;;-1:-1:-1;42714:207:0;;;;;:::i;:::-;;:::i;:::-;;22372:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2856:32:1;;;2838:51;;2826:2;2811:18;22372:51:0;2666:229:1;22537:20:0;;;;;;;;;;-1:-1:-1;22537:20:0;;;;;;;;26497:108;;;;;;;;;;-1:-1:-1;26585:12:0;;26497:108;;;3046:25:1;;;3034:2;3019:18;26497:108:0;2900:177:1;42028:191:0;;;;;;;;;;-1:-1:-1;42028:191:0;;;;;:::i;:::-;;:::i;23073:47::-;;;;;;;;;;;;;;;;22808:36;;;;;;;;;;;;;;;;24109:33;;;;;;;;;;;;;;;;24069;;;;;;;;;;;;;;;;38764:124;;;;;;;;;;-1:-1:-1;38764:124:0;;;;;:::i;:::-;;:::i;28780:492::-;;;;;;;;;;-1:-1:-1;28780:492:0;;;;;:::i;:::-;;:::i;22475:53::-;;;;;;;;;;;;22521:6;22475:53;;22983:45;;;;;;;;;;;;;;;;22864:32;;;;;;;;;;-1:-1:-1;22864:32:0;;;;;;;;26339:93;;;;;;;;;;-1:-1:-1;26339:93:0;;26422:2;4078:36:1;;4066:2;4051:18;26339:93:0;3936:184:1;29681:215:0;;;;;;;;;;-1:-1:-1;29681:215:0;;;;;:::i;:::-;;:::i;22430:38::-;;;;;;;;;;;;;;;23171:33;;;;;;;;;;-1:-1:-1;23171:33:0;;;;;;;;42227:126;;;;;;;;;;-1:-1:-1;42227:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;42317:28:0;42293:4;42317:28;;;:19;:28;;;;;;;;;42227:126;52808:306;;;;;;;;;;;;;:::i;42460:120::-;;;;;;;;;;-1:-1:-1;42554:18:0;;42539:12;:33;42460:120;;23924:28;;;;;;;;;;;;;;;;23520:25;;;;;;;;;;;;;;;;23251:31;;;;;;;;;;-1:-1:-1;23251:31:0;;;;;;;;;;;26668:127;;;;;;;;;;-1:-1:-1;26668:127:0;;;;;:::i;:::-;;:::i;2840:103::-;;;;;;;;;;;;;:::i;38140:121::-;;;;;;;;;;;;;:::i;39052:196::-;;;;;;;;;;-1:-1:-1;39052:196:0;;;;;:::i;:::-;;:::i;22619:30::-;;;;;;;;;;-1:-1:-1;22619:30:0;;;;;;;-1:-1:-1;;;;;22619:30:0;;;23817;;;;;;;;;;;;;;;;23410:44;;;;;;;;;;-1:-1:-1;23410:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56308:306;;;;;;;;;;-1:-1:-1;56308:306:0;;;;;:::i;:::-;;:::i;2167:87::-;;;;;;;;;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2167:87;;22656:24;;;;;;;;;;-1:-1:-1;22656:24:0;;;;-1:-1:-1;;;;;22656:24:0;;;23959:31;;;;;;;;;;;;;;;;39344:126;;;;;;;;;;-1:-1:-1;39344:126:0;;;;;:::i;:::-;;:::i;25596:104::-;;;;;;;;;;;;;:::i;42977:352::-;;;;;;;;;;-1:-1:-1;42977:352:0;;;;;:::i;:::-;;:::i;22903:28::-;;;;;;;;;;-1:-1:-1;22903:28:0;;;;;;;;;;;41243:304;;;;;;;;;;-1:-1:-1;41243:304:0;;;;;:::i;:::-;;:::i;23891:24::-;;;;;;;;;;;;;;;;23127:35;;;;;;;;;;;;;;;;24149:27;;;;;;;;;;;;;;;;24035:25;;;;;;;;;;;;;;;;30399:413;;;;;;;;;;-1:-1:-1;30399:413:0;;;;;:::i;:::-;;:::i;23035:29::-;;;;;;;;;;;;;;;;23370:33;;;;;;;;;;;;;;;;27008:175;;;;;;;;;;-1:-1:-1;27008:175:0;;;;;:::i;:::-;;:::i;41751:269::-;;;;;;;;;;-1:-1:-1;41751:269:0;;;;;:::i;:::-;;:::i;24554:57::-;;;;;;;;;;-1:-1:-1;24554:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23211:33;;;;;;;;;;-1:-1:-1;23211:33:0;;;;;;;;;;;40387:182;;;;;;;;;;-1:-1:-1;40387:182:0;;;;;:::i;:::-;;:::i;38896:148::-;;;;;;;;;;-1:-1:-1;38896:148:0;;;;;:::i;:::-;;:::i;23734:40::-;;;;;;;;;;-1:-1:-1;23734:40:0;;;;;;;;22689:35;;;;;;;;;;;;;;;;39924:455;;;;;;;;;;-1:-1:-1;39924:455:0;;;;;:::i;:::-;;:::i;39478:438::-;;;;;;;;;;-1:-1:-1;39478:438:0;;;;;:::i;:::-;;:::i;38527:229::-;;;;;;;;;;-1:-1:-1;38527:229:0;;;;;:::i;:::-;;:::i;23783:27::-;;;;;;;;;;;;;;;;27246:151;;;;;;;;;;-1:-1:-1;27246:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;27362:18:0;;;27335:7;27362:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;27246:151;22940:36;;;;;;;;;;-1:-1:-1;22940:36:0;;;;;;;;;;;22731:33;;;;;;;;;;;;;;;;40579:654;;;;;;;;;;-1:-1:-1;40579:654:0;;;;;:::i;:::-;;:::i;42588:118::-;;;;;;;;;;-1:-1:-1;42588:118:0;;;;;:::i;:::-;;:::i;38322:135::-;;;;;;;;;;;;;:::i;53878:533::-;;;;;;;;;;-1:-1:-1;53878:533:0;;;;;:::i;:::-;;:::i;23293:37::-;;;;;;;;;;;;;;;;23854:30;;;;;;;;;;;;;;;;3098:201;;;;;;;;;;-1:-1:-1;3098:201:0;;;;;:::i;:::-;;:::i;56684:150::-;;;;;;;;;;;;;:::i;23997:31::-;;;;;;;;;;;;;;;;22771:24;;;;;;;;;;;;;;;;25377:100;25431:13;25464:5;25457:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25377:100;:::o;28129:169::-;28212:4;28229:39;892:10;28252:7;28261:6;28229:8;:39::i;:::-;-1:-1:-1;28286:4:0;28129:169;;;;:::o;42714:207::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;;;;;;;;;42818:9:::1;42814:100;42833:18:::0;;::::1;42814:100;;;42898:4;42872:11;:23;42884:7;;42892:1;42884:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42872:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42872:23:0;:30;;-1:-1:-1;;42872:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42853:3;::::1;::::0;::::1;:::i;:::-;;;;42814:100;;;;42714:207:::0;;;:::o;42028:191::-;42105:10;42091:25;;;;:13;:25;;;;;;;;42087:125;;;42164:9;;42136:38;;-1:-1:-1;;;;;42164:9:0;;;;42136:38;;;;;42164:9;;42136:38;42185:9;:21;;-1:-1:-1;;;;;;42185:21:0;-1:-1:-1;;;;;42185:21:0;;;;;42087:125;42028:191;:::o;38764:124::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;38863:17:::1;:6:::0;38873::::1;38863:17;:::i;:::-;38840:20;:40:::0;-1:-1:-1;38764:124:0:o;28780:492::-;28920:4;28937:36;28947:6;28955:9;28966:6;28937:9;:36::i;:::-;-1:-1:-1;;;;;29013:19:0;;28986:24;29013:19;;;:11;:19;;;;;;;;892:10;29013:33;;;;;;;;29065:26;;;;29057:79;;;;-1:-1:-1;;;29057:79:0;;8843:2:1;29057:79:0;;;8825:21:1;8882:2;8862:18;;;8855:30;8921:34;8901:18;;;8894:62;-1:-1:-1;;;8972:18:1;;;8965:38;9020:19;;29057:79:0;8641:404:1;29057:79:0;29172:57;29181:6;892:10;29222:6;29203:16;:25;29172:8;:57::i;:::-;-1:-1:-1;29260:4:0;;28780:492;-1:-1:-1;;;;28780:492:0:o;29681:215::-;892:10;29769:4;29818:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29818:34:0;;;;;;;;;;29769:4;;29786:80;;29809:7;;29818:47;;29855:10;;29818:47;:::i;:::-;29786:8;:80::i;52808:306::-;52898:18;;52870:24;52888:4;52870:9;:24::i;:::-;:46;;52862:123;;;;;-1:-1:-1;;;52862:123:0;;9385:2:1;52862:123:0;;;9367:21:1;9404:18;;;9397:30;;;;9463:34;9443:18;;;9436:62;9534:34;9514:18;;;9507:62;9586:19;;52862:123:0;9183:428:1;52862:123:0;53012:10;52998:25;;;;:13;:25;;;;;;;;52994:111;;;53036:8;:15;;-1:-1:-1;;53036:15:0;53047:4;53036:15;;;53062:10;:8;:10::i;:::-;53083:8;:16;;-1:-1:-1;;53083:16:0;;;52994:111;52808:306::o;26668:127::-;-1:-1:-1;;;;;26769:18:0;26742:7;26769:18;;;:9;:18;;;;;;;26668:127::o;2840:103::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;2905:30:::1;2932:1;2905:18;:30::i;38140:121::-:0;38192:4;2240:6;;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;-1:-1:-1;38209:14:0::1;:22:::0;;-1:-1:-1;;38209:22:0::1;::::0;;;38140:121;:::o;39052:196::-;39165:10;39151:25;;;;:13;:25;;;;;;;;39147:94;;;-1:-1:-1;;;;;39189:39:0;;;;;;:31;:39;;;;;:46;;-1:-1:-1;;39189:46:0;;;;;;;39147:94;39052:196;;:::o;56308:306::-;56365:10;-1:-1:-1;;;;;56396:20:0;;56388:59;;;;-1:-1:-1;;;56388:59:0;;9818:2:1;56388:59:0;;;9800:21:1;9857:2;9837:18;;;9830:30;9896:28;9876:18;;;9869:56;9942:18;;56388:59:0;9616:350:1;56388:59:0;56485:39;;-1:-1:-1;;;56485:39:0;;56518:4;56485:39;;;2838:51:1;56458:24:0;;-1:-1:-1;;;;;56485:24:0;;;;;2811:18:1;;56485:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56575:9;;56543:61;;-1:-1:-1;;;56543:61:0;;-1:-1:-1;;;;;56575:9:0;;;56543:61;;;10334:51:1;10401:18;;;10394:34;;;56458:66:0;;-1:-1:-1;56543:23:0;;;;;10307:18:1;;56543:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56535:69;56308:306;-1:-1:-1;;;56308:306:0:o;39344:126::-;39424:10;39410:25;;;;:13;:25;;;;;;;;39406:57;;;39439:11;:21;;;;;;;-1:-1:-1;;39439:21:0;;;;;;39344:126;:::o;25596:104::-;25652:13;25685:7;25678:14;;;;;:::i;42977:352::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;43054:13:::1;::::0;::::1;::::0;::::1;;;43053:14;43045:50;;;::::0;-1:-1:-1;;;43045:50:0;;10891:2:1;43045:50:0::1;::::0;::::1;10873:21:1::0;10930:2;10910:18;;;10903:30;10969:25;10949:18;;;10942:53;11012:18;;43045:50:0::1;10689:347:1::0;43045:50:0::1;43116:13;:20:::0;;-1:-1:-1;;43147:18:0;;;;;43193:15:::1;43176:14;:32:::0;43242:12:::1;43221:18;:33:::0;;;43286:31:::1;::::0;43307:10;;43286:31:::1;:::i;:::-;43265:18;:52:::0;-1:-1:-1;42977:352:0:o;41243:304::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;41387:13:::1;-1:-1:-1::0;;;;;41379:21:0::1;:4;-1:-1:-1::0;;;;;41379:21:0::1;;;41357:128;;;::::0;-1:-1:-1;;;41357:128:0;;11243:2:1;41357:128:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;11321:34;11301:18;;;11294:62;11392:27;11372:18;;;11365:55;11437:19;;41357:128:0::1;11041:421:1::0;41357:128:0::1;41498:41;41527:4;41533:5;41498:28;:41::i;30399:413::-:0;892:10;30492:4;30536:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;30536:34:0;;;;;;;;;;30589:35;;;;30581:85;;;;-1:-1:-1;;;30581:85:0;;11669:2:1;30581:85:0;;;11651:21:1;11708:2;11688:18;;;11681:30;11747:34;11727:18;;;11720:62;-1:-1:-1;;;11798:18:1;;;11791:35;11843:19;;30581:85:0;11467:401:1;30581:85:0;30702:67;892:10;30725:7;30753:15;30734:16;:34;30702:8;:67::i;:::-;-1:-1:-1;30800:4:0;;30399:413;-1:-1:-1;;;30399:413:0:o;27008:175::-;27094:4;27111:42;892:10;27135:9;27146:6;27111:9;:42::i;41751:269::-;41866:10;41852:25;;;;:13;:25;;;;;;;;41848:161;;;41940:15;;41897:59;;-1:-1:-1;;;;;41940:15:0;;;;;;;41897:59;;;;;;;;41967:15;:36;;-1:-1:-1;;;;;41967:36:0;;;;-1:-1:-1;;;;;;41967:36:0;;;;;;41751:269;:::o;40387:182::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40472:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;40472:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;40527:34;;681:41:1;;;40527:34:0::1;::::0;654:18:1;40527:34:0::1;;;;;;;40387:182:::0;;:::o;38896:148::-;38976:10;38962:25;;;;:13;:25;;;;;;;;38958:79;;;39014:17;:6;39024;39014:17;:::i;:::-;39002:9;:29;38896:148;:::o;39924:455::-;40075:10;40061:25;;;;:13;:25;;;;;;;;40057:315;;;40104:16;:32;;;40147:16;:32;;;40190:10;:20;;;40203:7;40237:35;40166:13;40123;40237:35;:::i;:::-;:48;;;;:::i;:::-;40221:13;:64;;;40328:3;-1:-1:-1;40311:20:0;40303:63;;;;-1:-1:-1;;;40303:63:0;;12075:2:1;40303:63:0;;;12057:21:1;12114:2;12094:18;;;12087:30;12153:31;12133:18;;;12126:59;12202:18;;40303:63:0;11873:353:1;40303:63:0;39924:455;;;:::o;39478:438::-;39630:10;39616:25;;;;:13;:25;;;;;;;;39612:297;;;39657:15;:31;;;39699:15;:31;;;39741:9;:19;;;39753:7;39786:33;39717:13;39675;39786:33;:::i;:::-;:45;;;;:::i;:::-;39771:12;:60;;;39866:3;-1:-1:-1;39850:19:0;39842:61;;;;-1:-1:-1;;;39842:61:0;;12075:2:1;39842:61:0;;;12057:21:1;12114:2;12094:18;;;12087:30;12153:31;12133:18;;;12126:59;12202:18;;39842:61:0;11873:353:1;38527:229:0;38665:10;38626:4;38651:25;;;:13;:25;;;;;;;;38647:102;;;-1:-1:-1;38691:18:0;:30;38739:4;;38527:229::o;38647:102::-;38527:229;;;:::o;40579:654::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;40800:3:::1;40782:7;:14;:21;;40774:88;;;::::0;-1:-1:-1;;;40774:88:0;;12433:2:1;40774:88:0::1;::::0;::::1;12415:21:1::0;12472:2;12452:18;;;12445:30;12511:34;12491:18;;;12484:62;-1:-1:-1;;;12562:18:1;;;12555:52;12624:19;;40774:88:0::1;12231:418:1::0;40774:88:0::1;40975:9;40971:255;40994:7;:14;40990:1;:18;40971:255;;;41029:15;41047:7;41055:1;41047:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;41063:28:0::1;;::::0;;;:19:::1;:28:::0;;;;;;:39;;-1:-1:-1;;41063:39:0::1;::::0;::::1;;;::::0;;-1:-1:-1;41010:3:0;::::1;::::0;::::1;:::i;:::-;;;;40971:255;;42588:118:::0;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42672:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:26;;-1:-1:-1;;42672:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42588:118::o;38322:135::-;38382:4;2240:6;;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;-1:-1:-1;38399:20:0::1;:28:::0;;-1:-1:-1;;38399:28:0::1;::::0;;;38322:135;:::o;53878:533::-;54073:10;54059:25;;;;:13;:25;;;;;;;;54055:349;;;54135:4;54123:8;:16;;:33;;;;-1:-1:-1;54143:13:0;54123:33;54101:131;;;;-1:-1:-1;;;54101:131:0;;12856:2:1;54101:131:0;;;12838:21:1;12895:2;12875:18;;;12868:30;12934:34;12914:18;;;12907:62;-1:-1:-1;;;12985:18:1;;;12978:46;13041:19;;54101:131:0;12654:412:1;54101:131:0;54243:15;:37;;;54291:16;:27;;;54329:13;:28;;54368:30;;;;;-1:-1:-1;;54329:28:0;;;54368:30;-1:-1:-1;;54368:30:0;;;;;;;;;;53878:533;;;;:::o;3098:201::-;2213:7;2240:6;-1:-1:-1;;;;;2240:6:0;892:10;2387:23;;:45;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;2240:6:0;2412:9;:20;2387:45;2379:90;;;;-1:-1:-1;;;2379:90:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3187:22:0;::::1;3179:73;;;::::0;-1:-1:-1;;;3179:73:0;;13273:2:1;3179:73:0::1;::::0;::::1;13255:21:1::0;13312:2;13292:18;;;13285:30;13351:34;13331:18;;;13324:62;-1:-1:-1;;;13402:18:1;;;13395:36;13448:19;;3179:73:0::1;13071:402:1::0;3179:73:0::1;3263:28;3282:8;3263:18;:28::i;56684:150::-:0;56777:9;;56769:57;;56733:12;;-1:-1:-1;;;;;56777:9:0;;56800:21;;56733:12;56769:57;56733:12;56769:57;56800:21;56777:9;56769:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33178:380;-1:-1:-1;;;;;33314:19:0;;33306:68;;;;-1:-1:-1;;;33306:68:0;;13890:2:1;33306:68:0;;;13872:21:1;13929:2;13909:18;;;13902:30;13968:34;13948:18;;;13941:62;-1:-1:-1;;;14019:18:1;;;14012:34;14063:19;;33306:68:0;13688:400:1;33306:68:0;-1:-1:-1;;;;;33393:21:0;;33385:68;;;;-1:-1:-1;;;33385:68:0;;14295:2:1;33385:68:0;;;14277:21:1;14334:2;14314:18;;;14307:30;14373:34;14353:18;;;14346:62;-1:-1:-1;;;14424:18:1;;;14417:32;14466:19;;33385:68:0;14093:398:1;33385:68:0;-1:-1:-1;;;;;33466:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;33518:32;;3046:25:1;;;33518:32:0;;3019:18:1;33518:32:0;;;;;;;33178:380;;;:::o;43337:6440::-;-1:-1:-1;;;;;43461:18:0;;43453:68;;;;-1:-1:-1;;;43453:68:0;;14698:2:1;43453:68:0;;;14680:21:1;14737:2;14717:18;;;14710:30;14776:34;14756:18;;;14749:62;-1:-1:-1;;;14827:18:1;;;14820:35;14872:19;;43453:68:0;14496:401:1;43453:68:0;-1:-1:-1;;;;;43542:21:0;;43556:6;43542:21;;:38;;-1:-1:-1;;;;;;43565:15:0;;;43542:38;43538:120;;;43597:28;43608:4;43614:2;43618:6;43597:10;:28::i;43538:120::-;43691:18;;:22;43688:223;;-1:-1:-1;;;;;43738:17:0;;;;;;:11;:17;;;;;;;;43737:18;;:46;;-1:-1:-1;;;;;;43758:25:0;;;;;;:19;:25;;;;;;;;43737:46;:62;;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;43786:13:0;;;2240:6;;43786:13;43737:62;:87;;;-1:-1:-1;;;;;;43803:21:0;;43817:6;43803:21;43737:87;43729:170;;;;-1:-1:-1;;;43729:170:0;;15104:2:1;43729:170:0;;;15086:21:1;15143:2;15123:18;;;15116:30;15182:34;15162:18;;;15155:62;15253:34;15233:18;;;15226:62;-1:-1:-1;;;15304:19:1;;;15297:37;15351:19;;43729:170:0;14902:474:1;43729:170:0;42554:18;;42539:12;:33;43958:60;;;;-1:-1:-1;;;;;;43987:31:0;;;;;;:25;:31;;;;;;;;43958:60;:94;;;;-1:-1:-1;;;;;;44023:29:0;;;;;;:25;:29;;;;;;;;44022:30;43958:94;43955:288;;;-1:-1:-1;;;;;44075:15:0;;;;;;:11;:15;;;;;;;;44071:155;;-1:-1:-1;;;;;44110:15:0;;;;;;:11;:15;;;;;:22;;-1:-1:-1;;44110:22:0;44128:4;44110:22;;;;;;44151:10;:15;;44128:4;;44151:10;;:15;;44128:4;;44151:15;:::i;:::-;;;;-1:-1:-1;;44190:20:0;;-1:-1:-1;;;;;2856:32:1;;2838:51;;44190:20:0;;2826:2:1;2811:18;44190:20:0;;;;;;;44071:155;44270:11;44266:88;;44298:23;44309:4;44315:2;44319:1;44298:10;:23::i;44266:88::-;44370:14;;;;44366:2495;;;2213:7;2240:6;-1:-1:-1;;;;;44423:15:0;;;2240:6;;44423:15;;;;:49;;-1:-1:-1;2213:7:0;2240:6;-1:-1:-1;;;;;44459:13:0;;;2240:6;;44459:13;;44423:49;:86;;;;-1:-1:-1;;;;;;44493:16:0;;;;44423:86;:128;;;;-1:-1:-1;;;;;;44530:21:0;;44544:6;44530:21;;44423:128;:158;;;;-1:-1:-1;44573:8:0;;;;44572:9;44423:158;44401:2449;;;44621:13;;;;;;;44616:223;;-1:-1:-1;;;;;44693:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;44722:23:0;;;;;;:19;:23;;;;;;;;44693:52;44659:160;;;;-1:-1:-1;;;44659:160:0;;15583:2:1;44659:160:0;;;15565:21:1;15622:2;15602:18;;;15595:30;-1:-1:-1;;;15641:18:1;;;15634:52;15703:18;;44659:160:0;15381:346:1;44659:160:0;44995:20;;;;44991:641;;;2213:7;2240:6;-1:-1:-1;;;;;45070:13:0;;;2240:6;;45070:13;;;;:72;;;45126:15;-1:-1:-1;;;;;45112:30:0;:2;-1:-1:-1;;;;;45112:30:0;;;45070:72;:129;;;;;45185:13;-1:-1:-1;;;;;45171:28:0;:2;-1:-1:-1;;;;;45171:28:0;;;45070:129;45040:573;;;45317:9;45288:39;;;;:28;:39;;;;;;45363:12;-1:-1:-1;45250:258:0;;;;-1:-1:-1;;;45250:258:0;;15934:2:1;45250:258:0;;;15916:21:1;15973:2;15953:18;;;15946:30;16012:34;15992:18;;;15985:62;16083:34;16063:18;;;16056:62;-1:-1:-1;;;16134:19:1;;;16127:40;16184:19;;45250:258:0;15732:477:1;45250:258:0;45564:9;45535:39;;;;:28;:39;;;;;45577:12;45535:54;;45040:573;-1:-1:-1;;;;;45706:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;45763:35:0;;;;;;:31;:35;;;;;;;;45762:36;45706:92;45680:1155;;;45885:20;;45875:6;:30;;45841:169;;;;-1:-1:-1;;;45841:169:0;;16416:2:1;45841:169:0;;;16398:21:1;16455:2;16435:18;;;16428:30;16494:34;16474:18;;;16467:62;-1:-1:-1;;;16545:18:1;;;16538:51;16606:19;;45841:169:0;16214:417:1;45841:169:0;46093:9;;46076:13;46086:2;46076:9;:13::i;:::-;46067:22;;:6;:22;:::i;:::-;:35;;46033:140;;;;-1:-1:-1;;;46033:140:0;;16838:2:1;46033:140:0;;;16820:21:1;16877:2;16857:18;;;16850:30;-1:-1:-1;;;16896:18:1;;;16889:49;16955:18;;46033:140:0;16636:343:1;46033:140:0;45680:1155;;;-1:-1:-1;;;;;46279:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;46334:37:0;;;;;;:31;:37;;;;;;;;46333:38;46279:92;46253:582;;;46458:20;;46448:6;:30;;46414:170;;;;-1:-1:-1;;;46414:170:0;;17186:2:1;46414:170:0;;;17168:21:1;17225:2;17205:18;;;17198:30;17264:34;17244:18;;;17237:62;-1:-1:-1;;;17315:18:1;;;17308:52;17377:19;;46414:170:0;16984:418:1;46253:582:0;-1:-1:-1;;;;;46615:35:0;;;;;;:31;:35;;;;;;;;46610:225;;46735:9;;46718:13;46728:2;46718:9;:13::i;:::-;46709:22;;:6;:22;:::i;:::-;:35;;46675:140;;;;-1:-1:-1;;;46675:140:0;;16838:2:1;46675:140:0;;;16820:21:1;16877:2;16857:18;;;16850:30;-1:-1:-1;;;16896:18:1;;;16889:49;16955:18;;46675:140:0;16636:343:1;46675:140:0;46877:15;46895;46905:4;46895:9;:15::i;:::-;46877:33;-1:-1:-1;46921:21:0;46963:6;46945:15;46877:33;46955:5;46945:15;:::i;:::-;:24;;;;:::i;:::-;46921:48;;46987:13;46978:6;:22;46974:77;;;47022:13;47013:22;;46974:77;47109:15;;47092:14;;:32;;;;:::i;:::-;47062:8;:62;;-1:-1:-1;;47062:62:0;47073:15;:51;;;;;47062:62;;;;;;;;-1:-1:-1;;;;;47171:29:0;;-1:-1:-1;47171:29:0;;;:25;:29;;;;;;47062:62;47171:29;:59;;;;-1:-1:-1;47217:13:0;;;;47171:59;:84;;;;-1:-1:-1;47247:8:0;;;;;;;47171:84;:127;;;;-1:-1:-1;;;;;;47273:25:0;;;;;;:19;:25;;;;;;;;47272:26;47171:127;47139:241;;;47339:29;:27;:29::i;:::-;;47139:241;47398:28;47429:24;47447:4;47429:9;:24::i;:::-;47500:18;;47466:7;:52;;;47476:42;;;;47466:52;;-1:-1:-1;;47466:52:0;;;;;;;;47398:55;;-1:-1:-1;47549:7:0;;47466:52;47549:7;:35;;;;-1:-1:-1;47573:11:0;;;;;;;47549:35;:61;;;;-1:-1:-1;47602:8:0;;;;47601:9;47549:61;:110;;;;-1:-1:-1;;;;;;47628:31:0;;;;;;:25;:31;;;;;;;;47627:32;47549:110;:153;;;;-1:-1:-1;;;;;;47677:25:0;;;;;;:19;:25;;;;;;;;47676:26;47549:153;:194;;;;-1:-1:-1;;;;;;47720:23:0;;;;;;:19;:23;;;;;;;;47719:24;47549:194;47531:326;;;47770:8;:15;;-1:-1:-1;;47770:15:0;47781:4;47770:15;;;47802:10;:8;:10::i;:::-;47829:8;:16;;-1:-1:-1;;47829:16:0;;;47531:326;47891:8;;-1:-1:-1;;;;;48001:25:0;;47875:12;48001:25;;;:19;:25;;;;;;47891:8;;;;47890:9;;48001:25;;:52;;-1:-1:-1;;;;;;48030:23:0;;;;;;:19;:23;;;;;;;;48001:52;47997:100;;;-1:-1:-1;48080:5:0;47997:100;48109:12;48214:7;48210:966;;;-1:-1:-1;;;;;48266:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;48315:1;48299:13;;:17;48266:50;48262:770;;;48344:35;48374:4;48344:25;48355:13;;48344:6;:10;;:25;;;;:::i;:::-;:29;;:35::i;:::-;48337:42;;48448:13;;48428:16;;48421:4;:23;;;;:::i;:::-;48420:41;;;;:::i;:::-;48398:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;48518:13:0;;48504:10;;48497:17;;:4;:17;:::i;:::-;48496:35;;;;:::i;:::-;48480:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;48600:13:0;;48580:16;;48573:23;;:4;:23;:::i;:::-;48572:41;;;;:::i;:::-;48550:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;48262:770:0;;-1:-1:-1;48262:770:0;;-1:-1:-1;;;;;48675:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;48725:1;48710:12;;:16;48675:51;48671:361;;;48754:34;48783:4;48754:24;48765:12;;48754:6;:10;;:24;;;;:::i;:34::-;48747:41;;48856:12;;48837:15;;48830:4;:22;;;;:::i;:::-;48829:39;;;;:::i;:::-;48807:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;48924:12:0;;48911:9;;48904:16;;:4;:16;:::i;:::-;48903:33;;;;:::i;:::-;48887:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;49004:12:0;;48985:15;;48978:22;;:4;:22;:::i;:::-;48977:39;;;;:::i;:::-;48955:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;48671:361:0;49052:8;;49048:86;;49081:37;49092:4;49106;49113;49081:10;:37::i;:::-;49150:14;49160:4;49150:14;;:::i;:::-;;;48210:966;-1:-1:-1;;;;;49221:21:0;;49235:6;49221:21;;;;:36;;-1:-1:-1;49250:7:0;;;;;;;49249:8;49221:36;:61;;;;-1:-1:-1;49274:8:0;;;;49273:9;49221:61;:109;;;;-1:-1:-1;;;;;;49299:31:0;;;;;;:25;:31;;;;;;;;49221:109;:141;;;;-1:-1:-1;49346:16:0;;;;;;;49221:141;:184;;;;-1:-1:-1;;;;;;49380:25:0;;;;;;:19;:25;;;;;;;;49379:26;49221:184;49212:515;;;49473:20;49496:71;49547:5;49496:28;49507:16;;49496:6;:10;;:28;;;;:::i;:71::-;49473:94;-1:-1:-1;49584:16:0;;49580:96;;49617:47;49628:4;49642:6;49651:12;49617:10;:47::i;:::-;49692:23;49703:12;49692:23;;:::i;:::-;;;49417:310;49212:515;49741:28;49752:4;49758:2;49762:6;49741:10;:28::i;:::-;43442:6335;;;;;43337:6440;;;:::o;50907:1847::-;50946:23;50972:24;50990:4;50972:9;:24::i;:::-;50946:50;;51007:25;51103:12;;51069:18;;51035;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;51007:108;-1:-1:-1;51126:12:0;51155:20;;;:46;;-1:-1:-1;51179:22:0;;51155:46;51151:85;;;51218:7;;;50907:1847::o;51151:85::-;51270:18;;51252:15;:36;51248:105;;;51323:18;;51305:36;;51248:105;51414:23;51527:1;51494:17;51459:18;;51441:15;:36;;;;:::i;:::-;51440:71;;;;:::i;:::-;:88;;;;:::i;:::-;51414:114;-1:-1:-1;51539:26:0;51568:36;:15;51414:114;51568:19;:36::i;:::-;51539:65;-1:-1:-1;51645:21:0;51679:36;51539:65;51679:16;:36::i;:::-;51728:18;51749:44;:21;51775:17;51749:25;:44::i;:::-;51728:65;;51806:23;51832:81;51885:17;51832:34;51847:18;;51832:10;:14;;:34;;;;:::i;:81::-;51806:107;;51924:17;51944:51;51977:17;51944:28;51959:12;;51944:10;:14;;:28;;;;:::i;:51::-;51924:71;-1:-1:-1;52008:23:0;51924:71;52034:28;52047:15;52034:10;:28;:::i;:::-;:40;;;;:::i;:::-;52108:1;52087:18;:22;;;52120:18;:22;;;52153:12;:16;52008:66;-1:-1:-1;52186:13:0;;52182:101;;52234:9;;52226:45;;-1:-1:-1;;;;;52234:9:0;;;;52257;;52226:45;;;;52257:9;52234;52226:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52212:59:0;;-1:-1:-1;;52182:101:0;52319:1;52301:15;:19;:42;;;;;52342:1;52324:15;:19;52301:42;52297:278;;;52360:46;52373:15;52390;52360:12;:46::i;:::-;52530:18;;52426:137;;;17961:25:1;;;18017:2;18002:18;;17995:34;;;18045:18;;;18038:34;;;;52426:137:0;;;;;;17949:2:1;52426:137:0;;;52297:278;52613:6;52591:21;:28;52587:158;;;52654:15;;52646:87;;52654:15;;;;-1:-1:-1;;;;;52654:15:0;;52697:21;;52646:87;;;;52697:21;52654:15;52646:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52632:101:0;;-1:-1:-1;;52587:158:0;50935:1819;;;;;;;;;;50907:1847::o;3459:191::-;3533:16;3552:6;;-1:-1:-1;;;;;3569:17:0;;;-1:-1:-1;;;;;;3569:17:0;;;;;;3602:40;;3552:6;;;;;;;3602:40;;3533:16;3602:40;3522:128;3459:191;:::o;41555:188::-;-1:-1:-1;;;;;41638:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;41638:39:0;;;;;;;;;;41695:40;;41638:39;;:31;41695:40;;;41555:188;;:::o;27405:573::-;-1:-1:-1;;;;;27626:17:0;;27602:21;27626:17;;;:9;:17;;;;;;27662:23;;;;27654:74;;;;-1:-1:-1;;;27654:74:0;;18285:2:1;27654:74:0;;;18267:21:1;18324:2;18304:18;;;18297:30;18363:34;18343:18;;;18336:62;-1:-1:-1;;;18414:18:1;;;18407:36;18460:19;;27654:74:0;18083:402:1;27654:74:0;-1:-1:-1;;;;;27764:17:0;;;;;;;:9;:17;;;;;;27784:22;;;27764:42;;27828:20;;;;;;;;:30;;27800:6;;27764:17;27828:30;;27800:6;;27828:30;:::i;:::-;;;;;;;;27893:9;-1:-1:-1;;;;;27876:35:0;27885:6;-1:-1:-1;;;;;27876:35:0;;27904:6;27876:35;;;;3046:25:1;;3034:2;3019:18;;2900:177;27876:35:0;;;;;;;;27924:46;39924:455;54421:802;54512:15;54495:14;:32;54613:29;;-1:-1:-1;;;54613:29:0;;-1:-1:-1;;;;;54628:13:0;2856:32:1;54613:29:0;;;2838:51:1;54478:4:0;;;;54613;;:14;;2811:18:1;;54613:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54582:60;;54692:20;54715:77;54776:5;54715:42;54740:16;;54715:20;:24;;:42;;;;:::i;:77::-;54692:100;-1:-1:-1;54897:16:0;;54893:105;;54930:56;54941:13;54964:6;54973:12;54930:10;:56::i;:::-;55073:19;55110:13;55073:51;;55147:4;-1:-1:-1;;;;;55147:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55174:12:0;;;;-1:-1:-1;55174:12:0;;-1:-1:-1;55174:12:0;55211:4;55204:11;;;;;54421:802;:::o;12443:98::-;12501:7;12528:5;12532:1;12528;:5;:::i;12842:98::-;12900:7;12927:5;12931:1;12927;:5;:::i;12086:98::-;12144:7;12171:5;12175:1;12171;:5;:::i;49787:589::-;49937:16;;;49951:1;49937:16;;;;;;;;49913:21;;49937:16;;;;;;;;;;-1:-1:-1;49937:16:0;49913:40;;49982:4;49964;49969:1;49964:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;49964:23:0;;;-1:-1:-1;;;;;49964:23:0;;;;;50008:15;-1:-1:-1;;;;;50008:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49998:4;50003:1;49998:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;49998:32:0;;;-1:-1:-1;;;;;49998:32:0;;;;;50043:62;50060:4;50075:15;50093:11;50043:8;:62::i;:::-;50144:224;;-1:-1:-1;;;50144:224:0;;-1:-1:-1;;;;;50144:15:0;:66;;;;:224;;50225:11;;50251:1;;50295:4;;50322;;50342:15;;50144:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49842:534;49787:589;:::o;50384:515::-;50532:62;50549:4;50564:15;50582:11;50532:8;:62::i;:::-;50841:9;;50637:254;;-1:-1:-1;;;50637:254:0;;50709:4;50637:254;;;20072:34:1;20122:18;;;20115:34;;;50755:1:0;20165:18:1;;;20158:34;;;20208:18;;;20201:34;-1:-1:-1;;;;;50841:9:0;;;20251:19:1;;;20244:44;50865:15:0;20304:19:1;;;20297:35;50637:15:0;:31;;;;;;50676:9;;20006:19:1;;50637:254:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;50384:515;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;733:597::-;845:4;874:2;903;892:9;885:21;935:6;929:13;978:6;973:2;962:9;958:18;951:34;1003:1;1013:140;1027:6;1024:1;1021:13;1013:140;;;1122:14;;;1118:23;;1112:30;1088:17;;;1107:2;1084:26;1077:66;1042:10;;1013:140;;;1171:6;1168:1;1165:13;1162:91;;;1241:1;1236:2;1227:6;1216:9;1212:22;1208:31;1201:42;1162:91;-1:-1:-1;1314:2:1;1293:15;-1:-1:-1;;1289:29:1;1274:45;;;;1321:2;1270:54;;733:597;-1:-1:-1;;;733:597:1:o;1335:315::-;1403:6;1411;1464:2;1452:9;1443:7;1439:23;1435:32;1432:52;;;1480:1;1477;1470:12;1432:52;1519:9;1506:23;1538:31;1563:5;1538:31;:::i;:::-;1588:5;1640:2;1625:18;;;;1612:32;;-1:-1:-1;;;1335:315:1:o;1655:118::-;1741:5;1734:13;1727:21;1720:5;1717:32;1707:60;;1763:1;1760;1753:12;1778:128;1843:20;;1872:28;1843:20;1872:28;:::i;1911:750::-;2003:6;2011;2019;2072:2;2060:9;2051:7;2047:23;2043:32;2040:52;;;2088:1;2085;2078:12;2040:52;2128:9;2115:23;2157:18;2198:2;2190:6;2187:14;2184:34;;;2214:1;2211;2204:12;2184:34;2252:6;2241:9;2237:22;2227:32;;2297:7;2290:4;2286:2;2282:13;2278:27;2268:55;;2319:1;2316;2309:12;2268:55;2359:2;2346:16;2385:2;2377:6;2374:14;2371:34;;;2401:1;2398;2391:12;2371:34;2456:7;2449:4;2439:6;2436:1;2432:14;2428:2;2424:23;2420:34;2417:47;2414:67;;;2477:1;2474;2467:12;2414:67;2508:4;2500:13;;;;-1:-1:-1;2532:6:1;-1:-1:-1;;2573:20:1;;2560:34;2603:28;2560:34;2603:28;:::i;:::-;2650:5;2640:15;;;1911:750;;;;;:::o;3082:180::-;3141:6;3194:2;3182:9;3173:7;3169:23;3165:32;3162:52;;;3210:1;3207;3200:12;3162:52;-1:-1:-1;3233:23:1;;3082:180;-1:-1:-1;3082:180:1:o;3267:456::-;3344:6;3352;3360;3413:2;3401:9;3392:7;3388:23;3384:32;3381:52;;;3429:1;3426;3419:12;3381:52;3468:9;3455:23;3487:31;3512:5;3487:31;:::i;:::-;3537:5;-1:-1:-1;3594:2:1;3579:18;;3566:32;3607:33;3566:32;3607:33;:::i;:::-;3267:456;;3659:7;;-1:-1:-1;;;3713:2:1;3698:18;;;;3685:32;;3267:456::o;4125:382::-;4190:6;4198;4251:2;4239:9;4230:7;4226:23;4222:32;4219:52;;;4267:1;4264;4257:12;4219:52;4306:9;4293:23;4325:31;4350:5;4325:31;:::i;:::-;4375:5;-1:-1:-1;4432:2:1;4417:18;;4404:32;4445:30;4404:32;4445:30;:::i;:::-;4494:7;4484:17;;;4125:382;;;;;:::o;4512:241::-;4568:6;4621:2;4609:9;4600:7;4596:23;4592:32;4589:52;;;4637:1;4634;4627:12;4589:52;4676:9;4663:23;4695:28;4717:5;4695:28;:::i;4758:316::-;4835:6;4843;4851;4904:2;4892:9;4883:7;4879:23;4875:32;4872:52;;;4920:1;4917;4910:12;4872:52;-1:-1:-1;;4943:23:1;;;5013:2;4998:18;;4985:32;;-1:-1:-1;5064:2:1;5049:18;;;5036:32;;4758:316;-1:-1:-1;4758:316:1:o;5079:388::-;5147:6;5155;5208:2;5196:9;5187:7;5183:23;5179:32;5176:52;;;5224:1;5221;5214:12;5176:52;5263:9;5250:23;5282:31;5307:5;5282:31;:::i;:::-;5332:5;-1:-1:-1;5389:2:1;5374:18;;5361:32;5402:33;5361:32;5402:33;:::i;5472:127::-;5533:10;5528:3;5524:20;5521:1;5514:31;5564:4;5561:1;5554:15;5588:4;5585:1;5578:15;5604:1191;5694:6;5702;5755:2;5743:9;5734:7;5730:23;5726:32;5723:52;;;5771:1;5768;5761:12;5723:52;5811:9;5798:23;5840:18;5881:2;5873:6;5870:14;5867:34;;;5897:1;5894;5887:12;5867:34;5935:6;5924:9;5920:22;5910:32;;5980:7;5973:4;5969:2;5965:13;5961:27;5951:55;;6002:1;5999;5992:12;5951:55;6038:2;6025:16;6060:4;6083:2;6079;6076:10;6073:36;;;6089:18;;:::i;:::-;6135:2;6132:1;6128:10;6167:2;6161:9;6230:2;6226:7;6221:2;6217;6213:11;6209:25;6201:6;6197:38;6285:6;6273:10;6270:22;6265:2;6253:10;6250:18;6247:46;6244:72;;;6296:18;;:::i;:::-;6332:2;6325:22;6382:18;;;6416:15;;;;-1:-1:-1;6458:11:1;;;6454:20;;;6486:19;;;6483:39;;;6518:1;6515;6508:12;6483:39;6542:11;;;;6562:148;6578:6;6573:3;6570:15;6562:148;;;6644:23;6663:3;6644:23;:::i;:::-;6632:36;;6595:12;;;;6688;;;;6562:148;;;6729:6;-1:-1:-1;6754:35:1;;-1:-1:-1;6770:18:1;;;6754:35;:::i;:::-;6744:45;;;;;;5604:1191;;;;;:::o;6800:513::-;6880:6;6888;6896;6904;6957:3;6945:9;6936:7;6932:23;6928:33;6925:53;;;6974:1;6971;6964:12;6925:53;7010:9;6997:23;6987:33;;7067:2;7056:9;7052:18;7039:32;7029:42;;7121:2;7110:9;7106:18;7093:32;7134:28;7156:5;7134:28;:::i;:::-;7181:5;-1:-1:-1;7238:2:1;7223:18;;7210:32;7251:30;7210:32;7251:30;:::i;:::-;6800:513;;;;-1:-1:-1;6800:513:1;;-1:-1:-1;;6800:513:1:o;7318:380::-;7397:1;7393:12;;;;7440;;;7461:61;;7515:4;7507:6;7503:17;7493:27;;7461:61;7568:2;7560:6;7557:14;7537:18;7534:38;7531:161;;;7614:10;7609:3;7605:20;7602:1;7595:31;7649:4;7646:1;7639:15;7677:4;7674:1;7667:15;7531:161;;7318:380;;;:::o;7703:356::-;7905:2;7887:21;;;7924:18;;;7917:30;7983:34;7978:2;7963:18;;7956:62;8050:2;8035:18;;7703:356::o;8064:127::-;8125:10;8120:3;8116:20;8113:1;8106:31;8156:4;8153:1;8146:15;8180:4;8177:1;8170:15;8196:127;8257:10;8252:3;8248:20;8245:1;8238:31;8288:4;8285:1;8278:15;8312:4;8309:1;8302:15;8328:135;8367:3;-1:-1:-1;;8388:17:1;;8385:43;;;8408:18;;:::i;:::-;-1:-1:-1;8455:1:1;8444:13;;8328:135::o;8468:168::-;8508:7;8574:1;8570;8566:6;8562:14;8559:1;8556:21;8551:1;8544:9;8537:17;8533:45;8530:71;;;8581:18;;:::i;:::-;-1:-1:-1;8621:9:1;;8468:168::o;9050:128::-;9090:3;9121:1;9117:6;9114:1;9111:13;9108:39;;;9127:18;;:::i;:::-;-1:-1:-1;9163:9:1;;9050:128::o;9971:184::-;10041:6;10094:2;10082:9;10073:7;10069:23;10065:32;10062:52;;;10110:1;10107;10100:12;10062:52;-1:-1:-1;10133:16:1;;9971:184;-1:-1:-1;9971:184:1:o;10439:245::-;10506:6;10559:2;10547:9;10538:7;10534:23;10530:32;10527:52;;;10575:1;10572;10565:12;10527:52;10607:9;10601:16;10626:28;10648:5;10626:28;:::i;17407:217::-;17447:1;17473;17463:132;;17517:10;17512:3;17508:20;17505:1;17498:31;17552:4;17549:1;17542:15;17580:4;17577:1;17570:15;17463:132;-1:-1:-1;17609:9:1;;17407:217::o;17629:125::-;17669:4;17697:1;17694;17691:8;17688:34;;;17702:18;;:::i;:::-;-1:-1:-1;17739:9:1;;17629:125::o;18490:251::-;18560:6;18613:2;18601:9;18592:7;18588:23;18584:32;18581:52;;;18629:1;18626;18619:12;18581:52;18661:9;18655:16;18680:31;18705:5;18680:31;:::i;18746:980::-;19008:4;19056:3;19045:9;19041:19;19087:6;19076:9;19069:25;19113:2;19151:6;19146:2;19135:9;19131:18;19124:34;19194:3;19189:2;19178:9;19174:18;19167:31;19218:6;19253;19247:13;19284:6;19276;19269:22;19322:3;19311:9;19307:19;19300:26;;19361:2;19353:6;19349:15;19335:29;;19382:1;19392:195;19406:6;19403:1;19400:13;19392:195;;;19471:13;;-1:-1:-1;;;;;19467:39:1;19455:52;;19562:15;;;;19527:12;;;;19503:1;19421:9;19392:195;;;-1:-1:-1;;;;;;;19643:32:1;;;;19638:2;19623:18;;19616:60;-1:-1:-1;;;19707:3:1;19692:19;19685:35;19604:3;18746:980;-1:-1:-1;;;18746:980:1:o;20343:306::-;20431:6;20439;20447;20500:2;20488:9;20479:7;20475:23;20471:32;20468:52;;;20516:1;20513;20506:12;20468:52;20545:9;20539:16;20529:26;;20595:2;20584:9;20580:18;20574:25;20564:35;;20639:2;20628:9;20624:18;20618:25;20608:35;;20343:306;;;;;:::o

Swarm Source

ipfs://22a3a6bf0a8c2b9e7f827bd09c4e32cf6686d49fabd447133eb5425a65788bf7
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.