ETH Price: $2,257.45 (-1.00%)
 

Overview

Max Total Supply

10,000,000 SC

Holders

7

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
SquidChain

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2023-11-17
*/

// SPDX-License-Identifier: Unlicensed

// X:   https://twitter.com/squidchaineth
// Web: https://squidchain.xyz/
// WP:  https://wp.squidchain.xyz/
// TG:  https://t.me/SquidChainETH
pragma solidity 0.8.21;
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
 
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
 
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);
 
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
 
    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);
 
    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
 
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
 
    function initialize(address, address) external;
}
 
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
 
    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
 
    function createPair(address tokenA, address tokenB) external returns (address pair);
 
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
 
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);
}
 
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);
 
    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);
 
    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;
 
    mapping(address => uint256) private _balances;
 
    mapping(address => mapping(address => uint256)) private _allowances;
 
    uint256 private _totalSupply;
 
    string private _name;
    string private _symbol;
 
    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
 
    /**
     * @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];
    }
 
    /**
     * @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 setd 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);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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 setd allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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 setd 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
 
    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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);
 
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
 
    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
 
        _beforeTokenTransfer(account, address(0), amount);
 
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), 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 to 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 {}
}
 
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
 
        return c;
    }
 
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
 
    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
 
        return c;
    }
 
    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }
 
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
 
        return c;
    }
 
    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
 
    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
 
        return c;
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }
 
    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
 
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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
 
    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }
 
    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
 
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);
 
    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;
 
        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }
 
    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);
 
        // Solidity already throws when dividing by 0.
        return a / b;
    }
 
    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }
 
    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }
 
    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
 
 
    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}
 
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}
 
interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
 
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
 
    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
 
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);
 
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract SquidChain is ERC20, Ownable {
    using SafeMath for uint256;
 
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    bool private swapping;
    uint256 public percentForLPBurn = 35;
    address public _marketingAddress;
    address public devWallet;
    uint256 public lpBurnFrequency = 5000 seconds;
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWalletSize;
    bool public lpBurnEnabled;
    uint256 public lastLpBurnTime;
    uint256 public lastManualLpBurnTime;
    bool public limitsInEffect = true;
    bool public tradingOpened;
    bool public swapEnabled;
    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;
 
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    mapping (address => bool) public automatedMarketMakerPairs;
  
    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    constructor() ERC20("SquidChain", "SC") {
 
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
 
        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 = 10;
        uint256 _buyLiquidityFee = 0;
        uint256 _buyDevFee = 0;
 
        uint256 _sellMarketingFee = 10;
        uint256 _sellLiquidityFee = 0;
        uint256 _sellDevFee = 0;
 
        uint256 totalSupply = 10e6 * 1e18;
 
        maxTransactionAmount = totalSupply * 2 / 100;
        maxWalletSize = totalSupply * 2 / 100;
        swapTokensAtAmount = totalSupply / 1000;
 
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
 
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;

 
        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(0xdead)] = true;
        _isExcludedFromFees[address(uniswapV2Router)] = true;
 
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        excludeFromMaxTransaction(address(uniswapV2Router), true);
  
        _marketingAddress = address(msg.sender);
        devWallet = address(msg.sender);
        _mint(msg.sender, totalSupply);
    }
 
    receive() external payable {
 
  	}
 
    // once enabled, can never be turned off
    function openTrading() external onlyOwner {
        tradingOpened = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;
    }
 
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        return true;
    }
 
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
  	    swapTokensAtAmount = newAmount;
  	    return true;
  	}

    function setMaxTxAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.5%");
        maxTransactionAmount = newNum * (10**18);
    }
 
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function setMaxWalletSize(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 1 / 100)/1e18, "Cannot set maxWalletSize lower than 1.5%");
        maxWalletSize = newNum * (10**18);
    }
 
    function setBuyTax(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 30, "Must keep fees at 30% or less");
    }
 
    function setSellTax(uint256 _marketingFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 30, "Must keep fees at 30% or less");
    }
 
    function _excludeFromFees(address account) public onlyOwner {
        _isExcludedFromFees[account] = true;
    }
 
    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;
    }
 
    function _setMarketingAddress(address _newMarketingAddress) external onlyOwner {
        _marketingAddress = _newMarketingAddress;
    }
 
    function _setDevWallet(address newWallet) external onlyOwner {
        devWallet = newWallet;
    }
 
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
 
        if(limitsInEffect){
            if (
                !_isExcludedFromFees[from] &&
                !_isExcludedFromFees[to] &&
                !swapping
            ){
                if(!tradingOpened){
                    require(tradingOpened, "Trading is not opened!");
                }
 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount");
                        require(amount + balanceOf(to) <= maxWalletSize, "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) <= maxWalletSize, "Max wallet exceeded");
                }
            }
        }
 
		uint256 contractTokenBalance = balanceOf(address(this));
 
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
 
        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
 
            swapBack();
 
            swapping = false;
        }
 
        if(lpBurnEnabled && !swapping && automatedMarketMakerPairs[to]  && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !_isExcludedFromFees[from]){
            autoBurnLiquidityPairTokens();
        }
 
        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(100);
                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(100);
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
 
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
 
        	amount -= fees;
        }
 
        super._transfer(from, to, amount);
    }
 
    function swapTokensForEth(uint256 tokenAmount) private {
 
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
 
        _approve(address(this), address(uniswapV2Router), tokenAmount);
 
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
 
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
 
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            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 * 4){
          contractBalance = swapTokensAtAmount * 4;
        }
 
        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;
 
        (success,) = address(devWallet).call{value: ethForDev}("");
 
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
        }
 
 
        (success,) = address(_marketingAddress).call{value: address(this).balance}("");
    }
 
    function _setAutoLPBurnSettings(uint256 _frequencyInSeconds, uint256 _percent, bool _Enabled) external onlyOwner {
        require(_frequencyInSeconds >= 600, "cannot set buyback more often than every 10 minutes");
        require(_percent <= 1000 && _percent >= 0, "Must set auto LP burn percent between 0% and 10%");
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }
 
    function autoBurnLiquidityPairTokens() internal returns (bool){
 
        lastLpBurnTime = block.timestamp;
 
        uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair);
 
        uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(10000);
 
        if (amountToBurn > 0){
            super._transfer(uniswapV2Pair, address(0xdead), amountToBurn);
        }
 
        IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair);
        pair.sync();
        return true;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"_setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"_setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMarketingAddress","type":"address"}],"name":"_setMarketingAddress","outputs":[],"stateMutability":"nonpayable","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":"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":"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":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":[],"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":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","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":"openTrading","outputs":[],"stateMutability":"nonpayable","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":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","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":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"setMaxWalletSize","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":"setSellTax","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":"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":"tradingOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"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":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260236006556113886009556010805460ff1916600117905534801562000028575f80fd5b506040518060400160405280600a81526020016929b8bab4b221b430b4b760b11b81525060405180604001604052806002815260200161534360f01b8152508160039081620000789190620006ed565b506004620000878282620006ed565b5050505f6200009b6200046e60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d6200010a81600162000472565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000153573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001799190620007b5565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001eb9190620007b5565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000236573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200025c9190620007b5565b6001600160a01b031660a08190526200027790600162000472565b60a0516001600160a01b03165f908152601b60205260409020805460ff19166001179055600a5f808281806a084595161401484a0000006064620002bd826002620007f1565b620002c991906200080b565b600a556064620002db826002620007f1565b620002e791906200080b565b600c55620002f86103e8826200080b565b600b55601287905560138690556014859055846200031787896200082b565b6200032391906200082b565b601155601684905560178390556018829055816200034284866200082b565b6200034e91906200082b565b601555600160195f620003696005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182015f908120805495151560ff1996871617905530815260199093528183208054851660019081179091557fc73b1d6eda13a615b81c31830292dbbbf5fbb07f472982e223002bd83d5c3dc4805486168217905560805190911683529120805490921617905562000407620003ff6005546001600160a01b031690565b600162000472565b6200041430600162000472565b6200042361dead600162000472565b6080516200043390600162000472565b60078054336001600160a01b031991821681179092556008805490911682179055620004609082620004fc565b505050505050505062000841565b3390565b6005546001600160a01b03163314620004d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601a60205260409020805460ff1916911515919091179055565b6001600160a01b038216620005545760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620004c9565b600254620005639082620005e3565b6002556001600160a01b0382165f908152602081905260409020546200058a9082620005e3565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b5f80620005f183856200082b565b905083811015620006455760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620004c9565b90505b92915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200067757607f821691505b6020821081036200069657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620005de575f81815260208120601f850160051c81016020861015620006c45750805b601f850160051c820191505b81811015620006e557828155600101620006d0565b505050505050565b81516001600160401b038111156200070957620007096200064e565b62000721816200071a845462000662565b846200069c565b602080601f83116001811462000757575f84156200073f5750858301515b5f19600386901b1c1916600185901b178555620006e5565b5f85815260208120601f198616915b82811015620007875788860151825594840194600190910190840162000766565b5085821015620007a557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620007c6575f80fd5b81516001600160a01b038116811462000645575f80fd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620006485762000648620007dd565b5f826200082657634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620006485762000648620007dd565b60805160a051612a76620008a25f395f818161055601528181610e7201528181612119015281816121b701526121e201525f8181610408015281816123b001528181612467015281816124a301528181612517015261253e0152612a765ff3fe608060405260043610610344575f3560e01c80638da5cb5b116101bd578063b62496f5116100f2578063e2f4560511610092578063f0a3cc8f1161006d578063f0a3cc8f14610951578063f11a24d314610970578063f2fde38b14610985578063f6374342146109a4575f80fd5b8063e2f45605146108fe578063ea1644d514610913578063ec28438a14610932575f80fd5b8063caac7934116100cd578063caac793414610867578063d257b34f14610886578063d85ba063146108a5578063dd62ed3e146108ba575f80fd5b8063b62496f514610810578063c8c8ebe41461083e578063c9567bf914610853575f80fd5b80639c3b4fdc1161015d578063a0d82dc511610138578063a0d82dc5146107a8578063a457c2d7146107bd578063a4c82a00146107dc578063a9059cbb146107f1575f80fd5b80639c3b4fdc146107695780639ec22c0e1461077e5780639fccce3214610793575f80fd5b80638f3fa860116101985780638f3fa8601461070c578063921369131461072157806395d89b41146107365780639a7a23d61461074a575f80fd5b80638da5cb5b146106b15780638ea5220f146106ce5780638f2076fd146106ed575f80fd5b8063313ce567116102935780636ddd171311610233578063751039fc1161020e578063751039fc1461064b5780637571336a1461065f5780637bce5a041461067e5780637daa930a14610693575f80fd5b80636ddd1713146105e457806370a0823114610603578063715018a614610637575f80fd5b80634a62bb651161026e5780634a62bb65146105785780635cf70f1c146105915780636a486a8e146105b05780636b06da60146105c5575f80fd5b8063313ce5671461050b578063395093511461052657806349bd5a5e14610545575f80fd5b8063199ffc72116102fe57806321ce72e5116102d957806321ce72e51461049f57806323b872dd146104be5780632c3e486c146104dd5780632e82f1a0146104f2575f80fd5b8063199ffc72146104605780631a8145bb146104755780631f3fed8f1461048a575f80fd5b806306fdde031461034f578063095ea7b3146103795780630a1f8ea8146103a857806310d5de53146103c95780631694505e146103f757806318160ddd14610442575f80fd5b3661034b57005b5f80fd5b34801561035a575f80fd5b506103636109b9565b6040516103709190612640565b60405180910390f35b348015610384575f80fd5b506103986103933660046126a2565b610a49565b6040519015158152602001610370565b3480156103b3575f80fd5b506103c76103c23660046126cc565b610a5f565b005b3480156103d4575f80fd5b506103986103e33660046126cc565b601a6020525f908152604090205460ff1681565b348015610402575f80fd5b5061042a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610370565b34801561044d575f80fd5b506002545b604051908152602001610370565b34801561046b575f80fd5b5061045260065481565b348015610480575f80fd5b50610452601d5481565b348015610495575f80fd5b50610452601c5481565b3480156104aa575f80fd5b506103c76104b93660046126e7565b610ab4565b3480156104c9575f80fd5b506103986104d8366004612710565b610b5c565b3480156104e8575f80fd5b5061045260095481565b3480156104fd575f80fd5b50600d546103989060ff1681565b348015610516575f80fd5b5060405160128152602001610370565b348015610531575f80fd5b506103986105403660046126a2565b610bc3565b348015610550575f80fd5b5061042a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610583575f80fd5b506010546103989060ff1681565b34801561059c575f80fd5b506103c76105ab3660046126cc565b610bf8565b3480156105bb575f80fd5b5061045260155481565b3480156105d0575f80fd5b506103c76105df3660046126cc565b610c44565b3480156105ef575f80fd5b506010546103989062010000900460ff1681565b34801561060e575f80fd5b5061045261061d3660046126cc565b6001600160a01b03165f9081526020819052604090205490565b348015610642575f80fd5b506103c7610c91565b348015610656575f80fd5b50610398610d04565b34801561066a575f80fd5b506103c761067936600461275d565b610d40565b348015610689575f80fd5b5061045260125481565b34801561069e575f80fd5b5060105461039890610100900460ff1681565b3480156106bc575f80fd5b506005546001600160a01b031661042a565b3480156106d9575f80fd5b5060085461042a906001600160a01b031681565b3480156106f8575f80fd5b506103c76107073660046126e7565b610d94565b348015610717575f80fd5b50610452600c5481565b34801561072c575f80fd5b5061045260165481565b348015610741575f80fd5b50610363610e37565b348015610755575f80fd5b506103c761076436600461275d565b610e46565b348015610774575f80fd5b5061045260145481565b348015610789575f80fd5b50610452600f5481565b34801561079e575f80fd5b50610452601e5481565b3480156107b3575f80fd5b5061045260185481565b3480156107c8575f80fd5b506103986107d73660046126a2565b610f3e565b3480156107e7575f80fd5b50610452600e5481565b3480156107fc575f80fd5b5061039861080b3660046126a2565b610f8b565b34801561081b575f80fd5b5061039861082a3660046126cc565b601b6020525f908152604090205460ff1681565b348015610849575f80fd5b50610452600a5481565b34801561085e575f80fd5b506103c7610f97565b348015610872575f80fd5b5060075461042a906001600160a01b031681565b348015610891575f80fd5b506103986108a0366004612790565b610fd8565b3480156108b0575f80fd5b5061045260115481565b3480156108c5575f80fd5b506104526108d43660046127a7565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610909575f80fd5b50610452600b5481565b34801561091e575f80fd5b506103c761092d366004612790565b61112e565b34801561093d575f80fd5b506103c761094c366004612790565b611203565b34801561095c575f80fd5b506103c761096b3660046127de565b6112e0565b34801561097b575f80fd5b5061045260135481565b348015610990575f80fd5b506103c761099f3660046126cc565b611409565b3480156109af575f80fd5b5061045260175481565b6060600380546109c890612810565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490612810565b8015610a3f5780601f10610a1657610100808354040283529160200191610a3f565b820191905f5260205f20905b815481529060010190602001808311610a2257829003601f168201915b5050505050905090565b5f610a553384846114f3565b5060015b92915050565b6005546001600160a01b03163314610a925760405162461bcd60e51b8152600401610a8990612848565b60405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610ade5760405162461bcd60e51b8152600401610a8990612848565b60128390556013829055601481905580610af88385612891565b610b029190612891565b6011819055601e1015610b575760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610a89565b505050565b5f610b68848484611617565b610bb98433610bb4856040518060600160405280602881526020016129f4602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190611cfb565b6114f3565b5060019392505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610a55918590610bb49086611d33565b6005546001600160a01b03163314610c225760405162461bcd60e51b8152600401610a8990612848565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610c6e5760405162461bcd60e51b8152600401610a8990612848565b6001600160a01b03165f908152601960205260409020805460ff19166001179055565b6005546001600160a01b03163314610cbb5760405162461bcd60e51b8152600401610a8990612848565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005545f906001600160a01b03163314610d305760405162461bcd60e51b8152600401610a8990612848565b506010805460ff19169055600190565b6005546001600160a01b03163314610d6a5760405162461bcd60e51b8152600401610a8990612848565b6001600160a01b03919091165f908152601a60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610dbe5760405162461bcd60e51b8152600401610a8990612848565b60168390556017829055601881905580610dd88385612891565b610de29190612891565b6015819055601e1015610b575760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610a89565b6060600480546109c890612810565b6005546001600160a01b03163314610e705760405162461bcd60e51b8152600401610a8990612848565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603610f175760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a89565b6001600160a01b0382165f908152601b60205260409020805460ff19168215151790555050565b5f610a553384610bb485604051806060016040528060258152602001612a1c60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611cfb565b5f610a55338484611617565b6005546001600160a01b03163314610fc15760405162461bcd60e51b8152600401610a8990612848565b6010805462ffff0019166201010017905542600e55565b6005545f906001600160a01b031633146110045760405162461bcd60e51b8152600401610a8990612848565b620186a061101160025490565b61101c9060016128a4565b61102691906128bb565b8210156110935760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a89565b6103e861109f60025490565b6110aa9060056128a4565b6110b491906128bb565b8211156111205760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a89565b50600b81905560015b919050565b6005546001600160a01b031633146111585760405162461bcd60e51b8152600401610a8990612848565b670de0b6b3a7640000606461116c60025490565b6111779060016128a4565b61118191906128bb565b61118b91906128bb565b8110156111eb5760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f7420736574206d617857616c6c657453697a65206c6f776572207460448201526768616e20312e352560c01b6064820152608401610a89565b6111fd81670de0b6b3a76400006128a4565b600c5550565b6005546001600160a01b0316331461122d5760405162461bcd60e51b8152600401610a8990612848565b670de0b6b3a76400006103e861124260025490565b61124d9060056128a4565b61125791906128bb565b61126191906128bb565b8110156112c85760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610a89565b6112da81670de0b6b3a76400006128a4565b600a5550565b6005546001600160a01b0316331461130a5760405162461bcd60e51b8152600401610a8990612848565b6102588310156113785760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610a89565b6103e88211158015611388575060015b6113ed5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610a89565b600992909255600655600d805460ff1916911515919091179055565b6005546001600160a01b031633146114335760405162461bcd60e51b8152600401610a8990612848565b6001600160a01b0381166114985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a89565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166115555760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a89565b6001600160a01b0382166115b65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a89565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b805f0361162957610b5783835f611d98565b60105460ff161561194b576001600160a01b0383165f9081526019602052604090205460ff1615801561167457506001600160a01b0382165f9081526019602052604090205460ff16155b801561168a5750600554600160a01b900460ff16155b1561194b57601054610100900460ff166116ee57601054610100900460ff166116ee5760405162461bcd60e51b815260206004820152601660248201527554726164696e67206973206e6f74206f70656e65642160501b6044820152606401610a89565b6001600160a01b0383165f908152601b602052604090205460ff16801561172d57506001600160a01b0382165f908152601a602052604090205460ff16155b1561180f57600a548111156117a15760405162461bcd60e51b815260206004820152603460248201527f427579207472616e7366657220616d6f756e74206578636565647320746865206044820152731b585e151c985b9cd858dd1a5bdb905b5bdd5b9d60621b6064820152608401610a89565b600c546001600160a01b0383165f908152602081905260409020546117c69083612891565b111561180a5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a89565b61194b565b6001600160a01b0382165f908152601b602052604090205460ff16801561184e57506001600160a01b0383165f908152601a602052604090205460ff16155b156118c357600a5481111561180a5760405162461bcd60e51b815260206004820152603560248201527f53656c6c207472616e7366657220616d6f756e74206578636565647320746865604482015274081b585e151c985b9cd858dd1a5bdb905b5bdd5b9d605a1b6064820152608401610a89565b6001600160a01b0382165f908152601a602052604090205460ff1661194b57600c546001600160a01b0383165f908152602081905260409020546119079083612891565b111561194b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a89565b305f90815260208190526040902054600b5481108015908190611976575060105462010000900460ff165b801561198c5750600554600160a01b900460ff16155b80156119b057506001600160a01b0385165f908152601b602052604090205460ff16155b80156119d457506001600160a01b0385165f9081526019602052604090205460ff16155b80156119f857506001600160a01b0384165f9081526019602052604090205460ff16155b15611a26576005805460ff60a01b1916600160a01b179055611a18611f18565b6005805460ff60a01b191690555b600d5460ff168015611a425750600554600160a01b900460ff16155b8015611a6557506001600160a01b0384165f908152601b602052604090205460ff165b8015611a805750600954600e54611a7c9190612891565b4210155b8015611aa457506001600160a01b0385165f9081526019602052604090205460ff16155b15611ab357611ab16120fe565b505b6005546001600160a01b0386165f9081526019602052604090205460ff600160a01b909204821615911680611aff57506001600160a01b0385165f9081526019602052604090205460ff165b15611b0757505f5b5f8115611ce7576001600160a01b0386165f908152601b602052604090205460ff168015611b3657505f601554115b15611bf157611b5b6064611b556015548861225b90919063ffffffff16565b906122d9565b905060155460175482611b6e91906128a4565b611b7891906128bb565b601d5f828254611b889190612891565b9091555050601554601854611b9d90836128a4565b611ba791906128bb565b601e5f828254611bb79190612891565b9091555050601554601654611bcc90836128a4565b611bd691906128bb565b601c5f828254611be69190612891565b90915550611cc99050565b6001600160a01b0387165f908152601b602052604090205460ff168015611c1957505f601154115b15611cc957611c386064611b556011548861225b90919063ffffffff16565b905060115460135482611c4b91906128a4565b611c5591906128bb565b601d5f828254611c659190612891565b9091555050601154601454611c7a90836128a4565b611c8491906128bb565b601e5f828254611c949190612891565b9091555050601154601254611ca990836128a4565b611cb391906128bb565b601c5f828254611cc39190612891565b90915550505b8015611cda57611cda873083611d98565b611ce481866128da565b94505b611cf2878787611d98565b50505050505050565b5f8184841115611d1e5760405162461bcd60e51b8152600401610a899190612640565b505f611d2a84866128da565b95945050505050565b5f80611d3f8385612891565b905083811015611d915760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a89565b9392505050565b6001600160a01b038316611dfc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a89565b6001600160a01b038216611e5e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a89565b611e9a816040518060600160405280602681526020016129ce602691396001600160a01b0386165f908152602081905260409020549190611cfb565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611ec89082611d33565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161160a565b305f9081526020819052604081205490505f601e54601c54601d54611f3d9190612891565b611f479190612891565b90505f821580611f55575081155b15611f5f57505050565b600b54611f6d9060046128a4565b831115611f8557600b54611f829060046128a4565b92505b5f600283601d5486611f9791906128a4565b611fa191906128bb565b611fab91906128bb565b90505f611fb8858361231a565b905047611fc48261235b565b5f611fcf478361231a565b90505f611feb87611b55601c548561225b90919063ffffffff16565b90505f61200788611b55601e548661225b90919063ffffffff16565b90505f8161201584866128da565b61201f91906128da565b5f601d819055601c819055601e8190556008546040519293506001600160a01b031691849181818185875af1925050503d805f8114612079576040519150601f19603f3d011682016040523d82523d5f602084013e61207e565b606091505b5090985050861580159061209157505f81115b156120a0576120a08782612511565b6007546040516001600160a01b039091169047905f81818185875af1925050503d805f81146120ea576040519150601f19603f3d011682016040523d82523d5f602084013e6120ef565b606091505b50505050505050505050505050565b42600e556040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201525f90819030906370a0823190602401602060405180830381865afa158015612168573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061218c91906128ed565b90505f6121aa612710611b556006548561225b90919063ffffffff16565b905080156121df576121df7f000000000000000000000000000000000000000000000000000000000000000061dead83611d98565b5f7f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561223b575f80fd5b505af115801561224d573d5f803e3d5ffd5b505050506001935050505090565b5f825f0361226a57505f610a59565b5f61227583856128a4565b90508261228285836128bb565b14611d915760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a89565b5f611d9183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612614565b5f611d9183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cfb565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061238e5761238e612904565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242e9190612918565b8160018151811061244157612441612904565b60200260200101906001600160a01b031690816001600160a01b03168152505061248c307f0000000000000000000000000000000000000000000000000000000000000000846114f3565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906124e09085905f90869030904290600401612933565b5f604051808303815f87803b1580156124f7575f80fd5b505af1158015612509573d5f803e3d5ffd5b505050505050565b61253c307f0000000000000000000000000000000000000000000000000000000000000000846114f3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230855f806125826005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156125e8573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061260d91906129a2565b5050505050565b5f81836126345760405162461bcd60e51b8152600401610a899190612640565b505f611d2a84866128bb565b5f6020808352835180828501525f5b8181101561266b5785810183015185820160400152820161264f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461269f575f80fd5b50565b5f80604083850312156126b3575f80fd5b82356126be8161268b565b946020939093013593505050565b5f602082840312156126dc575f80fd5b8135611d918161268b565b5f805f606084860312156126f9575f80fd5b505081359360208301359350604090920135919050565b5f805f60608486031215612722575f80fd5b833561272d8161268b565b9250602084013561273d8161268b565b929592945050506040919091013590565b80358015158114611129575f80fd5b5f806040838503121561276e575f80fd5b82356127798161268b565b91506127876020840161274e565b90509250929050565b5f602082840312156127a0575f80fd5b5035919050565b5f80604083850312156127b8575f80fd5b82356127c38161268b565b915060208301356127d38161268b565b809150509250929050565b5f805f606084860312156127f0575f80fd5b83359250602084013591506128076040850161274e565b90509250925092565b600181811c9082168061282457607f821691505b60208210810361284257634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a5957610a5961287d565b8082028115828204841417610a5957610a5961287d565b5f826128d557634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a5957610a5961287d565b5f602082840312156128fd575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612928575f80fd5b8151611d918161268b565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156129815784516001600160a01b03168352938301939183019160010161295c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156129b4575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122044163a8425c19cdddb29fd1dc4dabecb4afbcfaab5b15a1f844ebfafbcf3050364736f6c63430008150033

Deployed Bytecode

0x608060405260043610610344575f3560e01c80638da5cb5b116101bd578063b62496f5116100f2578063e2f4560511610092578063f0a3cc8f1161006d578063f0a3cc8f14610951578063f11a24d314610970578063f2fde38b14610985578063f6374342146109a4575f80fd5b8063e2f45605146108fe578063ea1644d514610913578063ec28438a14610932575f80fd5b8063caac7934116100cd578063caac793414610867578063d257b34f14610886578063d85ba063146108a5578063dd62ed3e146108ba575f80fd5b8063b62496f514610810578063c8c8ebe41461083e578063c9567bf914610853575f80fd5b80639c3b4fdc1161015d578063a0d82dc511610138578063a0d82dc5146107a8578063a457c2d7146107bd578063a4c82a00146107dc578063a9059cbb146107f1575f80fd5b80639c3b4fdc146107695780639ec22c0e1461077e5780639fccce3214610793575f80fd5b80638f3fa860116101985780638f3fa8601461070c578063921369131461072157806395d89b41146107365780639a7a23d61461074a575f80fd5b80638da5cb5b146106b15780638ea5220f146106ce5780638f2076fd146106ed575f80fd5b8063313ce567116102935780636ddd171311610233578063751039fc1161020e578063751039fc1461064b5780637571336a1461065f5780637bce5a041461067e5780637daa930a14610693575f80fd5b80636ddd1713146105e457806370a0823114610603578063715018a614610637575f80fd5b80634a62bb651161026e5780634a62bb65146105785780635cf70f1c146105915780636a486a8e146105b05780636b06da60146105c5575f80fd5b8063313ce5671461050b578063395093511461052657806349bd5a5e14610545575f80fd5b8063199ffc72116102fe57806321ce72e5116102d957806321ce72e51461049f57806323b872dd146104be5780632c3e486c146104dd5780632e82f1a0146104f2575f80fd5b8063199ffc72146104605780631a8145bb146104755780631f3fed8f1461048a575f80fd5b806306fdde031461034f578063095ea7b3146103795780630a1f8ea8146103a857806310d5de53146103c95780631694505e146103f757806318160ddd14610442575f80fd5b3661034b57005b5f80fd5b34801561035a575f80fd5b506103636109b9565b6040516103709190612640565b60405180910390f35b348015610384575f80fd5b506103986103933660046126a2565b610a49565b6040519015158152602001610370565b3480156103b3575f80fd5b506103c76103c23660046126cc565b610a5f565b005b3480156103d4575f80fd5b506103986103e33660046126cc565b601a6020525f908152604090205460ff1681565b348015610402575f80fd5b5061042a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610370565b34801561044d575f80fd5b506002545b604051908152602001610370565b34801561046b575f80fd5b5061045260065481565b348015610480575f80fd5b50610452601d5481565b348015610495575f80fd5b50610452601c5481565b3480156104aa575f80fd5b506103c76104b93660046126e7565b610ab4565b3480156104c9575f80fd5b506103986104d8366004612710565b610b5c565b3480156104e8575f80fd5b5061045260095481565b3480156104fd575f80fd5b50600d546103989060ff1681565b348015610516575f80fd5b5060405160128152602001610370565b348015610531575f80fd5b506103986105403660046126a2565b610bc3565b348015610550575f80fd5b5061042a7f0000000000000000000000002f3bbdcf5c15f25b0cfd366c2a84676033e3ef3f81565b348015610583575f80fd5b506010546103989060ff1681565b34801561059c575f80fd5b506103c76105ab3660046126cc565b610bf8565b3480156105bb575f80fd5b5061045260155481565b3480156105d0575f80fd5b506103c76105df3660046126cc565b610c44565b3480156105ef575f80fd5b506010546103989062010000900460ff1681565b34801561060e575f80fd5b5061045261061d3660046126cc565b6001600160a01b03165f9081526020819052604090205490565b348015610642575f80fd5b506103c7610c91565b348015610656575f80fd5b50610398610d04565b34801561066a575f80fd5b506103c761067936600461275d565b610d40565b348015610689575f80fd5b5061045260125481565b34801561069e575f80fd5b5060105461039890610100900460ff1681565b3480156106bc575f80fd5b506005546001600160a01b031661042a565b3480156106d9575f80fd5b5060085461042a906001600160a01b031681565b3480156106f8575f80fd5b506103c76107073660046126e7565b610d94565b348015610717575f80fd5b50610452600c5481565b34801561072c575f80fd5b5061045260165481565b348015610741575f80fd5b50610363610e37565b348015610755575f80fd5b506103c761076436600461275d565b610e46565b348015610774575f80fd5b5061045260145481565b348015610789575f80fd5b50610452600f5481565b34801561079e575f80fd5b50610452601e5481565b3480156107b3575f80fd5b5061045260185481565b3480156107c8575f80fd5b506103986107d73660046126a2565b610f3e565b3480156107e7575f80fd5b50610452600e5481565b3480156107fc575f80fd5b5061039861080b3660046126a2565b610f8b565b34801561081b575f80fd5b5061039861082a3660046126cc565b601b6020525f908152604090205460ff1681565b348015610849575f80fd5b50610452600a5481565b34801561085e575f80fd5b506103c7610f97565b348015610872575f80fd5b5060075461042a906001600160a01b031681565b348015610891575f80fd5b506103986108a0366004612790565b610fd8565b3480156108b0575f80fd5b5061045260115481565b3480156108c5575f80fd5b506104526108d43660046127a7565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610909575f80fd5b50610452600b5481565b34801561091e575f80fd5b506103c761092d366004612790565b61112e565b34801561093d575f80fd5b506103c761094c366004612790565b611203565b34801561095c575f80fd5b506103c761096b3660046127de565b6112e0565b34801561097b575f80fd5b5061045260135481565b348015610990575f80fd5b506103c761099f3660046126cc565b611409565b3480156109af575f80fd5b5061045260175481565b6060600380546109c890612810565b80601f01602080910402602001604051908101604052809291908181526020018280546109f490612810565b8015610a3f5780601f10610a1657610100808354040283529160200191610a3f565b820191905f5260205f20905b815481529060010190602001808311610a2257829003601f168201915b5050505050905090565b5f610a553384846114f3565b5060015b92915050565b6005546001600160a01b03163314610a925760405162461bcd60e51b8152600401610a8990612848565b60405180910390fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610ade5760405162461bcd60e51b8152600401610a8990612848565b60128390556013829055601481905580610af88385612891565b610b029190612891565b6011819055601e1015610b575760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610a89565b505050565b5f610b68848484611617565b610bb98433610bb4856040518060600160405280602881526020016129f4602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190611cfb565b6114f3565b5060019392505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610a55918590610bb49086611d33565b6005546001600160a01b03163314610c225760405162461bcd60e51b8152600401610a8990612848565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610c6e5760405162461bcd60e51b8152600401610a8990612848565b6001600160a01b03165f908152601960205260409020805460ff19166001179055565b6005546001600160a01b03163314610cbb5760405162461bcd60e51b8152600401610a8990612848565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005545f906001600160a01b03163314610d305760405162461bcd60e51b8152600401610a8990612848565b506010805460ff19169055600190565b6005546001600160a01b03163314610d6a5760405162461bcd60e51b8152600401610a8990612848565b6001600160a01b03919091165f908152601a60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314610dbe5760405162461bcd60e51b8152600401610a8990612848565b60168390556017829055601881905580610dd88385612891565b610de29190612891565b6015819055601e1015610b575760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610a89565b6060600480546109c890612810565b6005546001600160a01b03163314610e705760405162461bcd60e51b8152600401610a8990612848565b7f0000000000000000000000002f3bbdcf5c15f25b0cfd366c2a84676033e3ef3f6001600160a01b0316826001600160a01b031603610f175760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610a89565b6001600160a01b0382165f908152601b60205260409020805460ff19168215151790555050565b5f610a553384610bb485604051806060016040528060258152602001612a1c60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611cfb565b5f610a55338484611617565b6005546001600160a01b03163314610fc15760405162461bcd60e51b8152600401610a8990612848565b6010805462ffff0019166201010017905542600e55565b6005545f906001600160a01b031633146110045760405162461bcd60e51b8152600401610a8990612848565b620186a061101160025490565b61101c9060016128a4565b61102691906128bb565b8210156110935760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610a89565b6103e861109f60025490565b6110aa9060056128a4565b6110b491906128bb565b8211156111205760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610a89565b50600b81905560015b919050565b6005546001600160a01b031633146111585760405162461bcd60e51b8152600401610a8990612848565b670de0b6b3a7640000606461116c60025490565b6111779060016128a4565b61118191906128bb565b61118b91906128bb565b8110156111eb5760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f7420736574206d617857616c6c657453697a65206c6f776572207460448201526768616e20312e352560c01b6064820152608401610a89565b6111fd81670de0b6b3a76400006128a4565b600c5550565b6005546001600160a01b0316331461122d5760405162461bcd60e51b8152600401610a8990612848565b670de0b6b3a76400006103e861124260025490565b61124d9060056128a4565b61125791906128bb565b61126191906128bb565b8110156112c85760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610a89565b6112da81670de0b6b3a76400006128a4565b600a5550565b6005546001600160a01b0316331461130a5760405162461bcd60e51b8152600401610a8990612848565b6102588310156113785760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610a89565b6103e88211158015611388575060015b6113ed5760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610a89565b600992909255600655600d805460ff1916911515919091179055565b6005546001600160a01b031633146114335760405162461bcd60e51b8152600401610a8990612848565b6001600160a01b0381166114985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a89565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166115555760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a89565b6001600160a01b0382166115b65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a89565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b805f0361162957610b5783835f611d98565b60105460ff161561194b576001600160a01b0383165f9081526019602052604090205460ff1615801561167457506001600160a01b0382165f9081526019602052604090205460ff16155b801561168a5750600554600160a01b900460ff16155b1561194b57601054610100900460ff166116ee57601054610100900460ff166116ee5760405162461bcd60e51b815260206004820152601660248201527554726164696e67206973206e6f74206f70656e65642160501b6044820152606401610a89565b6001600160a01b0383165f908152601b602052604090205460ff16801561172d57506001600160a01b0382165f908152601a602052604090205460ff16155b1561180f57600a548111156117a15760405162461bcd60e51b815260206004820152603460248201527f427579207472616e7366657220616d6f756e74206578636565647320746865206044820152731b585e151c985b9cd858dd1a5bdb905b5bdd5b9d60621b6064820152608401610a89565b600c546001600160a01b0383165f908152602081905260409020546117c69083612891565b111561180a5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a89565b61194b565b6001600160a01b0382165f908152601b602052604090205460ff16801561184e57506001600160a01b0383165f908152601a602052604090205460ff16155b156118c357600a5481111561180a5760405162461bcd60e51b815260206004820152603560248201527f53656c6c207472616e7366657220616d6f756e74206578636565647320746865604482015274081b585e151c985b9cd858dd1a5bdb905b5bdd5b9d605a1b6064820152608401610a89565b6001600160a01b0382165f908152601a602052604090205460ff1661194b57600c546001600160a01b0383165f908152602081905260409020546119079083612891565b111561194b5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610a89565b305f90815260208190526040902054600b5481108015908190611976575060105462010000900460ff165b801561198c5750600554600160a01b900460ff16155b80156119b057506001600160a01b0385165f908152601b602052604090205460ff16155b80156119d457506001600160a01b0385165f9081526019602052604090205460ff16155b80156119f857506001600160a01b0384165f9081526019602052604090205460ff16155b15611a26576005805460ff60a01b1916600160a01b179055611a18611f18565b6005805460ff60a01b191690555b600d5460ff168015611a425750600554600160a01b900460ff16155b8015611a6557506001600160a01b0384165f908152601b602052604090205460ff165b8015611a805750600954600e54611a7c9190612891565b4210155b8015611aa457506001600160a01b0385165f9081526019602052604090205460ff16155b15611ab357611ab16120fe565b505b6005546001600160a01b0386165f9081526019602052604090205460ff600160a01b909204821615911680611aff57506001600160a01b0385165f9081526019602052604090205460ff165b15611b0757505f5b5f8115611ce7576001600160a01b0386165f908152601b602052604090205460ff168015611b3657505f601554115b15611bf157611b5b6064611b556015548861225b90919063ffffffff16565b906122d9565b905060155460175482611b6e91906128a4565b611b7891906128bb565b601d5f828254611b889190612891565b9091555050601554601854611b9d90836128a4565b611ba791906128bb565b601e5f828254611bb79190612891565b9091555050601554601654611bcc90836128a4565b611bd691906128bb565b601c5f828254611be69190612891565b90915550611cc99050565b6001600160a01b0387165f908152601b602052604090205460ff168015611c1957505f601154115b15611cc957611c386064611b556011548861225b90919063ffffffff16565b905060115460135482611c4b91906128a4565b611c5591906128bb565b601d5f828254611c659190612891565b9091555050601154601454611c7a90836128a4565b611c8491906128bb565b601e5f828254611c949190612891565b9091555050601154601254611ca990836128a4565b611cb391906128bb565b601c5f828254611cc39190612891565b90915550505b8015611cda57611cda873083611d98565b611ce481866128da565b94505b611cf2878787611d98565b50505050505050565b5f8184841115611d1e5760405162461bcd60e51b8152600401610a899190612640565b505f611d2a84866128da565b95945050505050565b5f80611d3f8385612891565b905083811015611d915760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a89565b9392505050565b6001600160a01b038316611dfc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a89565b6001600160a01b038216611e5e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a89565b611e9a816040518060600160405280602681526020016129ce602691396001600160a01b0386165f908152602081905260409020549190611cfb565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611ec89082611d33565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161160a565b305f9081526020819052604081205490505f601e54601c54601d54611f3d9190612891565b611f479190612891565b90505f821580611f55575081155b15611f5f57505050565b600b54611f6d9060046128a4565b831115611f8557600b54611f829060046128a4565b92505b5f600283601d5486611f9791906128a4565b611fa191906128bb565b611fab91906128bb565b90505f611fb8858361231a565b905047611fc48261235b565b5f611fcf478361231a565b90505f611feb87611b55601c548561225b90919063ffffffff16565b90505f61200788611b55601e548661225b90919063ffffffff16565b90505f8161201584866128da565b61201f91906128da565b5f601d819055601c819055601e8190556008546040519293506001600160a01b031691849181818185875af1925050503d805f8114612079576040519150601f19603f3d011682016040523d82523d5f602084013e61207e565b606091505b5090985050861580159061209157505f81115b156120a0576120a08782612511565b6007546040516001600160a01b039091169047905f81818185875af1925050503d805f81146120ea576040519150601f19603f3d011682016040523d82523d5f602084013e6120ef565b606091505b50505050505050505050505050565b42600e556040516370a0823160e01b81526001600160a01b037f0000000000000000000000002f3bbdcf5c15f25b0cfd366c2a84676033e3ef3f1660048201525f90819030906370a0823190602401602060405180830381865afa158015612168573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061218c91906128ed565b90505f6121aa612710611b556006548561225b90919063ffffffff16565b905080156121df576121df7f0000000000000000000000002f3bbdcf5c15f25b0cfd366c2a84676033e3ef3f61dead83611d98565b5f7f0000000000000000000000002f3bbdcf5c15f25b0cfd366c2a84676033e3ef3f9050806001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561223b575f80fd5b505af115801561224d573d5f803e3d5ffd5b505050506001935050505090565b5f825f0361226a57505f610a59565b5f61227583856128a4565b90508261228285836128bb565b14611d915760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a89565b5f611d9183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612614565b5f611d9183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cfb565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061238e5761238e612904565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242e9190612918565b8160018151811061244157612441612904565b60200260200101906001600160a01b031690816001600160a01b03168152505061248c307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846114f3565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906124e09085905f90869030904290600401612933565b5f604051808303815f87803b1580156124f7575f80fd5b505af1158015612509573d5f803e3d5ffd5b505050505050565b61253c307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846114f3565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230855f806125826005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156125e8573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061260d91906129a2565b5050505050565b5f81836126345760405162461bcd60e51b8152600401610a899190612640565b505f611d2a84866128bb565b5f6020808352835180828501525f5b8181101561266b5785810183015185820160400152820161264f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461269f575f80fd5b50565b5f80604083850312156126b3575f80fd5b82356126be8161268b565b946020939093013593505050565b5f602082840312156126dc575f80fd5b8135611d918161268b565b5f805f606084860312156126f9575f80fd5b505081359360208301359350604090920135919050565b5f805f60608486031215612722575f80fd5b833561272d8161268b565b9250602084013561273d8161268b565b929592945050506040919091013590565b80358015158114611129575f80fd5b5f806040838503121561276e575f80fd5b82356127798161268b565b91506127876020840161274e565b90509250929050565b5f602082840312156127a0575f80fd5b5035919050565b5f80604083850312156127b8575f80fd5b82356127c38161268b565b915060208301356127d38161268b565b809150509250929050565b5f805f606084860312156127f0575f80fd5b83359250602084013591506128076040850161274e565b90509250925092565b600181811c9082168061282457607f821691505b60208210810361284257634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a5957610a5961287d565b8082028115828204841417610a5957610a5961287d565b5f826128d557634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a5957610a5961287d565b5f602082840312156128fd575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612928575f80fd5b8151611d918161268b565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156129815784516001600160a01b03168352938301939183019160010161295c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156129b4575f80fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122044163a8425c19cdddb29fd1dc4dabecb4afbcfaab5b15a1f844ebfafbcf3050364736f6c63430008150033

Deployed Bytecode Sourcemap

29528:13172:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7645:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9819:169;;;;;;;;;;-1:-1:-1;9819:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;9819:169:0;1023:187:1;35802:101:0;;;;;;;;;;-1:-1:-1;35802:101:0;;;;;:::i;:::-;;:::i;:::-;;30579:64;;;;;;;;;;-1:-1:-1;30579:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29609:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1658:32:1;;;1640:51;;1628:2;1613:18;29609:51:0;1467:230:1;8768:108:0;;;;;;;;;;-1:-1:-1;8856:12:0;;8768:108;;;1848:25:1;;;1836:2;1821:18;8768:108:0;1702:177:1;29740:36:0;;;;;;;;;;;;;;;;30759:33;;;;;;;;;;;;;;;;30719;;;;;;;;;;;;;;;;34385:365;;;;;;;;;;-1:-1:-1;34385:365:0;;;;;:::i;:::-;;:::i;10468:355::-;;;;;;;;;;-1:-1:-1;10468:355:0;;;;;:::i;:::-;;:::i;29853:45::-;;;;;;;;;;;;;;;;30022:25;;;;;;;;;;-1:-1:-1;30022:25:0;;;;;;;;8609:93;;;;;;;;;;-1:-1:-1;8609:93:0;;8692:2;2808:36:1;;2796:2;2781:18;8609:93:0;2666:184:1;11230:218:0;;;;;;;;;;-1:-1:-1;11230:218:0;;;;;:::i;:::-;;:::i;29667:38::-;;;;;;;;;;;;;;;30132:33;;;;;;;;;;-1:-1:-1;30132:33:0;;;;;;;;35655:138;;;;;;;;;;-1:-1:-1;35655:138:0;;;;;:::i;:::-;;:::i;30373:28::-;;;;;;;;;;;;;;;;35142:114;;;;;;;;;;-1:-1:-1;35142:114:0;;;;;:::i;:::-;;:::i;30204:23::-;;;;;;;;;;-1:-1:-1;30204:23:0;;;;;;;;;;;8940:127;;;;;;;;;;-1:-1:-1;8940:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;9041:18:0;9014:7;9041:18;;;;;;;;;;;;8940:127;22138:148;;;;;;;;;;;;;:::i;33187:120::-;;;;;;;;;;;;;:::i;34007:144::-;;;;;;;;;;-1:-1:-1;34007:144:0;;;;;:::i;:::-;;:::i;30268:30::-;;;;;;;;;;;;;;;;30172:25;;;;;;;;;;-1:-1:-1;30172:25:0;;;;;;;;;;;21494:79;;;;;;;;;;-1:-1:-1;21559:6:0;;-1:-1:-1;;;;;21559:6:0;21494:79;;29822:24;;;;;;;;;;-1:-1:-1;29822:24:0;;;;-1:-1:-1;;;;;29822:24:0;;;34759:374;;;;;;;;;;-1:-1:-1;34759:374:0;;;;;:::i;:::-;;:::i;29987:28::-;;;;;;;;;;;;;;;;30408:31;;;;;;;;;;;;;;;;7865:104;;;;;;;;;;;;;:::i;35265:242::-;;;;;;;;;;-1:-1:-1;35265:242:0;;;;;:::i;:::-;;:::i;30342:24::-;;;;;;;;;;;;;;;;30090:35;;;;;;;;;;;;;;;;30799:27;;;;;;;;;;;;;;;;30484:25;;;;;;;;;;;;;;;;11949:269;;;;;;;;;;-1:-1:-1;11949:269:0;;;;;:::i;:::-;;:::i;30054:29::-;;;;;;;;;;;;;;;;9281:175;;;;;;;;;;-1:-1:-1;9281:175:0;;;;;:::i;:::-;;:::i;30650:58::-;;;;;;;;;;-1:-1:-1;30650:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29905:35;;;;;;;;;;;;;;;;32981:153;;;;;;;;;;;;;:::i;29783:32::-;;;;;;;;;;-1:-1:-1;29783:32:0;;;;-1:-1:-1;;;;;29783:32:0;;;33379:381;;;;;;;;;;-1:-1:-1;33379:381:0;;;;;:::i;:::-;;:::i;30234:27::-;;;;;;;;;;;;;;;;9520:151;;;;;;;;;;-1:-1:-1;9520:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;9636:18:0;;;9609:7;9636:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9520:151;29947:33;;;;;;;;;;;;;;;;34159:217;;;;;;;;;;-1:-1:-1;34159:217:0;;;;;:::i;:::-;;:::i;33768:230::-;;;;;;;;;;-1:-1:-1;33768:230:0;;;;;:::i;:::-;;:::i;41729:448::-;;;;;;;;;;-1:-1:-1;41729:448:0;;;;;:::i;:::-;;:::i;30305:30::-;;;;;;;;;;;;;;;;22442:244;;;;;;;;;;-1:-1:-1;22442:244:0;;;;;:::i;:::-;;:::i;30446:31::-;;;;;;;;;;;;;;;;7645:100;7699:13;7732:5;7725:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7645:100;:::o;9819:169::-;9902:4;9919:39;331:10;9942:7;9951:6;9919:8;:39::i;:::-;-1:-1:-1;9976:4:0;9819:169;;;;;:::o;35802:101::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;;;;;;;;;35874:9:::1;:21:::0;;-1:-1:-1;;;;;;35874:21:0::1;-1:-1:-1::0;;;;;35874:21:0;;;::::1;::::0;;;::::1;::::0;;35802:101::o;34385:365::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;34497:15:::1;:31:::0;;;34539:15:::1;:31:::0;;;34581:9:::1;:19:::0;;;34593:7;34626:33:::1;34557:13:::0;34515;34626:33:::1;:::i;:::-;:45;;;;:::i;:::-;34611:12;:60:::0;;;34706:2:::1;-1:-1:-1::0;34690:18:0::1;34682:60;;;::::0;-1:-1:-1;;;34682:60:0;;5657:2:1;34682:60:0::1;::::0;::::1;5639:21:1::0;5696:2;5676:18;;;5669:30;5735:31;5715:18;;;5708:59;5784:18;;34682:60:0::1;5455:353:1::0;34682:60:0::1;34385:365:::0;;;:::o;10468:355::-;10608:4;10625:36;10635:6;10643:9;10654:6;10625:9;:36::i;:::-;10672:121;10681:6;331:10;10703:89;10741:6;10703:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10703:19:0;;;;;;:11;:19;;;;;;;;331:10;10703:33;;;;;;;;;;:37;:89::i;:::-;10672:8;:121::i;:::-;-1:-1:-1;10811:4:0;10468:355;;;;;:::o;11230:218::-;331:10;11318:4;11367:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11367:34:0;;;;;;;;;;11318:4;;11335:83;;11358:7;;11367:50;;11406:10;11367:38;:50::i;35655:138::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;35745:17:::1;:40:::0;;-1:-1:-1;;;;;;35745:40:0::1;-1:-1:-1::0;;;;;35745:40:0;;;::::1;::::0;;;::::1;::::0;;35655:138::o;35142:114::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35213:28:0::1;;::::0;;;:19:::1;:28;::::0;;;;:35;;-1:-1:-1;;35213:35:0::1;35244:4;35213:35;::::0;;35142:114::o;22138:148::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;22229:6:::1;::::0;22208:40:::1;::::0;22245:1:::1;::::0;-1:-1:-1;;;;;22229:6:0::1;::::0;22208:40:::1;::::0;22245:1;;22208:40:::1;22259:6;:19:::0;;-1:-1:-1;;;;;;22259:19:0::1;::::0;;22138:148::o;33187:120::-;21707:6;;33239:4;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;-1:-1:-1;33255:14:0::1;:22:::0;;-1:-1:-1;;33255:22:0::1;::::0;;;33187:120;:::o;34007:144::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34097:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;34097:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34007:144::o;34759:374::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;34872:16:::1;:32:::0;;;34915:16:::1;:32:::0;;;34958:10:::1;:20:::0;;;34971:7;35005:35:::1;34934:13:::0;34891;35005:35:::1;:::i;:::-;:48;;;;:::i;:::-;34989:13;:64:::0;;;35089:2:::1;-1:-1:-1::0;35072:19:0::1;35064:61;;;::::0;-1:-1:-1;;;35064:61:0;;5657:2:1;35064:61:0::1;::::0;::::1;5639:21:1::0;5696:2;5676:18;;;5669:30;5735:31;5715:18;;;5708:59;5784:18;;35064:61:0::1;5455:353:1::0;7865:104:0;7921:13;7954:7;7947:14;;;;;:::i;35265:242::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;35372:13:::1;-1:-1:-1::0;;;;;35364:21:0::1;:4;-1:-1:-1::0;;;;;35364:21:0::1;::::0;35356:91:::1;;;::::0;-1:-1:-1;;;35356:91:0;;6015:2:1;35356:91:0::1;::::0;::::1;5997:21:1::0;6054:2;6034:18;;;6027:30;6093:34;6073:18;;;6066:62;6164:27;6144:18;;;6137:55;6209:19;;35356:91:0::1;5813:421:1::0;35356:91:0::1;-1:-1:-1::0;;;;;35599:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;35599:39:0;;;;;;;35265:242;;:::o;11949:269::-;12042:4;12059:129;331:10;12082:7;12091:96;12130:15;12091:96;;;;;;;;;;;;;;;;;331:10;12091:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12091:34:0;;;;;;;;;;;;:38;:96::i;9281:175::-;9367:4;9384:42;331:10;9408:9;9419:6;9384:9;:42::i;32981:153::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;33034:13:::1;:20:::0;;-1:-1:-1;;33065:18:0;;;;;33111:15:::1;33094:14;:32:::0;32981:153::o;33379:381::-;21707:6;;33460:4;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;33516:6:::1;33496:13;8856:12:::0;;;8768:108;33496:13:::1;:17;::::0;33512:1:::1;33496:17;:::i;:::-;:26;;;;:::i;:::-;33483:9;:39;;33475:105;;;::::0;-1:-1:-1;;;33475:105:0;;6836:2:1;33475:105:0::1;::::0;::::1;6818:21:1::0;6875:2;6855:18;;;6848:30;6914:34;6894:18;;;6887:62;-1:-1:-1;;;6965:18:1;;;6958:51;7026:19;;33475:105:0::1;6634:417:1::0;33475:105:0::1;33631:4;33611:13;8856:12:::0;;;8768:108;33611:13:::1;:17;::::0;33627:1:::1;33611:17;:::i;:::-;:24;;;;:::i;:::-;33598:9;:37;;33590:102;;;::::0;-1:-1:-1;;;33590:102:0;;7258:2:1;33590:102:0::1;::::0;::::1;7240:21:1::0;7297:2;7277:18;;;7270:30;7336:34;7316:18;;;7309:62;-1:-1:-1;;;7387:18:1;;;7380:50;7447:19;;33590:102:0::1;7056:416:1::0;33590:102:0::1;-1:-1:-1::0;33702:18:0::1;:30:::0;;;33749:4:::1;21777:1;33379:381:::0;;;:::o;34159:217::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;34275:4:::1;34270:3;34250:13;8856:12:::0;;;8768:108;34250:13:::1;:17;::::0;34266:1:::1;34250:17;:::i;:::-;:23;;;;:::i;:::-;34249:30;;;;:::i;:::-;34239:6;:40;;34231:93;;;::::0;-1:-1:-1;;;34231:93:0;;7679:2:1;34231:93:0::1;::::0;::::1;7661:21:1::0;7718:2;7698:18;;;7691:30;7757:34;7737:18;;;7730:62;-1:-1:-1;;;7808:18:1;;;7801:38;7856:19;;34231:93:0::1;7477:404:1::0;34231:93:0::1;34351:17;:6:::0;34361::::1;34351:17;:::i;:::-;34335:13;:33:::0;-1:-1:-1;34159:217:0:o;33768:230::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;33883:4:::1;33877;33857:13;8856:12:::0;;;8768:108;33857:13:::1;:17;::::0;33873:1:::1;33857:17;:::i;:::-;:24;;;;:::i;:::-;33856:31;;;;:::i;:::-;33846:6;:41;;33838:101;;;::::0;-1:-1:-1;;;33838:101:0;;8088:2:1;33838:101:0::1;::::0;::::1;8070:21:1::0;8127:2;8107:18;;;8100:30;8166:34;8146:18;;;8139:62;-1:-1:-1;;;8217:18:1;;;8210:45;8272:19;;33838:101:0::1;7886:411:1::0;33838:101:0::1;33973:17;:6:::0;33983::::1;33973:17;:::i;:::-;33950:20;:40:::0;-1:-1:-1;33768:230:0:o;41729:448::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;41884:3:::1;41861:19;:26;;41853:90;;;::::0;-1:-1:-1;;;41853:90:0;;8504:2:1;41853:90:0::1;::::0;::::1;8486:21:1::0;8543:2;8523:18;;;8516:30;8582:34;8562:18;;;8555:62;-1:-1:-1;;;8633:18:1;;;8626:49;8692:19;;41853:90:0::1;8302:415:1::0;41853:90:0::1;41974:4;41962:8;:16;;:33;;;;-1:-1:-1::0;41982:13:0;41962:33:::1;41954:94;;;::::0;-1:-1:-1;;;41954:94:0;;8924:2:1;41954:94:0::1;::::0;::::1;8906:21:1::0;8963:2;8943:18;;;8936:30;9002:34;8982:18;;;8975:62;-1:-1:-1;;;9053:18:1;;;9046:46;9109:19;;41954:94:0::1;8722:412:1::0;41954:94:0::1;42059:15;:37:::0;;;;42107:16:::1;:27:::0;42145:13:::1;:24:::0;;-1:-1:-1;;42145:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41729:448::o;22442:244::-;21707:6;;-1:-1:-1;;;;;21707:6:0;331:10;21707:22;21699:67;;;;-1:-1:-1;;;21699:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22531:22:0;::::1;22523:73;;;::::0;-1:-1:-1;;;22523:73:0;;9341:2:1;22523:73:0::1;::::0;::::1;9323:21:1::0;9380:2;9360:18;;;9353:30;9419:34;9399:18;;;9392:62;-1:-1:-1;;;9470:18:1;;;9463:36;9516:19;;22523:73:0::1;9139:402:1::0;22523:73:0::1;22633:6;::::0;22612:38:::1;::::0;-1:-1:-1;;;;;22612:38:0;;::::1;::::0;22633:6:::1;::::0;22612:38:::1;::::0;22633:6:::1;::::0;22612:38:::1;22661:6;:17:::0;;-1:-1:-1;;;;;;22661:17:0::1;-1:-1:-1::0;;;;;22661:17:0;;;::::1;::::0;;;::::1;::::0;;22442:244::o;15145:381::-;-1:-1:-1;;;;;15281:19:0;;15273:68;;;;-1:-1:-1;;;15273:68:0;;9748:2:1;15273:68:0;;;9730:21:1;9787:2;9767:18;;;9760:30;9826:34;9806:18;;;9799:62;-1:-1:-1;;;9877:18:1;;;9870:34;9921:19;;15273:68:0;9546:400:1;15273:68:0;-1:-1:-1;;;;;15360:21:0;;15352:68;;;;-1:-1:-1;;;15352:68:0;;10153:2:1;15352:68:0;;;10135:21:1;10192:2;10172:18;;;10165:30;10231:34;10211:18;;;10204:62;-1:-1:-1;;;10282:18:1;;;10275:32;10324:19;;15352:68:0;9951:398:1;15352:68:0;-1:-1:-1;;;;;15434:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15486:32;;1848:25:1;;;15486:32:0;;1821:18:1;15486:32:0;;;;;;;;15145:381;;;:::o;35912:3417::-;36040:6;36050:1;36040:11;36037:92;;36068:28;36084:4;36090:2;36094:1;36068:15;:28::i;36037:92::-;36145:14;;;;36142:1143;;;-1:-1:-1;;;;;36198:25:0;;;;;;:19;:25;;;;;;;;36197:26;:71;;;;-1:-1:-1;;;;;;36245:23:0;;;;;;:19;:23;;;;;;;;36244:24;36197:71;:101;;;;-1:-1:-1;36290:8:0;;-1:-1:-1;;;36290:8:0;;;;36289:9;36197:101;36175:1099;;;36336:13;;;;;;;36332:109;;36381:13;;;;;;;36373:48;;;;-1:-1:-1;;;36373:48:0;;10556:2:1;36373:48:0;;;10538:21:1;10595:2;10575:18;;;10568:30;-1:-1:-1;;;10614:18:1;;;10607:52;10676:18;;36373:48:0;10354:346:1;36373:48:0;-1:-1:-1;;;;;36494:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;36530:35:0;;;;;;:31;:35;;;;;;;;36529:36;36494:71;36490:769;;;36612:20;;36602:6;:30;;36594:95;;;;-1:-1:-1;;;36594:95:0;;10907:2:1;36594:95:0;;;10889:21:1;10946:2;10926:18;;;10919:30;10985:34;10965:18;;;10958:62;-1:-1:-1;;;11036:18:1;;;11029:50;11096:19;;36594:95:0;10705:416:1;36594:95:0;36750:13;;-1:-1:-1;;;;;9041:18:0;;9014:7;9041:18;;;;;;;;;;;36724:22;;:6;:22;:::i;:::-;:39;;36716:71;;;;-1:-1:-1;;;36716:71:0;;11328:2:1;36716:71:0;;;11310:21:1;11367:2;11347:18;;;11340:30;-1:-1:-1;;;11386:18:1;;;11379:49;11445:18;;36716:71:0;11126:343:1;36716:71:0;36490:769;;;-1:-1:-1;;;;;36866:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;36900:37:0;;;;;;:31;:37;;;;;;;;36899:38;36866:71;36862:397;;;36984:20;;36974:6;:30;;36966:96;;;;-1:-1:-1;;;36966:96:0;;11676:2:1;36966:96:0;;;11658:21:1;11715:2;11695:18;;;11688:30;11754:34;11734:18;;;11727:62;-1:-1:-1;;;11805:18:1;;;11798:51;11866:19;;36966:96:0;11474:417:1;36862:397:0;-1:-1:-1;;;;;37109:35:0;;;;;;:31;:35;;;;;;;;37105:154;;37202:13;;-1:-1:-1;;;;;9041:18:0;;9014:7;9041:18;;;;;;;;;;;37176:22;;:6;:22;:::i;:::-;:39;;37168:71;;;;-1:-1:-1;;;37168:71:0;;11328:2:1;37168:71:0;;;11310:21:1;11367:2;11347:18;;;11340:30;-1:-1:-1;;;11386:18:1;;;11379:49;11445:18;;37168:71:0;11126:343:1;37168:71:0;37341:4;37292:28;9041:18;;;;;;;;;;;37400;;37376:42;;;;;;;37450:35;;-1:-1:-1;37474:11:0;;;;;;;37450:35;:61;;;;-1:-1:-1;37503:8:0;;-1:-1:-1;;;37503:8:0;;;;37502:9;37450:61;:110;;;;-1:-1:-1;;;;;;37529:31:0;;;;;;:25;:31;;;;;;;;37528:32;37450:110;:153;;;;-1:-1:-1;;;;;;37578:25:0;;;;;;:19;:25;;;;;;;;37577:26;37450:153;:194;;;;-1:-1:-1;;;;;;37621:23:0;;;;;;:19;:23;;;;;;;;37620:24;37450:194;37432:328;;;37671:8;:15;;-1:-1:-1;;;;37671:15:0;-1:-1:-1;;;37671:15:0;;;37704:10;:8;:10::i;:::-;37732:8;:16;;-1:-1:-1;;;;37732:16:0;;;37432:328;37776:13;;;;:26;;;;-1:-1:-1;37794:8:0;;-1:-1:-1;;;37794:8:0;;;;37793:9;37776:26;:59;;;;-1:-1:-1;;;;;;37806:29:0;;;;;;:25;:29;;;;;;;;37776:59;:115;;;;;37876:15;;37859:14;;:32;;;;:::i;:::-;37840:15;:51;;37776:115;:145;;;;-1:-1:-1;;;;;;37896:25:0;;;;;;:19;:25;;;;;;;;37895:26;37776:145;37773:205;;;37937:29;:27;:29::i;:::-;;37773:205;38007:8;;-1:-1:-1;;;;;38117:25:0;;37991:12;38117:25;;;:19;:25;;;;;;38007:8;-1:-1:-1;;;38007:8:0;;;;;38006:9;;38117:25;;:52;;-1:-1:-1;;;;;;38146:23:0;;;;;;:19;:23;;;;;;;;38117:52;38114:99;;;-1:-1:-1;38196:5:0;38114:99;38226:12;38330:7;38327:948;;;-1:-1:-1;;;;;38381:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;38430:1;38414:13;;:17;38381:50;38377:748;;;38458:34;38488:3;38458:25;38469:13;;38458:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;38451:41;;38559:13;;38540:16;;38533:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;38511:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;38627:13:0;;38614:10;;38607:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;38591:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;38707:13:0;;38688:16;;38681:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;38659:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;38377:748:0;;-1:-1:-1;38377:748:0;;-1:-1:-1;;;;;38781:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;38831:1;38816:12;;:16;38781:51;38778:347;;;38857:33;38886:3;38857:24;38868:12;;38857:6;:10;;:24;;;;:::i;:33::-;38850:40;;38953:12;;38935:15;;38928:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;38906:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;39019:12:0;;39007:9;;39000:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;38984:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;39097:12:0;;39079:15;;39072:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;39050:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;38778:347:0;39145:8;;39142:93;;39177:42;39193:4;39207;39214;39177:15;:42::i;:::-;39249:14;39259:4;39249:14;;:::i;:::-;;;38327:948;39288:33;39304:4;39310:2;39314:6;39288:15;:33::i;:::-;36025:3304;;;;35912:3417;;;:::o;17432:193::-;17518:7;17554:12;17546:6;;;;17538:29;;;;-1:-1:-1;;;17538:29:0;;;;;;;;:::i;:::-;-1:-1:-1;17578:9:0;17590:5;17594:1;17590;:5;:::i;:::-;17578:17;17432:193;-1:-1:-1;;;;;17432:193:0:o;16526:182::-;16584:7;;16616:5;16620:1;16616;:5;:::i;:::-;16604:17;;16645:1;16640;:6;;16632:46;;;;-1:-1:-1;;;16632:46:0;;12231:2:1;16632:46:0;;;12213:21:1;12270:2;12250:18;;;12243:30;12309:29;12289:18;;;12282:57;12356:18;;16632:46:0;12029:351:1;16632:46:0;16699:1;16526:182;-1:-1:-1;;;16526:182:0:o;12709:575::-;-1:-1:-1;;;;;12849:20:0;;12841:70;;;;-1:-1:-1;;;12841:70:0;;12587:2:1;12841:70:0;;;12569:21:1;12626:2;12606:18;;;12599:30;12665:34;12645:18;;;12638:62;-1:-1:-1;;;12716:18:1;;;12709:35;12761:19;;12841:70:0;12385:401:1;12841:70:0;-1:-1:-1;;;;;12930:23:0;;12922:71;;;;-1:-1:-1;;;12922:71:0;;12993:2:1;12922:71:0;;;12975:21:1;13032:2;13012:18;;;13005:30;13071:34;13051:18;;;13044:62;-1:-1:-1;;;13122:18:1;;;13115:33;13165:19;;12922:71:0;12791:399:1;12922:71:0;13088;13110:6;13088:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13088:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;13068:17:0;;;:9;:17;;;;;;;;;;;:91;;;;13193:20;;;;;;;:32;;13218:6;13193:24;:32::i;:::-;-1:-1:-1;;;;;13170:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;13241:35;1848:25:1;;;13170:20:0;;13241:35;;;;;;1821:18:1;13241:35:0;1702:177:1;40283:1437:0;40366:4;40322:23;9041:18;;;;;;;;;;;40322:50;;40383:25;40453:12;;40432:18;;40411;;:39;;;;:::i;:::-;:54;;;;:::i;:::-;40383:82;-1:-1:-1;40476:12:0;40505:20;;;:46;;-1:-1:-1;40529:22:0;;40505:46;40502:60;;;40554:7;;;40283:1437::o;40502:60::-;40596:18;;:22;;40617:1;40596:22;:::i;:::-;40578:15;:40;40575:109;;;40650:18;;:22;;40671:1;40650:22;:::i;:::-;40632:40;;40575:109;40697:23;40782:1;40762:17;40741:18;;40723:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;40697:86;-1:-1:-1;40794:26:0;40823:36;:15;40697:86;40823:19;:36::i;:::-;40794:65;-1:-1:-1;40901:21:0;40936:36;40794:65;40936:16;:36::i;:::-;40987:18;41008:44;:21;41034:17;41008:25;:44::i;:::-;40987:65;;41066:23;41092:57;41131:17;41092:34;41107:18;;41092:10;:14;;:34;;;;:::i;:57::-;41066:83;;41160:17;41180:51;41213:17;41180:28;41195:12;;41180:10;:14;;:28;;;;:::i;:51::-;41160:71;-1:-1:-1;41248:23:0;41160:71;41274:28;41287:15;41274:10;:28;:::i;:::-;:40;;;;:::i;:::-;41352:1;41331:18;:22;;;41364:18;:22;;;41397:12;:16;;;41448:9;;41440:45;;41248:66;;-1:-1:-1;;;;;;41448:9:0;;41471;;41440:45;41352:1;41440:45;41471:9;41448;41440:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41427:58:0;;-1:-1:-1;;41502:19:0;;;;;:42;;;41543:1;41525:15;:19;41502:42;41499:119;;;41560:46;41573:15;41590;41560:12;:46::i;:::-;41655:17;;41647:65;;-1:-1:-1;;;;;41655:17:0;;;;41686:21;;41647:65;;;;41686:21;41655:17;41647:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;40283:1437:0:o;42186:511::-;42279:15;42262:14;:32;42339:29;;-1:-1:-1;;;42339:29:0;;-1:-1:-1;;;;;42354:13:0;1658:32:1;42339:29:0;;;1640:51:1;42243:4:0;;;;42339;;:14;;1613:18:1;;42339:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42308:60;;42382:20;42405:53;42452:5;42405:42;42430:16;;42405:20;:24;;:42;;;;:::i;:53::-;42382:76;-1:-1:-1;42476:16:0;;42472:109;;42508:61;42524:13;42547:6;42556:12;42508:15;:61::i;:::-;42594:19;42631:13;42594:51;;42656:4;-1:-1:-1;;;;;42656:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42685:4;42678:11;;;;;42186:511;:::o;17885:473::-;17943:7;18188:1;18193;18188:6;18184:47;;-1:-1:-1;18218:1:0;18211:8;;18184:47;18244:9;18256:5;18260:1;18256;:5;:::i;:::-;18244:17;-1:-1:-1;18289:1:0;18280:5;18284:1;18244:17;18280:5;:::i;:::-;:10;18272:56;;;;-1:-1:-1;;;18272:56:0;;13796:2:1;18272:56:0;;;13778:21:1;13835:2;13815:18;;;13808:30;13874:34;13854:18;;;13847:62;-1:-1:-1;;;13925:18:1;;;13918:31;13966:19;;18272:56:0;13594:397:1;18835:132:0;18893:7;18920:39;18924:1;18927;18920:39;;;;;;;;;;;;;;;;;:3;:39::i;16992:136::-;17050:7;17077:43;17081:1;17084;17077:43;;;;;;;;;;;;;;;;;:3;:43::i;39338:511::-;39431:16;;;39445:1;39431:16;;;;;;;;39407:21;;39431:16;;;;;;;;;;-1:-1:-1;39431:16:0;39407:40;;39476:4;39458;39463:1;39458:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;39458:23:0;;;-1:-1:-1;;;;;39458:23:0;;;;;39502:15;-1:-1:-1;;;;;39502:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39492:4;39497:1;39492:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;39492:32:0;;;-1:-1:-1;;;;;39492:32:0;;;;;39538:62;39555:4;39570:15;39588:11;39538:8;:62::i;:::-;39614:224;;-1:-1:-1;;;39614:224:0;;-1:-1:-1;;;;;39614:15:0;:66;;;;:224;;39695:11;;39721:1;;39765:4;;39792;;39812:15;;39614:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39393:456;39338:511;:::o;39857:417::-;39938:62;39955:4;39970:15;39988:11;39938:8;:62::i;:::-;40014:15;-1:-1:-1;;;;;40014:31:0;;40053:9;40086:4;40106:11;40132:1;40175;40218:7;21559:6;;-1:-1:-1;;;;;21559:6:0;;21494:79;40218:7;40014:252;;;;;;-1:-1:-1;;;;;;40014:252:0;;;-1:-1:-1;;;;;15860:15:1;;;40014:252:0;;;15842:34:1;15892:18;;;15885:34;;;;15935:18;;;15928:34;;;;15978:18;;;15971:34;16042:15;;;16021:19;;;16014:44;40240:15:0;16074:19:1;;;16067:35;15776:19;;40014:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;39857:417;;:::o;19464:279::-;19550:7;19585:12;19578:5;19570:28;;;;-1:-1:-1;;;19570:28:0;;;;;;;;:::i;:::-;-1:-1:-1;19609:9:0;19621:5;19625:1;19621;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:315::-;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1884:316::-;1961:6;1969;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;-1:-1:-1;;2069:23:1;;;2139:2;2124:18;;2111:32;;-1:-1:-1;2190:2:1;2175:18;;;2162:32;;1884:316;-1:-1:-1;1884:316:1:o;2205:456::-;2282:6;2290;2298;2351:2;2339:9;2330:7;2326:23;2322:32;2319:52;;;2367:1;2364;2357:12;2319:52;2406:9;2393:23;2425:31;2450:5;2425:31;:::i;:::-;2475:5;-1:-1:-1;2532:2:1;2517:18;;2504:32;2545:33;2504:32;2545:33;:::i;:::-;2205:456;;2597:7;;-1:-1:-1;;;2651:2:1;2636:18;;;;2623:32;;2205:456::o;3063:160::-;3128:20;;3184:13;;3177:21;3167:32;;3157:60;;3213:1;3210;3203:12;3228:315;3293:6;3301;3354:2;3342:9;3333:7;3329:23;3325:32;3322:52;;;3370:1;3367;3360:12;3322:52;3409:9;3396:23;3428:31;3453:5;3428:31;:::i;:::-;3478:5;-1:-1:-1;3502:35:1;3533:2;3518:18;;3502:35;:::i;:::-;3492:45;;3228:315;;;;;:::o;3548:180::-;3607:6;3660:2;3648:9;3639:7;3635:23;3631:32;3628:52;;;3676:1;3673;3666:12;3628:52;-1:-1:-1;3699:23:1;;3548:180;-1:-1:-1;3548:180:1:o;3733:388::-;3801:6;3809;3862:2;3850:9;3841:7;3837:23;3833:32;3830:52;;;3878:1;3875;3868:12;3830:52;3917:9;3904:23;3936:31;3961:5;3936:31;:::i;:::-;3986:5;-1:-1:-1;4043:2:1;4028:18;;4015:32;4056:33;4015:32;4056:33;:::i;:::-;4108:7;4098:17;;;3733:388;;;;;:::o;4126:316::-;4200:6;4208;4216;4269:2;4257:9;4248:7;4244:23;4240:32;4237:52;;;4285:1;4282;4275:12;4237:52;4321:9;4308:23;4298:33;;4378:2;4367:9;4363:18;4350:32;4340:42;;4401:35;4432:2;4421:9;4417:18;4401:35;:::i;:::-;4391:45;;4126:316;;;;;:::o;4447:380::-;4526:1;4522:12;;;;4569;;;4590:61;;4644:4;4636:6;4632:17;4622:27;;4590:61;4697:2;4689:6;4686:14;4666:18;4663:38;4660:161;;4743:10;4738:3;4734:20;4731:1;4724:31;4778:4;4775:1;4768:15;4806:4;4803:1;4796:15;4660:161;;4447:380;;;:::o;4832:356::-;5034:2;5016:21;;;5053:18;;;5046:30;5112:34;5107:2;5092:18;;5085:62;5179:2;5164:18;;4832:356::o;5193:127::-;5254:10;5249:3;5245:20;5242:1;5235:31;5285:4;5282:1;5275:15;5309:4;5306:1;5299:15;5325:125;5390:9;;;5411:10;;;5408:36;;;5424:18;;:::i;6239:168::-;6312:9;;;6343;;6360:15;;;6354:22;;6340:37;6330:71;;6381:18;;:::i;6412:217::-;6452:1;6478;6468:132;;6522:10;6517:3;6513:20;6510:1;6503:31;6557:4;6554:1;6547:15;6585:4;6582:1;6575:15;6468:132;-1:-1:-1;6614:9:1;;6412:217::o;11896:128::-;11963:9;;;11984:11;;;11981:37;;;11998:18;;:::i;13405:184::-;13475:6;13528:2;13516:9;13507:7;13503:23;13499:32;13496:52;;;13544:1;13541;13534:12;13496:52;-1:-1:-1;13567:16:1;;13405:184;-1:-1:-1;13405:184:1:o;14128:127::-;14189:10;14184:3;14180:20;14177:1;14170:31;14220:4;14217:1;14210:15;14244:4;14241:1;14234:15;14260:251;14330:6;14383:2;14371:9;14362:7;14358:23;14354:32;14351:52;;;14399:1;14396;14389:12;14351:52;14431:9;14425:16;14450:31;14475:5;14450:31;:::i;14516:980::-;14778:4;14826:3;14815:9;14811:19;14857:6;14846:9;14839:25;14883:2;14921:6;14916:2;14905:9;14901:18;14894:34;14964:3;14959:2;14948:9;14944:18;14937:31;14988:6;15023;15017:13;15054:6;15046;15039:22;15092:3;15081:9;15077:19;15070:26;;15131:2;15123:6;15119:15;15105:29;;15152:1;15162:195;15176:6;15173:1;15170:13;15162:195;;;15241:13;;-1:-1:-1;;;;;15237:39:1;15225:52;;15332:15;;;;15297:12;;;;15273:1;15191:9;15162:195;;;-1:-1:-1;;;;;;;15413:32:1;;;;15408:2;15393:18;;15386:60;-1:-1:-1;;;15477:3:1;15462:19;15455:35;15374:3;14516:980;-1:-1:-1;;;14516:980:1:o;16113:306::-;16201:6;16209;16217;16270:2;16258:9;16249:7;16245:23;16241:32;16238:52;;;16286:1;16283;16276:12;16238:52;16315:9;16309:16;16299:26;;16365:2;16354:9;16350:18;16344:25;16334:35;;16409:2;16398:9;16394:18;16388:25;16378:35;;16113:306;;;;;:::o

Swarm Source

ipfs://44163a8425c19cdddb29fd1dc4dabecb4afbcfaab5b15a1f844ebfafbcf30503
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.