ETH Price: $2,377.46 (-1.27%)

Token

PUREBLOOD (PUREBLOOD)
 

Overview

Max Total Supply

25,000,000,000,000 PUREBLOOD

Holders

251

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
5,786,063,984.247410547793875693 PUREBLOOD

Value
$0.00
0x7C6f7645911e039c6e08BcA1D310Ea0fE0a56AdD
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:
PUREBLOOD

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-17
*/

// SPDX-License-Identifier: Unlicensed

pragma solidity 0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SignedSafeMath {
    /**
     * @dev Returns the multiplication of two signed integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        return a * b;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

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

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private inSwapAndLiquify;

    bool public swapAndLiquifyEnabled = true;

    uint256 public maxSellTransactionAmount = 25000000000000 * (10**18);
    uint256 public maxBuyTransactionAmount = 25000000000000 * (10**18);
    uint256 public swapTokensAtAmount = 100000000000 * (10**18);

    uint256 public liquidityFee = 5;
    uint256 public charityFee = 5;
    address public  charityWallet = 0xc0195c99bf9Dd9678d20055152E238609d3f57B8;

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

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);

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

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event SwapAndLiquifyEnabledUpdated(bool enabled);

    event SwapAndLiquify(
        uint256 tokensIntoLiqudity,
        uint256 ethReceived
    );

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

    function setFee(uint256 _liquidityFee, uint256 _charityFee) public onlyOwner {
        liquidityFee = _liquidityFee;
        charityFee = _charityFee;
    }

    function setMaxSellTransaction(uint256 _maxSellTxAmount) public onlyOwner {
        maxSellTransactionAmount = _maxSellTxAmount;
    }
    
    function setMaxBuyTransaction(uint256 _maxBuyTxAmount) public onlyOwner {
        maxBuyTransactionAmount = _maxBuyTxAmount;
    }

    constructor() ERC20("PUREBLOOD", "PUREBLOOD") {

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(charityWallet, true);
        excludeFromFees(address(this), true);
        
        // exclude from max tx
        _isExcludedFromMaxTx[owner()] = true;
        _isExcludedFromMaxTx[address(this)] = true;
        _isExcludedFromMaxTx[charityWallet] = true;
        

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 25000000000000 * (10**18));
    }

    receive() external payable {

  	}

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "CJP: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "CJP: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }
    
    function setExcludeFromMaxTx(address _address, bool value) public onlyOwner { 
        _isExcludedFromMaxTx[_address] = value;
    }

    function setExcludeFromAll(address _address) public onlyOwner {
        _isExcludedFromMaxTx[_address] = true;
        _isExcludedFromFees[_address] = true;
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

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

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "CJP: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    
    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }
    
    function isExcludedFromMaxTx(address account) public view returns(bool) {
        return _isExcludedFromMaxTx[account];
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    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;
        }
        
        if(automatedMarketMakerPairs[from] && (!_isExcludedFromMaxTx[from]) && (!_isExcludedFromMaxTx[to])){
            require(amount <= maxBuyTransactionAmount, "amount exceeds the maxBuyTransactionAmount.");
        }

        if(automatedMarketMakerPairs[to] && (!_isExcludedFromMaxTx[from]) && (!_isExcludedFromMaxTx[to])){
            require(amount <= maxSellTransactionAmount, "amount exceeds the maxSellTransactionAmount.");
        }
        

    	uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= swapTokensAtAmount;
       
        if(
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            automatedMarketMakerPairs[to] && 
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify(contractTokenBalance);
        }

         // if any account belongs to _isExcludedFromFee account then remove the fee
        if(!_isExcludedFromFees[from] && !_isExcludedFromFees[to] && automatedMarketMakerPairs[to]) {
        	uint256 _liquidityfees = amount.mul(liquidityFee).div(100);
            uint256 _charityfees = amount.mul(charityFee).div(100);
        	amount = amount.sub(_liquidityfees.add(_charityfees));
            super._transfer(from, address(this), _liquidityfees); 
            super._transfer(from, charityWallet, _charityfees);
            
        }

        super._transfer(from, to, amount);

    }

     function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        
        // split the Liquidity token balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance);
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

        if(allowance(address(this), address(uniswapV2Router)) < tokenAmount) {
          _approve(address(this), address(uniswapV2Router), ~uint256(0));
        }

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

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

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","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":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","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":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setExcludeFromAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_charityFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyTxAmount","type":"uint256"}],"name":"setMaxBuyTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellTxAmount","type":"uint256"}],"name":"setMaxSellTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","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":[{"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":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526001600660156101000a81548160ff0219169083151502179055506d013b8b5b5056e16b3be0400000006007556d013b8b5b5056e16b3be0400000006008556c01431e0fae6d7217caa00000006009556005600a556005600b5573c0195c99bf9dd9678d20055152e238609d3f57b8600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000c057600080fd5b506040518060400160405280600981526020017f50555245424c4f4f4400000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f50555245424c4f4f44000000000000000000000000000000000000000000000081525081600390805190602001906200014592919062000b17565b5080600490805190602001906200015e92919062000b17565b50505062000181620001756200059560201b60201c565b6200059d60201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001e357600080fd5b505afa158015620001f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021e919062000c31565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200028157600080fd5b505afa15801562000296573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bc919062000c31565b6040518363ffffffff1660e01b8152600401620002db92919062000c74565b602060405180830381600087803b158015620002f657600080fd5b505af11580156200030b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000331919062000c31565b905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050620003bb8160016200066360201b60201c565b620003dd620003cf6200079a60201b60201c565b6001620007c460201b60201c565b62000412600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620007c460201b60201c565b62000425306001620007c460201b60201c565b6001600e60006200043b6200079a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200058d620005726200079a60201b60201c565b6d013b8b5b5056e16b3be0400000006200099460201b60201c565b505062001029565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415620006f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006f09062000d28565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007d46200059560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007fa6200079a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000853576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200084a9062000d9a565b60405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415620008e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008e09062000e32565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000988919062000e71565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009fe9062000ede565b60405180910390fd5b62000a1b6000838362000b0d60201b60201c565b806002600082825462000a2f919062000f39565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000a86919062000f39565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000aed919062000fa7565b60405180910390a362000b096000838362000b1260201b60201c565b5050565b505050565b505050565b82805462000b259062000ff3565b90600052602060002090601f01602090048101928262000b49576000855562000b95565b82601f1062000b6457805160ff191683800117855562000b95565b8280016001018555821562000b95579182015b8281111562000b9457825182559160200191906001019062000b77565b5b50905062000ba4919062000ba8565b5090565b5b8082111562000bc357600081600090555060010162000ba9565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000bf98262000bcc565b9050919050565b62000c0b8162000bec565b811462000c1757600080fd5b50565b60008151905062000c2b8162000c00565b92915050565b60006020828403121562000c4a5762000c4962000bc7565b5b600062000c5a8482850162000c1a565b91505092915050565b62000c6e8162000bec565b82525050565b600060408201905062000c8b600083018562000c63565b62000c9a602083018462000c63565b9392505050565b600082825260208201905092915050565b7f434a503a204175746f6d61746564206d61726b6574206d616b6572207061697260008201527f20697320616c72656164792073657420746f20746861742076616c7565000000602082015250565b600062000d10603d8362000ca1565b915062000d1d8262000cb2565b604082019050919050565b6000602082019050818103600083015262000d438162000d01565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000d8260208362000ca1565b915062000d8f8262000d4a565b602082019050919050565b6000602082019050818103600083015262000db58162000d73565b9050919050565b7f434a503a204163636f756e7420697320616c7265616479207468652076616c7560008201527f65206f6620276578636c75646564270000000000000000000000000000000000602082015250565b600062000e1a602f8362000ca1565b915062000e278262000dbc565b604082019050919050565b6000602082019050818103600083015262000e4d8162000e0b565b9050919050565b60008115159050919050565b62000e6b8162000e54565b82525050565b600060208201905062000e88600083018462000e60565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000ec6601f8362000ca1565b915062000ed38262000e8e565b602082019050919050565b6000602082019050818103600083015262000ef98162000eb7565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f468262000f00565b915062000f538362000f00565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000f8b5762000f8a62000f0a565b5b828201905092915050565b62000fa18162000f00565b82525050565b600060208201905062000fbe600083018462000f96565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200100c57607f821691505b6020821081141562001023576200102262000fc4565b5b50919050565b608051613fb66200104c60003960008181610c79015261134e0152613fb66000f3fe6080604052600436106102135760003560e01c806370a0823111610118578063b3b5e043116100a0578063c49b9a801161006f578063c49b9a80146107d0578063dd62ed3e146107f9578063e2f4560514610836578063ecfca89914610861578063f2fde38b1461088c5761021a565b8063b3b5e04314610718578063b62496f514610741578063c02466681461077e578063c492f046146107a75761021a565b806395d89b41116100e757806395d89b411461061f57806398118cb41461064a5780639a7a23d614610675578063a457c2d71461069e578063a9059cbb146106db5761021a565b806370a0823114610575578063715018a6146105b25780637b208769146105c95780638da5cb5b146105f45761021a565b806349bd5a5e1161019b5780635aa821a91161016a5780635aa821a9146104925780635b89029c146104bd5780635c38ffe2146104e6578063658c27a91461050f57806365b8dbc01461054c5761021a565b806349bd5a5e146103d65780634a74bb02146104015780634fbee1931461042c57806352f7c988146104695761021a565b806318160ddd116101e257806318160ddd146102dd57806323b872dd14610308578063313ce56714610345578063395093511461037057806349928a50146103ad5761021a565b806302259e9e1461021f57806306fdde031461024a578063095ea7b3146102755780631694505e146102b25761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b506102346108b5565b6040516102419190612bed565b60405180910390f35b34801561025657600080fd5b5061025f6108bb565b60405161026c9190612ca1565b60405180910390f35b34801561028157600080fd5b5061029c60048036038101906102979190612d57565b61094d565b6040516102a99190612db2565b60405180910390f35b3480156102be57600080fd5b506102c761096b565b6040516102d49190612e2c565b60405180910390f35b3480156102e957600080fd5b506102f2610991565b6040516102ff9190612bed565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190612e47565b61099b565b60405161033c9190612db2565b60405180910390f35b34801561035157600080fd5b5061035a610a93565b6040516103679190612eb6565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190612d57565b610a9c565b6040516103a49190612db2565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190612ed1565b610b48565b005b3480156103e257600080fd5b506103eb610c77565b6040516103f89190612f0d565b60405180910390f35b34801561040d57600080fd5b50610416610c9b565b6040516104239190612db2565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190612ed1565b610cae565b6040516104609190612db2565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612f28565b610d04565b005b34801561049e57600080fd5b506104a7610d92565b6040516104b49190612bed565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190612f94565b610d98565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612fd4565b610e6f565b005b34801561051b57600080fd5b5061053660048036038101906105319190612ed1565b610ef5565b6040516105439190612db2565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612ed1565b610f4b565b005b34801561058157600080fd5b5061059c60048036038101906105979190612ed1565b611118565b6040516105a99190612bed565b60405180910390f35b3480156105be57600080fd5b506105c7611160565b005b3480156105d557600080fd5b506105de6111e8565b6040516105eb9190612f0d565b60405180910390f35b34801561060057600080fd5b5061060961120e565b6040516106169190612f0d565b60405180910390f35b34801561062b57600080fd5b50610634611238565b6040516106419190612ca1565b60405180910390f35b34801561065657600080fd5b5061065f6112ca565b60405161066c9190612bed565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612f94565b6112d0565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190612d57565b6113e9565b6040516106d29190612db2565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190612d57565b6114d4565b60405161070f9190612db2565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190612fd4565b6114f2565b005b34801561074d57600080fd5b5061076860048036038101906107639190612ed1565b611578565b6040516107759190612db2565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190612f94565b611598565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190613066565b611750565b005b3480156107dc57600080fd5b506107f760048036038101906107f291906130c6565b6118ac565b005b34801561080557600080fd5b50610820600480360381019061081b91906130f3565b61197c565b60405161082d9190612bed565b60405180910390f35b34801561084257600080fd5b5061084b611a03565b6040516108589190612bed565b60405180910390f35b34801561086d57600080fd5b50610876611a09565b6040516108839190612bed565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae9190612ed1565b611a0f565b005b60075481565b6060600380546108ca90613162565b80601f01602080910402602001604051908101604052809291908181526020018280546108f690613162565b80156109435780601f1061091857610100808354040283529160200191610943565b820191906000526020600020905b81548152906001019060200180831161092657829003601f168201915b5050505050905090565b600061096161095a611b07565b8484611b0f565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60006109a8848484611cda565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109f3611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90613206565b60405180910390fd5b610a8785610a7f611b07565b858403611b0f565b60019150509392505050565b60006012905090565b6000610b3e610aa9611b07565b848460016000610ab7611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b399190613255565b611b0f565b6001905092915050565b610b50611b07565b73ffffffffffffffffffffffffffffffffffffffff16610b6e61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb906132f7565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660159054906101000a900460ff1681565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610d0c611b07565b73ffffffffffffffffffffffffffffffffffffffff16610d2a61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d77906132f7565b60405180910390fd5b81600a8190555080600b819055505050565b60085481565b610da0611b07565b73ffffffffffffffffffffffffffffffffffffffff16610dbe61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906132f7565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610e77611b07565b73ffffffffffffffffffffffffffffffffffffffff16610e9561120e565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee2906132f7565b60405180910390fd5b8060078190555050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f53611b07565b73ffffffffffffffffffffffffffffffffffffffff16610f7161120e565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906132f7565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613389565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611168611b07565b73ffffffffffffffffffffffffffffffffffffffff1661118661120e565b73ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d3906132f7565b60405180910390fd5b6111e660006122d4565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461124790613162565b80601f016020809104026020016040519081016040528092919081815260200182805461127390613162565b80156112c05780601f10611295576101008083540402835291602001916112c0565b820191906000526020600020905b8154815290600101906020018083116112a357829003601f168201915b5050505050905090565b600a5481565b6112d8611b07565b73ffffffffffffffffffffffffffffffffffffffff166112f661120e565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611343906132f7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613441565b60405180910390fd5b6113e5828261239a565b5050565b600080600160006113f8611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac906134d3565b60405180910390fd5b6114c96114c0611b07565b85858403611b0f565b600191505092915050565b60006114e86114e1611b07565b8484611cda565b6001905092915050565b6114fa611b07565b73ffffffffffffffffffffffffffffffffffffffff1661151861120e565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906132f7565b60405180910390fd5b8060088190555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b6115a0611b07565b73ffffffffffffffffffffffffffffffffffffffff166115be61120e565b73ffffffffffffffffffffffffffffffffffffffff1614611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b906132f7565b60405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90613565565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516117449190612db2565b60405180910390a25050565b611758611b07565b73ffffffffffffffffffffffffffffffffffffffff1661177661120e565b73ffffffffffffffffffffffffffffffffffffffff16146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c3906132f7565b60405180910390fd5b60005b8383905081101561186b5781600d60008686858181106117f2576117f1613585565b5b90506020020160208101906118079190612ed1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611863906135b4565b9150506117cf565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161189f939291906136c0565b60405180910390a1505050565b6118b4611b07565b73ffffffffffffffffffffffffffffffffffffffff166118d261120e565b73ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906132f7565b60405180910390fd5b80600660156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516119719190612db2565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600b5481565b611a17611b07565b73ffffffffffffffffffffffffffffffffffffffff16611a3561120e565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a82906132f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290613764565b60405180910390fd5b611b04816122d4565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906137f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690613888565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ccd9190612bed565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d419061391a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906139ac565b60405180910390fd5b6000811415611dd457611dcf838360006124ce565b6122cf565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611e775750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611ecd5750600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f1857600854811115611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90613a3e565b60405180910390fd5b5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611fbb5750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120115750600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561205c5760075481111561205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205290613ad0565b60405180910390fd5b5b600061206730611118565b90506000600954821015905080801561208d5750600660149054906101000a900460ff16155b80156120e25750600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156120fa5750600660159054906101000a900460ff165b15612109576121088261274f565b5b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156121ad5750600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122025750600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122c15760006122316064612223600a548761282390919063ffffffff16565b61283990919063ffffffff16565b9050600061225d606461224f600b548861282390919063ffffffff16565b61283990919063ffffffff16565b9050612284612275828461284f90919063ffffffff16565b8661286590919063ffffffff16565b94506122918730846124ce565b6122be87600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836124ce565b50505b6122cc8585856124ce565b50505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242490613b62565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561253e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125359061391a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a5906139ac565b60405180910390fd5b6125b983838361287b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561263f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263690613bf4565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126d29190613255565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516127369190612bed565b60405180910390a3612749848484612880565b50505050565b6001600660146101000a81548160ff021916908315150217905550600061278060028361283990919063ffffffff16565b90506000612797828461286590919063ffffffff16565b905060004790506127a783612885565b60006127bc824761286590919063ffffffff16565b90506127c88382612b0d565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f838148684826040516127f9929190613c14565b60405180910390a1505050506000600660146101000a81548160ff02191690831515021790555050565b600081836128319190613c3d565b905092915050565b600081836128479190613cc6565b905092915050565b6000818361285d9190613255565b905092915050565b600081836128739190613cf7565b905092915050565b505050565b505050565b6000600267ffffffffffffffff8111156128a2576128a1613d2b565b5b6040519080825280602002602001820160405280156128d05781602001602082028036833780820191505090505b50905030816000815181106128e8576128e7613585565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561298a57600080fd5b505afa15801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190613d6f565b816001815181106129d6576129d5613585565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612a3d30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661197c565b1015612a7357612a7230600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600019611b0f565b5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612ad7959493929190613e5d565b600060405180830381600087803b158015612af157600080fd5b505af1158015612b05573d6000803e3d6000fd5b505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612b5961120e565b426040518863ffffffff1660e01b8152600401612b7b96959493929190613eb7565b6060604051808303818588803b158015612b9457600080fd5b505af1158015612ba8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bcd9190613f2d565b5050505050565b6000819050919050565b612be781612bd4565b82525050565b6000602082019050612c026000830184612bde565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c42578082015181840152602081019050612c27565b83811115612c51576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c7382612c08565b612c7d8185612c13565b9350612c8d818560208601612c24565b612c9681612c57565b840191505092915050565b60006020820190508181036000830152612cbb8184612c68565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cf882612ccd565b9050919050565b612d0881612ced565b8114612d1357600080fd5b50565b600081359050612d2581612cff565b92915050565b612d3481612bd4565b8114612d3f57600080fd5b50565b600081359050612d5181612d2b565b92915050565b60008060408385031215612d6e57612d6d612cc3565b5b6000612d7c85828601612d16565b9250506020612d8d85828601612d42565b9150509250929050565b60008115159050919050565b612dac81612d97565b82525050565b6000602082019050612dc76000830184612da3565b92915050565b6000819050919050565b6000612df2612ded612de884612ccd565b612dcd565b612ccd565b9050919050565b6000612e0482612dd7565b9050919050565b6000612e1682612df9565b9050919050565b612e2681612e0b565b82525050565b6000602082019050612e416000830184612e1d565b92915050565b600080600060608486031215612e6057612e5f612cc3565b5b6000612e6e86828701612d16565b9350506020612e7f86828701612d16565b9250506040612e9086828701612d42565b9150509250925092565b600060ff82169050919050565b612eb081612e9a565b82525050565b6000602082019050612ecb6000830184612ea7565b92915050565b600060208284031215612ee757612ee6612cc3565b5b6000612ef584828501612d16565b91505092915050565b612f0781612ced565b82525050565b6000602082019050612f226000830184612efe565b92915050565b60008060408385031215612f3f57612f3e612cc3565b5b6000612f4d85828601612d42565b9250506020612f5e85828601612d42565b9150509250929050565b612f7181612d97565b8114612f7c57600080fd5b50565b600081359050612f8e81612f68565b92915050565b60008060408385031215612fab57612faa612cc3565b5b6000612fb985828601612d16565b9250506020612fca85828601612f7f565b9150509250929050565b600060208284031215612fea57612fe9612cc3565b5b6000612ff884828501612d42565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261302657613025613001565b5b8235905067ffffffffffffffff81111561304357613042613006565b5b60208301915083602082028301111561305f5761305e61300b565b5b9250929050565b60008060006040848603121561307f5761307e612cc3565b5b600084013567ffffffffffffffff81111561309d5761309c612cc8565b5b6130a986828701613010565b935093505060206130bc86828701612f7f565b9150509250925092565b6000602082840312156130dc576130db612cc3565b5b60006130ea84828501612f7f565b91505092915050565b6000806040838503121561310a57613109612cc3565b5b600061311885828601612d16565b925050602061312985828601612d16565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061317a57607f821691505b6020821081141561318e5761318d613133565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006131f0602883612c13565b91506131fb82613194565b604082019050919050565b6000602082019050818103600083015261321f816131e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061326082612bd4565b915061326b83612bd4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132a05761329f613226565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132e1602083612c13565b91506132ec826132ab565b602082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f434a503a2054686520726f7574657220616c726561647920686173207468617460008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b6000613373602883612c13565b915061337e82613317565b604082019050919050565b600060208201905081810360008301526133a281613366565b9050919050565b7f434a503a205468652050616e63616b655377617020706169722063616e6e6f7460008201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b657460208201527f4d616b6572506169727300000000000000000000000000000000000000000000604082015250565b600061342b604a83612c13565b9150613436826133a9565b606082019050919050565b6000602082019050818103600083015261345a8161341e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006134bd602583612c13565b91506134c882613461565b604082019050919050565b600060208201905081810360008301526134ec816134b0565b9050919050565b7f434a503a204163636f756e7420697320616c7265616479207468652076616c7560008201527f65206f6620276578636c75646564270000000000000000000000000000000000602082015250565b600061354f602f83612c13565b915061355a826134f3565b604082019050919050565b6000602082019050818103600083015261357e81613542565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135bf82612bd4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135f2576135f1613226565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b61362181612ced565b82525050565b60006136338383613618565b60208301905092915050565b600061364e6020840184612d16565b905092915050565b6000602082019050919050565b600061366f83856135fd565b935061367a8261360e565b8060005b858110156136b357613690828461363f565b61369a8882613627565b97506136a583613656565b92505060018101905061367e565b5085925050509392505050565b600060408201905081810360008301526136db818587613663565b90506136ea6020830184612da3565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061374e602683612c13565b9150613759826136f2565b604082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137e0602483612c13565b91506137eb82613784565b604082019050919050565b6000602082019050818103600083015261380f816137d3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613872602283612c13565b915061387d82613816565b604082019050919050565b600060208201905081810360008301526138a181613865565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613904602583612c13565b915061390f826138a8565b604082019050919050565b60006020820190508181036000830152613933816138f7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613996602383612c13565b91506139a18261393a565b604082019050919050565b600060208201905081810360008301526139c581613989565b9050919050565b7f616d6f756e74206578636565647320746865206d61784275795472616e73616360008201527f74696f6e416d6f756e742e000000000000000000000000000000000000000000602082015250565b6000613a28602b83612c13565b9150613a33826139cc565b604082019050919050565b60006020820190508181036000830152613a5781613a1b565b9050919050565b7f616d6f756e74206578636565647320746865206d617853656c6c5472616e736160008201527f6374696f6e416d6f756e742e0000000000000000000000000000000000000000602082015250565b6000613aba602c83612c13565b9150613ac582613a5e565b604082019050919050565b60006020820190508181036000830152613ae981613aad565b9050919050565b7f434a503a204175746f6d61746564206d61726b6574206d616b6572207061697260008201527f20697320616c72656164792073657420746f20746861742076616c7565000000602082015250565b6000613b4c603d83612c13565b9150613b5782613af0565b604082019050919050565b60006020820190508181036000830152613b7b81613b3f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613bde602683612c13565b9150613be982613b82565b604082019050919050565b60006020820190508181036000830152613c0d81613bd1565b9050919050565b6000604082019050613c296000830185612bde565b613c366020830184612bde565b9392505050565b6000613c4882612bd4565b9150613c5383612bd4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8c57613c8b613226565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cd182612bd4565b9150613cdc83612bd4565b925082613cec57613ceb613c97565b5b828204905092915050565b6000613d0282612bd4565b9150613d0d83612bd4565b925082821015613d2057613d1f613226565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050613d6981612cff565b92915050565b600060208284031215613d8557613d84612cc3565b5b6000613d9384828501613d5a565b91505092915050565b6000819050919050565b6000613dc1613dbc613db784613d9c565b612dcd565b612bd4565b9050919050565b613dd181613da6565b82525050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000613e0a82613dd7565b613e1481856135fd565b9350613e1f83613de2565b8060005b83811015613e50578151613e378882613627565b9750613e4283613df2565b925050600181019050613e23565b5085935050505092915050565b600060a082019050613e726000830188612bde565b613e7f6020830187613dc8565b8181036040830152613e918186613dff565b9050613ea06060830185612efe565b613ead6080830184612bde565b9695505050505050565b600060c082019050613ecc6000830189612efe565b613ed96020830188612bde565b613ee66040830187613dc8565b613ef36060830186613dc8565b613f006080830185612efe565b613f0d60a0830184612bde565b979650505050505050565b600081519050613f2781612d2b565b92915050565b600080600060608486031215613f4657613f45612cc3565b5b6000613f5486828701613f18565b9350506020613f6586828701613f18565b9250506040613f7686828701613f18565b915050925092509256fea2646970667358221220f70b5b9ed3adbac16397afc011724222fb03b99840c708df4a82826800b299cb64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102135760003560e01c806370a0823111610118578063b3b5e043116100a0578063c49b9a801161006f578063c49b9a80146107d0578063dd62ed3e146107f9578063e2f4560514610836578063ecfca89914610861578063f2fde38b1461088c5761021a565b8063b3b5e04314610718578063b62496f514610741578063c02466681461077e578063c492f046146107a75761021a565b806395d89b41116100e757806395d89b411461061f57806398118cb41461064a5780639a7a23d614610675578063a457c2d71461069e578063a9059cbb146106db5761021a565b806370a0823114610575578063715018a6146105b25780637b208769146105c95780638da5cb5b146105f45761021a565b806349bd5a5e1161019b5780635aa821a91161016a5780635aa821a9146104925780635b89029c146104bd5780635c38ffe2146104e6578063658c27a91461050f57806365b8dbc01461054c5761021a565b806349bd5a5e146103d65780634a74bb02146104015780634fbee1931461042c57806352f7c988146104695761021a565b806318160ddd116101e257806318160ddd146102dd57806323b872dd14610308578063313ce56714610345578063395093511461037057806349928a50146103ad5761021a565b806302259e9e1461021f57806306fdde031461024a578063095ea7b3146102755780631694505e146102b25761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b506102346108b5565b6040516102419190612bed565b60405180910390f35b34801561025657600080fd5b5061025f6108bb565b60405161026c9190612ca1565b60405180910390f35b34801561028157600080fd5b5061029c60048036038101906102979190612d57565b61094d565b6040516102a99190612db2565b60405180910390f35b3480156102be57600080fd5b506102c761096b565b6040516102d49190612e2c565b60405180910390f35b3480156102e957600080fd5b506102f2610991565b6040516102ff9190612bed565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190612e47565b61099b565b60405161033c9190612db2565b60405180910390f35b34801561035157600080fd5b5061035a610a93565b6040516103679190612eb6565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190612d57565b610a9c565b6040516103a49190612db2565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190612ed1565b610b48565b005b3480156103e257600080fd5b506103eb610c77565b6040516103f89190612f0d565b60405180910390f35b34801561040d57600080fd5b50610416610c9b565b6040516104239190612db2565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e9190612ed1565b610cae565b6040516104609190612db2565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190612f28565b610d04565b005b34801561049e57600080fd5b506104a7610d92565b6040516104b49190612bed565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190612f94565b610d98565b005b3480156104f257600080fd5b5061050d60048036038101906105089190612fd4565b610e6f565b005b34801561051b57600080fd5b5061053660048036038101906105319190612ed1565b610ef5565b6040516105439190612db2565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190612ed1565b610f4b565b005b34801561058157600080fd5b5061059c60048036038101906105979190612ed1565b611118565b6040516105a99190612bed565b60405180910390f35b3480156105be57600080fd5b506105c7611160565b005b3480156105d557600080fd5b506105de6111e8565b6040516105eb9190612f0d565b60405180910390f35b34801561060057600080fd5b5061060961120e565b6040516106169190612f0d565b60405180910390f35b34801561062b57600080fd5b50610634611238565b6040516106419190612ca1565b60405180910390f35b34801561065657600080fd5b5061065f6112ca565b60405161066c9190612bed565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612f94565b6112d0565b005b3480156106aa57600080fd5b506106c560048036038101906106c09190612d57565b6113e9565b6040516106d29190612db2565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd9190612d57565b6114d4565b60405161070f9190612db2565b60405180910390f35b34801561072457600080fd5b5061073f600480360381019061073a9190612fd4565b6114f2565b005b34801561074d57600080fd5b5061076860048036038101906107639190612ed1565b611578565b6040516107759190612db2565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190612f94565b611598565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190613066565b611750565b005b3480156107dc57600080fd5b506107f760048036038101906107f291906130c6565b6118ac565b005b34801561080557600080fd5b50610820600480360381019061081b91906130f3565b61197c565b60405161082d9190612bed565b60405180910390f35b34801561084257600080fd5b5061084b611a03565b6040516108589190612bed565b60405180910390f35b34801561086d57600080fd5b50610876611a09565b6040516108839190612bed565b60405180910390f35b34801561089857600080fd5b506108b360048036038101906108ae9190612ed1565b611a0f565b005b60075481565b6060600380546108ca90613162565b80601f01602080910402602001604051908101604052809291908181526020018280546108f690613162565b80156109435780601f1061091857610100808354040283529160200191610943565b820191906000526020600020905b81548152906001019060200180831161092657829003601f168201915b5050505050905090565b600061096161095a611b07565b8484611b0f565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b60006109a8848484611cda565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109f3611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90613206565b60405180910390fd5b610a8785610a7f611b07565b858403611b0f565b60019150509392505050565b60006012905090565b6000610b3e610aa9611b07565b848460016000610ab7611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b399190613255565b611b0f565b6001905092915050565b610b50611b07565b73ffffffffffffffffffffffffffffffffffffffff16610b6e61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb906132f7565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b7f00000000000000000000000084b25067b20f97108d51458f230bb2d5c4bc3ccc81565b600660159054906101000a900460ff1681565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610d0c611b07565b73ffffffffffffffffffffffffffffffffffffffff16610d2a61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d77906132f7565b60405180910390fd5b81600a8190555080600b819055505050565b60085481565b610da0611b07565b73ffffffffffffffffffffffffffffffffffffffff16610dbe61120e565b73ffffffffffffffffffffffffffffffffffffffff1614610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b906132f7565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610e77611b07565b73ffffffffffffffffffffffffffffffffffffffff16610e9561120e565b73ffffffffffffffffffffffffffffffffffffffff1614610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee2906132f7565b60405180910390fd5b8060078190555050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f53611b07565b73ffffffffffffffffffffffffffffffffffffffff16610f7161120e565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906132f7565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104f90613389565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611168611b07565b73ffffffffffffffffffffffffffffffffffffffff1661118661120e565b73ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d3906132f7565b60405180910390fd5b6111e660006122d4565b565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461124790613162565b80601f016020809104026020016040519081016040528092919081815260200182805461127390613162565b80156112c05780601f10611295576101008083540402835291602001916112c0565b820191906000526020600020905b8154815290600101906020018083116112a357829003601f168201915b5050505050905090565b600a5481565b6112d8611b07565b73ffffffffffffffffffffffffffffffffffffffff166112f661120e565b73ffffffffffffffffffffffffffffffffffffffff161461134c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611343906132f7565b60405180910390fd5b7f00000000000000000000000084b25067b20f97108d51458f230bb2d5c4bc3ccc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613441565b60405180910390fd5b6113e5828261239a565b5050565b600080600160006113f8611b07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac906134d3565b60405180910390fd5b6114c96114c0611b07565b85858403611b0f565b600191505092915050565b60006114e86114e1611b07565b8484611cda565b6001905092915050565b6114fa611b07565b73ffffffffffffffffffffffffffffffffffffffff1661151861120e565b73ffffffffffffffffffffffffffffffffffffffff161461156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906132f7565b60405180910390fd5b8060088190555050565b600f6020528060005260406000206000915054906101000a900460ff1681565b6115a0611b07565b73ffffffffffffffffffffffffffffffffffffffff166115be61120e565b73ffffffffffffffffffffffffffffffffffffffff1614611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b906132f7565b60405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90613565565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516117449190612db2565b60405180910390a25050565b611758611b07565b73ffffffffffffffffffffffffffffffffffffffff1661177661120e565b73ffffffffffffffffffffffffffffffffffffffff16146117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c3906132f7565b60405180910390fd5b60005b8383905081101561186b5781600d60008686858181106117f2576117f1613585565b5b90506020020160208101906118079190612ed1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611863906135b4565b9150506117cf565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161189f939291906136c0565b60405180910390a1505050565b6118b4611b07565b73ffffffffffffffffffffffffffffffffffffffff166118d261120e565b73ffffffffffffffffffffffffffffffffffffffff1614611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f906132f7565b60405180910390fd5b80600660156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516119719190612db2565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600b5481565b611a17611b07565b73ffffffffffffffffffffffffffffffffffffffff16611a3561120e565b73ffffffffffffffffffffffffffffffffffffffff1614611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a82906132f7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290613764565b60405180910390fd5b611b04816122d4565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906137f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690613888565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ccd9190612bed565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d419061391a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db1906139ac565b60405180910390fd5b6000811415611dd457611dcf838360006124ce565b6122cf565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611e775750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611ecd5750600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611f1857600854811115611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90613a3e565b60405180910390fd5b5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015611fbb5750600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156120115750600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561205c5760075481111561205b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205290613ad0565b60405180910390fd5b5b600061206730611118565b90506000600954821015905080801561208d5750600660149054906101000a900460ff16155b80156120e25750600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80156120fa5750600660159054906101000a900460ff165b15612109576121088261274f565b5b600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156121ad5750600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156122025750600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156122c15760006122316064612223600a548761282390919063ffffffff16565b61283990919063ffffffff16565b9050600061225d606461224f600b548861282390919063ffffffff16565b61283990919063ffffffff16565b9050612284612275828461284f90919063ffffffff16565b8661286590919063ffffffff16565b94506122918730846124ce565b6122be87600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836124ce565b50505b6122cc8585856124ce565b50505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242490613b62565b60405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561253e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125359061391a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a5906139ac565b60405180910390fd5b6125b983838361287b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561263f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263690613bf4565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126d29190613255565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516127369190612bed565b60405180910390a3612749848484612880565b50505050565b6001600660146101000a81548160ff021916908315150217905550600061278060028361283990919063ffffffff16565b90506000612797828461286590919063ffffffff16565b905060004790506127a783612885565b60006127bc824761286590919063ffffffff16565b90506127c88382612b0d565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f838148684826040516127f9929190613c14565b60405180910390a1505050506000600660146101000a81548160ff02191690831515021790555050565b600081836128319190613c3d565b905092915050565b600081836128479190613cc6565b905092915050565b6000818361285d9190613255565b905092915050565b600081836128739190613cf7565b905092915050565b505050565b505050565b6000600267ffffffffffffffff8111156128a2576128a1613d2b565b5b6040519080825280602002602001820160405280156128d05781602001602082028036833780820191505090505b50905030816000815181106128e8576128e7613585565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561298a57600080fd5b505afa15801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190613d6f565b816001815181106129d6576129d5613585565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612a3d30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661197c565b1015612a7357612a7230600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600019611b0f565b5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612ad7959493929190613e5d565b600060405180830381600087803b158015612af157600080fd5b505af1158015612b05573d6000803e3d6000fd5b505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612b5961120e565b426040518863ffffffff1660e01b8152600401612b7b96959493929190613eb7565b6060604051808303818588803b158015612b9457600080fd5b505af1158015612ba8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bcd9190613f2d565b5050505050565b6000819050919050565b612be781612bd4565b82525050565b6000602082019050612c026000830184612bde565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c42578082015181840152602081019050612c27565b83811115612c51576000848401525b50505050565b6000601f19601f8301169050919050565b6000612c7382612c08565b612c7d8185612c13565b9350612c8d818560208601612c24565b612c9681612c57565b840191505092915050565b60006020820190508181036000830152612cbb8184612c68565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612cf882612ccd565b9050919050565b612d0881612ced565b8114612d1357600080fd5b50565b600081359050612d2581612cff565b92915050565b612d3481612bd4565b8114612d3f57600080fd5b50565b600081359050612d5181612d2b565b92915050565b60008060408385031215612d6e57612d6d612cc3565b5b6000612d7c85828601612d16565b9250506020612d8d85828601612d42565b9150509250929050565b60008115159050919050565b612dac81612d97565b82525050565b6000602082019050612dc76000830184612da3565b92915050565b6000819050919050565b6000612df2612ded612de884612ccd565b612dcd565b612ccd565b9050919050565b6000612e0482612dd7565b9050919050565b6000612e1682612df9565b9050919050565b612e2681612e0b565b82525050565b6000602082019050612e416000830184612e1d565b92915050565b600080600060608486031215612e6057612e5f612cc3565b5b6000612e6e86828701612d16565b9350506020612e7f86828701612d16565b9250506040612e9086828701612d42565b9150509250925092565b600060ff82169050919050565b612eb081612e9a565b82525050565b6000602082019050612ecb6000830184612ea7565b92915050565b600060208284031215612ee757612ee6612cc3565b5b6000612ef584828501612d16565b91505092915050565b612f0781612ced565b82525050565b6000602082019050612f226000830184612efe565b92915050565b60008060408385031215612f3f57612f3e612cc3565b5b6000612f4d85828601612d42565b9250506020612f5e85828601612d42565b9150509250929050565b612f7181612d97565b8114612f7c57600080fd5b50565b600081359050612f8e81612f68565b92915050565b60008060408385031215612fab57612faa612cc3565b5b6000612fb985828601612d16565b9250506020612fca85828601612f7f565b9150509250929050565b600060208284031215612fea57612fe9612cc3565b5b6000612ff884828501612d42565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261302657613025613001565b5b8235905067ffffffffffffffff81111561304357613042613006565b5b60208301915083602082028301111561305f5761305e61300b565b5b9250929050565b60008060006040848603121561307f5761307e612cc3565b5b600084013567ffffffffffffffff81111561309d5761309c612cc8565b5b6130a986828701613010565b935093505060206130bc86828701612f7f565b9150509250925092565b6000602082840312156130dc576130db612cc3565b5b60006130ea84828501612f7f565b91505092915050565b6000806040838503121561310a57613109612cc3565b5b600061311885828601612d16565b925050602061312985828601612d16565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061317a57607f821691505b6020821081141561318e5761318d613133565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b60006131f0602883612c13565b91506131fb82613194565b604082019050919050565b6000602082019050818103600083015261321f816131e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061326082612bd4565b915061326b83612bd4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132a05761329f613226565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006132e1602083612c13565b91506132ec826132ab565b602082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f434a503a2054686520726f7574657220616c726561647920686173207468617460008201527f2061646472657373000000000000000000000000000000000000000000000000602082015250565b6000613373602883612c13565b915061337e82613317565b604082019050919050565b600060208201905081810360008301526133a281613366565b9050919050565b7f434a503a205468652050616e63616b655377617020706169722063616e6e6f7460008201527f2062652072656d6f7665642066726f6d206175746f6d617465644d61726b657460208201527f4d616b6572506169727300000000000000000000000000000000000000000000604082015250565b600061342b604a83612c13565b9150613436826133a9565b606082019050919050565b6000602082019050818103600083015261345a8161341e565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006134bd602583612c13565b91506134c882613461565b604082019050919050565b600060208201905081810360008301526134ec816134b0565b9050919050565b7f434a503a204163636f756e7420697320616c7265616479207468652076616c7560008201527f65206f6620276578636c75646564270000000000000000000000000000000000602082015250565b600061354f602f83612c13565b915061355a826134f3565b604082019050919050565b6000602082019050818103600083015261357e81613542565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006135bf82612bd4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135f2576135f1613226565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b61362181612ced565b82525050565b60006136338383613618565b60208301905092915050565b600061364e6020840184612d16565b905092915050565b6000602082019050919050565b600061366f83856135fd565b935061367a8261360e565b8060005b858110156136b357613690828461363f565b61369a8882613627565b97506136a583613656565b92505060018101905061367e565b5085925050509392505050565b600060408201905081810360008301526136db818587613663565b90506136ea6020830184612da3565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061374e602683612c13565b9150613759826136f2565b604082019050919050565b6000602082019050818103600083015261377d81613741565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137e0602483612c13565b91506137eb82613784565b604082019050919050565b6000602082019050818103600083015261380f816137d3565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613872602283612c13565b915061387d82613816565b604082019050919050565b600060208201905081810360008301526138a181613865565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613904602583612c13565b915061390f826138a8565b604082019050919050565b60006020820190508181036000830152613933816138f7565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613996602383612c13565b91506139a18261393a565b604082019050919050565b600060208201905081810360008301526139c581613989565b9050919050565b7f616d6f756e74206578636565647320746865206d61784275795472616e73616360008201527f74696f6e416d6f756e742e000000000000000000000000000000000000000000602082015250565b6000613a28602b83612c13565b9150613a33826139cc565b604082019050919050565b60006020820190508181036000830152613a5781613a1b565b9050919050565b7f616d6f756e74206578636565647320746865206d617853656c6c5472616e736160008201527f6374696f6e416d6f756e742e0000000000000000000000000000000000000000602082015250565b6000613aba602c83612c13565b9150613ac582613a5e565b604082019050919050565b60006020820190508181036000830152613ae981613aad565b9050919050565b7f434a503a204175746f6d61746564206d61726b6574206d616b6572207061697260008201527f20697320616c72656164792073657420746f20746861742076616c7565000000602082015250565b6000613b4c603d83612c13565b9150613b5782613af0565b604082019050919050565b60006020820190508181036000830152613b7b81613b3f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613bde602683612c13565b9150613be982613b82565b604082019050919050565b60006020820190508181036000830152613c0d81613bd1565b9050919050565b6000604082019050613c296000830185612bde565b613c366020830184612bde565b9392505050565b6000613c4882612bd4565b9150613c5383612bd4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8c57613c8b613226565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cd182612bd4565b9150613cdc83612bd4565b925082613cec57613ceb613c97565b5b828204905092915050565b6000613d0282612bd4565b9150613d0d83612bd4565b925082821015613d2057613d1f613226565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050613d6981612cff565b92915050565b600060208284031215613d8557613d84612cc3565b5b6000613d9384828501613d5a565b91505092915050565b6000819050919050565b6000613dc1613dbc613db784613d9c565b612dcd565b612bd4565b9050919050565b613dd181613da6565b82525050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b6000613e0a82613dd7565b613e1481856135fd565b9350613e1f83613de2565b8060005b83811015613e50578151613e378882613627565b9750613e4283613df2565b925050600181019050613e23565b5085935050505092915050565b600060a082019050613e726000830188612bde565b613e7f6020830187613dc8565b8181036040830152613e918186613dff565b9050613ea06060830185612efe565b613ead6080830184612bde565b9695505050505050565b600060c082019050613ecc6000830189612efe565b613ed96020830188612bde565b613ee66040830187613dc8565b613ef36060830186613dc8565b613f006080830185612efe565b613f0d60a0830184612bde565b979650505050505050565b600081519050613f2781612d2b565b92915050565b600080600060608486031215613f4657613f45612cc3565b5b6000613f5486828701613f18565b9350506020613f6586828701613f18565b9250506040613f7686828701613f18565b915050925092509256fea2646970667358221220f70b5b9ed3adbac16397afc011724222fb03b99840c708df4a82826800b299cb64736f6c63430008090033

Deployed Bytecode Sourcemap

39704:9631:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39965:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5575:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7742:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39783:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6695:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8393:492;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6537:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9294:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43839:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39831:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39916:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44918:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41431:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40039:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43697:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41598:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45055:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43070:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6866:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17097:94;;;;;;;;;;;;;:::i;:::-;;40254:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16446:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5794:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40180:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44324:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10012:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7206:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41746:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40667:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43390:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44012:304;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45190:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7444:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40112:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40218:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17346:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39965:67;;;;:::o;5575:100::-;5629:13;5662:5;5655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5575:100;:::o;7742:169::-;7825:4;7842:39;7851:12;:10;:12::i;:::-;7865:7;7874:6;7842:8;:39::i;:::-;7899:4;7892:11;;7742:169;;;;:::o;39783:41::-;;;;;;;;;;;;;:::o;6695:108::-;6756:7;6783:12;;6776:19;;6695:108;:::o;8393:492::-;8533:4;8550:36;8560:6;8568:9;8579:6;8550:9;:36::i;:::-;8599:24;8626:11;:19;8638:6;8626:19;;;;;;;;;;;;;;;:33;8646:12;:10;:12::i;:::-;8626:33;;;;;;;;;;;;;;;;8599:60;;8698:6;8678:16;:26;;8670:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;8785:57;8794:6;8802:12;:10;:12::i;:::-;8835:6;8816:16;:25;8785:8;:57::i;:::-;8873:4;8866:11;;;8393:492;;;;;:::o;6537:93::-;6595:5;6620:2;6613:9;;6537:93;:::o;9294:215::-;9382:4;9399:80;9408:12;:10;:12::i;:::-;9422:7;9468:10;9431:11;:25;9443:12;:10;:12::i;:::-;9431:25;;;;;;;;;;;;;;;:34;9457:7;9431:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;9399:8;:80::i;:::-;9497:4;9490:11;;9294:215;;;;:::o;43839:165::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43945:4:::1;43912:20;:30;43933:8;43912:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43992:4;43960:19;:29;43980:8;43960:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;43839:165:::0;:::o;39831:38::-;;;:::o;39916:40::-;;;;;;;;;;;;;:::o;44918:125::-;44983:4;45007:19;:28;45027:7;45007:28;;;;;;;;;;;;;;;;;;;;;;;;;45000:35;;44918:125;;;:::o;41431:159::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41534:13:::1;41519:12;:28;;;;41571:11;41558:10;:24;;;;41431:159:::0;;:::o;40039:66::-;;;;:::o;43697:134::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43818:5:::1;43785:20;:30;43806:8;43785:30;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;43697:134:::0;;:::o;41598:136::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41710:16:::1;41683:24;:43;;;;41598:136:::0;:::o;45055:127::-;45121:4;45145:20;:29;45166:7;45145:29;;;;;;;;;;;;;;;;;;;;;;;;;45138:36;;45055:127;;;:::o;43070:312::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43179:15:::1;;;;;;;;;;;43157:38;;:10;:38;;;;43149:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;43298:15;;;;;;;;;;;43256:59;;43278:10;43256:59;;;;;;;;;;;;43363:10;43326:15;;:48;;;;;;;;;;;;;;;;;;43070:312:::0;:::o;6866:127::-;6940:7;6967:9;:18;6977:7;6967:18;;;;;;;;;;;;;;;;6960:25;;6866:127;;;:::o;17097:94::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17162:21:::1;17180:1;17162:9;:21::i;:::-;17097:94::o:0;40254:74::-;;;;;;;;;;;;;:::o;16446:87::-;16492:7;16519:6;;;;;;;;;;;16512:13;;16446:87;:::o;5794:104::-;5850:13;5883:7;5876:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5794:104;:::o;40180:31::-;;;;:::o;44324:261::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44431:13:::1;44423:21;;:4;:21;;;;44415:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;44536:41;44565:4;44571:5;44536:28;:41::i;:::-;44324:261:::0;;:::o;10012:413::-;10105:4;10122:24;10149:11;:25;10161:12;:10;:12::i;:::-;10149:25;;;;;;;;;;;;;;;:34;10175:7;10149:34;;;;;;;;;;;;;;;;10122:61;;10222:15;10202:16;:35;;10194:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10315:67;10324:12;:10;:12::i;:::-;10338:7;10366:15;10347:16;:34;10315:8;:67::i;:::-;10413:4;10406:11;;;10012:413;;;;:::o;7206:175::-;7292:4;7309:42;7319:12;:10;:12::i;:::-;7333:9;7344:6;7309:9;:42::i;:::-;7369:4;7362:11;;7206:175;;;;:::o;41746:132::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41855:15:::1;41829:23;:41;;;;41746:132:::0;:::o;40667:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;43390:295::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43515:8:::1;43483:40;;:19;:28;43503:7;43483:28;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;43475:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;43617:8;43586:19;:28;43606:7;43586:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;43659:7;43643:34;;;43668:8;43643:34;;;;;;:::i;:::-;;;;;;;;43390:295:::0;;:::o;44012:304::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44129:9:::1;44125:115;44148:8;;:15;;44144:1;:19;44125:115;;;44220:8;44185:19;:32;44205:8;;44214:1;44205:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;44185:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;44165:3;;;;;:::i;:::-;;;;44125:115;;;;44257:51;44289:8;;44299;44257:51;;;;;;;;:::i;:::-;;;;;;;;44012:304:::0;;;:::o;45190:171::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45291:8:::1;45267:21;;:32;;;;;;;;;;;;;;;;;;45315:38;45344:8;45315:38;;;;;;:::i;:::-;;;;;;;;45190:171:::0;:::o;7444:151::-;7533:7;7560:11;:18;7572:5;7560:18;;;;;;;;;;;;;;;:27;7579:7;7560:27;;;;;;;;;;;;;;;;7553:34;;7444:151;;;;:::o;40112:59::-;;;;:::o;40218:29::-;;;;:::o;17346:192::-;16677:12;:10;:12::i;:::-;16666:23;;:7;:5;:7::i;:::-;:23;;;16658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17455:1:::1;17435:22;;:8;:22;;;;17427:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17511:19;17521:8;17511:9;:19::i;:::-;17346:192:::0;:::o;101:98::-;154:7;181:10;174:17;;101:98;:::o;13696:380::-;13849:1;13832:19;;:5;:19;;;;13824:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13930:1;13911:21;;:7;:21;;;;13903:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14014:6;13984:11;:18;13996:5;13984:18;;;;;;;;;;;;;;;:27;14003:7;13984:27;;;;;;;;;;;;;;;:36;;;;14052:7;14036:32;;14045:5;14036:32;;;14061:6;14036:32;;;;;;:::i;:::-;;;;;;;;13696:380;;;:::o;45369:1856::-;45517:1;45501:18;;:4;:18;;;;45493:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45594:1;45580:16;;:2;:16;;;;45572:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45662:1;45652:6;:11;45649:92;;;45680:28;45696:4;45702:2;45706:1;45680:15;:28::i;:::-;45723:7;;45649:92;45764:25;:31;45790:4;45764:31;;;;;;;;;;;;;;;;;;;;;;;;;:64;;;;;45801:20;:26;45822:4;45801:26;;;;;;;;;;;;;;;;;;;;;;;;;45800:27;45764:64;:95;;;;;45834:20;:24;45855:2;45834:24;;;;;;;;;;;;;;;;;;;;;;;;;45833:25;45764:95;45761:215;;;45893:23;;45883:6;:33;;45875:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;45761:215;45991:25;:29;46017:2;45991:29;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;;46026:20;:26;46047:4;46026:26;;;;;;;;;;;;;;;;;;;;;;;;;46025:27;45991:62;:93;;;;;46059:20;:24;46080:2;46059:24;;;;;;;;;;;;;;;;;;;;;;;;;46058:25;45991:93;45988:215;;;46118:24;;46108:6;:34;;46100:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;45988:215;46222:28;46253:24;46271:4;46253:9;:24::i;:::-;46222:55;;46298:24;46349:18;;46325:20;:42;;46298:69;;46404:19;:53;;;;;46441:16;;;;;;;;;;;46440:17;46404:53;:99;;;;;46474:25;:29;46500:2;46474:29;;;;;;;;;;;;;;;;;;;;;;;;;46404:99;:138;;;;;46521:21;;;;;;;;;;;46404:138;46387:230;;;46569:36;46584:20;46569:14;:36::i;:::-;46387:230;46719:19;:25;46739:4;46719:25;;;;;;;;;;;;;;;;;;;;;;;;;46718:26;:54;;;;;46749:19;:23;46769:2;46749:23;;;;;;;;;;;;;;;;;;;;;;;;;46748:24;46718:54;:87;;;;;46776:25;:29;46802:2;46776:29;;;;;;;;;;;;;;;;;;;;;;;;;46718:87;46715:455;;;46819:22;46844:33;46873:3;46844:24;46855:12;;46844:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;46819:58;;46892:20;46915:31;46942:3;46915:22;46926:10;;46915:6;:10;;:22;;;;:::i;:::-;:26;;:31;;;;:::i;:::-;46892:54;;46967:44;46978:32;46997:12;46978:14;:18;;:32;;;;:::i;:::-;46967:6;:10;;:44;;;;:::i;:::-;46958:53;;47026:52;47042:4;47056;47063:14;47026:15;:52::i;:::-;47094:50;47110:4;47116:13;;;;;;;;;;;47131:12;47094:15;:50::i;:::-;46807:363;;46715:455;47182:33;47198:4;47204:2;47208:6;47182:15;:33::i;:::-;45482:1743;;45369:1856;;;;:::o;17546:173::-;17602:16;17621:6;;;;;;;;;;;17602:25;;17647:8;17638:6;;:17;;;;;;;;;;;;;;;;;;17702:8;17671:40;;17692:8;17671:40;;;;;;;;;;;;17591:128;17546:173;:::o;44593:313::-;44719:5;44684:40;;:25;:31;44710:4;44684:31;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;44676:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;44835:5;44801:25;:31;44827:4;44801:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;44892:5;44858:40;;44886:4;44858:40;;;;;;;;;;;;44593:313;;:::o;10915:733::-;11073:1;11055:20;;:6;:20;;;;11047:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11157:1;11136:23;;:9;:23;;;;11128:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11212:47;11233:6;11241:9;11252:6;11212:20;:47::i;:::-;11272:21;11296:9;:17;11306:6;11296:17;;;;;;;;;;;;;;;;11272:41;;11349:6;11332:13;:23;;11324:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11470:6;11454:13;:22;11434:9;:17;11444:6;11434:17;;;;;;;;;;;;;;;:42;;;;11522:6;11498:9;:20;11508:9;11498:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;11563:9;11546:35;;11555:6;11546:35;;;11574:6;11546:35;;;;;;:::i;:::-;;;;;;;;11594:46;11614:6;11622:9;11633:6;11594:19;:46::i;:::-;11036:612;10915:733;;;:::o;47234:983::-;41364:4;41345:16;;:23;;;;;;;;;;;;;;;;;;47387:12:::1;47402:27;47427:1;47402:20;:24;;:27;;;;:::i;:::-;47387:42;;47440:17;47460:30;47485:4;47460:20;:24;;:30;;;;:::i;:::-;47440:50;;47768:22;47793:21;47768:46;;47859:22;47876:4;47859:16;:22::i;:::-;48012:18;48033:41;48059:14;48033:21;:25;;:41;;;;:::i;:::-;48012:62;;48124:35;48137:9;48148:10;48124:12;:35::i;:::-;48177:32;48192:4;48198:10;48177:32;;;;;;;:::i;:::-;;;;;;;;47308:909;;;;41410:5:::0;41391:16;;:24;;;;;;;;;;;;;;;;;;47234:983;:::o;28338:98::-;28396:7;28427:1;28423;:5;;;;:::i;:::-;28416:12;;28338:98;;;;:::o;28737:::-;28795:7;28826:1;28822;:5;;;;:::i;:::-;28815:12;;28737:98;;;;:::o;27600:::-;27658:7;27689:1;27685;:5;;;;:::i;:::-;27678:12;;27600:98;;;;:::o;27981:::-;28039:7;28070:1;28066;:5;;;;:::i;:::-;28059:12;;27981:98;;;;:::o;14676:125::-;;;;:::o;15405:124::-;;;;:::o;48225:704::-;48363:21;48401:1;48387:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48363:40;;48432:4;48414;48419:1;48414:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;48458:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48448:4;48453:1;48448:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;48549:11;48496:50;48514:4;48529:15;;;;;;;;;;;48496:9;:50::i;:::-;:64;48493:156;;;48575:62;48592:4;48607:15;;;;;;;;;;;48634:1;48625:11;48575:8;:62::i;:::-;48493:156;48687:15;;;;;;;;;;;:66;;;48768:11;48794:1;48838:4;48865;48885:15;48687:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48280:649;48225:704;:::o;48937:391::-;49058:15;;;;;;;;;;;:31;;;49097:9;49130:4;49150:11;49176:1;49219;49262:7;:5;:7::i;:::-;49284:15;49058:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;48937:391;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:307::-;790:1;800:113;814:6;811:1;808:13;800:113;;;899:1;894:3;890:11;884:18;880:1;875:3;871:11;864:39;836:2;833:1;829:10;824:15;;800:113;;;931:6;928:1;925:13;922:101;;;1011:1;1002:6;997:3;993:16;986:27;922:101;771:258;722:307;;;:::o;1035:102::-;1076:6;1127:2;1123:7;1118:2;1111:5;1107:14;1103:28;1093:38;;1035:102;;;:::o;1143:364::-;1231:3;1259:39;1292:5;1259:39;:::i;:::-;1314:71;1378:6;1373:3;1314:71;:::i;:::-;1307:78;;1394:52;1439:6;1434:3;1427:4;1420:5;1416:16;1394:52;:::i;:::-;1471:29;1493:6;1471:29;:::i;:::-;1466:3;1462:39;1455:46;;1235:272;1143:364;;;;:::o;1513:313::-;1626:4;1664:2;1653:9;1649:18;1641:26;;1713:9;1707:4;1703:20;1699:1;1688:9;1684:17;1677:47;1741:78;1814:4;1805:6;1741:78;:::i;:::-;1733:86;;1513:313;;;;:::o;1913:117::-;2022:1;2019;2012:12;2036:117;2145:1;2142;2135:12;2159:126;2196:7;2236:42;2229:5;2225:54;2214:65;;2159:126;;;:::o;2291:96::-;2328:7;2357:24;2375:5;2357:24;:::i;:::-;2346:35;;2291:96;;;:::o;2393:122::-;2466:24;2484:5;2466:24;:::i;:::-;2459:5;2456:35;2446:63;;2505:1;2502;2495:12;2446:63;2393:122;:::o;2521:139::-;2567:5;2605:6;2592:20;2583:29;;2621:33;2648:5;2621:33;:::i;:::-;2521:139;;;;:::o;2666:122::-;2739:24;2757:5;2739:24;:::i;:::-;2732:5;2729:35;2719:63;;2778:1;2775;2768:12;2719:63;2666:122;:::o;2794:139::-;2840:5;2878:6;2865:20;2856:29;;2894:33;2921:5;2894:33;:::i;:::-;2794:139;;;;:::o;2939:474::-;3007:6;3015;3064:2;3052:9;3043:7;3039:23;3035:32;3032:119;;;3070:79;;:::i;:::-;3032:119;3190:1;3215:53;3260:7;3251:6;3240:9;3236:22;3215:53;:::i;:::-;3205:63;;3161:117;3317:2;3343:53;3388:7;3379:6;3368:9;3364:22;3343:53;:::i;:::-;3333:63;;3288:118;2939:474;;;;;:::o;3419:90::-;3453:7;3496:5;3489:13;3482:21;3471:32;;3419:90;;;:::o;3515:109::-;3596:21;3611:5;3596:21;:::i;:::-;3591:3;3584:34;3515:109;;:::o;3630:210::-;3717:4;3755:2;3744:9;3740:18;3732:26;;3768:65;3830:1;3819:9;3815:17;3806:6;3768:65;:::i;:::-;3630:210;;;;:::o;3846:60::-;3874:3;3895:5;3888:12;;3846:60;;;:::o;3912:142::-;3962:9;3995:53;4013:34;4022:24;4040:5;4022:24;:::i;:::-;4013:34;:::i;:::-;3995:53;:::i;:::-;3982:66;;3912:142;;;:::o;4060:126::-;4110:9;4143:37;4174:5;4143:37;:::i;:::-;4130:50;;4060:126;;;:::o;4192:153::-;4269:9;4302:37;4333:5;4302:37;:::i;:::-;4289:50;;4192:153;;;:::o;4351:185::-;4465:64;4523:5;4465:64;:::i;:::-;4460:3;4453:77;4351:185;;:::o;4542:276::-;4662:4;4700:2;4689:9;4685:18;4677:26;;4713:98;4808:1;4797:9;4793:17;4784:6;4713:98;:::i;:::-;4542:276;;;;:::o;4824:619::-;4901:6;4909;4917;4966:2;4954:9;4945:7;4941:23;4937:32;4934:119;;;4972:79;;:::i;:::-;4934:119;5092:1;5117:53;5162:7;5153:6;5142:9;5138:22;5117:53;:::i;:::-;5107:63;;5063:117;5219:2;5245:53;5290:7;5281:6;5270:9;5266:22;5245:53;:::i;:::-;5235:63;;5190:118;5347:2;5373:53;5418:7;5409:6;5398:9;5394:22;5373:53;:::i;:::-;5363:63;;5318:118;4824:619;;;;;:::o;5449:86::-;5484:7;5524:4;5517:5;5513:16;5502:27;;5449:86;;;:::o;5541:112::-;5624:22;5640:5;5624:22;:::i;:::-;5619:3;5612:35;5541:112;;:::o;5659:214::-;5748:4;5786:2;5775:9;5771:18;5763:26;;5799:67;5863:1;5852:9;5848:17;5839:6;5799:67;:::i;:::-;5659:214;;;;:::o;5879:329::-;5938:6;5987:2;5975:9;5966:7;5962:23;5958:32;5955:119;;;5993:79;;:::i;:::-;5955:119;6113:1;6138:53;6183:7;6174:6;6163:9;6159:22;6138:53;:::i;:::-;6128:63;;6084:117;5879:329;;;;:::o;6214:118::-;6301:24;6319:5;6301:24;:::i;:::-;6296:3;6289:37;6214:118;;:::o;6338:222::-;6431:4;6469:2;6458:9;6454:18;6446:26;;6482:71;6550:1;6539:9;6535:17;6526:6;6482:71;:::i;:::-;6338:222;;;;:::o;6566:474::-;6634:6;6642;6691:2;6679:9;6670:7;6666:23;6662:32;6659:119;;;6697:79;;:::i;:::-;6659:119;6817:1;6842:53;6887:7;6878:6;6867:9;6863:22;6842:53;:::i;:::-;6832:63;;6788:117;6944:2;6970:53;7015:7;7006:6;6995:9;6991:22;6970:53;:::i;:::-;6960:63;;6915:118;6566:474;;;;;:::o;7046:116::-;7116:21;7131:5;7116:21;:::i;:::-;7109:5;7106:32;7096:60;;7152:1;7149;7142:12;7096:60;7046:116;:::o;7168:133::-;7211:5;7249:6;7236:20;7227:29;;7265:30;7289:5;7265:30;:::i;:::-;7168:133;;;;:::o;7307:468::-;7372:6;7380;7429:2;7417:9;7408:7;7404:23;7400:32;7397:119;;;7435:79;;:::i;:::-;7397:119;7555:1;7580:53;7625:7;7616:6;7605:9;7601:22;7580:53;:::i;:::-;7570:63;;7526:117;7682:2;7708:50;7750:7;7741:6;7730:9;7726:22;7708:50;:::i;:::-;7698:60;;7653:115;7307:468;;;;;:::o;7781:329::-;7840:6;7889:2;7877:9;7868:7;7864:23;7860:32;7857:119;;;7895:79;;:::i;:::-;7857:119;8015:1;8040:53;8085:7;8076:6;8065:9;8061:22;8040:53;:::i;:::-;8030:63;;7986:117;7781:329;;;;:::o;8116:117::-;8225:1;8222;8215:12;8239:117;8348:1;8345;8338:12;8362:117;8471:1;8468;8461:12;8502:568;8575:8;8585:6;8635:3;8628:4;8620:6;8616:17;8612:27;8602:122;;8643:79;;:::i;:::-;8602:122;8756:6;8743:20;8733:30;;8786:18;8778:6;8775:30;8772:117;;;8808:79;;:::i;:::-;8772:117;8922:4;8914:6;8910:17;8898:29;;8976:3;8968:4;8960:6;8956:17;8946:8;8942:32;8939:41;8936:128;;;8983:79;;:::i;:::-;8936:128;8502:568;;;;;:::o;9076:698::-;9168:6;9176;9184;9233:2;9221:9;9212:7;9208:23;9204:32;9201:119;;;9239:79;;:::i;:::-;9201:119;9387:1;9376:9;9372:17;9359:31;9417:18;9409:6;9406:30;9403:117;;;9439:79;;:::i;:::-;9403:117;9552:80;9624:7;9615:6;9604:9;9600:22;9552:80;:::i;:::-;9534:98;;;;9330:312;9681:2;9707:50;9749:7;9740:6;9729:9;9725:22;9707:50;:::i;:::-;9697:60;;9652:115;9076:698;;;;;:::o;9780:323::-;9836:6;9885:2;9873:9;9864:7;9860:23;9856:32;9853:119;;;9891:79;;:::i;:::-;9853:119;10011:1;10036:50;10078:7;10069:6;10058:9;10054:22;10036:50;:::i;:::-;10026:60;;9982:114;9780:323;;;;:::o;10109:474::-;10177:6;10185;10234:2;10222:9;10213:7;10209:23;10205:32;10202:119;;;10240:79;;:::i;:::-;10202:119;10360:1;10385:53;10430:7;10421:6;10410:9;10406:22;10385:53;:::i;:::-;10375:63;;10331:117;10487:2;10513:53;10558:7;10549:6;10538:9;10534:22;10513:53;:::i;:::-;10503:63;;10458:118;10109:474;;;;;:::o;10589:180::-;10637:77;10634:1;10627:88;10734:4;10731:1;10724:15;10758:4;10755:1;10748:15;10775:320;10819:6;10856:1;10850:4;10846:12;10836:22;;10903:1;10897:4;10893:12;10924:18;10914:81;;10980:4;10972:6;10968:17;10958:27;;10914:81;11042:2;11034:6;11031:14;11011:18;11008:38;11005:84;;;11061:18;;:::i;:::-;11005:84;10826:269;10775:320;;;:::o;11101:227::-;11241:34;11237:1;11229:6;11225:14;11218:58;11310:10;11305:2;11297:6;11293:15;11286:35;11101:227;:::o;11334:366::-;11476:3;11497:67;11561:2;11556:3;11497:67;:::i;:::-;11490:74;;11573:93;11662:3;11573:93;:::i;:::-;11691:2;11686:3;11682:12;11675:19;;11334:366;;;:::o;11706:419::-;11872:4;11910:2;11899:9;11895:18;11887:26;;11959:9;11953:4;11949:20;11945:1;11934:9;11930:17;11923:47;11987:131;12113:4;11987:131;:::i;:::-;11979:139;;11706:419;;;:::o;12131:180::-;12179:77;12176:1;12169:88;12276:4;12273:1;12266:15;12300:4;12297:1;12290:15;12317:305;12357:3;12376:20;12394:1;12376:20;:::i;:::-;12371:25;;12410:20;12428:1;12410:20;:::i;:::-;12405:25;;12564:1;12496:66;12492:74;12489:1;12486:81;12483:107;;;12570:18;;:::i;:::-;12483:107;12614:1;12611;12607:9;12600:16;;12317:305;;;;:::o;12628:182::-;12768:34;12764:1;12756:6;12752:14;12745:58;12628:182;:::o;12816:366::-;12958:3;12979:67;13043:2;13038:3;12979:67;:::i;:::-;12972:74;;13055:93;13144:3;13055:93;:::i;:::-;13173:2;13168:3;13164:12;13157:19;;12816:366;;;:::o;13188:419::-;13354:4;13392:2;13381:9;13377:18;13369:26;;13441:9;13435:4;13431:20;13427:1;13416:9;13412:17;13405:47;13469:131;13595:4;13469:131;:::i;:::-;13461:139;;13188:419;;;:::o;13613:227::-;13753:34;13749:1;13741:6;13737:14;13730:58;13822:10;13817:2;13809:6;13805:15;13798:35;13613:227;:::o;13846:366::-;13988:3;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14085:93;14174:3;14085:93;:::i;:::-;14203:2;14198:3;14194:12;14187:19;;13846:366;;;:::o;14218:419::-;14384:4;14422:2;14411:9;14407:18;14399:26;;14471:9;14465:4;14461:20;14457:1;14446:9;14442:17;14435:47;14499:131;14625:4;14499:131;:::i;:::-;14491:139;;14218:419;;;:::o;14643:298::-;14783:34;14779:1;14771:6;14767:14;14760:58;14852:34;14847:2;14839:6;14835:15;14828:59;14921:12;14916:2;14908:6;14904:15;14897:37;14643:298;:::o;14947:366::-;15089:3;15110:67;15174:2;15169:3;15110:67;:::i;:::-;15103:74;;15186:93;15275:3;15186:93;:::i;:::-;15304:2;15299:3;15295:12;15288:19;;14947:366;;;:::o;15319:419::-;15485:4;15523:2;15512:9;15508:18;15500:26;;15572:9;15566:4;15562:20;15558:1;15547:9;15543:17;15536:47;15600:131;15726:4;15600:131;:::i;:::-;15592:139;;15319:419;;;:::o;15744:224::-;15884:34;15880:1;15872:6;15868:14;15861:58;15953:7;15948:2;15940:6;15936:15;15929:32;15744:224;:::o;15974:366::-;16116:3;16137:67;16201:2;16196:3;16137:67;:::i;:::-;16130:74;;16213:93;16302:3;16213:93;:::i;:::-;16331:2;16326:3;16322:12;16315:19;;15974:366;;;:::o;16346:419::-;16512:4;16550:2;16539:9;16535:18;16527:26;;16599:9;16593:4;16589:20;16585:1;16574:9;16570:17;16563:47;16627:131;16753:4;16627:131;:::i;:::-;16619:139;;16346:419;;;:::o;16771:234::-;16911:34;16907:1;16899:6;16895:14;16888:58;16980:17;16975:2;16967:6;16963:15;16956:42;16771:234;:::o;17011:366::-;17153:3;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17250:93;17339:3;17250:93;:::i;:::-;17368:2;17363:3;17359:12;17352:19;;17011:366;;;:::o;17383:419::-;17549:4;17587:2;17576:9;17572:18;17564:26;;17636:9;17630:4;17626:20;17622:1;17611:9;17607:17;17600:47;17664:131;17790:4;17664:131;:::i;:::-;17656:139;;17383:419;;;:::o;17808:180::-;17856:77;17853:1;17846:88;17953:4;17950:1;17943:15;17977:4;17974:1;17967:15;17994:233;18033:3;18056:24;18074:5;18056:24;:::i;:::-;18047:33;;18102:66;18095:5;18092:77;18089:103;;;18172:18;;:::i;:::-;18089:103;18219:1;18212:5;18208:13;18201:20;;17994:233;;;:::o;18233:184::-;18332:11;18366:6;18361:3;18354:19;18406:4;18401:3;18397:14;18382:29;;18233:184;;;;:::o;18423:102::-;18492:4;18515:3;18507:11;;18423:102;;;:::o;18531:108::-;18608:24;18626:5;18608:24;:::i;:::-;18603:3;18596:37;18531:108;;:::o;18645:179::-;18714:10;18735:46;18777:3;18769:6;18735:46;:::i;:::-;18813:4;18808:3;18804:14;18790:28;;18645:179;;;;:::o;18830:122::-;18882:5;18907:39;18942:2;18937:3;18933:12;18928:3;18907:39;:::i;:::-;18898:48;;18830:122;;;;:::o;18958:115::-;19030:4;19062;19057:3;19053:14;19045:22;;18958:115;;;:::o;19109:699::-;19238:3;19261:86;19340:6;19335:3;19261:86;:::i;:::-;19254:93;;19371:58;19423:5;19371:58;:::i;:::-;19452:7;19483:1;19468:315;19493:6;19490:1;19487:13;19468:315;;;19563:42;19598:6;19589:7;19563:42;:::i;:::-;19625:63;19684:3;19669:13;19625:63;:::i;:::-;19618:70;;19711:62;19766:6;19711:62;:::i;:::-;19701:72;;19528:255;19515:1;19512;19508:9;19503:14;;19468:315;;;19472:14;19799:3;19792:10;;19243:565;;19109:699;;;;;:::o;19814:491::-;19989:4;20027:2;20016:9;20012:18;20004:26;;20076:9;20070:4;20066:20;20062:1;20051:9;20047:17;20040:47;20104:118;20217:4;20208:6;20200;20104:118;:::i;:::-;20096:126;;20232:66;20294:2;20283:9;20279:18;20270:6;20232:66;:::i;:::-;19814:491;;;;;;:::o;20311:225::-;20451:34;20447:1;20439:6;20435:14;20428:58;20520:8;20515:2;20507:6;20503:15;20496:33;20311:225;:::o;20542:366::-;20684:3;20705:67;20769:2;20764:3;20705:67;:::i;:::-;20698:74;;20781:93;20870:3;20781:93;:::i;:::-;20899:2;20894:3;20890:12;20883:19;;20542:366;;;:::o;20914:419::-;21080:4;21118:2;21107:9;21103:18;21095:26;;21167:9;21161:4;21157:20;21153:1;21142:9;21138:17;21131:47;21195:131;21321:4;21195:131;:::i;:::-;21187:139;;20914:419;;;:::o;21339:223::-;21479:34;21475:1;21467:6;21463:14;21456:58;21548:6;21543:2;21535:6;21531:15;21524:31;21339:223;:::o;21568:366::-;21710:3;21731:67;21795:2;21790:3;21731:67;:::i;:::-;21724:74;;21807:93;21896:3;21807:93;:::i;:::-;21925:2;21920:3;21916:12;21909:19;;21568:366;;;:::o;21940:419::-;22106:4;22144:2;22133:9;22129:18;22121:26;;22193:9;22187:4;22183:20;22179:1;22168:9;22164:17;22157:47;22221:131;22347:4;22221:131;:::i;:::-;22213:139;;21940:419;;;:::o;22365:221::-;22505:34;22501:1;22493:6;22489:14;22482:58;22574:4;22569:2;22561:6;22557:15;22550:29;22365:221;:::o;22592:366::-;22734:3;22755:67;22819:2;22814:3;22755:67;:::i;:::-;22748:74;;22831:93;22920:3;22831:93;:::i;:::-;22949:2;22944:3;22940:12;22933:19;;22592:366;;;:::o;22964:419::-;23130:4;23168:2;23157:9;23153:18;23145:26;;23217:9;23211:4;23207:20;23203:1;23192:9;23188:17;23181:47;23245:131;23371:4;23245:131;:::i;:::-;23237:139;;22964:419;;;:::o;23389:224::-;23529:34;23525:1;23517:6;23513:14;23506:58;23598:7;23593:2;23585:6;23581:15;23574:32;23389:224;:::o;23619:366::-;23761:3;23782:67;23846:2;23841:3;23782:67;:::i;:::-;23775:74;;23858:93;23947:3;23858:93;:::i;:::-;23976:2;23971:3;23967:12;23960:19;;23619:366;;;:::o;23991:419::-;24157:4;24195:2;24184:9;24180:18;24172:26;;24244:9;24238:4;24234:20;24230:1;24219:9;24215:17;24208:47;24272:131;24398:4;24272:131;:::i;:::-;24264:139;;23991:419;;;:::o;24416:222::-;24556:34;24552:1;24544:6;24540:14;24533:58;24625:5;24620:2;24612:6;24608:15;24601:30;24416:222;:::o;24644:366::-;24786:3;24807:67;24871:2;24866:3;24807:67;:::i;:::-;24800:74;;24883:93;24972:3;24883:93;:::i;:::-;25001:2;24996:3;24992:12;24985:19;;24644:366;;;:::o;25016:419::-;25182:4;25220:2;25209:9;25205:18;25197:26;;25269:9;25263:4;25259:20;25255:1;25244:9;25240:17;25233:47;25297:131;25423:4;25297:131;:::i;:::-;25289:139;;25016:419;;;:::o;25441:230::-;25581:34;25577:1;25569:6;25565:14;25558:58;25650:13;25645:2;25637:6;25633:15;25626:38;25441:230;:::o;25677:366::-;25819:3;25840:67;25904:2;25899:3;25840:67;:::i;:::-;25833:74;;25916:93;26005:3;25916:93;:::i;:::-;26034:2;26029:3;26025:12;26018:19;;25677:366;;;:::o;26049:419::-;26215:4;26253:2;26242:9;26238:18;26230:26;;26302:9;26296:4;26292:20;26288:1;26277:9;26273:17;26266:47;26330:131;26456:4;26330:131;:::i;:::-;26322:139;;26049:419;;;:::o;26474:231::-;26614:34;26610:1;26602:6;26598:14;26591:58;26683:14;26678:2;26670:6;26666:15;26659:39;26474:231;:::o;26711:366::-;26853:3;26874:67;26938:2;26933:3;26874:67;:::i;:::-;26867:74;;26950:93;27039:3;26950:93;:::i;:::-;27068:2;27063:3;27059:12;27052:19;;26711:366;;;:::o;27083:419::-;27249:4;27287:2;27276:9;27272:18;27264:26;;27336:9;27330:4;27326:20;27322:1;27311:9;27307:17;27300:47;27364:131;27490:4;27364:131;:::i;:::-;27356:139;;27083:419;;;:::o;27508:248::-;27648:34;27644:1;27636:6;27632:14;27625:58;27717:31;27712:2;27704:6;27700:15;27693:56;27508:248;:::o;27762:366::-;27904:3;27925:67;27989:2;27984:3;27925:67;:::i;:::-;27918:74;;28001:93;28090:3;28001:93;:::i;:::-;28119:2;28114:3;28110:12;28103:19;;27762:366;;;:::o;28134:419::-;28300:4;28338:2;28327:9;28323:18;28315:26;;28387:9;28381:4;28377:20;28373:1;28362:9;28358:17;28351:47;28415:131;28541:4;28415:131;:::i;:::-;28407:139;;28134:419;;;:::o;28559:225::-;28699:34;28695:1;28687:6;28683:14;28676:58;28768:8;28763:2;28755:6;28751:15;28744:33;28559:225;:::o;28790:366::-;28932:3;28953:67;29017:2;29012:3;28953:67;:::i;:::-;28946:74;;29029:93;29118:3;29029:93;:::i;:::-;29147:2;29142:3;29138:12;29131:19;;28790:366;;;:::o;29162:419::-;29328:4;29366:2;29355:9;29351:18;29343:26;;29415:9;29409:4;29405:20;29401:1;29390:9;29386:17;29379:47;29443:131;29569:4;29443:131;:::i;:::-;29435:139;;29162:419;;;:::o;29587:332::-;29708:4;29746:2;29735:9;29731:18;29723:26;;29759:71;29827:1;29816:9;29812:17;29803:6;29759:71;:::i;:::-;29840:72;29908:2;29897:9;29893:18;29884:6;29840:72;:::i;:::-;29587:332;;;;;:::o;29925:348::-;29965:7;29988:20;30006:1;29988:20;:::i;:::-;29983:25;;30022:20;30040:1;30022:20;:::i;:::-;30017:25;;30210:1;30142:66;30138:74;30135:1;30132:81;30127:1;30120:9;30113:17;30109:105;30106:131;;;30217:18;;:::i;:::-;30106:131;30265:1;30262;30258:9;30247:20;;29925:348;;;;:::o;30279:180::-;30327:77;30324:1;30317:88;30424:4;30421:1;30414:15;30448:4;30445:1;30438:15;30465:185;30505:1;30522:20;30540:1;30522:20;:::i;:::-;30517:25;;30556:20;30574:1;30556:20;:::i;:::-;30551:25;;30595:1;30585:35;;30600:18;;:::i;:::-;30585:35;30642:1;30639;30635:9;30630:14;;30465:185;;;;:::o;30656:191::-;30696:4;30716:20;30734:1;30716:20;:::i;:::-;30711:25;;30750:20;30768:1;30750:20;:::i;:::-;30745:25;;30789:1;30786;30783:8;30780:34;;;30794:18;;:::i;:::-;30780:34;30839:1;30836;30832:9;30824:17;;30656:191;;;;:::o;30853:180::-;30901:77;30898:1;30891:88;30998:4;30995:1;30988:15;31022:4;31019:1;31012:15;31039:143;31096:5;31127:6;31121:13;31112:22;;31143:33;31170:5;31143:33;:::i;:::-;31039:143;;;;:::o;31188:351::-;31258:6;31307:2;31295:9;31286:7;31282:23;31278:32;31275:119;;;31313:79;;:::i;:::-;31275:119;31433:1;31458:64;31514:7;31505:6;31494:9;31490:22;31458:64;:::i;:::-;31448:74;;31404:128;31188:351;;;;:::o;31545:85::-;31590:7;31619:5;31608:16;;31545:85;;;:::o;31636:158::-;31694:9;31727:61;31745:42;31754:32;31780:5;31754:32;:::i;:::-;31745:42;:::i;:::-;31727:61;:::i;:::-;31714:74;;31636:158;;;:::o;31800:147::-;31895:45;31934:5;31895:45;:::i;:::-;31890:3;31883:58;31800:147;;:::o;31953:114::-;32020:6;32054:5;32048:12;32038:22;;31953:114;;;:::o;32073:132::-;32140:4;32163:3;32155:11;;32193:4;32188:3;32184:14;32176:22;;32073:132;;;:::o;32211:113::-;32281:4;32313;32308:3;32304:14;32296:22;;32211:113;;;:::o;32360:732::-;32479:3;32508:54;32556:5;32508:54;:::i;:::-;32578:86;32657:6;32652:3;32578:86;:::i;:::-;32571:93;;32688:56;32738:5;32688:56;:::i;:::-;32767:7;32798:1;32783:284;32808:6;32805:1;32802:13;32783:284;;;32884:6;32878:13;32911:63;32970:3;32955:13;32911:63;:::i;:::-;32904:70;;32997:60;33050:6;32997:60;:::i;:::-;32987:70;;32843:224;32830:1;32827;32823:9;32818:14;;32783:284;;;32787:14;33083:3;33076:10;;32484:608;;;32360:732;;;;:::o;33098:831::-;33361:4;33399:3;33388:9;33384:19;33376:27;;33413:71;33481:1;33470:9;33466:17;33457:6;33413:71;:::i;:::-;33494:80;33570:2;33559:9;33555:18;33546:6;33494:80;:::i;:::-;33621:9;33615:4;33611:20;33606:2;33595:9;33591:18;33584:48;33649:108;33752:4;33743:6;33649:108;:::i;:::-;33641:116;;33767:72;33835:2;33824:9;33820:18;33811:6;33767:72;:::i;:::-;33849:73;33917:3;33906:9;33902:19;33893:6;33849:73;:::i;:::-;33098:831;;;;;;;;:::o;33935:807::-;34184:4;34222:3;34211:9;34207:19;34199:27;;34236:71;34304:1;34293:9;34289:17;34280:6;34236:71;:::i;:::-;34317:72;34385:2;34374:9;34370:18;34361:6;34317:72;:::i;:::-;34399:80;34475:2;34464:9;34460:18;34451:6;34399:80;:::i;:::-;34489;34565:2;34554:9;34550:18;34541:6;34489:80;:::i;:::-;34579:73;34647:3;34636:9;34632:19;34623:6;34579:73;:::i;:::-;34662;34730:3;34719:9;34715:19;34706:6;34662:73;:::i;:::-;33935:807;;;;;;;;;:::o;34748:143::-;34805:5;34836:6;34830:13;34821:22;;34852:33;34879:5;34852:33;:::i;:::-;34748:143;;;;:::o;34897:663::-;34985:6;34993;35001;35050:2;35038:9;35029:7;35025:23;35021:32;35018:119;;;35056:79;;:::i;:::-;35018:119;35176:1;35201:64;35257:7;35248:6;35237:9;35233:22;35201:64;:::i;:::-;35191:74;;35147:128;35314:2;35340:64;35396:7;35387:6;35376:9;35372:22;35340:64;:::i;:::-;35330:74;;35285:129;35453:2;35479:64;35535:7;35526:6;35515:9;35511:22;35479:64;:::i;:::-;35469:74;;35424:129;34897:663;;;;;:::o

Swarm Source

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