ETH Price: $3,332.80 (-0.32%)

Token

JarvisAI (JAI)
 

Overview

Max Total Supply

1,000,000 JAI

Holders

400

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,530.885853771850138003 JAI

Value
$0.00
0x9e1f00b7a502371fc37788775930ac815c6ac535
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:
JarvisAI

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
       __                 _      ___    ____
      / /___ _______   __(_)____/   |  /  _/
 __  / / __ `/ ___/ | / / / ___/ /| |  / /
/ /_/ / /_/ / /   | |/ / (__  ) ___ |_/ /
\____/\__,_/_/    |___/_/____/_/  |_/___/

JarvisAI - Innovative app that uses AI and Machine Learning to analyze tokens and provide valuable insights.

Chat - https://t.me/Jarvis_ERC20
Twitter - https://twitter.com/jarvisai_erc20
Website - https://jarvisai.pro/

Unlock the JarvisAI power.
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

pragma solidity ^0.8.0;

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);
}

pragma solidity ^0.8.0;

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);
}

pragma solidity ^0.8.0;

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @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 updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
    unchecked {
        _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

    /**
     * @dev 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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
    unchecked {
        _balances[account] = accountBalance - amount;
    }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

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

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

pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
    unchecked {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    }

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.10;
pragma experimental ABIEncoderV2;

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

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

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

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

contract JarvisAI is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;

    address public immutable uniswapV2Pair;
    address public devWallet;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    uint256 public swapTokensAtAmount;
    uint256 public buyDevFee;
    uint256 public buyLiquidityFee;
    uint256 public buyTotalFees;
    uint256 public sellDevFee;
    uint256 public sellLiquidityFee;
    uint256 public sellTotalFees;
    uint256 public maxWallet;

    bool public swapBackEnabled = true;
    bool public limitsInEffect = true;
    bool public tradingActive;
    bool private swapping;

    constructor() ERC20("JarvisAI", "JAI") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());

        uint256 totalSupply = 1000000e18;
        maxWallet = totalSupply * 2 / 100;
        swapTokensAtAmount = (totalSupply * 3) / 10000;
        buyDevFee = 0;
        buyLiquidityFee = 1;
        buyTotalFees = buyDevFee + buyLiquidityFee;
        sellDevFee = 0;
        sellLiquidityFee = 1;
        sellTotalFees = sellDevFee + sellLiquidityFee;
        devWallet = owner();

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(address(0x0000), true);

        excludeFromMaxWallet(owner(), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(0xdead), true);
        excludeFromMaxWallet(address(0x0000), true);

        _mint(msg.sender, totalSupply);
    }

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

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool isBuy = from == uniswapV2Pair;
        bool isSell = to == uniswapV2Pair;

        if (!tradingActive && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) require(false, "Trading has not started yet");

        if (limitsInEffect && !_isExcludedFromMaxWallet[to] && !swapping) {
            if (isBuy) {
                require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded (buy)");
            }
            if (!isBuy && !isSell) {
                require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded (transfer)");
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        if (canSwap && swapBackEnabled && !swapping && to == uniswapV2Pair && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        bool takeFee = !swapping;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        uint256 tokensForLiquidity = 0;

        if (takeFee) {
            if (to == uniswapV2Pair && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity = (fees * sellLiquidityFee) / sellTotalFees;
            }
            else if (from == uniswapV2Pair && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity = (fees * buyLiquidityFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
            if (tokensForLiquidity > 0) {
                super._transfer(address(this), uniswapV2Pair, tokensForLiquidity);
            }

            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,
            path,
            devWallet,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        if (contractBalance == 0) {
            return;
        }
        swapTokensForETH(contractBalance);
    }

    receive() external payable {}

    function updateDevWallet(address newWallet) external onlyOwner {
        devWallet = newWallet;
    }

    function updateSwapBackEnabled(bool enabled) external onlyOwner {
        swapBackEnabled = enabled;
    }

    function updateBuyFee(uint256 _devFee, uint256 _liquidityFee) external onlyOwner {
        buyDevFee = _devFee;
        buyLiquidityFee = _liquidityFee;
        buyTotalFees = buyDevFee + buyLiquidityFee;
        require(buyTotalFees <= 20, "buy tax > 20%");
    }

    function updateSellFees(uint256 _devFee, uint256 _liquidityFee) external onlyOwner {
        sellDevFee = _devFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellDevFee + sellLiquidityFee;
        require(sellTotalFees <= 20, "sell tax > 20%");
    }

    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) {
        require(newAmount >= (totalSupply() * 1) / 100000, "< 0.001% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxWallet(uint256 newAmount) external onlyOwner {
        require(newAmount >= (totalSupply() * 5 / 1000) / 1e18, "Cannot set maxWallet lower than 0.5%");
        maxWallet = newAmount * 1e18;
    }

    function enableTrading() public onlyOwner {
        tradingActive = true;
    }

    function enableLimits(bool _limitsInEffect) public onlyOwner {
        limitsInEffect = _limitsInEffect;
    }

    function rescue(address token) public onlyOwner {
        ERC20 Token = ERC20(token);
        uint256 balance = Token.balanceOf(address(this));
        if (balance > 0) Token.transfer(_msgSender(), balance);
    }

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

    function excludeFromMaxWallet(address account, bool excluded) public onlyOwner {
        _isExcludedFromMaxWallet[account] = excluded;
    }

    function isExcludedFromMaxWallet(address account) public view returns (bool) {
        return _isExcludedFromMaxWallet[account];
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"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":"bool","name":"_limitsInEffect","type":"bool"}],"name":"enableLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","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":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapBackEnabled","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapBackEnabled","outputs":[],"stateMutability":"nonpayable","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"}]

60c06040526001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600881526020017f4a617276697341490000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4a414900000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000cc9291906200090a565b508060049080519060200190620000e59291906200090a565b50505062000108620000fc620004bb60201b60201c565b620004c360201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001c7919062000a24565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000231573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000257919062000a24565b6040518363ffffffff1660e01b81526004016200027692919062000a67565b6020604051808303816000875af115801562000296573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bc919062000a24565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600069d3c21bcecceda1000000905060646002826200030f919062000acd565b6200031b919062000b5d565b60108190555061271060038262000333919062000acd565b6200033f919062000b5d565b6009819055506000600a819055506001600b81905550600b54600a5462000367919062000b95565b600c819055506000600d819055506001600e81905550600e54600d546200038f919062000b95565b600f81905550620003a56200058960201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000407620003f96200058960201b60201c565b6001620005b360201b60201c565b6200041a306001620005b360201b60201c565b6200042f61dead6001620005b360201b60201c565b6200044360006001620005b360201b60201c565b62000465620004576200058960201b60201c565b60016200069d60201b60201c565b620004783060016200069d60201b60201c565b6200048d61dead60016200069d60201b60201c565b620004a1600060016200069d60201b60201c565b620004b333826200078760201b60201c565b505062000d7a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620005c3620004bb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005e96200058960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006399062000c53565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b620006ad620004bb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006d36200058960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200072c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007239062000c53565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007f19062000cc5565b60405180910390fd5b6200080e600083836200090060201b60201c565b806002600082825462000822919062000b95565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000879919062000b95565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620008e0919062000cf8565b60405180910390a3620008fc600083836200090560201b60201c565b5050565b505050565b505050565b828054620009189062000d44565b90600052602060002090601f0160209004810192826200093c576000855562000988565b82601f106200095757805160ff191683800117855562000988565b8280016001018555821562000988579182015b82811115620009875782518255916020019190600101906200096a565b5b5090506200099791906200099b565b5090565b5b80821115620009b65760008160009055506001016200099c565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009ec82620009bf565b9050919050565b620009fe81620009df565b811462000a0a57600080fd5b50565b60008151905062000a1e81620009f3565b92915050565b60006020828403121562000a3d5762000a3c620009ba565b5b600062000a4d8482850162000a0d565b91505092915050565b62000a6181620009df565b82525050565b600060408201905062000a7e600083018562000a56565b62000a8d602083018462000a56565b9392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ada8262000a94565b915062000ae78362000a94565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000b235762000b2262000a9e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000b6a8262000a94565b915062000b778362000a94565b92508262000b8a5762000b8962000b2e565b5b828204905092915050565b600062000ba28262000a94565b915062000baf8362000a94565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000be75762000be662000a9e565b5b828201905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c3b60208362000bf2565b915062000c488262000c03565b602082019050919050565b6000602082019050818103600083015262000c6e8162000c2c565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000cad601f8362000bf2565b915062000cba8262000c75565b602082019050919050565b6000602082019050818103600083015262000ce08162000c9e565b9050919050565b62000cf28162000a94565b82525050565b600060208201905062000d0f600083018462000ce7565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d5d57607f821691505b6020821081141562000d745762000d7362000d15565b5b50919050565b60805160a051613c9362000ddf60003960008181610ef701528181611e2201528181611e7501528181612168015281816123710152818161241f01526124ec015260008181610b4d0152818161297e01528181612a5f0152612a860152613c936000f3fe60806040526004361061024a5760003560e01c80638a8c523c11610139578063c0246668116100b6578063e2f456051161007a578063e2f45605146108b3578063f11a24d3146108de578063f2fde38b14610909578063f637434214610932578063f8b45b051461095d578063f931d9d21461098857610251565b8063c0246668146107bc578063d257b34f146107e5578063d2fcc00114610822578063d85ba0631461084b578063dd62ed3e1461087657610251565b8063a0d82dc5116100fd578063a0d82dc5146106c3578063a457c2d7146106ee578063a5cdee051461072b578063a9059cbb14610754578063bbc0c7421461079157610251565b80638a8c523c146106005780638da5cb5b146106175780638ea5220f1461064257806395d89b411461066d5780639c3b4fdc1461069857610251565b806349bd5a5e116101c75780636a486a8e1161018b5780636a486a8e1461051b5780636dd3d39f1461054657806370a0823114610583578063715018a6146105c0578063839006f2146105d757610251565b806349bd5a5e146104345780634a62bb651461045f5780634fbee1931461048a578063610e34b9146104c757806364c0a2f8146104f057610251565b80631816467f1161020e5780631816467f1461033d5780631c499ab01461036657806323b872dd1461038f578063313ce567146103cc57806339509351146103f757610251565b806302dbd8f81461025657806306fdde031461027f578063095ea7b3146102aa5780631694505e146102e757806318160ddd1461031257610251565b3661025157005b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612b79565b6109b1565b005b34801561028b57600080fd5b50610294610a9b565b6040516102a19190612c52565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190612cd2565b610b2d565b6040516102de9190612d2d565b60405180910390f35b3480156102f357600080fd5b506102fc610b4b565b6040516103099190612da7565b60405180910390f35b34801561031e57600080fd5b50610327610b6f565b6040516103349190612dd1565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190612dec565b610b79565b005b34801561037257600080fd5b5061038d60048036038101906103889190612e19565b610c39565b005b34801561039b57600080fd5b506103b660048036038101906103b19190612e46565b610d48565b6040516103c39190612d2d565b60405180910390f35b3480156103d857600080fd5b506103e1610e40565b6040516103ee9190612eb5565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190612cd2565b610e49565b60405161042b9190612d2d565b60405180910390f35b34801561044057600080fd5b50610449610ef5565b6040516104569190612edf565b60405180910390f35b34801561046b57600080fd5b50610474610f19565b6040516104819190612d2d565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190612dec565b610f2c565b6040516104be9190612d2d565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e99190612b79565b610f82565b005b3480156104fc57600080fd5b5061050561106c565b6040516105129190612d2d565b60405180910390f35b34801561052757600080fd5b5061053061107f565b60405161053d9190612dd1565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190612dec565b611085565b60405161057a9190612d2d565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190612dec565b6110db565b6040516105b79190612dd1565b60405180910390f35b3480156105cc57600080fd5b506105d5611123565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190612dec565b6111ab565b005b34801561060c57600080fd5b5061061561133f565b005b34801561062357600080fd5b5061062c6113d8565b6040516106399190612edf565b60405180910390f35b34801561064e57600080fd5b50610657611402565b6040516106649190612edf565b60405180910390f35b34801561067957600080fd5b50610682611428565b60405161068f9190612c52565b60405180910390f35b3480156106a457600080fd5b506106ad6114ba565b6040516106ba9190612dd1565b60405180910390f35b3480156106cf57600080fd5b506106d86114c0565b6040516106e59190612dd1565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612cd2565b6114c6565b6040516107229190612d2d565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612f26565b6115b1565b005b34801561076057600080fd5b5061077b60048036038101906107769190612cd2565b61164a565b6040516107889190612d2d565b60405180910390f35b34801561079d57600080fd5b506107a6611668565b6040516107b39190612d2d565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de9190612f53565b61167b565b005b3480156107f157600080fd5b5061080c60048036038101906108079190612e19565b611752565b6040516108199190612d2d565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190612f53565b611844565b005b34801561085757600080fd5b5061086061191b565b60405161086d9190612dd1565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190612f93565b611921565b6040516108aa9190612dd1565b60405180910390f35b3480156108bf57600080fd5b506108c86119a8565b6040516108d59190612dd1565b60405180910390f35b3480156108ea57600080fd5b506108f36119ae565b6040516109009190612dd1565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190612dec565b6119b4565b005b34801561093e57600080fd5b50610947611aac565b6040516109549190612dd1565b60405180910390f35b34801561096957600080fd5b50610972611ab2565b60405161097f9190612dd1565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190612f26565b611ab8565b005b6109b9611b51565b73ffffffffffffffffffffffffffffffffffffffff166109d76113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a249061301f565b60405180910390fd5b81600d8190555080600e81905550600e54600d54610a4b919061306e565b600f819055506014600f541115610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90613110565b60405180910390fd5b5050565b606060038054610aaa9061315f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad69061315f565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b6000610b41610b3a611b51565b8484611b59565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b610b81611b51565b73ffffffffffffffffffffffffffffffffffffffff16610b9f6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec9061301f565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610c41611b51565b73ffffffffffffffffffffffffffffffffffffffff16610c5f6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac9061301f565b60405180910390fd5b670de0b6b3a76400006103e86005610ccb610b6f565b610cd59190613191565b610cdf919061321a565b610ce9919061321a565b811015610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d22906132bd565b60405180910390fd5b670de0b6b3a764000081610d3f9190613191565b60108190555050565b6000610d55848484611d24565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610da0611b51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e179061334f565b60405180910390fd5b610e3485610e2c611b51565b858403611b59565b60019150509392505050565b60006012905090565b6000610eeb610e56611b51565b848460016000610e64611b51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ee6919061306e565b611b59565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601160019054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f8a611b51565b73ffffffffffffffffffffffffffffffffffffffff16610fa86113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff59061301f565b60405180910390fd5b81600a8190555080600b81905550600b54600a5461101c919061306e565b600c819055506014600c541115611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f906133bb565b60405180910390fd5b5050565b601160009054906101000a900460ff1681565b600f5481565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61112b611b51565b73ffffffffffffffffffffffffffffffffffffffff166111496113d8565b73ffffffffffffffffffffffffffffffffffffffff161461119f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111969061301f565b60405180910390fd5b6111a96000612539565b565b6111b3611b51565b73ffffffffffffffffffffffffffffffffffffffff166111d16113d8565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9061301f565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112679190612edf565b602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906133f0565b9050600081111561133a578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112d7611b51565b836040518363ffffffff1660e01b81526004016112f592919061341d565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611338919061345b565b505b505050565b611347611b51565b73ffffffffffffffffffffffffffffffffffffffff166113656113d8565b73ffffffffffffffffffffffffffffffffffffffff16146113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b29061301f565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546114379061315f565b80601f01602080910402602001604051908101604052809291908181526020018280546114639061315f565b80156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b5050505050905090565b600a5481565b600d5481565b600080600160006114d5611b51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906134fa565b60405180910390fd5b6115a661159d611b51565b85858403611b59565b600191505092915050565b6115b9611b51565b73ffffffffffffffffffffffffffffffffffffffff166115d76113d8565b73ffffffffffffffffffffffffffffffffffffffff161461162d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116249061301f565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b600061165e611657611b51565b8484611d24565b6001905092915050565b601160029054906101000a900460ff1681565b611683611b51565b73ffffffffffffffffffffffffffffffffffffffff166116a16113d8565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee9061301f565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061175c611b51565b73ffffffffffffffffffffffffffffffffffffffff1661177a6113d8565b73ffffffffffffffffffffffffffffffffffffffff16146117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c79061301f565b60405180910390fd5b620186a060016117de610b6f565b6117e89190613191565b6117f2919061321a565b821015611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613566565b60405180910390fd5b8160098190555060019050919050565b61184c611b51565b73ffffffffffffffffffffffffffffffffffffffff1661186a6113d8565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b79061301f565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600b5481565b6119bc611b51565b73ffffffffffffffffffffffffffffffffffffffff166119da6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a279061301f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a97906135f8565b60405180910390fd5b611aa981612539565b50565b600e5481565b60105481565b611ac0611b51565b73ffffffffffffffffffffffffffffffffffffffff16611ade6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b9061301f565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09061368a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c309061371c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d179190612dd1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b906137ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90613840565b60405180910390fd5b6000811415611e1e57611e19838360006125ff565b612534565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16149050601160029054906101000a900460ff16158015611f2b5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611f815750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611fc8576000611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe906138ac565b60405180910390fd5b5b601160019054906101000a900460ff16801561202e5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120475750601160039054906101000a900460ff16155b156121165781156120ab5760105461205e856110db565b84612069919061306e565b11156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613918565b60405180910390fd5b5b811580156120b7575080155b15612115576010546120c8856110db565b846120d3919061306e565b1115612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b90613984565b60405180910390fd5b5b5b6000612121306110db565b9050600060095482101590508080156121465750601160009054906101000a900460ff165b801561215f5750601160039054906101000a900460ff16155b80156121b657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b801561220c5750600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122625750600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156122a6576001601160036101000a81548160ff02191690831515021790555061228a612880565b6000601160036101000a81548160ff0219169083151502179055505b6000601160039054906101000a900460ff16159050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061235c5750600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561236657600090505b6000808215612521577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480156123cc57506000600f54115b1561241d576123f960646123eb600f548b6128a990919063ffffffff16565b6128bf90919063ffffffff16565b9150600f54600e548361240c9190613191565b612416919061321a565b90506124c8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614801561247a57506000600c54115b156124c7576124a76064612499600c548b6128a990919063ffffffff16565b6128bf90919063ffffffff16565b9150600c54600b54836124ba9190613191565b6124c4919061321a565b90505b5b60008211156124dd576124dc8a30846125ff565b5b600081111561251257612511307f0000000000000000000000000000000000000000000000000000000000000000836125ff565b5b818861251e91906139a4565b97505b61252c8a8a8a6125ff565b505050505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561266f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612666906137ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d690613840565b60405180910390fd5b6126ea8383836128d5565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790613a4a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612803919061306e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128679190612dd1565b60405180910390a361287a8484846128da565b50505050565b600061288b306110db565b9050600081141561289c57506128a7565b6128a5816128df565b505b565b600081836128b79190613191565b905092915050565b600081836128cd919061321a565b905092915050565b505050565b505050565b6000600267ffffffffffffffff8111156128fc576128fb613a6a565b5b60405190808252806020026020018201604052801561292a5781602001602082028036833780820191505090505b509050308160008151811061294257612941613a99565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0b9190613add565b81600181518110612a1f57612a1e613a99565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a84307f000000000000000000000000000000000000000000000000000000000000000084611b59565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612b08959493929190613c03565b600060405180830381600087803b158015612b2257600080fd5b505af1158015612b36573d6000803e3d6000fd5b505050505050565b600080fd5b6000819050919050565b612b5681612b43565b8114612b6157600080fd5b50565b600081359050612b7381612b4d565b92915050565b60008060408385031215612b9057612b8f612b3e565b5b6000612b9e85828601612b64565b9250506020612baf85828601612b64565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bf3578082015181840152602081019050612bd8565b83811115612c02576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c2482612bb9565b612c2e8185612bc4565b9350612c3e818560208601612bd5565b612c4781612c08565b840191505092915050565b60006020820190508181036000830152612c6c8184612c19565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9f82612c74565b9050919050565b612caf81612c94565b8114612cba57600080fd5b50565b600081359050612ccc81612ca6565b92915050565b60008060408385031215612ce957612ce8612b3e565b5b6000612cf785828601612cbd565b9250506020612d0885828601612b64565b9150509250929050565b60008115159050919050565b612d2781612d12565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b6000819050919050565b6000612d6d612d68612d6384612c74565b612d48565b612c74565b9050919050565b6000612d7f82612d52565b9050919050565b6000612d9182612d74565b9050919050565b612da181612d86565b82525050565b6000602082019050612dbc6000830184612d98565b92915050565b612dcb81612b43565b82525050565b6000602082019050612de66000830184612dc2565b92915050565b600060208284031215612e0257612e01612b3e565b5b6000612e1084828501612cbd565b91505092915050565b600060208284031215612e2f57612e2e612b3e565b5b6000612e3d84828501612b64565b91505092915050565b600080600060608486031215612e5f57612e5e612b3e565b5b6000612e6d86828701612cbd565b9350506020612e7e86828701612cbd565b9250506040612e8f86828701612b64565b9150509250925092565b600060ff82169050919050565b612eaf81612e99565b82525050565b6000602082019050612eca6000830184612ea6565b92915050565b612ed981612c94565b82525050565b6000602082019050612ef46000830184612ed0565b92915050565b612f0381612d12565b8114612f0e57600080fd5b50565b600081359050612f2081612efa565b92915050565b600060208284031215612f3c57612f3b612b3e565b5b6000612f4a84828501612f11565b91505092915050565b60008060408385031215612f6a57612f69612b3e565b5b6000612f7885828601612cbd565b9250506020612f8985828601612f11565b9150509250929050565b60008060408385031215612faa57612fa9612b3e565b5b6000612fb885828601612cbd565b9250506020612fc985828601612cbd565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613009602083612bc4565b915061301482612fd3565b602082019050919050565b6000602082019050818103600083015261303881612ffc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061307982612b43565b915061308483612b43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130b9576130b861303f565b5b828201905092915050565b7f73656c6c20746178203e20323025000000000000000000000000000000000000600082015250565b60006130fa600e83612bc4565b9150613105826130c4565b602082019050919050565b60006020820190508181036000830152613129816130ed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061317757607f821691505b6020821081141561318b5761318a613130565b5b50919050565b600061319c82612b43565b91506131a783612b43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131e0576131df61303f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061322582612b43565b915061323083612b43565b9250826132405761323f6131eb565b5b828204905092915050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b60006132a7602483612bc4565b91506132b28261324b565b604082019050919050565b600060208201905081810360008301526132d68161329a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613339602883612bc4565b9150613344826132dd565b604082019050919050565b600060208201905081810360008301526133688161332c565b9050919050565b7f62757920746178203e2032302500000000000000000000000000000000000000600082015250565b60006133a5600d83612bc4565b91506133b08261336f565b602082019050919050565b600060208201905081810360008301526133d481613398565b9050919050565b6000815190506133ea81612b4d565b92915050565b60006020828403121561340657613405612b3e565b5b6000613414848285016133db565b91505092915050565b60006040820190506134326000830185612ed0565b61343f6020830184612dc2565b9392505050565b60008151905061345581612efa565b92915050565b60006020828403121561347157613470612b3e565b5b600061347f84828501613446565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006134e4602583612bc4565b91506134ef82613488565b604082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f3c20302e3030312520746f74616c20737570706c792e00000000000000000000600082015250565b6000613550601683612bc4565b915061355b8261351a565b602082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135e2602683612bc4565b91506135ed82613586565b604082019050919050565b60006020820190508181036000830152613611816135d5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613674602483612bc4565b915061367f82613618565b604082019050919050565b600060208201905081810360008301526136a381613667565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613706602283612bc4565b9150613711826136aa565b604082019050919050565b60006020820190508181036000830152613735816136f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613798602583612bc4565b91506137a38261373c565b604082019050919050565b600060208201905081810360008301526137c78161378b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061382a602383612bc4565b9150613835826137ce565b604082019050919050565b600060208201905081810360008301526138598161381d565b9050919050565b7f54726164696e6720686173206e6f742073746172746564207965740000000000600082015250565b6000613896601b83612bc4565b91506138a182613860565b602082019050919050565b600060208201905081810360008301526138c581613889565b9050919050565b7f4d61782077616c6c657420657863656564656420286275792900000000000000600082015250565b6000613902601983612bc4565b915061390d826138cc565b602082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f4d61782077616c6c657420657863656564656420287472616e73666572290000600082015250565b600061396e601e83612bc4565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b60006139af82612b43565b91506139ba83612b43565b9250828210156139cd576139cc61303f565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613a34602683612bc4565b9150613a3f826139d8565b604082019050919050565b60006020820190508181036000830152613a6381613a27565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613ad781612ca6565b92915050565b600060208284031215613af357613af2612b3e565b5b6000613b0184828501613ac8565b91505092915050565b6000819050919050565b6000613b2f613b2a613b2584613b0a565b612d48565b612b43565b9050919050565b613b3f81613b14565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b7a81612c94565b82525050565b6000613b8c8383613b71565b60208301905092915050565b6000602082019050919050565b6000613bb082613b45565b613bba8185613b50565b9350613bc583613b61565b8060005b83811015613bf6578151613bdd8882613b80565b9750613be883613b98565b925050600181019050613bc9565b5085935050505092915050565b600060a082019050613c186000830188612dc2565b613c256020830187613b36565b8181036040830152613c378186613ba5565b9050613c466060830185612ed0565b613c536080830184612dc2565b969550505050505056fea2646970667358221220b3e3a60efa79d0d1dea3beb9acb0426a766c358a4c367704ff3da8738353021a64736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061024a5760003560e01c80638a8c523c11610139578063c0246668116100b6578063e2f456051161007a578063e2f45605146108b3578063f11a24d3146108de578063f2fde38b14610909578063f637434214610932578063f8b45b051461095d578063f931d9d21461098857610251565b8063c0246668146107bc578063d257b34f146107e5578063d2fcc00114610822578063d85ba0631461084b578063dd62ed3e1461087657610251565b8063a0d82dc5116100fd578063a0d82dc5146106c3578063a457c2d7146106ee578063a5cdee051461072b578063a9059cbb14610754578063bbc0c7421461079157610251565b80638a8c523c146106005780638da5cb5b146106175780638ea5220f1461064257806395d89b411461066d5780639c3b4fdc1461069857610251565b806349bd5a5e116101c75780636a486a8e1161018b5780636a486a8e1461051b5780636dd3d39f1461054657806370a0823114610583578063715018a6146105c0578063839006f2146105d757610251565b806349bd5a5e146104345780634a62bb651461045f5780634fbee1931461048a578063610e34b9146104c757806364c0a2f8146104f057610251565b80631816467f1161020e5780631816467f1461033d5780631c499ab01461036657806323b872dd1461038f578063313ce567146103cc57806339509351146103f757610251565b806302dbd8f81461025657806306fdde031461027f578063095ea7b3146102aa5780631694505e146102e757806318160ddd1461031257610251565b3661025157005b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612b79565b6109b1565b005b34801561028b57600080fd5b50610294610a9b565b6040516102a19190612c52565b60405180910390f35b3480156102b657600080fd5b506102d160048036038101906102cc9190612cd2565b610b2d565b6040516102de9190612d2d565b60405180910390f35b3480156102f357600080fd5b506102fc610b4b565b6040516103099190612da7565b60405180910390f35b34801561031e57600080fd5b50610327610b6f565b6040516103349190612dd1565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f9190612dec565b610b79565b005b34801561037257600080fd5b5061038d60048036038101906103889190612e19565b610c39565b005b34801561039b57600080fd5b506103b660048036038101906103b19190612e46565b610d48565b6040516103c39190612d2d565b60405180910390f35b3480156103d857600080fd5b506103e1610e40565b6040516103ee9190612eb5565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190612cd2565b610e49565b60405161042b9190612d2d565b60405180910390f35b34801561044057600080fd5b50610449610ef5565b6040516104569190612edf565b60405180910390f35b34801561046b57600080fd5b50610474610f19565b6040516104819190612d2d565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac9190612dec565b610f2c565b6040516104be9190612d2d565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e99190612b79565b610f82565b005b3480156104fc57600080fd5b5061050561106c565b6040516105129190612d2d565b60405180910390f35b34801561052757600080fd5b5061053061107f565b60405161053d9190612dd1565b60405180910390f35b34801561055257600080fd5b5061056d60048036038101906105689190612dec565b611085565b60405161057a9190612d2d565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a59190612dec565b6110db565b6040516105b79190612dd1565b60405180910390f35b3480156105cc57600080fd5b506105d5611123565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190612dec565b6111ab565b005b34801561060c57600080fd5b5061061561133f565b005b34801561062357600080fd5b5061062c6113d8565b6040516106399190612edf565b60405180910390f35b34801561064e57600080fd5b50610657611402565b6040516106649190612edf565b60405180910390f35b34801561067957600080fd5b50610682611428565b60405161068f9190612c52565b60405180910390f35b3480156106a457600080fd5b506106ad6114ba565b6040516106ba9190612dd1565b60405180910390f35b3480156106cf57600080fd5b506106d86114c0565b6040516106e59190612dd1565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612cd2565b6114c6565b6040516107229190612d2d565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190612f26565b6115b1565b005b34801561076057600080fd5b5061077b60048036038101906107769190612cd2565b61164a565b6040516107889190612d2d565b60405180910390f35b34801561079d57600080fd5b506107a6611668565b6040516107b39190612d2d565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de9190612f53565b61167b565b005b3480156107f157600080fd5b5061080c60048036038101906108079190612e19565b611752565b6040516108199190612d2d565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190612f53565b611844565b005b34801561085757600080fd5b5061086061191b565b60405161086d9190612dd1565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190612f93565b611921565b6040516108aa9190612dd1565b60405180910390f35b3480156108bf57600080fd5b506108c86119a8565b6040516108d59190612dd1565b60405180910390f35b3480156108ea57600080fd5b506108f36119ae565b6040516109009190612dd1565b60405180910390f35b34801561091557600080fd5b50610930600480360381019061092b9190612dec565b6119b4565b005b34801561093e57600080fd5b50610947611aac565b6040516109549190612dd1565b60405180910390f35b34801561096957600080fd5b50610972611ab2565b60405161097f9190612dd1565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190612f26565b611ab8565b005b6109b9611b51565b73ffffffffffffffffffffffffffffffffffffffff166109d76113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a249061301f565b60405180910390fd5b81600d8190555080600e81905550600e54600d54610a4b919061306e565b600f819055506014600f541115610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e90613110565b60405180910390fd5b5050565b606060038054610aaa9061315f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad69061315f565b8015610b235780601f10610af857610100808354040283529160200191610b23565b820191906000526020600020905b815481529060010190602001808311610b0657829003601f168201915b5050505050905090565b6000610b41610b3a611b51565b8484611b59565b6001905092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b610b81611b51565b73ffffffffffffffffffffffffffffffffffffffff16610b9f6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec9061301f565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610c41611b51565b73ffffffffffffffffffffffffffffffffffffffff16610c5f6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac9061301f565b60405180910390fd5b670de0b6b3a76400006103e86005610ccb610b6f565b610cd59190613191565b610cdf919061321a565b610ce9919061321a565b811015610d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d22906132bd565b60405180910390fd5b670de0b6b3a764000081610d3f9190613191565b60108190555050565b6000610d55848484611d24565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610da0611b51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e179061334f565b60405180910390fd5b610e3485610e2c611b51565b858403611b59565b60019150509392505050565b60006012905090565b6000610eeb610e56611b51565b848460016000610e64611b51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ee6919061306e565b611b59565b6001905092915050565b7f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d81565b601160019054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f8a611b51565b73ffffffffffffffffffffffffffffffffffffffff16610fa86113d8565b73ffffffffffffffffffffffffffffffffffffffff1614610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff59061301f565b60405180910390fd5b81600a8190555080600b81905550600b54600a5461101c919061306e565b600c819055506014600c541115611068576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105f906133bb565b60405180910390fd5b5050565b601160009054906101000a900460ff1681565b600f5481565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61112b611b51565b73ffffffffffffffffffffffffffffffffffffffff166111496113d8565b73ffffffffffffffffffffffffffffffffffffffff161461119f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111969061301f565b60405180910390fd5b6111a96000612539565b565b6111b3611b51565b73ffffffffffffffffffffffffffffffffffffffff166111d16113d8565b73ffffffffffffffffffffffffffffffffffffffff1614611227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9061301f565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112679190612edf565b602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a891906133f0565b9050600081111561133a578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112d7611b51565b836040518363ffffffff1660e01b81526004016112f592919061341d565b6020604051808303816000875af1158015611314573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611338919061345b565b505b505050565b611347611b51565b73ffffffffffffffffffffffffffffffffffffffff166113656113d8565b73ffffffffffffffffffffffffffffffffffffffff16146113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b29061301f565b60405180910390fd5b6001601160026101000a81548160ff021916908315150217905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546114379061315f565b80601f01602080910402602001604051908101604052809291908181526020018280546114639061315f565b80156114b05780601f10611485576101008083540402835291602001916114b0565b820191906000526020600020905b81548152906001019060200180831161149357829003601f168201915b5050505050905090565b600a5481565b600d5481565b600080600160006114d5611b51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611592576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611589906134fa565b60405180910390fd5b6115a661159d611b51565b85858403611b59565b600191505092915050565b6115b9611b51565b73ffffffffffffffffffffffffffffffffffffffff166115d76113d8565b73ffffffffffffffffffffffffffffffffffffffff161461162d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116249061301f565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b600061165e611657611b51565b8484611d24565b6001905092915050565b601160029054906101000a900460ff1681565b611683611b51565b73ffffffffffffffffffffffffffffffffffffffff166116a16113d8565b73ffffffffffffffffffffffffffffffffffffffff16146116f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ee9061301f565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061175c611b51565b73ffffffffffffffffffffffffffffffffffffffff1661177a6113d8565b73ffffffffffffffffffffffffffffffffffffffff16146117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c79061301f565b60405180910390fd5b620186a060016117de610b6f565b6117e89190613191565b6117f2919061321a565b821015611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90613566565b60405180910390fd5b8160098190555060019050919050565b61184c611b51565b73ffffffffffffffffffffffffffffffffffffffff1661186a6113d8565b73ffffffffffffffffffffffffffffffffffffffff16146118c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b79061301f565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600c5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600b5481565b6119bc611b51565b73ffffffffffffffffffffffffffffffffffffffff166119da6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a279061301f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a97906135f8565b60405180910390fd5b611aa981612539565b50565b600e5481565b60105481565b611ac0611b51565b73ffffffffffffffffffffffffffffffffffffffff16611ade6113d8565b73ffffffffffffffffffffffffffffffffffffffff1614611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b9061301f565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc09061368a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c309061371c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d179190612dd1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b906137ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb90613840565b60405180910390fd5b6000811415611e1e57611e19838360006125ff565b612534565b60007f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614905060007f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16149050601160029054906101000a900460ff16158015611f2b5750600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611f815750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611fc8576000611fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbe906138ac565b60405180910390fd5b5b601160019054906101000a900460ff16801561202e5750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120475750601160039054906101000a900460ff16155b156121165781156120ab5760105461205e856110db565b84612069919061306e565b11156120aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a190613918565b60405180910390fd5b5b811580156120b7575080155b15612115576010546120c8856110db565b846120d3919061306e565b1115612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b90613984565b60405180910390fd5b5b5b6000612121306110db565b9050600060095482101590508080156121465750601160009054906101000a900460ff165b801561215f5750601160039054906101000a900460ff16155b80156121b657507f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b801561220c5750600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122625750600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156122a6576001601160036101000a81548160ff02191690831515021790555061228a612880565b6000601160036101000a81548160ff0219169083151502179055505b6000601160039054906101000a900460ff16159050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061235c5750600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561236657600090505b6000808215612521577f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161480156123cc57506000600f54115b1561241d576123f960646123eb600f548b6128a990919063ffffffff16565b6128bf90919063ffffffff16565b9150600f54600e548361240c9190613191565b612416919061321a565b90506124c8565b7f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614801561247a57506000600c54115b156124c7576124a76064612499600c548b6128a990919063ffffffff16565b6128bf90919063ffffffff16565b9150600c54600b54836124ba9190613191565b6124c4919061321a565b90505b5b60008211156124dd576124dc8a30846125ff565b5b600081111561251257612511307f0000000000000000000000001701d7346526c92d321f8fbc4dcce5d6ed6dac1d836125ff565b5b818861251e91906139a4565b97505b61252c8a8a8a6125ff565b505050505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561266f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612666906137ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d690613840565b60405180910390fd5b6126ea8383836128d5565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276790613a4a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612803919061306e565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128679190612dd1565b60405180910390a361287a8484846128da565b50505050565b600061288b306110db565b9050600081141561289c57506128a7565b6128a5816128df565b505b565b600081836128b79190613191565b905092915050565b600081836128cd919061321a565b905092915050565b505050565b505050565b6000600267ffffffffffffffff8111156128fc576128fb613a6a565b5b60405190808252806020026020018201604052801561292a5781602001602082028036833780820191505090505b509050308160008151811061294257612941613a99565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129e7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0b9190613add565b81600181518110612a1f57612a1e613a99565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612a84307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611b59565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401612b08959493929190613c03565b600060405180830381600087803b158015612b2257600080fd5b505af1158015612b36573d6000803e3d6000fd5b505050505050565b600080fd5b6000819050919050565b612b5681612b43565b8114612b6157600080fd5b50565b600081359050612b7381612b4d565b92915050565b60008060408385031215612b9057612b8f612b3e565b5b6000612b9e85828601612b64565b9250506020612baf85828601612b64565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612bf3578082015181840152602081019050612bd8565b83811115612c02576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c2482612bb9565b612c2e8185612bc4565b9350612c3e818560208601612bd5565b612c4781612c08565b840191505092915050565b60006020820190508181036000830152612c6c8184612c19565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9f82612c74565b9050919050565b612caf81612c94565b8114612cba57600080fd5b50565b600081359050612ccc81612ca6565b92915050565b60008060408385031215612ce957612ce8612b3e565b5b6000612cf785828601612cbd565b9250506020612d0885828601612b64565b9150509250929050565b60008115159050919050565b612d2781612d12565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b6000819050919050565b6000612d6d612d68612d6384612c74565b612d48565b612c74565b9050919050565b6000612d7f82612d52565b9050919050565b6000612d9182612d74565b9050919050565b612da181612d86565b82525050565b6000602082019050612dbc6000830184612d98565b92915050565b612dcb81612b43565b82525050565b6000602082019050612de66000830184612dc2565b92915050565b600060208284031215612e0257612e01612b3e565b5b6000612e1084828501612cbd565b91505092915050565b600060208284031215612e2f57612e2e612b3e565b5b6000612e3d84828501612b64565b91505092915050565b600080600060608486031215612e5f57612e5e612b3e565b5b6000612e6d86828701612cbd565b9350506020612e7e86828701612cbd565b9250506040612e8f86828701612b64565b9150509250925092565b600060ff82169050919050565b612eaf81612e99565b82525050565b6000602082019050612eca6000830184612ea6565b92915050565b612ed981612c94565b82525050565b6000602082019050612ef46000830184612ed0565b92915050565b612f0381612d12565b8114612f0e57600080fd5b50565b600081359050612f2081612efa565b92915050565b600060208284031215612f3c57612f3b612b3e565b5b6000612f4a84828501612f11565b91505092915050565b60008060408385031215612f6a57612f69612b3e565b5b6000612f7885828601612cbd565b9250506020612f8985828601612f11565b9150509250929050565b60008060408385031215612faa57612fa9612b3e565b5b6000612fb885828601612cbd565b9250506020612fc985828601612cbd565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613009602083612bc4565b915061301482612fd3565b602082019050919050565b6000602082019050818103600083015261303881612ffc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061307982612b43565b915061308483612b43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130b9576130b861303f565b5b828201905092915050565b7f73656c6c20746178203e20323025000000000000000000000000000000000000600082015250565b60006130fa600e83612bc4565b9150613105826130c4565b602082019050919050565b60006020820190508181036000830152613129816130ed565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061317757607f821691505b6020821081141561318b5761318a613130565b5b50919050565b600061319c82612b43565b91506131a783612b43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131e0576131df61303f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061322582612b43565b915061323083612b43565b9250826132405761323f6131eb565b5b828204905092915050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b60006132a7602483612bc4565b91506132b28261324b565b604082019050919050565b600060208201905081810360008301526132d68161329a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000613339602883612bc4565b9150613344826132dd565b604082019050919050565b600060208201905081810360008301526133688161332c565b9050919050565b7f62757920746178203e2032302500000000000000000000000000000000000000600082015250565b60006133a5600d83612bc4565b91506133b08261336f565b602082019050919050565b600060208201905081810360008301526133d481613398565b9050919050565b6000815190506133ea81612b4d565b92915050565b60006020828403121561340657613405612b3e565b5b6000613414848285016133db565b91505092915050565b60006040820190506134326000830185612ed0565b61343f6020830184612dc2565b9392505050565b60008151905061345581612efa565b92915050565b60006020828403121561347157613470612b3e565b5b600061347f84828501613446565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006134e4602583612bc4565b91506134ef82613488565b604082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f3c20302e3030312520746f74616c20737570706c792e00000000000000000000600082015250565b6000613550601683612bc4565b915061355b8261351a565b602082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006135e2602683612bc4565b91506135ed82613586565b604082019050919050565b60006020820190508181036000830152613611816135d5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613674602483612bc4565b915061367f82613618565b604082019050919050565b600060208201905081810360008301526136a381613667565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613706602283612bc4565b9150613711826136aa565b604082019050919050565b60006020820190508181036000830152613735816136f9565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613798602583612bc4565b91506137a38261373c565b604082019050919050565b600060208201905081810360008301526137c78161378b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061382a602383612bc4565b9150613835826137ce565b604082019050919050565b600060208201905081810360008301526138598161381d565b9050919050565b7f54726164696e6720686173206e6f742073746172746564207965740000000000600082015250565b6000613896601b83612bc4565b91506138a182613860565b602082019050919050565b600060208201905081810360008301526138c581613889565b9050919050565b7f4d61782077616c6c657420657863656564656420286275792900000000000000600082015250565b6000613902601983612bc4565b915061390d826138cc565b602082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f4d61782077616c6c657420657863656564656420287472616e73666572290000600082015250565b600061396e601e83612bc4565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b60006139af82612b43565b91506139ba83612b43565b9250828210156139cd576139cc61303f565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613a34602683612bc4565b9150613a3f826139d8565b604082019050919050565b60006020820190508181036000830152613a6381613a27565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050613ad781612ca6565b92915050565b600060208284031215613af357613af2612b3e565b5b6000613b0184828501613ac8565b91505092915050565b6000819050919050565b6000613b2f613b2a613b2584613b0a565b612d48565b612b43565b9050919050565b613b3f81613b14565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b7a81612c94565b82525050565b6000613b8c8383613b71565b60208301905092915050565b6000602082019050919050565b6000613bb082613b45565b613bba8185613b50565b9350613bc583613b61565b8060005b83811015613bf6578151613bdd8882613b80565b9750613be883613b98565b925050600181019050613bc9565b5085935050505092915050565b600060a082019050613c186000830188612dc2565b613c256020830187613b36565b8181036040830152613c378186613ba5565b9050613c466060830185612ed0565b613c536080830184612dc2565b969550505050505056fea2646970667358221220b3e3a60efa79d0d1dea3beb9acb0426a766c358a4c367704ff3da8738353021a64736f6c634300080a0033

Deployed Bytecode Sourcemap

23668:7304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29212:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6662:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8829:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23746:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7782:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28708:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29751:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9480:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7624:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10369:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23806:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24330:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30843:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28935:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24289:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24221:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30699:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7953:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1887:103;;;;;;;;;;;;;:::i;:::-;;30184:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29975:81;;;;;;;;;;;;;:::i;:::-;;1236:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23851:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6881:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24049:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24151:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11087:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30064:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8293:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24370:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30409:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29498:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30549:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24117:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8531:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24009:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24080:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2145:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24183:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24256:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28819:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29212:278;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29319:7:::1;29306:10;:20;;;;29356:13;29337:16;:32;;;;29409:16;;29396:10;;:29;;;;:::i;:::-;29380:13;:45;;;;29461:2;29444:13;;:19;;29436:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;29212:278:::0;;:::o;6662:100::-;6716:13;6749:5;6742:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6662:100;:::o;8829:169::-;8912:4;8929:39;8938:12;:10;:12::i;:::-;8952:7;8961:6;8929:8;:39::i;:::-;8986:4;8979:11;;8829:169;;;;:::o;23746:51::-;;;:::o;7782:108::-;7843:7;7870:12;;7863:19;;7782:108;:::o;28708:103::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28794:9:::1;28782;;:21;;;;;;;;;;;;;;;;;;28708:103:::0;:::o;29751:216::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29875:4:::1;29867;29863:1;29847:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;29846:33;;;;:::i;:::-;29833:9;:46;;29825:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;29955:4;29943:9;:16;;;;:::i;:::-;29931:9;:28;;;;29751:216:::0;:::o;9480:480::-;9620:4;9637:36;9647:6;9655:9;9666:6;9637:9;:36::i;:::-;9686:24;9713:11;:19;9725:6;9713:19;;;;;;;;;;;;;;;:33;9733:12;:10;:12::i;:::-;9713:33;;;;;;;;;;;;;;;;9686:60;;9785:6;9765:16;:26;;9757:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;9864:57;9873:6;9881:12;:10;:12::i;:::-;9914:6;9895:16;:25;9864:8;:57::i;:::-;9948:4;9941:11;;;9480:480;;;;;:::o;7624:93::-;7682:5;7707:2;7700:9;;7624:93;:::o;10369:215::-;10457:4;10474:80;10483:12;:10;:12::i;:::-;10497:7;10543:10;10506:11;:25;10518:12;:10;:12::i;:::-;10506:25;;;;;;;;;;;;;;;:34;10532:7;10506:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;10474:8;:80::i;:::-;10572:4;10565:11;;10369:215;;;;:::o;23806:38::-;;;:::o;24330:33::-;;;;;;;;;;;;;:::o;30843:126::-;30909:4;30933:19;:28;30953:7;30933:28;;;;;;;;;;;;;;;;;;;;;;;;;30926:35;;30843:126;;;:::o;28935:269::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29039:7:::1;29027:9;:19;;;;29075:13;29057:15;:31;;;;29126:15;;29114:9;;:27;;;;:::i;:::-;29099:12;:42;;;;29176:2;29160:12;;:18;;29152:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;28935:269:::0;;:::o;24289:34::-;;;;;;;;;;;;;:::o;24221:28::-;;;;:::o;30699:136::-;30770:4;30794:24;:33;30819:7;30794:33;;;;;;;;;;;;;;;;;;;;;;;;;30787:40;;30699:136;;;:::o;7953:127::-;8027:7;8054:9;:18;8064:7;8054:18;;;;;;;;;;;;;;;;8047:25;;7953:127;;;:::o;1887:103::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1952:30:::1;1979:1;1952:18;:30::i;:::-;1887:103::o:0;30184:217::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30243:11:::1;30263:5;30243:26;;30280:15;30298:5;:15;;;30322:4;30298:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30280:48;;30353:1;30343:7;:11;30339:54;;;30356:5;:14;;;30371:12;:10;:12::i;:::-;30385:7;30356:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30339:54;30232:169;;30184:217:::0;:::o;29975:81::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30044:4:::1;30028:13;;:20;;;;;;;;;;;;;;;;;;29975:81::o:0;1236:87::-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;23851:24::-;;;;;;;;;;;;;:::o;6881:104::-;6937:13;6970:7;6963:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6881:104;:::o;24049:24::-;;;;:::o;24151:25::-;;;;:::o;11087:401::-;11180:4;11197:24;11224:11;:25;11236:12;:10;:12::i;:::-;11224:25;;;;;;;;;;;;;;;:34;11250:7;11224:34;;;;;;;;;;;;;;;;11197:61;;11297:15;11277:16;:35;;11269:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11382:67;11391:12;:10;:12::i;:::-;11405:7;11433:15;11414:16;:34;11382:8;:67::i;:::-;11476:4;11469:11;;;11087:401;;;;:::o;30064:112::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30153:15:::1;30136:14;;:32;;;;;;;;;;;;;;;;;;30064:112:::0;:::o;8293:175::-;8379:4;8396:42;8406:12;:10;:12::i;:::-;8420:9;8431:6;8396:9;:42::i;:::-;8456:4;8449:11;;8293:175;;;;:::o;24370:25::-;;;;;;;;;;;;;:::o;30409:132::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30525:8:::1;30494:19;:28;30514:7;30494:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;30409:132:::0;;:::o;29498:245::-;29579:4;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29639:6:::1;29634:1;29618:13;:11;:13::i;:::-;:17;;;;:::i;:::-;29617:28;;;;:::i;:::-;29604:9;:41;;29596:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29704:9;29683:18;:30;;;;29731:4;29724:11;;29498:245:::0;;;:::o;30549:142::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30675:8:::1;30639:24;:33;30664:7;30639:33;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;30549:142:::0;;:::o;24117:27::-;;;;:::o;8531:151::-;8620:7;8647:11;:18;8659:5;8647:18;;;;;;;;;;;;;;;:27;8666:7;8647:27;;;;;;;;;;;;;;;;8640:34;;8531:151;;;;:::o;24009:33::-;;;;:::o;24080:30::-;;;;:::o;2145:201::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2254:1:::1;2234:22;;:8;:22;;;;2226:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2310:28;2329:8;2310:18;:28::i;:::-;2145:201:::0;:::o;24183:31::-;;;;:::o;24256:24::-;;;;:::o;28819:108::-;1467:12;:10;:12::i;:::-;1456:23;;:7;:5;:7::i;:::-;:23;;;1448:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28912:7:::1;28894:15;;:25;;;;;;;;;;;;;;;;;;28819:108:::0;:::o;583:98::-;636:7;663:10;656:17;;583:98;:::o;14735:380::-;14888:1;14871:19;;:5;:19;;;;14863:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14969:1;14950:21;;:7;:21;;;;14942:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15053:6;15023:11;:18;15035:5;15023:18;;;;;;;;;;;;;;;:27;15042:7;15023:27;;;;;;;;;;;;;;;:36;;;;15091:7;15075:32;;15084:5;15075:32;;;15100:6;15075:32;;;;;;:::i;:::-;;;;;;;;14735:380;;;:::o;25599:2367::-;25747:1;25731:18;;:4;:18;;;;25723:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25824:1;25810:16;;:2;:16;;;;25802:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25893:1;25883:6;:11;25879:93;;;25911:28;25927:4;25933:2;25937:1;25911:15;:28::i;:::-;25954:7;;25879:93;25984:10;26005:13;25997:21;;:4;:21;;;25984:34;;26029:11;26049:13;26043:19;;:2;:19;;;26029:33;;26080:13;;;;;;;;;;;26079:14;:44;;;;;26098:19;:25;26118:4;26098:25;;;;;;;;;;;;;;;;;;;;;;;;;26097:26;26079:44;:72;;;;;26128:19;:23;26148:2;26128:23;;;;;;;;;;;;;;;;;;;;;;;;;26127:24;26079:72;26075:123;;;26161:5;26153:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;26075:123;26215:14;;;;;;;;;;;:47;;;;;26234:24;:28;26259:2;26234:28;;;;;;;;;;;;;;;;;;;;;;;;;26233:29;26215:47;:60;;;;;26267:8;;;;;;;;;;;26266:9;26215:60;26211:361;;;26296:5;26292:119;;;26356:9;;26339:13;26349:2;26339:9;:13::i;:::-;26330:6;:22;;;;:::i;:::-;:35;;26322:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26292:119;26430:5;26429:6;:17;;;;;26440:6;26439:7;26429:17;26425:136;;;26501:9;;26484:13;26494:2;26484:9;:13::i;:::-;26475:6;:22;;;;:::i;:::-;:35;;26467:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;26425:136;26211:361;26584:28;26615:24;26633:4;26615:9;:24::i;:::-;26584:55;;26650:12;26689:18;;26665:20;:42;;26650:57;;26722:7;:26;;;;;26733:15;;;;;;;;;;;26722:26;:39;;;;;26753:8;;;;;;;;;;;26752:9;26722:39;:62;;;;;26771:13;26765:19;;:2;:19;;;26722:62;:92;;;;;26789:19;:25;26809:4;26789:25;;;;;;;;;;;;;;;;;;;;;;;;;26788:26;26722:92;:120;;;;;26819:19;:23;26839:2;26819:23;;;;;;;;;;;;;;;;;;;;;;;;;26818:24;26722:120;26718:224;;;26870:4;26859:8;;:15;;;;;;;;;;;;;;;;;;26889:10;:8;:10::i;:::-;26925:5;26914:8;;:16;;;;;;;;;;;;;;;;;;26718:224;26954:12;26970:8;;;;;;;;;;;26969:9;26954:24;;26993:19;:25;27013:4;26993:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;27022:19;:23;27042:2;27022:23;;;;;;;;;;;;;;;;;;;;;;;;;26993:52;26989:100;;;27072:5;27062:15;;26989:100;27101:12;27128:26;27175:7;27171:742;;;27209:13;27203:19;;:2;:19;;;:40;;;;;27242:1;27226:13;;:17;27203:40;27199:423;;;27271:34;27301:3;27271:25;27282:13;;27271:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;27264:41;;27373:13;;27353:16;;27346:4;:23;;;;:::i;:::-;27345:41;;;;:::i;:::-;27324:62;;27199:423;;;27433:13;27425:21;;:4;:21;;;:41;;;;;27465:1;27450:12;;:16;27425:41;27421:201;;;27494:33;27523:3;27494:24;27505:12;;27494:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;27487:40;;27594:12;;27575:15;;27568:4;:22;;;;:::i;:::-;27567:39;;;;:::i;:::-;27546:60;;27421:201;27199:423;27649:1;27642:4;:8;27638:91;;;27671:42;27687:4;27701;27708;27671:15;:42::i;:::-;27638:91;27768:1;27747:18;:22;27743:128;;;27790:65;27814:4;27821:13;27836:18;27790:15;:65::i;:::-;27743:128;27897:4;27887:14;;;;;:::i;:::-;;;27171:742;27925:33;27941:4;27947:2;27951:6;27925:15;:33::i;:::-;25712:2254;;;;;;;25599:2367;;;;:::o;2506:191::-;2580:16;2599:6;;;;;;;;;;;2580:25;;2625:8;2616:6;;:17;;;;;;;;;;;;;;;;;;2680:8;2649:40;;2670:8;2649:40;;;;;;;;;;;;2569:128;2506:191;:::o;11978:721::-;12136:1;12118:20;;:6;:20;;;;12110:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12220:1;12199:23;;:9;:23;;;;12191:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12275:47;12296:6;12304:9;12315:6;12275:20;:47::i;:::-;12335:21;12359:9;:17;12369:6;12359:17;;;;;;;;;;;;;;;;12335:41;;12412:6;12395:13;:23;;12387:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;12525:6;12509:13;:22;12489:9;:17;12499:6;12489:17;;;;;;;;;;;;;;;:42;;;;12573:6;12549:9;:20;12559:9;12549:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;12614:9;12597:35;;12606:6;12597:35;;;12625:6;12597:35;;;;;;:::i;:::-;;;;;;;;12645:46;12665:6;12673:9;12684:6;12645:19;:46::i;:::-;12099:600;11978:721;;;:::o;28453:210::-;28492:23;28518:24;28536:4;28518:9;:24::i;:::-;28492:50;;28576:1;28557:15;:20;28553:59;;;28594:7;;;28553:59;28622:33;28639:15;28622:16;:33::i;:::-;28481:182;28453:210;:::o;19587:98::-;19645:7;19676:1;19672;:5;;;;:::i;:::-;19665:12;;19587:98;;;;:::o;19986:::-;20044:7;20075:1;20071;:5;;;;:::i;:::-;20064:12;;19986:98;;;;:::o;15715:125::-;;;;:::o;16444:124::-;;;;:::o;27974:471::-;28040:21;28078:1;28064:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28040:40;;28109:4;28091;28096:1;28091:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;28135:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28125:4;28130:1;28125:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;28170:62;28187:4;28202:15;28220:11;28170:8;:62::i;:::-;28245:15;:66;;;28326:11;28352:1;28368:4;28387:9;;;;;;;;;;;28411:15;28245:192;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28029:416;27974:471;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:99::-;1222:6;1256:5;1250:12;1240:22;;1170:99;;;:::o;1275:169::-;1359:11;1393:6;1388:3;1381:19;1433:4;1428:3;1424:14;1409:29;;1275:169;;;;:::o;1450:307::-;1518:1;1528:113;1542:6;1539:1;1536:13;1528:113;;;1627:1;1622:3;1618:11;1612:18;1608:1;1603:3;1599:11;1592:39;1564:2;1561:1;1557:10;1552:15;;1528:113;;;1659:6;1656:1;1653:13;1650:101;;;1739:1;1730:6;1725:3;1721:16;1714:27;1650:101;1499:258;1450:307;;;:::o;1763:102::-;1804:6;1855:2;1851:7;1846:2;1839:5;1835:14;1831:28;1821:38;;1763:102;;;:::o;1871:364::-;1959:3;1987:39;2020:5;1987:39;:::i;:::-;2042:71;2106:6;2101:3;2042:71;:::i;:::-;2035:78;;2122:52;2167:6;2162:3;2155:4;2148:5;2144:16;2122:52;:::i;:::-;2199:29;2221:6;2199:29;:::i;:::-;2194:3;2190:39;2183:46;;1963:272;1871:364;;;;:::o;2241:313::-;2354:4;2392:2;2381:9;2377:18;2369:26;;2441:9;2435:4;2431:20;2427:1;2416:9;2412:17;2405:47;2469:78;2542:4;2533:6;2469:78;:::i;:::-;2461:86;;2241:313;;;;:::o;2560:126::-;2597:7;2637:42;2630:5;2626:54;2615:65;;2560:126;;;:::o;2692:96::-;2729:7;2758:24;2776:5;2758:24;:::i;:::-;2747:35;;2692:96;;;:::o;2794:122::-;2867:24;2885:5;2867:24;:::i;:::-;2860:5;2857:35;2847:63;;2906:1;2903;2896:12;2847:63;2794:122;:::o;2922:139::-;2968:5;3006:6;2993:20;2984:29;;3022:33;3049:5;3022:33;:::i;:::-;2922:139;;;;:::o;3067:474::-;3135:6;3143;3192:2;3180:9;3171:7;3167:23;3163:32;3160:119;;;3198:79;;:::i;:::-;3160:119;3318:1;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3289:117;3445:2;3471:53;3516:7;3507:6;3496:9;3492:22;3471:53;:::i;:::-;3461:63;;3416:118;3067:474;;;;;:::o;3547:90::-;3581:7;3624:5;3617:13;3610:21;3599:32;;3547:90;;;:::o;3643:109::-;3724:21;3739:5;3724:21;:::i;:::-;3719:3;3712:34;3643:109;;:::o;3758:210::-;3845:4;3883:2;3872:9;3868:18;3860:26;;3896:65;3958:1;3947:9;3943:17;3934:6;3896:65;:::i;:::-;3758:210;;;;:::o;3974:60::-;4002:3;4023:5;4016:12;;3974:60;;;:::o;4040:142::-;4090:9;4123:53;4141:34;4150:24;4168:5;4150:24;:::i;:::-;4141:34;:::i;:::-;4123:53;:::i;:::-;4110:66;;4040:142;;;:::o;4188:126::-;4238:9;4271:37;4302:5;4271:37;:::i;:::-;4258:50;;4188:126;;;:::o;4320:153::-;4397:9;4430:37;4461:5;4430:37;:::i;:::-;4417:50;;4320:153;;;:::o;4479:185::-;4593:64;4651:5;4593:64;:::i;:::-;4588:3;4581:77;4479:185;;:::o;4670:276::-;4790:4;4828:2;4817:9;4813:18;4805:26;;4841:98;4936:1;4925:9;4921:17;4912:6;4841:98;:::i;:::-;4670:276;;;;:::o;4952:118::-;5039:24;5057:5;5039:24;:::i;:::-;5034:3;5027:37;4952:118;;:::o;5076:222::-;5169:4;5207:2;5196:9;5192:18;5184:26;;5220:71;5288:1;5277:9;5273:17;5264:6;5220:71;:::i;:::-;5076:222;;;;:::o;5304:329::-;5363:6;5412:2;5400:9;5391:7;5387:23;5383:32;5380:119;;;5418:79;;:::i;:::-;5380:119;5538:1;5563:53;5608:7;5599:6;5588:9;5584:22;5563:53;:::i;:::-;5553:63;;5509:117;5304:329;;;;:::o;5639:::-;5698:6;5747:2;5735:9;5726:7;5722:23;5718:32;5715:119;;;5753:79;;:::i;:::-;5715:119;5873:1;5898:53;5943:7;5934:6;5923:9;5919:22;5898:53;:::i;:::-;5888:63;;5844:117;5639:329;;;;:::o;5974:619::-;6051:6;6059;6067;6116:2;6104:9;6095:7;6091:23;6087:32;6084:119;;;6122:79;;:::i;:::-;6084:119;6242:1;6267:53;6312:7;6303:6;6292:9;6288:22;6267:53;:::i;:::-;6257:63;;6213:117;6369:2;6395:53;6440:7;6431:6;6420:9;6416:22;6395:53;:::i;:::-;6385:63;;6340:118;6497:2;6523:53;6568:7;6559:6;6548:9;6544:22;6523:53;:::i;:::-;6513:63;;6468:118;5974:619;;;;;:::o;6599:86::-;6634:7;6674:4;6667:5;6663:16;6652:27;;6599:86;;;:::o;6691:112::-;6774:22;6790:5;6774:22;:::i;:::-;6769:3;6762:35;6691:112;;:::o;6809:214::-;6898:4;6936:2;6925:9;6921:18;6913:26;;6949:67;7013:1;7002:9;6998:17;6989:6;6949:67;:::i;:::-;6809:214;;;;:::o;7029:118::-;7116:24;7134:5;7116:24;:::i;:::-;7111:3;7104:37;7029:118;;:::o;7153:222::-;7246:4;7284:2;7273:9;7269:18;7261:26;;7297:71;7365:1;7354:9;7350:17;7341:6;7297:71;:::i;:::-;7153:222;;;;:::o;7381:116::-;7451:21;7466:5;7451:21;:::i;:::-;7444:5;7441:32;7431:60;;7487:1;7484;7477:12;7431:60;7381:116;:::o;7503:133::-;7546:5;7584:6;7571:20;7562:29;;7600:30;7624:5;7600:30;:::i;:::-;7503:133;;;;:::o;7642:323::-;7698:6;7747:2;7735:9;7726:7;7722:23;7718:32;7715:119;;;7753:79;;:::i;:::-;7715:119;7873:1;7898:50;7940:7;7931:6;7920:9;7916:22;7898:50;:::i;:::-;7888:60;;7844:114;7642:323;;;;:::o;7971:468::-;8036:6;8044;8093:2;8081:9;8072:7;8068:23;8064:32;8061:119;;;8099:79;;:::i;:::-;8061:119;8219:1;8244:53;8289:7;8280:6;8269:9;8265:22;8244:53;:::i;:::-;8234:63;;8190:117;8346:2;8372:50;8414:7;8405:6;8394:9;8390:22;8372:50;:::i;:::-;8362:60;;8317:115;7971:468;;;;;:::o;8445:474::-;8513:6;8521;8570:2;8558:9;8549:7;8545:23;8541:32;8538:119;;;8576:79;;:::i;:::-;8538:119;8696:1;8721:53;8766:7;8757:6;8746:9;8742:22;8721:53;:::i;:::-;8711:63;;8667:117;8823:2;8849:53;8894:7;8885:6;8874:9;8870:22;8849:53;:::i;:::-;8839:63;;8794:118;8445:474;;;;;:::o;8925:182::-;9065:34;9061:1;9053:6;9049:14;9042:58;8925:182;:::o;9113:366::-;9255:3;9276:67;9340:2;9335:3;9276:67;:::i;:::-;9269:74;;9352:93;9441:3;9352:93;:::i;:::-;9470:2;9465:3;9461:12;9454:19;;9113:366;;;:::o;9485:419::-;9651:4;9689:2;9678:9;9674:18;9666:26;;9738:9;9732:4;9728:20;9724:1;9713:9;9709:17;9702:47;9766:131;9892:4;9766:131;:::i;:::-;9758:139;;9485:419;;;:::o;9910:180::-;9958:77;9955:1;9948:88;10055:4;10052:1;10045:15;10079:4;10076:1;10069:15;10096:305;10136:3;10155:20;10173:1;10155:20;:::i;:::-;10150:25;;10189:20;10207:1;10189:20;:::i;:::-;10184:25;;10343:1;10275:66;10271:74;10268:1;10265:81;10262:107;;;10349:18;;:::i;:::-;10262:107;10393:1;10390;10386:9;10379:16;;10096:305;;;;:::o;10407:164::-;10547:16;10543:1;10535:6;10531:14;10524:40;10407:164;:::o;10577:366::-;10719:3;10740:67;10804:2;10799:3;10740:67;:::i;:::-;10733:74;;10816:93;10905:3;10816:93;:::i;:::-;10934:2;10929:3;10925:12;10918:19;;10577:366;;;:::o;10949:419::-;11115:4;11153:2;11142:9;11138:18;11130:26;;11202:9;11196:4;11192:20;11188:1;11177:9;11173:17;11166:47;11230:131;11356:4;11230:131;:::i;:::-;11222:139;;10949:419;;;:::o;11374:180::-;11422:77;11419:1;11412:88;11519:4;11516:1;11509:15;11543:4;11540:1;11533:15;11560:320;11604:6;11641:1;11635:4;11631:12;11621:22;;11688:1;11682:4;11678:12;11709:18;11699:81;;11765:4;11757:6;11753:17;11743:27;;11699:81;11827:2;11819:6;11816:14;11796:18;11793:38;11790:84;;;11846:18;;:::i;:::-;11790:84;11611:269;11560:320;;;:::o;11886:348::-;11926:7;11949:20;11967:1;11949:20;:::i;:::-;11944:25;;11983:20;12001:1;11983:20;:::i;:::-;11978:25;;12171:1;12103:66;12099:74;12096:1;12093:81;12088:1;12081:9;12074:17;12070:105;12067:131;;;12178:18;;:::i;:::-;12067:131;12226:1;12223;12219:9;12208:20;;11886:348;;;;:::o;12240:180::-;12288:77;12285:1;12278:88;12385:4;12382:1;12375:15;12409:4;12406:1;12399:15;12426:185;12466:1;12483:20;12501:1;12483:20;:::i;:::-;12478:25;;12517:20;12535:1;12517:20;:::i;:::-;12512:25;;12556:1;12546:35;;12561:18;;:::i;:::-;12546:35;12603:1;12600;12596:9;12591:14;;12426:185;;;;:::o;12617:223::-;12757:34;12753:1;12745:6;12741:14;12734:58;12826:6;12821:2;12813:6;12809:15;12802:31;12617:223;:::o;12846:366::-;12988:3;13009:67;13073:2;13068:3;13009:67;:::i;:::-;13002:74;;13085:93;13174:3;13085:93;:::i;:::-;13203:2;13198:3;13194:12;13187:19;;12846:366;;;:::o;13218:419::-;13384:4;13422:2;13411:9;13407:18;13399:26;;13471:9;13465:4;13461:20;13457:1;13446:9;13442:17;13435:47;13499:131;13625:4;13499:131;:::i;:::-;13491:139;;13218:419;;;:::o;13643:227::-;13783:34;13779:1;13771:6;13767:14;13760:58;13852:10;13847:2;13839:6;13835:15;13828:35;13643:227;:::o;13876:366::-;14018:3;14039:67;14103:2;14098:3;14039:67;:::i;:::-;14032:74;;14115:93;14204:3;14115:93;:::i;:::-;14233:2;14228:3;14224:12;14217:19;;13876:366;;;:::o;14248:419::-;14414:4;14452:2;14441:9;14437:18;14429:26;;14501:9;14495:4;14491:20;14487:1;14476:9;14472:17;14465:47;14529:131;14655:4;14529:131;:::i;:::-;14521:139;;14248:419;;;:::o;14673:163::-;14813:15;14809:1;14801:6;14797:14;14790:39;14673:163;:::o;14842:366::-;14984:3;15005:67;15069:2;15064:3;15005:67;:::i;:::-;14998:74;;15081:93;15170:3;15081:93;:::i;:::-;15199:2;15194:3;15190:12;15183:19;;14842:366;;;:::o;15214:419::-;15380:4;15418:2;15407:9;15403:18;15395:26;;15467:9;15461:4;15457:20;15453:1;15442:9;15438:17;15431:47;15495:131;15621:4;15495:131;:::i;:::-;15487:139;;15214:419;;;:::o;15639:143::-;15696:5;15727:6;15721:13;15712:22;;15743:33;15770:5;15743:33;:::i;:::-;15639:143;;;;:::o;15788:351::-;15858:6;15907:2;15895:9;15886:7;15882:23;15878:32;15875:119;;;15913:79;;:::i;:::-;15875:119;16033:1;16058:64;16114:7;16105:6;16094:9;16090:22;16058:64;:::i;:::-;16048:74;;16004:128;15788:351;;;;:::o;16145:332::-;16266:4;16304:2;16293:9;16289:18;16281:26;;16317:71;16385:1;16374:9;16370:17;16361:6;16317:71;:::i;:::-;16398:72;16466:2;16455:9;16451:18;16442:6;16398:72;:::i;:::-;16145:332;;;;;:::o;16483:137::-;16537:5;16568:6;16562:13;16553:22;;16584:30;16608:5;16584:30;:::i;:::-;16483:137;;;;:::o;16626:345::-;16693:6;16742:2;16730:9;16721:7;16717:23;16713:32;16710:119;;;16748:79;;:::i;:::-;16710:119;16868:1;16893:61;16946:7;16937:6;16926:9;16922:22;16893:61;:::i;:::-;16883:71;;16839:125;16626:345;;;;:::o;16977:224::-;17117:34;17113:1;17105:6;17101:14;17094:58;17186:7;17181:2;17173:6;17169:15;17162:32;16977:224;:::o;17207:366::-;17349:3;17370:67;17434:2;17429:3;17370:67;:::i;:::-;17363:74;;17446:93;17535:3;17446:93;:::i;:::-;17564:2;17559:3;17555:12;17548:19;;17207:366;;;:::o;17579:419::-;17745:4;17783:2;17772:9;17768:18;17760:26;;17832:9;17826:4;17822:20;17818:1;17807:9;17803:17;17796:47;17860:131;17986:4;17860:131;:::i;:::-;17852:139;;17579:419;;;:::o;18004:172::-;18144:24;18140:1;18132:6;18128:14;18121:48;18004:172;:::o;18182:366::-;18324:3;18345:67;18409:2;18404:3;18345:67;:::i;:::-;18338:74;;18421:93;18510:3;18421:93;:::i;:::-;18539:2;18534:3;18530:12;18523:19;;18182:366;;;:::o;18554:419::-;18720:4;18758:2;18747:9;18743:18;18735:26;;18807:9;18801:4;18797:20;18793:1;18782:9;18778:17;18771:47;18835:131;18961:4;18835:131;:::i;:::-;18827:139;;18554:419;;;:::o;18979:225::-;19119:34;19115:1;19107:6;19103:14;19096:58;19188:8;19183:2;19175:6;19171:15;19164:33;18979:225;:::o;19210:366::-;19352:3;19373:67;19437:2;19432:3;19373:67;:::i;:::-;19366:74;;19449:93;19538:3;19449:93;:::i;:::-;19567:2;19562:3;19558:12;19551:19;;19210:366;;;:::o;19582:419::-;19748:4;19786:2;19775:9;19771:18;19763:26;;19835:9;19829:4;19825:20;19821:1;19810:9;19806:17;19799:47;19863:131;19989:4;19863:131;:::i;:::-;19855:139;;19582:419;;;:::o;20007:223::-;20147:34;20143:1;20135:6;20131:14;20124:58;20216:6;20211:2;20203:6;20199:15;20192:31;20007:223;:::o;20236:366::-;20378:3;20399:67;20463:2;20458:3;20399:67;:::i;:::-;20392:74;;20475:93;20564:3;20475:93;:::i;:::-;20593:2;20588:3;20584:12;20577:19;;20236:366;;;:::o;20608:419::-;20774:4;20812:2;20801:9;20797:18;20789:26;;20861:9;20855:4;20851:20;20847:1;20836:9;20832:17;20825:47;20889:131;21015:4;20889:131;:::i;:::-;20881:139;;20608:419;;;:::o;21033:221::-;21173:34;21169:1;21161:6;21157:14;21150:58;21242:4;21237:2;21229:6;21225:15;21218:29;21033:221;:::o;21260:366::-;21402:3;21423:67;21487:2;21482:3;21423:67;:::i;:::-;21416:74;;21499:93;21588:3;21499:93;:::i;:::-;21617:2;21612:3;21608:12;21601:19;;21260:366;;;:::o;21632:419::-;21798:4;21836:2;21825:9;21821:18;21813:26;;21885:9;21879:4;21875:20;21871:1;21860:9;21856:17;21849:47;21913:131;22039:4;21913:131;:::i;:::-;21905:139;;21632:419;;;:::o;22057:224::-;22197:34;22193:1;22185:6;22181:14;22174:58;22266:7;22261:2;22253:6;22249:15;22242:32;22057:224;:::o;22287:366::-;22429:3;22450:67;22514:2;22509:3;22450:67;:::i;:::-;22443:74;;22526:93;22615:3;22526:93;:::i;:::-;22644:2;22639:3;22635:12;22628:19;;22287:366;;;:::o;22659:419::-;22825:4;22863:2;22852:9;22848:18;22840:26;;22912:9;22906:4;22902:20;22898:1;22887:9;22883:17;22876:47;22940:131;23066:4;22940:131;:::i;:::-;22932:139;;22659:419;;;:::o;23084:222::-;23224:34;23220:1;23212:6;23208:14;23201:58;23293:5;23288:2;23280:6;23276:15;23269:30;23084:222;:::o;23312:366::-;23454:3;23475:67;23539:2;23534:3;23475:67;:::i;:::-;23468:74;;23551:93;23640:3;23551:93;:::i;:::-;23669:2;23664:3;23660:12;23653:19;;23312:366;;;:::o;23684:419::-;23850:4;23888:2;23877:9;23873:18;23865:26;;23937:9;23931:4;23927:20;23923:1;23912:9;23908:17;23901:47;23965:131;24091:4;23965:131;:::i;:::-;23957:139;;23684:419;;;:::o;24109:177::-;24249:29;24245:1;24237:6;24233:14;24226:53;24109:177;:::o;24292:366::-;24434:3;24455:67;24519:2;24514:3;24455:67;:::i;:::-;24448:74;;24531:93;24620:3;24531:93;:::i;:::-;24649:2;24644:3;24640:12;24633:19;;24292:366;;;:::o;24664:419::-;24830:4;24868:2;24857:9;24853:18;24845:26;;24917:9;24911:4;24907:20;24903:1;24892:9;24888:17;24881:47;24945:131;25071:4;24945:131;:::i;:::-;24937:139;;24664:419;;;:::o;25089:175::-;25229:27;25225:1;25217:6;25213:14;25206:51;25089:175;:::o;25270:366::-;25412:3;25433:67;25497:2;25492:3;25433:67;:::i;:::-;25426:74;;25509:93;25598:3;25509:93;:::i;:::-;25627:2;25622:3;25618:12;25611:19;;25270:366;;;:::o;25642:419::-;25808:4;25846:2;25835:9;25831:18;25823:26;;25895:9;25889:4;25885:20;25881:1;25870:9;25866:17;25859:47;25923:131;26049:4;25923:131;:::i;:::-;25915:139;;25642:419;;;:::o;26067:180::-;26207:32;26203:1;26195:6;26191:14;26184:56;26067:180;:::o;26253:366::-;26395:3;26416:67;26480:2;26475:3;26416:67;:::i;:::-;26409:74;;26492:93;26581:3;26492:93;:::i;:::-;26610:2;26605:3;26601:12;26594:19;;26253:366;;;:::o;26625:419::-;26791:4;26829:2;26818:9;26814:18;26806:26;;26878:9;26872:4;26868:20;26864:1;26853:9;26849:17;26842:47;26906:131;27032:4;26906:131;:::i;:::-;26898:139;;26625:419;;;:::o;27050:191::-;27090:4;27110:20;27128:1;27110:20;:::i;:::-;27105:25;;27144:20;27162:1;27144:20;:::i;:::-;27139:25;;27183:1;27180;27177:8;27174:34;;;27188:18;;:::i;:::-;27174:34;27233:1;27230;27226:9;27218:17;;27050:191;;;;:::o;27247:225::-;27387:34;27383:1;27375:6;27371:14;27364:58;27456:8;27451:2;27443:6;27439:15;27432:33;27247:225;:::o;27478:366::-;27620:3;27641:67;27705:2;27700:3;27641:67;:::i;:::-;27634:74;;27717:93;27806:3;27717:93;:::i;:::-;27835:2;27830:3;27826:12;27819:19;;27478:366;;;:::o;27850:419::-;28016:4;28054:2;28043:9;28039:18;28031:26;;28103:9;28097:4;28093:20;28089:1;28078:9;28074:17;28067:47;28131:131;28257:4;28131:131;:::i;:::-;28123:139;;27850:419;;;:::o;28275:180::-;28323:77;28320:1;28313:88;28420:4;28417:1;28410:15;28444:4;28441:1;28434:15;28461:180;28509:77;28506:1;28499:88;28606:4;28603:1;28596:15;28630:4;28627:1;28620:15;28647:143;28704:5;28735:6;28729:13;28720:22;;28751:33;28778:5;28751:33;:::i;:::-;28647:143;;;;:::o;28796:351::-;28866:6;28915:2;28903:9;28894:7;28890:23;28886:32;28883:119;;;28921:79;;:::i;:::-;28883:119;29041:1;29066:64;29122:7;29113:6;29102:9;29098:22;29066:64;:::i;:::-;29056:74;;29012:128;28796:351;;;;:::o;29153:85::-;29198:7;29227:5;29216:16;;29153:85;;;:::o;29244:158::-;29302:9;29335:61;29353:42;29362:32;29388:5;29362:32;:::i;:::-;29353:42;:::i;:::-;29335:61;:::i;:::-;29322:74;;29244:158;;;:::o;29408:147::-;29503:45;29542:5;29503:45;:::i;:::-;29498:3;29491:58;29408:147;;:::o;29561:114::-;29628:6;29662:5;29656:12;29646:22;;29561:114;;;:::o;29681:184::-;29780:11;29814:6;29809:3;29802:19;29854:4;29849:3;29845:14;29830:29;;29681:184;;;;:::o;29871:132::-;29938:4;29961:3;29953:11;;29991:4;29986:3;29982:14;29974:22;;29871:132;;;:::o;30009:108::-;30086:24;30104:5;30086:24;:::i;:::-;30081:3;30074:37;30009:108;;:::o;30123:179::-;30192:10;30213:46;30255:3;30247:6;30213:46;:::i;:::-;30291:4;30286:3;30282:14;30268:28;;30123:179;;;;:::o;30308:113::-;30378:4;30410;30405:3;30401:14;30393:22;;30308:113;;;:::o;30457:732::-;30576:3;30605:54;30653:5;30605:54;:::i;:::-;30675:86;30754:6;30749:3;30675:86;:::i;:::-;30668:93;;30785:56;30835:5;30785:56;:::i;:::-;30864:7;30895:1;30880:284;30905:6;30902:1;30899:13;30880:284;;;30981:6;30975:13;31008:63;31067:3;31052:13;31008:63;:::i;:::-;31001:70;;31094:60;31147:6;31094:60;:::i;:::-;31084:70;;30940:224;30927:1;30924;30920:9;30915:14;;30880:284;;;30884:14;31180:3;31173:10;;30581:608;;;30457:732;;;;:::o;31195:831::-;31458:4;31496:3;31485:9;31481:19;31473:27;;31510:71;31578:1;31567:9;31563:17;31554:6;31510:71;:::i;:::-;31591:80;31667:2;31656:9;31652:18;31643:6;31591:80;:::i;:::-;31718:9;31712:4;31708:20;31703:2;31692:9;31688:18;31681:48;31746:108;31849:4;31840:6;31746:108;:::i;:::-;31738:116;;31864:72;31932:2;31921:9;31917:18;31908:6;31864:72;:::i;:::-;31946:73;32014:3;32003:9;31999:19;31990:6;31946:73;:::i;:::-;31195:831;;;;;;;;:::o

Swarm Source

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