ETH Price: $3,695.92 (+1.16%)

Token

ERC-20: Torty (TORTY)
 

Overview

Max Total Supply

1,000,000,000 TORTY

Holders

293

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: TORTY 2
Balance
0.000000000014017716 TORTY

Value
$0.00
0x0539b68a4f2b1b3bc76365481a338a2f5ea77b3a
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:
Torty

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-07
*/

// SPDX-License-Identifier: MIT

pragma solidity =0.8.17;

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

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

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

    /**
     * @dev Returns the subtraction 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;
        }
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

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

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

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

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

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

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

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

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @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 {}
}

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

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

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

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

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

interface 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 IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

contract Torty is Context, ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private _uniswapV2Router;
    
    IERC20 private WrappedETH;

    mapping (address => uint) private _cooldown;
    mapping (address => uint) private _vestingCooldown;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;
    mapping (address => bool) private _isBlacklisted;

    bool public tradingOpen;
    bool private _swapping;
    bool public swapEnabled = false;
    bool public cooldownEnabled = false;
    bool public vestingCooldownEnabled = false;
    bool public feesEnabled = true;
    bool public transferFeesEnabled = true;
    bool public piPenaltyEnabled = true;

    uint256 private constant _tSupply = 1_000_000_000 ether;

    uint256 public maxBuyAmount = _tSupply;
    uint256 public maxSellAmount = _tSupply;
    uint256 public maxWalletAmount = _tSupply;

    uint256 public maxSellPercentage = 25;

    uint256 public tradingOpenBlock = 0;
    uint256 private _blocksToBlacklist = 0;
    uint256 private _cooldownBlocks = 1;
    uint256 private _vestingCooldownBlocks = 2390;

    uint256 public constant FEE_DIVISOR = 1000;
    uint256 public constant PENALTY_DIVISOR = 10;

    uint256 private _totalFees;
    uint256 private _mktgFee;
    uint256 private _devFee;
    uint256 private _buybackFee;

    uint256 public buyMktgFee = 20;
    uint256 private _previousBuyMktgFee = buyMktgFee;
    uint256 public buyDevFee = 20;
    uint256 private _previousBuyDevFee = buyDevFee;
    uint256 public buyBuybackFee = 10;
    uint256 private _previousBuyBuybackFee = buyBuybackFee;

    uint256 public sellMktgFee = 50;
    uint256 private _previousSellMktgFee = sellMktgFee;
    uint256 public sellDevFee = 50;
    uint256 private _previousSellDevFee = sellDevFee;
    uint256 public sellBuybackFee = 50;
    uint256 private _previousSellBuybackFee = sellBuybackFee;

    uint256 public transferMktgFee = 333;
    uint256 private _previousTransferMktgFee = transferMktgFee;
    uint256 public transferDevFee = 333;
    uint256 private _previousTransferDevFee = transferDevFee;
    uint256 public transferBuybackFee = 333;
    uint256 private _previousTransferBuybackFee = transferBuybackFee;

    uint256 public piPenaltyMultiplier24 = 15;
    uint256 public piPenaltyMultiplier46 = 20;
    uint256 public piPenaltyMultiplier68 = 25;
    uint256 public piPenaltyMultiplier810 = 30;
    uint256 public piPenaltyMultiplier10more = 35;

    uint256 private _tokensForMktg;
    uint256 private _tokensForDev;
    uint256 private _tokensForBuyback;
    uint256 private _swapTokensAtAmount = 0;

    address payable private _mktgWallet;
    address payable private _devWallet;
    address payable private _buybackWallet;

    address private _uniswapV2Pair;
    address constant private DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant private ZERO = 0x0000000000000000000000000000000000000000;

    enum TransactionType {
        BUY,
        SELL,
        TRANSFER
    }

    event OpenTrading(uint256 tradingOpenBlock, uint256 _blocksToBlacklist);
    event SetMaxBuyAmount(uint256 newMaxBuyAmount);
    event SetMaxSellAmount(uint256 newMaxSellAmount);
    event SetMaxWalletAmount(uint256 newMaxWalletAmount);
    event SetMaxSellPercentage(uint256 newMaxSellPercentage);
    event SetSwapTokensAtAmount(uint256 newSwapTokensAtAmount);
    event SetBuyFee(uint256 buyMktgFee, uint256 buyDevFee, uint256 buyBuybackFee);
	event SetSellFee(uint256 sellMktgFee, uint256 sellDevFee, uint256 sellBuybackFee);
    event SetTransferFee(uint256 transferMktgFee, uint256 transferDevFee, uint256 transferBuybackFee);
    event SetPenaltyMultiplier(uint256 piPenaltyMultiplier24, uint256 piPenaltyMultiplier46, uint256 piPenaltyMultiplier68, uint256 piPenaltyMultiplier810, uint256 piPenaltyMultiplier10more);
    
    constructor () ERC20("Torty", "TORTY") {
        _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _approve(address(this), address(_uniswapV2Router), _tSupply);
        _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        IERC20(_uniswapV2Pair).approve(address(_uniswapV2Router), type(uint).max);

        WrappedETH = IERC20(_uniswapV2Router.WETH());

        _mktgWallet = payable(owner());
        _devWallet = payable(owner());
        _buybackWallet = payable(owner());

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[DEAD] = true;

        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[DEAD] = true;

        _mint(owner(), _tSupply);
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != ZERO, "ERC20: transfer from the zero address");
        require(to != ZERO, "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool takeFee = true;
        TransactionType txType = (from == _uniswapV2Pair) ? TransactionType.BUY : (to == _uniswapV2Pair) ? TransactionType.SELL : TransactionType.TRANSFER;
        if (from != owner() && to != owner() && to != ZERO && to != DEAD && !_swapping) {
            require(!_isBlacklisted[from] && !_isBlacklisted[to], "Blacklisted.");

            if(!tradingOpen) require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not allowed yet.");

            if (cooldownEnabled) {
                if (to != address(_uniswapV2Router) && to != address(_uniswapV2Pair)) {
                    require(_cooldown[tx.origin] < block.number - _cooldownBlocks && _cooldown[to] < block.number - _cooldownBlocks, "Transfer delay enabled. Try again later.");
                    _cooldown[tx.origin] = block.number;
                    _cooldown[to] = block.number;
                }
            }

            if (txType == TransactionType.BUY && to != address(_uniswapV2Router) && !_isExcludedMaxTransactionAmount[to]) {
                require(amount <= maxBuyAmount, "Transfer amount exceeds the maxBuyAmount.");
                require(balanceOf(to) + amount <= maxWalletAmount, "Exceeds maximum wallet token amount.");
            }
            
            if (txType == TransactionType.SELL && from != address(_uniswapV2Router) && !_isExcludedMaxTransactionAmount[from]) {
                require(amount <= maxSellAmount, "Transfer amount exceeds the maxSellAmount.");
                require(amount <= balanceOf(from).mul(maxSellPercentage).div(100), "Transfer amount exceeds the maxSellPercentage.");

                if (vestingCooldownEnabled) {
                    if (from != address(_uniswapV2Router) && from != address(_uniswapV2Pair)) {
                        require(_vestingCooldown[tx.origin] < block.number - _vestingCooldownBlocks && _vestingCooldown[from] < block.number - _vestingCooldownBlocks, "You're vested. Try again later.");
                        _vestingCooldown[tx.origin] = block.number;
                        _vestingCooldown[from] = block.number;
                    }
                }

            }
        }

        if(_isExcludedFromFees[from] || _isExcludedFromFees[to] || !feesEnabled || (!transferFeesEnabled && txType == TransactionType.TRANSFER)) takeFee = false;

        uint256 contractBalance = balanceOf(address(this));
        bool canSwap = (contractBalance > _swapTokensAtAmount) && (txType == TransactionType.SELL);

        if (canSwap && swapEnabled && !_swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            _swapping = true;
            _swapBack(contractBalance);
            _swapping = false;
        }

        _tokenTransfer(from, to, amount, takeFee, txType);
    }

    function _swapBack(uint256 contractBalance) internal {
        uint256 totalTokensToSwap =  _tokensForMktg.add(_tokensForDev).add(_tokensForBuyback);
        bool success;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;

        if (contractBalance > _swapTokensAtAmount.mul(5)) contractBalance = _swapTokensAtAmount.mul(5);

        _swapTokensForETH(contractBalance);
        
        uint256 ethBalance = address(this).balance;
        uint256 ethForDev = ethBalance.mul(_tokensForDev).div(totalTokensToSwap);
        uint256 ethForBuyback = ethBalance.mul(_tokensForBuyback).div(totalTokensToSwap);
        
        _tokensForMktg = 0;
        _tokensForDev = 0;
        _tokensForBuyback = 0;

        (success,) = address(_devWallet).call{value: ethForDev}("");
        (success,) = address(_buybackWallet).call{value: ethForBuyback}("");
        (success,) = address(_mktgWallet).call{value: address(this).balance}("");
    }

    function _swapTokensForETH(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();
        _approve(address(this), address(_uniswapV2Router), tokenAmount);
        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
        
    function _sendETHToFee(uint256 amount) internal {
        _mktgWallet.transfer(amount.div(2));
        _devWallet.transfer(amount.div(2));
    }

    function isBlacklisted(address wallet) external view returns (bool) {
        return _isBlacklisted[wallet];
    }

    function openTrading(uint256 blocks) public onlyOwner {
        require(!tradingOpen, "Trading is already open");
        require(blocks <= 10, "Invalid blocks count.");
        maxBuyAmount = _tSupply.mul(2).div(1000);
        maxSellAmount = _tSupply.mul(1).div(1000);
        maxWalletAmount = _tSupply.mul(6).div(1000);
        maxSellPercentage = 25;
        _swapTokensAtAmount = _tSupply.mul(1).div(10000);
        swapEnabled = true;
        cooldownEnabled = true;
        vestingCooldownEnabled = true;
        tradingOpen = true;
        tradingOpenBlock = block.number;
        _blocksToBlacklist = blocks;
        emit OpenTrading(tradingOpenBlock, _blocksToBlacklist);
    }

    function setCooldownEnabled(bool onoff) public onlyOwner {
        cooldownEnabled = onoff;
    }

    function setVestingCooldownEnabled(bool onoff) public onlyOwner {
        vestingCooldownEnabled = onoff;
    }

    function setSwapEnabled(bool onoff) public onlyOwner {
        swapEnabled = onoff;
    }

    function setFeesEnabled(bool onoff) public onlyOwner {
        feesEnabled = onoff;
    }

    function setTransferFeesEnabled(bool onoff) public onlyOwner {
        transferFeesEnabled = onoff;
    }

    function setPIPenaltyEnabled(bool onoff) public onlyOwner {
        piPenaltyEnabled = onoff;
    }

    function setMaxBuyAmount(uint256 _maxBuyAmount) public onlyOwner {
        require(_maxBuyAmount >= (totalSupply().mul(1).div(1000)), "Max buy amount cannot be lower than 0.1% total supply.");
        maxBuyAmount = _maxBuyAmount;
        emit SetMaxBuyAmount(maxBuyAmount);
    }

    function setMaxSellAmount(uint256 _maxSellAmount) public onlyOwner {
        require(_maxSellAmount >= (totalSupply().mul(1).div(1000)), "Max sell amount cannot be lower than 0.1% total supply.");
        maxSellAmount = _maxSellAmount;
        emit SetMaxSellAmount(maxSellAmount);
    }
    
    function setMaxWalletAmount(uint256 _maxWalletAmount) public onlyOwner {
        require(_maxWalletAmount >= (totalSupply().mul(1).div(1000)), "Max wallet amount cannot be lower than 0.1% total supply.");
        maxWalletAmount = _maxWalletAmount;
        emit SetMaxWalletAmount(maxWalletAmount);
    }

    function setMaxSellPercentage(uint256 _maxSellPercentage) public onlyOwner {
        require(_maxSellPercentage >= 1, "Max sell percentage cannot be lower than 1%.");
        maxSellPercentage = _maxSellPercentage;
        emit SetMaxSellPercentage(maxSellPercentage);
    }
    
    function setSwapTokensAtAmount(uint256 swapTokensAtAmount) public onlyOwner {
        require(swapTokensAtAmount >= (totalSupply().mul(1).div(100000)), "Swap amount cannot be lower than 0.001% total supply.");
        require(swapTokensAtAmount <= (totalSupply().mul(5).div(1000)), "Swap amount cannot be higher than 0.5% total supply.");
        _swapTokensAtAmount = swapTokensAtAmount;
        emit SetSwapTokensAtAmount(_swapTokensAtAmount);
    }

    function setMktgWallet(address mktgWallet) public onlyOwner {
        require(mktgWallet != ZERO, "_mktgWallet address cannot be 0");
        _isExcludedFromFees[_mktgWallet] = false;
        _isExcludedMaxTransactionAmount[_mktgWallet] = false;
        _mktgWallet = payable(mktgWallet);
        _isExcludedFromFees[_mktgWallet] = true;
        _isExcludedMaxTransactionAmount[_mktgWallet] = true;
    }

    function setDevWallet(address devWallet) public onlyOwner {
        require(devWallet != ZERO, "_devWallet address cannot be 0");
        _isExcludedFromFees[_devWallet] = false;
        _isExcludedMaxTransactionAmount[_devWallet] = false;
        _devWallet = payable(devWallet);
        _isExcludedFromFees[_devWallet] = true;
        _isExcludedMaxTransactionAmount[_devWallet] = true;
    }

    function setBuybackWallet(address buybackWallet) public onlyOwner {
        require(buybackWallet != ZERO, "_buybackWallet address cannot be 0");
        _isExcludedFromFees[_buybackWallet] = false;
        _isExcludedMaxTransactionAmount[_buybackWallet] = false;
        _buybackWallet = payable(buybackWallet);
        _isExcludedFromFees[_buybackWallet] = true;
        _isExcludedMaxTransactionAmount[_buybackWallet] = true;
    }

    function setExcludedFromFees(address[] memory accounts, bool isEx) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) _isExcludedFromFees[accounts[i]] = isEx;
    }
    
    function setExcludeFromMaxTransaction(address[] memory accounts, bool isEx) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) _isExcludedMaxTransactionAmount[accounts[i]] = isEx;
    }
    
    function setBlacklisted(address[] memory accounts, bool isBL) public onlyOwner {
        for (uint i = 0; i < accounts.length; i++) {
            if((accounts[i] != _uniswapV2Pair) && (accounts[i] != address(_uniswapV2Router)) && (accounts[i] != address(this))) _isBlacklisted[accounts[i]] = isBL;
        }
    }

    function setBuyFee(uint256 _buyMktgFee, uint256 _buyDevFee, uint256 _buyBuybackFee) public onlyOwner {
        require(_buyMktgFee.add(_buyDevFee).add(_buyBuybackFee) <= 125, "Must keep buy taxes below 12.5%");
        buyMktgFee = _buyMktgFee;
        buyDevFee = _buyDevFee;
        buyBuybackFee = _buyBuybackFee;
        emit SetBuyFee(buyMktgFee, buyDevFee, buyBuybackFee);
    }

    function setSellFee(uint256 _sellMktgFee, uint256 _sellDevFee, uint256 _sellBuybackFee) public onlyOwner {
        require(_sellMktgFee.add(_sellDevFee).add(_sellBuybackFee) <= 250, "Must keep sell taxes below 25%");
        sellMktgFee = _sellMktgFee;
        sellDevFee = _sellDevFee;
        sellBuybackFee = _sellBuybackFee;
        emit SetSellFee(sellMktgFee, sellDevFee, sellBuybackFee);
    }

    function setTransferFee(uint256 _transferMktgFee, uint256 _transferDevFee, uint256 _transferBuybackFee) public onlyOwner {
        require(_transferMktgFee.add(_transferDevFee).add(_transferBuybackFee) <= 999, "Must keep sell taxes below 99%");
        transferMktgFee = _transferMktgFee;
        transferDevFee = _transferDevFee;
        transferBuybackFee = _transferBuybackFee;
        emit SetTransferFee(transferMktgFee, transferDevFee, transferBuybackFee);
    }

    function setPIPenaltyMultiplier(uint256 _piPenaltyMultiplier24, uint256 _piPenaltyMultiplier46, uint256 _piPenaltyMultiplier68, uint256 _piPenaltyMultiplier810, uint256 _piPenaltyMultiplier10more) public onlyOwner {
        piPenaltyMultiplier24 = _piPenaltyMultiplier24;
        piPenaltyMultiplier46 = _piPenaltyMultiplier46;
        piPenaltyMultiplier68 = _piPenaltyMultiplier68;
        piPenaltyMultiplier810 = _piPenaltyMultiplier810;
        piPenaltyMultiplier10more = _piPenaltyMultiplier10more;
        emit SetPenaltyMultiplier(piPenaltyMultiplier24, piPenaltyMultiplier46, piPenaltyMultiplier68, piPenaltyMultiplier810, piPenaltyMultiplier10more);
    }

    function setCooldownBlocks(uint256 blocks) public onlyOwner {
        require(blocks <= 10, "Invalid blocks count.");
        _cooldownBlocks = blocks;
    }

    function setVestingCooldownBlocks(uint256 blocks) public onlyOwner {
        require(blocks <= 215040, "Invalid blocks count.");
        _vestingCooldownBlocks = blocks;
    }

    function _removeAllFee() internal {
        if (buyMktgFee == 0 && buyDevFee == 0 && buyBuybackFee == 0 && sellMktgFee == 0 && sellDevFee == 0 && sellBuybackFee == 0) return;

        _previousBuyMktgFee = buyMktgFee;
        _previousBuyDevFee = buyDevFee;
        _previousBuyBuybackFee = buyBuybackFee;
        _previousSellMktgFee = sellMktgFee;
        _previousSellDevFee = sellDevFee;
        _previousSellBuybackFee = sellBuybackFee;
        
        buyMktgFee = 0;
        buyDevFee = 0;
        buyBuybackFee = 0;
        sellMktgFee = 0;
        sellDevFee = 0;
        sellBuybackFee = 0;
    }
    
    function _restoreAllFee() internal {
        buyMktgFee = _previousBuyMktgFee;
        buyDevFee = _previousBuyDevFee;
        buyBuybackFee = _previousBuyBuybackFee;
        sellMktgFee = _previousSellMktgFee;
        sellDevFee = _previousSellDevFee;
        sellBuybackFee = _previousSellBuybackFee;
    }
        
    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee, TransactionType txType) internal {
        if (!takeFee) _removeAllFee();
        else amount = _takeFees(sender, amount, txType);

        super._transfer(sender, recipient, amount);
        
        if (!takeFee) _restoreAllFee();
    }

    function _takeFees(address sender, uint256 amount, TransactionType txType) internal returns (uint256) {
        if(tradingOpenBlock + _blocksToBlacklist >= block.number) _setBot();
        else if (txType == TransactionType.SELL) _setSell(amount);
        else if (txType == TransactionType.BUY) _setBuy();
        else if (txType == TransactionType.TRANSFER) _setTransfer();
        else revert("Invalid transaction type.");
        
        uint256 fees;
        if (_totalFees > 0) {
            fees = amount.mul(_totalFees).div(FEE_DIVISOR);
            _tokensForMktg += fees * _mktgFee / _totalFees;
            _tokensForDev += fees * _devFee / _totalFees;
            _tokensForBuyback += fees * _buybackFee / _totalFees;
        }

        if (fees > 0) super._transfer(sender, address(this), fees);

        return amount -= fees;
    }

    function _setBot() internal {
        _mktgFee = 333;
        _devFee = 333;
        _buybackFee = 333;
        _totalFees = _mktgFee.add(_devFee).add(_buybackFee);
    }

    function _setSell(uint256 amount) internal {
        _mktgFee = sellMktgFee;
        _devFee = sellDevFee;
        _buybackFee = sellBuybackFee;

        if(piPenaltyEnabled) {
            uint256 pi = getPriceImpact(amount);
            if(pi > 2 ether && pi <= 4 ether) {
                _mktgFee = _mktgFee.mul(piPenaltyMultiplier24).div(PENALTY_DIVISOR);
                _devFee = _devFee.mul(piPenaltyMultiplier24).div(PENALTY_DIVISOR);
                _buybackFee = _buybackFee.mul(piPenaltyMultiplier24).div(PENALTY_DIVISOR);
            } else if (pi > 4 ether && pi <= 6 ether) {
                _mktgFee = _mktgFee.mul(piPenaltyMultiplier46).div(PENALTY_DIVISOR);
                _devFee = _devFee.mul(piPenaltyMultiplier46).div(PENALTY_DIVISOR);
                _buybackFee = _buybackFee.mul(piPenaltyMultiplier46).div(PENALTY_DIVISOR);
            } else if (pi > 6 ether && pi <= 8 ether) {
                _mktgFee = _mktgFee.mul(piPenaltyMultiplier68).div(PENALTY_DIVISOR);
                _devFee = _devFee.mul(piPenaltyMultiplier68).div(PENALTY_DIVISOR);
                _buybackFee = _buybackFee.mul(piPenaltyMultiplier68).div(PENALTY_DIVISOR);
            } else if (pi > 8 ether && pi <= 10 ether) {
                _mktgFee = _mktgFee.mul(piPenaltyMultiplier810).div(PENALTY_DIVISOR);
                _devFee = _devFee.mul(piPenaltyMultiplier810).div(PENALTY_DIVISOR);
                _buybackFee = _buybackFee.mul(piPenaltyMultiplier810).div(PENALTY_DIVISOR);
            } else if (pi > 10 ether) {
                _mktgFee = _mktgFee.mul(piPenaltyMultiplier10more).div(PENALTY_DIVISOR);
                _devFee = _devFee.mul(piPenaltyMultiplier10more).div(PENALTY_DIVISOR);
                _buybackFee = _buybackFee.mul(piPenaltyMultiplier10more).div(PENALTY_DIVISOR);
            }
        }

        _totalFees = _mktgFee.add(_devFee).add(_buybackFee);
    }

    function _setBuy() internal {
        _mktgFee = buyMktgFee;
        _devFee = buyDevFee;
        _buybackFee = buyBuybackFee;
        _totalFees = _mktgFee.add(_devFee).add(_buybackFee);
    }

    function _setTransfer() internal {
        _mktgFee = transferMktgFee;
        _devFee = transferDevFee;
        _buybackFee = transferBuybackFee;
        _totalFees = _mktgFee.add(_devFee).add(_buybackFee);
    }
    
    function unclog() public onlyOwner {
        uint256 contractBalance = balanceOf(address(this));
        _swapTokensForETH(contractBalance);
    }
    
    function distributeFees() public onlyOwner {
        uint256 contractETHBalance = address(this).balance;
        _sendETHToFee(contractETHBalance);
    }

    function withdrawStuckETH() public onlyOwner {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

    function withdrawStuckTokens(address tkn) public onlyOwner {
        require(tkn != address(this), "Cannot withdraw own token");
        require(IERC20(tkn).balanceOf(address(this)) > 0, "No tokens");
        uint amount = IERC20(tkn).balanceOf(address(this));
        IERC20(tkn).transfer(msg.sender, amount);
    }

    function removeLimits() public onlyOwner {
        maxBuyAmount = _tSupply;
        maxSellAmount = _tSupply;
        maxWalletAmount = _tSupply;
        cooldownEnabled = false;
    }

    function getConstantProduct() public view returns (uint256) {
        uint256 balanceThis = balanceOf(_uniswapV2Pair);
        uint256 balanceETH = WrappedETH.balanceOf(_uniswapV2Pair);
        return balanceThis.mul(balanceETH);
    }

    function getTokenPrice() public view returns (uint256) {
        uint256 balanceThis = balanceOf(_uniswapV2Pair).div(1 ether);
        uint256 balanceETH = WrappedETH.balanceOf(_uniswapV2Pair);
        return balanceETH.div(balanceThis);
    }

    function getPriceImpact(uint256 amount) public view returns (uint256) {
        uint256 iBalanceThis = balanceOf(_uniswapV2Pair);
        uint256 iETH = WrappedETH.balanceOf(_uniswapV2Pair);

        uint256 newBalanceThis = iBalanceThis.add(amount);
        uint256 ethAmount = getConstantProduct().div(newBalanceThis);
        uint256 ethToReceive = iETH.sub(ethAmount);

        return ((ethToReceive.mul(100)) / ethAmount).mul(1 ether);
    }

    receive() external payable {}
    fallback() external payable {}

}

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":false,"internalType":"uint256","name":"tradingOpenBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blocksToBlacklist","type":"uint256"}],"name":"OpenTrading","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":false,"internalType":"uint256","name":"buyMktgFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyBuybackFee","type":"uint256"}],"name":"SetBuyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxBuyAmount","type":"uint256"}],"name":"SetMaxBuyAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxSellAmount","type":"uint256"}],"name":"SetMaxSellAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxSellPercentage","type":"uint256"}],"name":"SetMaxSellPercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWalletAmount","type":"uint256"}],"name":"SetMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"piPenaltyMultiplier24","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"piPenaltyMultiplier46","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"piPenaltyMultiplier68","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"piPenaltyMultiplier810","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"piPenaltyMultiplier10more","type":"uint256"}],"name":"SetPenaltyMultiplier","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellMktgFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellBuybackFee","type":"uint256"}],"name":"SetSellFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSwapTokensAtAmount","type":"uint256"}],"name":"SetSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferMktgFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferBuybackFee","type":"uint256"}],"name":"SetTransferFee","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PENALTY_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMktgFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConstantProduct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getPriceImpact","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piPenaltyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piPenaltyMultiplier10more","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piPenaltyMultiplier24","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piPenaltyMultiplier46","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piPenaltyMultiplier68","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piPenaltyMultiplier810","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMktgFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isBL","type":"bool"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyMktgFee","type":"uint256"},{"internalType":"uint256","name":"_buyDevFee","type":"uint256"},{"internalType":"uint256","name":"_buyBuybackFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"buybackWallet","type":"address"}],"name":"setBuybackWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setCooldownBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"setExcludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyAmount","type":"uint256"}],"name":"setMaxBuyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellAmount","type":"uint256"}],"name":"setMaxSellAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSellPercentage","type":"uint256"}],"name":"setMaxSellPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletAmount","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mktgWallet","type":"address"}],"name":"setMktgWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setPIPenaltyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_piPenaltyMultiplier24","type":"uint256"},{"internalType":"uint256","name":"_piPenaltyMultiplier46","type":"uint256"},{"internalType":"uint256","name":"_piPenaltyMultiplier68","type":"uint256"},{"internalType":"uint256","name":"_piPenaltyMultiplier810","type":"uint256"},{"internalType":"uint256","name":"_piPenaltyMultiplier10more","type":"uint256"}],"name":"setPIPenaltyMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellMktgFee","type":"uint256"},{"internalType":"uint256","name":"_sellDevFee","type":"uint256"},{"internalType":"uint256","name":"_sellBuybackFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapTokensAtAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferMktgFee","type":"uint256"},{"internalType":"uint256","name":"_transferDevFee","type":"uint256"},{"internalType":"uint256","name":"_transferBuybackFee","type":"uint256"}],"name":"setTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setTransferFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"setVestingCooldownBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setVestingCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpenBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferMktgFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclog","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingCooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tkn","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600d805467ffffffffffff000019166701010100000000001790556b033b2e3c9fd0803ce8000000600e819055600f8181556010919091556019601181905560006012819055601381905560016014908155610956601555601a819055601b819055601c819055601d819055600a601e818155601f9190915560326020819055602181905560228190556023818155602482905560259190915561014d6026819055602781905560288190556029819055602a819055602b55602c95909555602d91909155602e92909255602f91909155603091909155603455348015620000eb57600080fd5b5060405180604001604052806005815260200164546f72747960d81b81525060405180604001604052806005815260200164544f52545960d81b81525081600390816200013991906200082c565b5060046200014882826200082c565b505050620001656200015f6200053e60201b60201c565b62000542565b600680546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d908117909155620001a89030906b033b2e3c9fd0803ce800000062000594565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002229190620008f8565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000285573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ab9190620008f8565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002f9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031f9190620008f8565b603880546001600160a01b0319166001600160a01b0392831690811790915560065460405163095ea7b360e01b81529216600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ad91906200092a565b50600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000402573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004289190620008f8565b600780546001600160a01b03199081166001600160a01b0393841617909155600580546035805491851691841682179055603680548416821790556037805490931681179092556000918252600a60209081526040808420805460ff1990811660019081179092553080875283872080548316841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb8054831684179055855488168752600b9094528286208054821683179055928552908420805483168217905561dead9093527f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac34158054909116909217909155546200053891166b033b2e3c9fd0803ce8000000620006c0565b62000976565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316620005fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166200065f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620005f3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038216620007185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620005f3565b80600260008282546200072c91906200094e565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620007b357607f821691505b602082108103620007d457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200078357600081815260208120601f850160051c81016020861015620008035750805b601f850160051c820191505b8181101562000824578281556001016200080f565b505050505050565b81516001600160401b0381111562000848576200084862000788565b62000860816200085984546200079e565b84620007da565b602080601f8311600181146200089857600084156200087f5750858301515b600019600386901b1c1916600185901b17855562000824565b600085815260208120601f198616915b82811015620008c957888601518255948401946001909101908401620008a8565b5085821015620008e85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200090b57600080fd5b81516001600160a01b03811681146200092357600080fd5b9392505050565b6000602082840312156200093d57600080fd5b815180151581146200092357600080fd5b808201808211156200097057634e487b7160e01b600052601160045260246000fd5b92915050565b613cc080620009866000396000f3fe6080604052600436106104105760003560e01c80639062d96b1161021c578063c210b99d11610122578063e7c89232116100b0578063f503412011610077578063f503412014610be3578063f5648a4f14610c03578063f5a6682f14610c18578063fe575a8714610c38578063ffb54a9914610c7157005b8063e7c8923214610b42578063e99c9d0914610b62578063effb3c5314610b82578063f2fde38b14610ba3578063f34eb0b814610bc357005b8063dd62ed3e116100f4578063dd62ed3e14610aac578063dd77b7e614610acc578063e01af92c14610aec578063e167fdfc14610b0c578063e1baae1f14610b2257005b8063c210b99d14610a37578063cb96372814610a57578063d163364914610a77578063db207aa514610a9757005b8063a9059cbb116101aa578063b50bc4e611610171578063b50bc4e6146109bf578063b704a9f6146109e1578063bab65cb9146109f7578063bb57ad2014610a0c578063c0f17acd14610a2157005b8063a9059cbb14610928578063a985ceef14610948578063aa4bde2814610969578063abea3e7d1461097f578063afa4f3b21461099f57005b8063a0d82dc5116101ee578063a0d82dc51461088e578063a169465f146108a4578063a457c2d7146108c5578063a64e4f8a146108e5578063a901dd921461090857005b80639062d96b1461083757806395d89b411461084d5780639c3b4fdc146108625780639e93ad8e1461087857005b8063313ce5671161032157806367c45349116102af57806371dbdb671161027657806371dbdb67146107ae578063743fdd72146107c4578063751039fc146107e457806388e765ff146107f95780638da5cb5b1461080f57005b806367c453491461072e5780636ddd17131461074357806370a0823114610763578063715018a61461078357806371a515221461079857005b80634b94f50e116102f35780634b94f50e146106ad578063540ba552146106c2578063572aae38146106d85780635932ead1146106f857806366d602ae1461071857005b8063313ce567146106455780633950935114610661578063434339f314610681578063489638561461069757005b80631d0adc071161039e57806323b872dd1161037057806323b872dd146105b957806325519cf2146105d95780632600612a146105f957806327a14fc21461060f578063312394a01461062f57005b80631d0adc07146105435780631d865c30146105635780631f53ac021461058357806320f1f316146105a357005b806314394e88116103e257806314394e88146104b857806314626dc6146104d857806315f94bca146104f857806318160ddd1461050e5780631c62857f1461052357005b806306fdde0314610419578063095ea7b3146104445780630e23500e14610474578063105222f91461049857005b3661041757005b005b34801561042557600080fd5b5061042e610c8b565b60405161043b9190613742565b60405180910390f35b34801561045057600080fd5b5061046461045f3660046137b5565b610d1d565b604051901515815260200161043b565b34801561048057600080fd5b5061048a60125481565b60405190815260200161043b565b3480156104a457600080fd5b506104176104b3366004613810565b610d37565b3480156104c457600080fd5b506104176104d33660046138e7565b610dab565b3480156104e457600080fd5b506104176104f3366004613922565b610e22565b34801561050457600080fd5b5061048a602e5481565b34801561051a57600080fd5b5060025461048a565b34801561052f57600080fd5b5061041761053e36600461393b565b610e59565b34801561054f57600080fd5b5061041761055e366004613958565b610e83565b34801561056f57600080fd5b5061041761057e366004613975565b610f6a565b34801561058f57600080fd5b5061041761059e366004613958565b61102a565b3480156105af57600080fd5b5061048a60265481565b3480156105c557600080fd5b506104646105d43660046139a1565b611106565b3480156105e557600080fd5b506104176105f4366004613975565b61112a565b34801561060557600080fd5b5061048a602d5481565b34801561061b57600080fd5b5061041761062a366004613922565b6111dd565b34801561063b57600080fd5b5061048a60205481565b34801561065157600080fd5b506040516012815260200161043b565b34801561066d57600080fd5b5061046461067c3660046137b5565b6112b6565b34801561068d57600080fd5b5061048a60285481565b3480156106a357600080fd5b5061048a60305481565b3480156106b957600080fd5b5061048a6112d8565b3480156106ce57600080fd5b5061048a601e5481565b3480156106e457600080fd5b506104176106f336600461393b565b611389565b34801561070457600080fd5b5061041761071336600461393b565b6113b1565b34801561072457600080fd5b5061048a600f5481565b34801561073a57600080fd5b506104176113d7565b34801561074f57600080fd5b50600d546104649062010000900460ff1681565b34801561076f57600080fd5b5061048a61077e366004613958565b6113f8565b34801561078f57600080fd5b50610417611413565b3480156107a457600080fd5b5061048a60245481565b3480156107ba57600080fd5b5061048a602a5481565b3480156107d057600080fd5b506104176107df366004613958565b611427565b3480156107f057600080fd5b50610417611503565b34801561080557600080fd5b5061048a600e5481565b34801561081b57600080fd5b506005546040516001600160a01b03909116815260200161043b565b34801561084357600080fd5b5061048a602f5481565b34801561085957600080fd5b5061042e611534565b34801561086e57600080fd5b5061048a601c5481565b34801561088457600080fd5b5061048a6103e881565b34801561089a57600080fd5b5061048a60225481565b3480156108b057600080fd5b50600d5461046490600160381b900460ff1681565b3480156108d157600080fd5b506104646108e03660046137b5565b611543565b3480156108f157600080fd5b50600d546104649065010000000000900460ff1681565b34801561091457600080fd5b5061041761092336600461393b565b6115be565b34801561093457600080fd5b506104646109433660046137b5565b6115e8565b34801561095457600080fd5b50600d54610464906301000000900460ff1681565b34801561097557600080fd5b5061048a60105481565b34801561098b57600080fd5b5061041761099a366004613922565b6115f6565b3480156109ab57600080fd5b506104176109ba366004613922565b611699565b3480156109cb57600080fd5b50600d5461046490640100000000900460ff1681565b3480156109ed57600080fd5b5061048a60115481565b348015610a0357600080fd5b5061048a600a81565b348015610a1857600080fd5b506104176117d8565b348015610a2d57600080fd5b5061048a601a5481565b348015610a4357600080fd5b50610417610a52366004613922565b6117ea565b348015610a6357600080fd5b50610417610a72366004613958565b61181a565b348015610a8357600080fd5b50610417610a92366004613922565b6119fd565b348015610aa357600080fd5b5061048a611b54565b348015610ab857600080fd5b5061048a610ac73660046139e2565b611bf0565b348015610ad857600080fd5b50610417610ae736600461393b565b611c1b565b348015610af857600080fd5b50610417610b0736600461393b565b611c44565b348015610b1857600080fd5b5061048a602c5481565b348015610b2e57600080fd5b50610417610b3d366004613810565b611c68565b348015610b4e57600080fd5b50610417610b5d366004613975565b611d95565b348015610b6e57600080fd5b50610417610b7d366004613922565b611e49565b348015610b8e57600080fd5b50600d5461046490600160301b900460ff1681565b348015610baf57600080fd5b50610417610bbe366004613958565b611f0f565b348015610bcf57600080fd5b50610417610bde366004613922565b611f85565b348015610bef57600080fd5b5061048a610bfe366004613922565b612044565b348015610c0f57600080fd5b5061041761212f565b348015610c2457600080fd5b50610417610c33366004613810565b612184565b348015610c4457600080fd5b50610464610c53366004613958565b6001600160a01b03166000908152600c602052604090205460ff1690565b348015610c7d57600080fd5b50600d546104649060ff1681565b606060038054610c9a90613a1b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc690613a1b565b8015610d135780601f10610ce857610100808354040283529160200191610d13565b820191906000526020600020905b815481529060010190602001808311610cf657829003601f168201915b5050505050905090565b600033610d2b8185856121f3565b60019150505b92915050565b610d3f612317565b60005b8251811015610da65781600a6000858481518110610d6257610d62613a55565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610d9e81613a81565b915050610d42565b505050565b610db3612317565b602c859055602d849055602e839055602f8290556030819055604080518681526020810186905290810184905260608101839052608081018290527fb9d3c8ea24dc072e1666f7aa2bcd4af0fd4bdab5bcb724f2d7973c50a8e1a7e99060a00160405180910390a15050505050565b610e2a612317565b600a811115610e545760405162461bcd60e51b8152600401610e4b90613a9a565b60405180910390fd5b601455565b610e61612317565b600d8054911515600160381b0267ff0000000000000019909216919091179055565b610e8b612317565b6001600160a01b038116610eec5760405162461bcd60e51b815260206004820152602260248201527f5f6275796261636b57616c6c657420616464726573732063616e6e6f74206265604482015261020360f41b6064820152608401610e4b565b603780546001600160a01b039081166000908152600a60208181526040808420805460ff19908116909155865486168552600b80845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b610f72612317565b60fa610f8882610f828686612371565b90612371565b1115610fd65760405162461bcd60e51b815260206004820152601e60248201527f4d757374206b6565702073656c6c2074617865732062656c6f772032352500006044820152606401610e4b565b6020838155602283905560248290556040805185815291820184905281018290527f5ff33e060dbf96ff8c11eeadaaa320b34884dc8af8156d77ab6134d2bece22c3906060015b60405180910390a1505050565b611032612317565b6001600160a01b0381166110885760405162461bcd60e51b815260206004820152601e60248201527f5f64657657616c6c657420616464726573732063616e6e6f74206265203000006044820152606401610e4b565b603680546001600160a01b039081166000908152600a60208181526040808420805460ff19908116909155865486168552600b80845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b600033611114858285612384565b61111f8585856123f8565b506001949350505050565b611132612317565b607d61114282610f828686612371565b11156111905760405162461bcd60e51b815260206004820152601f60248201527f4d757374206b656570206275792074617865732062656c6f772031322e3525006044820152606401610e4b565b601a839055601c829055601e81905560408051848152602081018490529081018290527f4b44023290188702187818a2359a9d40279e516e5e9bbade40c321936a7736209060600161101d565b6111e5612317565b6112056103e86111ff60016111f960025490565b90612c70565b90612c7c565b81101561127a5760405162461bcd60e51b815260206004820152603960248201527f4d61782077616c6c657420616d6f756e742063616e6e6f74206265206c6f776560448201527f72207468616e20302e312520746f74616c20737570706c792e000000000000006064820152608401610e4b565b60108190556040518181527f0176e9211818debdc4483c2bb0972798b7eb106239c8e465d4f1cee4ce5ae6e7906020015b60405180910390a150565b600033610d2b8185856112c98383611bf0565b6112d39190613ac9565b6121f3565b603854600090819061130090670de0b6b3a7640000906111ff906001600160a01b03166113f8565b6007546038546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113769190613adc565b90506113828183612c7c565b9250505090565b611391612317565b600d80549115156401000000000264ff0000000019909216919091179055565b6113b9612317565b600d805491151563010000000263ff00000019909216919091179055565b6113df612317565b60006113ea306113f8565b90506113f581612c88565b50565b6001600160a01b031660009081526020819052604090205490565b61141b612317565b6114256000612de2565b565b61142f612317565b6001600160a01b0381166114855760405162461bcd60e51b815260206004820152601f60248201527f5f6d6b746757616c6c657420616464726573732063616e6e6f742062652030006044820152606401610e4b565b603580546001600160a01b039081166000908152600a60208181526040808420805460ff19908116909155865486168552600b80845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b61150b612317565b6b033b2e3c9fd0803ce8000000600e819055600f819055601055600d805463ff00000019169055565b606060048054610c9a90613a1b565b600033816115518286611bf0565b9050838110156115b15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4b565b61111f82868684036121f3565b6115c6612317565b600d8054911515650100000000000265ff000000000019909216919091179055565b600033610d2b8185856123f8565b6115fe612317565b60018110156116645760405162461bcd60e51b815260206004820152602c60248201527f4d61782073656c6c2070657263656e746167652063616e6e6f74206265206c6f60448201526b3bb2b9103a3430b71018929760a11b6064820152608401610e4b565b60118190556040518181527fcc8d28739582b7ded93f9620fccebe60e934ae493eca4624324f9e28626fe6d8906020016112ab565b6116a1612317565b6116b6620186a06111ff60016111f960025490565b8110156117235760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610e4b565b6117376103e86111ff60056111f960025490565b8111156117a35760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610e4b565b60348190556040518181527f09e89af7cbd8410d0ad2a74ab3cc8d9ddeef8ab1177f0f8a1984d355bb9d78f1906020016112ab565b6117e0612317565b476113f581612e34565b6117f2612317565b620348008111156118155760405162461bcd60e51b8152600401610e4b90613a9a565b601555565b611822612317565b306001600160a01b0382160361187a5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177206f776e20746f6b656e000000000000006044820152606401610e4b565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e59190613adc565b1161191e5760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610e4b565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611965573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119899190613adc565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da69190613af5565b611a05612317565b600d5460ff1615611a585760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610e4b565b600a811115611a795760405162461bcd60e51b8152600401610e4b90613a9a565b611a966103e86111ff6b033b2e3c9fd0803ce80000006002612c70565b600e55611ab66103e86111ff6b033b2e3c9fd0803ce80000006001612c70565b600f55611ad66103e86111ff6b033b2e3c9fd0803ce80000006006612c70565b6010556019601155611afb6127106111ff6b033b2e3c9fd0803ce80000006001612c70565b603455600d805464ffffff00ff1916640101010001179055436012819055601382905560408051918252602082018390527f8d3438059bb853597d71f33faf1d080795f797da60ef1c460fe5849903c24adb91016112ab565b6038546000908190611b6e906001600160a01b03166113f8565b6007546038546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015611bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be49190613adc565b90506113828282612c70565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611c23612317565b600d8054911515600160301b0266ff00000000000019909216919091179055565b611c4c612317565b600d8054911515620100000262ff000019909216919091179055565b611c70612317565b60005b8251811015610da65760385483516001600160a01b0390911690849083908110611c9f57611c9f613a55565b60200260200101516001600160a01b031614158015611cf0575060065483516001600160a01b0390911690849083908110611cdc57611cdc613a55565b60200260200101516001600160a01b031614155b8015611d275750306001600160a01b0316838281518110611d1357611d13613a55565b60200260200101516001600160a01b031614155b15611d835781600c6000858481518110611d4357611d43613a55565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80611d8d81613a81565b915050611c73565b611d9d612317565b6103e7611dae82610f828686612371565b1115611dfc5760405162461bcd60e51b815260206004820152601e60248201527f4d757374206b6565702073656c6c2074617865732062656c6f772039392500006044820152606401610e4b565b60268390556028829055602a81905560408051848152602081018490529081018290527f0a1ca1cf020cce18eb2c1acd1eb2fbb0911b33f048c9592de691823a416a94bb9060600161101d565b611e51612317565b611e656103e86111ff60016111f960025490565b811015611eda5760405162461bcd60e51b815260206004820152603760248201527f4d61782073656c6c20616d6f756e742063616e6e6f74206265206c6f7765722060448201527f7468616e20302e312520746f74616c20737570706c792e0000000000000000006064820152608401610e4b565b600f8190556040518181527fa37090cc2feed4f3799a43ad59e5dab1cb6e70a7c1be92b72dbf9610550d5ac8906020016112ab565b611f17612317565b6001600160a01b038116611f7c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e4b565b6113f581612de2565b611f8d612317565b611fa16103e86111ff60016111f960025490565b81101561200f5760405162461bcd60e51b815260206004820152603660248201527f4d61782062757920616d6f756e742063616e6e6f74206265206c6f77657220746044820152753430b71018171892903a37ba30b61039bab838363c9760511b6064820152608401610e4b565b600e8190556040518181527f3a0b1f960db2351f13a6a83576ad81b35de3396cf92b9150216f2a6eea641d9a906020016112ab565b603854600090819061205e906001600160a01b03166113f8565b6007546038546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d49190613adc565b905060006120e28386612371565b905060006120f2826111ff611b54565b905060006121008483612ebd565b9050612124670de0b6b3a76400008361211a846064612c70565b6111f99190613b12565b979650505050505050565b612137612317565b604051600090339047908381818185875af1925050503d8060008114612179576040519150601f19603f3d011682016040523d82523d6000602084013e61217e565b606091505b50505050565b61218c612317565b60005b8251811015610da65781600b60008584815181106121af576121af613a55565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806121eb81613a81565b91505061218f565b6001600160a01b0383166122555760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4b565b6001600160a01b0382166122b65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146114255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e4b565b600061237d8284613ac9565b9392505050565b60006123908484611bf0565b9050600019811461217e57818110156123eb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4b565b61217e84848484036121f3565b6001600160a01b03831661241e5760405162461bcd60e51b8152600401610e4b90613b34565b6001600160a01b0382166124445760405162461bcd60e51b8152600401610e4b90613b79565b600081116124a65760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e4b565b6038546001906000906001600160a01b038681169116146124e4576038546001600160a01b038581169116146124dd5760026124e7565b60016124e7565b60005b90506124fb6005546001600160a01b031690565b6001600160a01b0316856001600160a01b03161415801561252a57506005546001600160a01b03858116911614155b801561253e57506001600160a01b03841615155b801561255557506001600160a01b03841661dead14155b80156125695750600d54610100900460ff16155b15612afa576001600160a01b0385166000908152600c602052604090205460ff161580156125b057506001600160a01b0384166000908152600c602052604090205460ff16155b6125eb5760405162461bcd60e51b815260206004820152600c60248201526b213630b1b5b634b9ba32b21760a11b6044820152606401610e4b565b600d5460ff16612680576001600160a01b0385166000908152600a602052604090205460ff168061263457506001600160a01b0384166000908152600a602052604090205460ff165b6126805760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420616c6c6f776564207965742e00000000006044820152606401610e4b565b600d546301000000900460ff1615612792576006546001600160a01b038581169116148015906126be57506038546001600160a01b03858116911614155b15612792576014546126d09043613bbc565b3260009081526008602052604090205410801561271057506014546126f59043613bbc565b6001600160a01b038516600090815260086020526040902054105b61276d5760405162461bcd60e51b815260206004820152602860248201527f5472616e736665722064656c617920656e61626c65642e20547279206167616960448201526737103630ba32b91760c11b6064820152608401610e4b565b3260009081526008602052604080822043908190556001600160a01b03871683529120555b60008160028111156127a6576127a6613bcf565b1480156127c157506006546001600160a01b03858116911614155b80156127e657506001600160a01b0384166000908152600b602052604090205460ff16155b156128c057600e5483111561284f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178426044820152683abca0b6b7bab73a1760b91b6064820152608401610e4b565b6010548361285c866113f8565b6128669190613ac9565b11156128c05760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610e4b565b60018160028111156128d4576128d4613bcf565b1480156128ef57506006546001600160a01b03868116911614155b801561291457506001600160a01b0385166000908152600b602052604090205460ff16155b15612afa57600f5483111561297e5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526932b63620b6b7bab73a1760b11b6064820152608401610e4b565b61299260646111ff6011546111f9896113f8565b8311156129f85760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526d32b6362832b931b2b73a30b3b29760911b6064820152608401610e4b565b600d54640100000000900460ff1615612afa576006546001600160a01b03868116911614801590612a3757506038546001600160a01b03868116911614155b15612afa57601554612a499043613bbc565b32600090815260096020526040902054108015612a895750601554612a6e9043613bbc565b6001600160a01b038616600090815260096020526040902054105b612ad55760405162461bcd60e51b815260206004820152601f60248201527f596f75277265207665737465642e2054727920616761696e206c617465722e006044820152606401610e4b565b3260009081526009602052604080822043908190556001600160a01b03881683529120555b6001600160a01b0385166000908152600a602052604090205460ff1680612b3957506001600160a01b0384166000908152600a602052604090205460ff165b80612b505750600d5465010000000000900460ff16155b80612b815750600d54600160301b900460ff16158015612b8157506002816002811115612b7f57612b7f613bcf565b145b15612b8b57600091505b6000612b96306113f8565b9050600060345482118015612bbc57506001836002811115612bba57612bba613bcf565b145b9050808015612bd35750600d5462010000900460ff165b8015612be75750600d54610100900460ff16155b8015612c0c57506001600160a01b0387166000908152600a602052604090205460ff16155b8015612c3157506001600160a01b0386166000908152600a602052604090205460ff16155b15612c5a57600d805461ff001916610100179055612c4e82612ec9565b600d805461ff00191690555b612c678787878787613084565b50505050505050565b600061237d8284613be5565b600061237d8284613b12565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cbd57612cbd613a55565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3a9190613bfc565b81600181518110612d4d57612d4d613a55565b6001600160a01b039283166020918202929092010152600654612d7391309116846121f3565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612dac908590600090869030904290600401613c19565b600060405180830381600087803b158015612dc657600080fd5b505af1158015612dda573d6000803e3d6000fd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6035546001600160a01b03166108fc612e4e836002612c7c565b6040518115909202916000818181858888f19350505050158015612e76573d6000803e3d6000fd5b506036546001600160a01b03166108fc612e91836002612c7c565b6040518115909202916000818181858888f19350505050158015612eb9573d6000803e3d6000fd5b5050565b600061237d8284613bbc565b6000612ee8603354610f8260325460315461237190919063ffffffff16565b90506000821580612ef7575081155b15612f0157505050565b603454612f0f906005612c70565b831115612f2757603454612f24906005612c70565b92505b612f3083612c88565b60004790506000612f50846111ff60325485612c7090919063ffffffff16565b90506000612f6d856111ff60335486612c7090919063ffffffff16565b60006031819055603281905560338190556036546040519293506001600160a01b031691849181818185875af1925050503d8060008114612fca576040519150601f19603f3d011682016040523d82523d6000602084013e612fcf565b606091505b50506037546040519195506001600160a01b0316908290600081818185875af1925050503d806000811461301f576040519150601f19603f3d011682016040523d82523d6000602084013e613024565b606091505b50506035546040519195506001600160a01b0316904790600081818185875af1925050503d8060008114613074576040519150601f19603f3d011682016040523d82523d6000602084013e613079565b606091505b505050505050505050565b81613096576130916130e4565b6130a4565b6130a185848361316c565b92505b6130af85858561331b565b816130dd576130dd601b54601a55601d54601c55601f54601e55602154602055602354602255602554602455565b5050505050565b601a541580156130f45750601c54155b80156131005750601e54155b801561310c5750602054155b80156131185750602254155b80156131245750602454155b1561312b57565b601a8054601b55601c8054601d55601e8054601f55602080546021556022805460235560248054602555600095869055938590559184905583905582905555565b60004360135460125461317f9190613ac9565b106131915761318c613445565b61323d565b60018260028111156131a5576131a5613bcf565b036131b35761318c8361346a565b60008260028111156131c7576131c7613bcf565b036131d45761318c6136f2565b60028260028111156131e8576131e8613bcf565b036131f55761318c61371a565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207472616e73616374696f6e20747970652e000000000000006044820152606401610e4b565b601654600090156132f7576132636103e86111ff60165487612c7090919063ffffffff16565b9050601654601754826132769190613be5565b6132809190613b12565b603160008282546132919190613ac9565b90915550506016546018546132a69083613be5565b6132b09190613b12565b603260008282546132c19190613ac9565b90915550506016546019546132d69083613be5565b6132e09190613b12565b603360008282546132f19190613ac9565b90915550505b80156133085761330885308361331b565b6133128185613bbc565b95945050505050565b6001600160a01b0383166133415760405162461bcd60e51b8152600401610e4b90613b34565b6001600160a01b0382166133675760405162461bcd60e51b8152600401610e4b90613b79565b6001600160a01b038316600090815260208190526040902054818110156133df5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361217e565b61014d60178190556018819055601981905561346590610f828180612371565b601655565b602054601755602254601855602454601955600d54600160381b900460ff16156136cf57600061349982612044565b9050671bc16d674ec80000811180156134ba5750673782dace9d9000008111155b15613515576134db600a6111ff602c54601754612c7090919063ffffffff16565b601755602c546018546134f491600a916111ff91612c70565b601855602c5460195461350d91600a916111ff91612c70565b6019556136cd565b673782dace9d9000008111801561353457506753444835ec5800008111155b1561358757613555600a6111ff602d54601754612c7090919063ffffffff16565b601755602d5460185461356e91600a916111ff91612c70565b601855602d5460195461350d91600a916111ff91612c70565b6753444835ec580000811180156135a65750676f05b59d3b2000008111155b156135f9576135c7600a6111ff602e54601754612c7090919063ffffffff16565b601755602e546018546135e091600a916111ff91612c70565b601855602e5460195461350d91600a916111ff91612c70565b676f05b59d3b200000811180156136185750678ac7230489e800008111155b1561366b57613639600a6111ff602f54601754612c7090919063ffffffff16565b601755602f5460185461365291600a916111ff91612c70565b601855602f5460195461350d91600a916111ff91612c70565b678ac7230489e800008111156136cd57613697600a6111ff603054601754612c7090919063ffffffff16565b6017556030546018546136b091600a916111ff91612c70565b6018556030546019546136c991600a916111ff91612c70565b6019555b505b6136ec601954610f8260185460175461237190919063ffffffff16565b60165550565b601a546017819055601c546018819055601e546019819055613465929091610f829190612371565b60265460178190556028546018819055602a546019819055613465929091610f829190612371565b600060208083528351808285015260005b8181101561376f57858101830151858201604001528201613753565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113f557600080fd5b80356137b081613790565b919050565b600080604083850312156137c857600080fd5b82356137d381613790565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b80151581146113f557600080fd5b80356137b0816137f7565b6000806040838503121561382357600080fd5b823567ffffffffffffffff8082111561383b57600080fd5b818501915085601f83011261384f57600080fd5b8135602082821115613863576138636137e1565b8160051b604051601f19603f83011681018181108682111715613888576138886137e1565b6040529283528183019350848101820192898411156138a657600080fd5b948201945b838610156138cb576138bc866137a5565b855294820194938201936138ab565b96506138da9050878201613805565b9450505050509250929050565b600080600080600060a086880312156138ff57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60006020828403121561393457600080fd5b5035919050565b60006020828403121561394d57600080fd5b813561237d816137f7565b60006020828403121561396a57600080fd5b813561237d81613790565b60008060006060848603121561398a57600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156139b657600080fd5b83356139c181613790565b925060208401356139d181613790565b929592945050506040919091013590565b600080604083850312156139f557600080fd5b8235613a0081613790565b91506020830135613a1081613790565b809150509250929050565b600181811c90821680613a2f57607f821691505b602082108103613a4f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613a9357613a93613a6b565b5060010190565b60208082526015908201527424b73b30b634b210313637b1b5b99031b7bab73a1760591b604082015260600190565b80820180821115610d3157610d31613a6b565b600060208284031215613aee57600080fd5b5051919050565b600060208284031215613b0757600080fd5b815161237d816137f7565b600082613b2f57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d3157610d31613a6b565b634e487b7160e01b600052602160045260246000fd5b8082028115828204841417610d3157610d31613a6b565b600060208284031215613c0e57600080fd5b815161237d81613790565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613c695784516001600160a01b031683529383019391830191600101613c44565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122035d1e583217c9d9d38e32e39013dbdd3d3f07c2a2a7201c5ef96eea58178f4d164736f6c63430008110033

Deployed Bytecode

0x6080604052600436106104105760003560e01c80639062d96b1161021c578063c210b99d11610122578063e7c89232116100b0578063f503412011610077578063f503412014610be3578063f5648a4f14610c03578063f5a6682f14610c18578063fe575a8714610c38578063ffb54a9914610c7157005b8063e7c8923214610b42578063e99c9d0914610b62578063effb3c5314610b82578063f2fde38b14610ba3578063f34eb0b814610bc357005b8063dd62ed3e116100f4578063dd62ed3e14610aac578063dd77b7e614610acc578063e01af92c14610aec578063e167fdfc14610b0c578063e1baae1f14610b2257005b8063c210b99d14610a37578063cb96372814610a57578063d163364914610a77578063db207aa514610a9757005b8063a9059cbb116101aa578063b50bc4e611610171578063b50bc4e6146109bf578063b704a9f6146109e1578063bab65cb9146109f7578063bb57ad2014610a0c578063c0f17acd14610a2157005b8063a9059cbb14610928578063a985ceef14610948578063aa4bde2814610969578063abea3e7d1461097f578063afa4f3b21461099f57005b8063a0d82dc5116101ee578063a0d82dc51461088e578063a169465f146108a4578063a457c2d7146108c5578063a64e4f8a146108e5578063a901dd921461090857005b80639062d96b1461083757806395d89b411461084d5780639c3b4fdc146108625780639e93ad8e1461087857005b8063313ce5671161032157806367c45349116102af57806371dbdb671161027657806371dbdb67146107ae578063743fdd72146107c4578063751039fc146107e457806388e765ff146107f95780638da5cb5b1461080f57005b806367c453491461072e5780636ddd17131461074357806370a0823114610763578063715018a61461078357806371a515221461079857005b80634b94f50e116102f35780634b94f50e146106ad578063540ba552146106c2578063572aae38146106d85780635932ead1146106f857806366d602ae1461071857005b8063313ce567146106455780633950935114610661578063434339f314610681578063489638561461069757005b80631d0adc071161039e57806323b872dd1161037057806323b872dd146105b957806325519cf2146105d95780632600612a146105f957806327a14fc21461060f578063312394a01461062f57005b80631d0adc07146105435780631d865c30146105635780631f53ac021461058357806320f1f316146105a357005b806314394e88116103e257806314394e88146104b857806314626dc6146104d857806315f94bca146104f857806318160ddd1461050e5780631c62857f1461052357005b806306fdde0314610419578063095ea7b3146104445780630e23500e14610474578063105222f91461049857005b3661041757005b005b34801561042557600080fd5b5061042e610c8b565b60405161043b9190613742565b60405180910390f35b34801561045057600080fd5b5061046461045f3660046137b5565b610d1d565b604051901515815260200161043b565b34801561048057600080fd5b5061048a60125481565b60405190815260200161043b565b3480156104a457600080fd5b506104176104b3366004613810565b610d37565b3480156104c457600080fd5b506104176104d33660046138e7565b610dab565b3480156104e457600080fd5b506104176104f3366004613922565b610e22565b34801561050457600080fd5b5061048a602e5481565b34801561051a57600080fd5b5060025461048a565b34801561052f57600080fd5b5061041761053e36600461393b565b610e59565b34801561054f57600080fd5b5061041761055e366004613958565b610e83565b34801561056f57600080fd5b5061041761057e366004613975565b610f6a565b34801561058f57600080fd5b5061041761059e366004613958565b61102a565b3480156105af57600080fd5b5061048a60265481565b3480156105c557600080fd5b506104646105d43660046139a1565b611106565b3480156105e557600080fd5b506104176105f4366004613975565b61112a565b34801561060557600080fd5b5061048a602d5481565b34801561061b57600080fd5b5061041761062a366004613922565b6111dd565b34801561063b57600080fd5b5061048a60205481565b34801561065157600080fd5b506040516012815260200161043b565b34801561066d57600080fd5b5061046461067c3660046137b5565b6112b6565b34801561068d57600080fd5b5061048a60285481565b3480156106a357600080fd5b5061048a60305481565b3480156106b957600080fd5b5061048a6112d8565b3480156106ce57600080fd5b5061048a601e5481565b3480156106e457600080fd5b506104176106f336600461393b565b611389565b34801561070457600080fd5b5061041761071336600461393b565b6113b1565b34801561072457600080fd5b5061048a600f5481565b34801561073a57600080fd5b506104176113d7565b34801561074f57600080fd5b50600d546104649062010000900460ff1681565b34801561076f57600080fd5b5061048a61077e366004613958565b6113f8565b34801561078f57600080fd5b50610417611413565b3480156107a457600080fd5b5061048a60245481565b3480156107ba57600080fd5b5061048a602a5481565b3480156107d057600080fd5b506104176107df366004613958565b611427565b3480156107f057600080fd5b50610417611503565b34801561080557600080fd5b5061048a600e5481565b34801561081b57600080fd5b506005546040516001600160a01b03909116815260200161043b565b34801561084357600080fd5b5061048a602f5481565b34801561085957600080fd5b5061042e611534565b34801561086e57600080fd5b5061048a601c5481565b34801561088457600080fd5b5061048a6103e881565b34801561089a57600080fd5b5061048a60225481565b3480156108b057600080fd5b50600d5461046490600160381b900460ff1681565b3480156108d157600080fd5b506104646108e03660046137b5565b611543565b3480156108f157600080fd5b50600d546104649065010000000000900460ff1681565b34801561091457600080fd5b5061041761092336600461393b565b6115be565b34801561093457600080fd5b506104646109433660046137b5565b6115e8565b34801561095457600080fd5b50600d54610464906301000000900460ff1681565b34801561097557600080fd5b5061048a60105481565b34801561098b57600080fd5b5061041761099a366004613922565b6115f6565b3480156109ab57600080fd5b506104176109ba366004613922565b611699565b3480156109cb57600080fd5b50600d5461046490640100000000900460ff1681565b3480156109ed57600080fd5b5061048a60115481565b348015610a0357600080fd5b5061048a600a81565b348015610a1857600080fd5b506104176117d8565b348015610a2d57600080fd5b5061048a601a5481565b348015610a4357600080fd5b50610417610a52366004613922565b6117ea565b348015610a6357600080fd5b50610417610a72366004613958565b61181a565b348015610a8357600080fd5b50610417610a92366004613922565b6119fd565b348015610aa357600080fd5b5061048a611b54565b348015610ab857600080fd5b5061048a610ac73660046139e2565b611bf0565b348015610ad857600080fd5b50610417610ae736600461393b565b611c1b565b348015610af857600080fd5b50610417610b0736600461393b565b611c44565b348015610b1857600080fd5b5061048a602c5481565b348015610b2e57600080fd5b50610417610b3d366004613810565b611c68565b348015610b4e57600080fd5b50610417610b5d366004613975565b611d95565b348015610b6e57600080fd5b50610417610b7d366004613922565b611e49565b348015610b8e57600080fd5b50600d5461046490600160301b900460ff1681565b348015610baf57600080fd5b50610417610bbe366004613958565b611f0f565b348015610bcf57600080fd5b50610417610bde366004613922565b611f85565b348015610bef57600080fd5b5061048a610bfe366004613922565b612044565b348015610c0f57600080fd5b5061041761212f565b348015610c2457600080fd5b50610417610c33366004613810565b612184565b348015610c4457600080fd5b50610464610c53366004613958565b6001600160a01b03166000908152600c602052604090205460ff1690565b348015610c7d57600080fd5b50600d546104649060ff1681565b606060038054610c9a90613a1b565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc690613a1b565b8015610d135780601f10610ce857610100808354040283529160200191610d13565b820191906000526020600020905b815481529060010190602001808311610cf657829003601f168201915b5050505050905090565b600033610d2b8185856121f3565b60019150505b92915050565b610d3f612317565b60005b8251811015610da65781600a6000858481518110610d6257610d62613a55565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610d9e81613a81565b915050610d42565b505050565b610db3612317565b602c859055602d849055602e839055602f8290556030819055604080518681526020810186905290810184905260608101839052608081018290527fb9d3c8ea24dc072e1666f7aa2bcd4af0fd4bdab5bcb724f2d7973c50a8e1a7e99060a00160405180910390a15050505050565b610e2a612317565b600a811115610e545760405162461bcd60e51b8152600401610e4b90613a9a565b60405180910390fd5b601455565b610e61612317565b600d8054911515600160381b0267ff0000000000000019909216919091179055565b610e8b612317565b6001600160a01b038116610eec5760405162461bcd60e51b815260206004820152602260248201527f5f6275796261636b57616c6c657420616464726573732063616e6e6f74206265604482015261020360f41b6064820152608401610e4b565b603780546001600160a01b039081166000908152600a60208181526040808420805460ff19908116909155865486168552600b80845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b610f72612317565b60fa610f8882610f828686612371565b90612371565b1115610fd65760405162461bcd60e51b815260206004820152601e60248201527f4d757374206b6565702073656c6c2074617865732062656c6f772032352500006044820152606401610e4b565b6020838155602283905560248290556040805185815291820184905281018290527f5ff33e060dbf96ff8c11eeadaaa320b34884dc8af8156d77ab6134d2bece22c3906060015b60405180910390a1505050565b611032612317565b6001600160a01b0381166110885760405162461bcd60e51b815260206004820152601e60248201527f5f64657657616c6c657420616464726573732063616e6e6f74206265203000006044820152606401610e4b565b603680546001600160a01b039081166000908152600a60208181526040808420805460ff19908116909155865486168552600b80845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b600033611114858285612384565b61111f8585856123f8565b506001949350505050565b611132612317565b607d61114282610f828686612371565b11156111905760405162461bcd60e51b815260206004820152601f60248201527f4d757374206b656570206275792074617865732062656c6f772031322e3525006044820152606401610e4b565b601a839055601c829055601e81905560408051848152602081018490529081018290527f4b44023290188702187818a2359a9d40279e516e5e9bbade40c321936a7736209060600161101d565b6111e5612317565b6112056103e86111ff60016111f960025490565b90612c70565b90612c7c565b81101561127a5760405162461bcd60e51b815260206004820152603960248201527f4d61782077616c6c657420616d6f756e742063616e6e6f74206265206c6f776560448201527f72207468616e20302e312520746f74616c20737570706c792e000000000000006064820152608401610e4b565b60108190556040518181527f0176e9211818debdc4483c2bb0972798b7eb106239c8e465d4f1cee4ce5ae6e7906020015b60405180910390a150565b600033610d2b8185856112c98383611bf0565b6112d39190613ac9565b6121f3565b603854600090819061130090670de0b6b3a7640000906111ff906001600160a01b03166113f8565b6007546038546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015611352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113769190613adc565b90506113828183612c7c565b9250505090565b611391612317565b600d80549115156401000000000264ff0000000019909216919091179055565b6113b9612317565b600d805491151563010000000263ff00000019909216919091179055565b6113df612317565b60006113ea306113f8565b90506113f581612c88565b50565b6001600160a01b031660009081526020819052604090205490565b61141b612317565b6114256000612de2565b565b61142f612317565b6001600160a01b0381166114855760405162461bcd60e51b815260206004820152601f60248201527f5f6d6b746757616c6c657420616464726573732063616e6e6f742062652030006044820152606401610e4b565b603580546001600160a01b039081166000908152600a60208181526040808420805460ff19908116909155865486168552600b80845282862080548316905587546001600160a01b03191698871698891788559785529282528084208054841660019081179091559554909416835294909452208054909216179055565b61150b612317565b6b033b2e3c9fd0803ce8000000600e819055600f819055601055600d805463ff00000019169055565b606060048054610c9a90613a1b565b600033816115518286611bf0565b9050838110156115b15760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e4b565b61111f82868684036121f3565b6115c6612317565b600d8054911515650100000000000265ff000000000019909216919091179055565b600033610d2b8185856123f8565b6115fe612317565b60018110156116645760405162461bcd60e51b815260206004820152602c60248201527f4d61782073656c6c2070657263656e746167652063616e6e6f74206265206c6f60448201526b3bb2b9103a3430b71018929760a11b6064820152608401610e4b565b60118190556040518181527fcc8d28739582b7ded93f9620fccebe60e934ae493eca4624324f9e28626fe6d8906020016112ab565b6116a1612317565b6116b6620186a06111ff60016111f960025490565b8110156117235760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610e4b565b6117376103e86111ff60056111f960025490565b8111156117a35760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610e4b565b60348190556040518181527f09e89af7cbd8410d0ad2a74ab3cc8d9ddeef8ab1177f0f8a1984d355bb9d78f1906020016112ab565b6117e0612317565b476113f581612e34565b6117f2612317565b620348008111156118155760405162461bcd60e51b8152600401610e4b90613a9a565b601555565b611822612317565b306001600160a01b0382160361187a5760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177206f776e20746f6b656e000000000000006044820152606401610e4b565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156118c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e59190613adc565b1161191e5760405162461bcd60e51b81526020600482015260096024820152684e6f20746f6b656e7360b81b6044820152606401610e4b565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611965573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119899190613adc565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da69190613af5565b611a05612317565b600d5460ff1615611a585760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610e4b565b600a811115611a795760405162461bcd60e51b8152600401610e4b90613a9a565b611a966103e86111ff6b033b2e3c9fd0803ce80000006002612c70565b600e55611ab66103e86111ff6b033b2e3c9fd0803ce80000006001612c70565b600f55611ad66103e86111ff6b033b2e3c9fd0803ce80000006006612c70565b6010556019601155611afb6127106111ff6b033b2e3c9fd0803ce80000006001612c70565b603455600d805464ffffff00ff1916640101010001179055436012819055601382905560408051918252602082018390527f8d3438059bb853597d71f33faf1d080795f797da60ef1c460fe5849903c24adb91016112ab565b6038546000908190611b6e906001600160a01b03166113f8565b6007546038546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa158015611bc0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be49190613adc565b90506113828282612c70565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611c23612317565b600d8054911515600160301b0266ff00000000000019909216919091179055565b611c4c612317565b600d8054911515620100000262ff000019909216919091179055565b611c70612317565b60005b8251811015610da65760385483516001600160a01b0390911690849083908110611c9f57611c9f613a55565b60200260200101516001600160a01b031614158015611cf0575060065483516001600160a01b0390911690849083908110611cdc57611cdc613a55565b60200260200101516001600160a01b031614155b8015611d275750306001600160a01b0316838281518110611d1357611d13613a55565b60200260200101516001600160a01b031614155b15611d835781600c6000858481518110611d4357611d43613a55565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b80611d8d81613a81565b915050611c73565b611d9d612317565b6103e7611dae82610f828686612371565b1115611dfc5760405162461bcd60e51b815260206004820152601e60248201527f4d757374206b6565702073656c6c2074617865732062656c6f772039392500006044820152606401610e4b565b60268390556028829055602a81905560408051848152602081018490529081018290527f0a1ca1cf020cce18eb2c1acd1eb2fbb0911b33f048c9592de691823a416a94bb9060600161101d565b611e51612317565b611e656103e86111ff60016111f960025490565b811015611eda5760405162461bcd60e51b815260206004820152603760248201527f4d61782073656c6c20616d6f756e742063616e6e6f74206265206c6f7765722060448201527f7468616e20302e312520746f74616c20737570706c792e0000000000000000006064820152608401610e4b565b600f8190556040518181527fa37090cc2feed4f3799a43ad59e5dab1cb6e70a7c1be92b72dbf9610550d5ac8906020016112ab565b611f17612317565b6001600160a01b038116611f7c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e4b565b6113f581612de2565b611f8d612317565b611fa16103e86111ff60016111f960025490565b81101561200f5760405162461bcd60e51b815260206004820152603660248201527f4d61782062757920616d6f756e742063616e6e6f74206265206c6f77657220746044820152753430b71018171892903a37ba30b61039bab838363c9760511b6064820152608401610e4b565b600e8190556040518181527f3a0b1f960db2351f13a6a83576ad81b35de3396cf92b9150216f2a6eea641d9a906020016112ab565b603854600090819061205e906001600160a01b03166113f8565b6007546038546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d49190613adc565b905060006120e28386612371565b905060006120f2826111ff611b54565b905060006121008483612ebd565b9050612124670de0b6b3a76400008361211a846064612c70565b6111f99190613b12565b979650505050505050565b612137612317565b604051600090339047908381818185875af1925050503d8060008114612179576040519150601f19603f3d011682016040523d82523d6000602084013e61217e565b606091505b50505050565b61218c612317565b60005b8251811015610da65781600b60008584815181106121af576121af613a55565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806121eb81613a81565b91505061218f565b6001600160a01b0383166122555760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e4b565b6001600160a01b0382166122b65760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e4b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146114255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e4b565b600061237d8284613ac9565b9392505050565b60006123908484611bf0565b9050600019811461217e57818110156123eb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e4b565b61217e84848484036121f3565b6001600160a01b03831661241e5760405162461bcd60e51b8152600401610e4b90613b34565b6001600160a01b0382166124445760405162461bcd60e51b8152600401610e4b90613b79565b600081116124a65760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e4b565b6038546001906000906001600160a01b038681169116146124e4576038546001600160a01b038581169116146124dd5760026124e7565b60016124e7565b60005b90506124fb6005546001600160a01b031690565b6001600160a01b0316856001600160a01b03161415801561252a57506005546001600160a01b03858116911614155b801561253e57506001600160a01b03841615155b801561255557506001600160a01b03841661dead14155b80156125695750600d54610100900460ff16155b15612afa576001600160a01b0385166000908152600c602052604090205460ff161580156125b057506001600160a01b0384166000908152600c602052604090205460ff16155b6125eb5760405162461bcd60e51b815260206004820152600c60248201526b213630b1b5b634b9ba32b21760a11b6044820152606401610e4b565b600d5460ff16612680576001600160a01b0385166000908152600a602052604090205460ff168061263457506001600160a01b0384166000908152600a602052604090205460ff165b6126805760405162461bcd60e51b815260206004820152601b60248201527f54726164696e67206973206e6f7420616c6c6f776564207965742e00000000006044820152606401610e4b565b600d546301000000900460ff1615612792576006546001600160a01b038581169116148015906126be57506038546001600160a01b03858116911614155b15612792576014546126d09043613bbc565b3260009081526008602052604090205410801561271057506014546126f59043613bbc565b6001600160a01b038516600090815260086020526040902054105b61276d5760405162461bcd60e51b815260206004820152602860248201527f5472616e736665722064656c617920656e61626c65642e20547279206167616960448201526737103630ba32b91760c11b6064820152608401610e4b565b3260009081526008602052604080822043908190556001600160a01b03871683529120555b60008160028111156127a6576127a6613bcf565b1480156127c157506006546001600160a01b03858116911614155b80156127e657506001600160a01b0384166000908152600b602052604090205460ff16155b156128c057600e5483111561284f5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178426044820152683abca0b6b7bab73a1760b91b6064820152608401610e4b565b6010548361285c866113f8565b6128669190613ac9565b11156128c05760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610e4b565b60018160028111156128d4576128d4613bcf565b1480156128ef57506006546001600160a01b03868116911614155b801561291457506001600160a01b0385166000908152600b602052604090205460ff16155b15612afa57600f5483111561297e5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526932b63620b6b7bab73a1760b11b6064820152608401610e4b565b61299260646111ff6011546111f9896113f8565b8311156129f85760405162461bcd60e51b815260206004820152602e60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785360448201526d32b6362832b931b2b73a30b3b29760911b6064820152608401610e4b565b600d54640100000000900460ff1615612afa576006546001600160a01b03868116911614801590612a3757506038546001600160a01b03868116911614155b15612afa57601554612a499043613bbc565b32600090815260096020526040902054108015612a895750601554612a6e9043613bbc565b6001600160a01b038616600090815260096020526040902054105b612ad55760405162461bcd60e51b815260206004820152601f60248201527f596f75277265207665737465642e2054727920616761696e206c617465722e006044820152606401610e4b565b3260009081526009602052604080822043908190556001600160a01b03881683529120555b6001600160a01b0385166000908152600a602052604090205460ff1680612b3957506001600160a01b0384166000908152600a602052604090205460ff165b80612b505750600d5465010000000000900460ff16155b80612b815750600d54600160301b900460ff16158015612b8157506002816002811115612b7f57612b7f613bcf565b145b15612b8b57600091505b6000612b96306113f8565b9050600060345482118015612bbc57506001836002811115612bba57612bba613bcf565b145b9050808015612bd35750600d5462010000900460ff165b8015612be75750600d54610100900460ff16155b8015612c0c57506001600160a01b0387166000908152600a602052604090205460ff16155b8015612c3157506001600160a01b0386166000908152600a602052604090205460ff16155b15612c5a57600d805461ff001916610100179055612c4e82612ec9565b600d805461ff00191690555b612c678787878787613084565b50505050505050565b600061237d8284613be5565b600061237d8284613b12565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cbd57612cbd613a55565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3a9190613bfc565b81600181518110612d4d57612d4d613a55565b6001600160a01b039283166020918202929092010152600654612d7391309116846121f3565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612dac908590600090869030904290600401613c19565b600060405180830381600087803b158015612dc657600080fd5b505af1158015612dda573d6000803e3d6000fd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6035546001600160a01b03166108fc612e4e836002612c7c565b6040518115909202916000818181858888f19350505050158015612e76573d6000803e3d6000fd5b506036546001600160a01b03166108fc612e91836002612c7c565b6040518115909202916000818181858888f19350505050158015612eb9573d6000803e3d6000fd5b5050565b600061237d8284613bbc565b6000612ee8603354610f8260325460315461237190919063ffffffff16565b90506000821580612ef7575081155b15612f0157505050565b603454612f0f906005612c70565b831115612f2757603454612f24906005612c70565b92505b612f3083612c88565b60004790506000612f50846111ff60325485612c7090919063ffffffff16565b90506000612f6d856111ff60335486612c7090919063ffffffff16565b60006031819055603281905560338190556036546040519293506001600160a01b031691849181818185875af1925050503d8060008114612fca576040519150601f19603f3d011682016040523d82523d6000602084013e612fcf565b606091505b50506037546040519195506001600160a01b0316908290600081818185875af1925050503d806000811461301f576040519150601f19603f3d011682016040523d82523d6000602084013e613024565b606091505b50506035546040519195506001600160a01b0316904790600081818185875af1925050503d8060008114613074576040519150601f19603f3d011682016040523d82523d6000602084013e613079565b606091505b505050505050505050565b81613096576130916130e4565b6130a4565b6130a185848361316c565b92505b6130af85858561331b565b816130dd576130dd601b54601a55601d54601c55601f54601e55602154602055602354602255602554602455565b5050505050565b601a541580156130f45750601c54155b80156131005750601e54155b801561310c5750602054155b80156131185750602254155b80156131245750602454155b1561312b57565b601a8054601b55601c8054601d55601e8054601f55602080546021556022805460235560248054602555600095869055938590559184905583905582905555565b60004360135460125461317f9190613ac9565b106131915761318c613445565b61323d565b60018260028111156131a5576131a5613bcf565b036131b35761318c8361346a565b60008260028111156131c7576131c7613bcf565b036131d45761318c6136f2565b60028260028111156131e8576131e8613bcf565b036131f55761318c61371a565b60405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207472616e73616374696f6e20747970652e000000000000006044820152606401610e4b565b601654600090156132f7576132636103e86111ff60165487612c7090919063ffffffff16565b9050601654601754826132769190613be5565b6132809190613b12565b603160008282546132919190613ac9565b90915550506016546018546132a69083613be5565b6132b09190613b12565b603260008282546132c19190613ac9565b90915550506016546019546132d69083613be5565b6132e09190613b12565b603360008282546132f19190613ac9565b90915550505b80156133085761330885308361331b565b6133128185613bbc565b95945050505050565b6001600160a01b0383166133415760405162461bcd60e51b8152600401610e4b90613b34565b6001600160a01b0382166133675760405162461bcd60e51b8152600401610e4b90613b79565b6001600160a01b038316600090815260208190526040902054818110156133df5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e4b565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361217e565b61014d60178190556018819055601981905561346590610f828180612371565b601655565b602054601755602254601855602454601955600d54600160381b900460ff16156136cf57600061349982612044565b9050671bc16d674ec80000811180156134ba5750673782dace9d9000008111155b15613515576134db600a6111ff602c54601754612c7090919063ffffffff16565b601755602c546018546134f491600a916111ff91612c70565b601855602c5460195461350d91600a916111ff91612c70565b6019556136cd565b673782dace9d9000008111801561353457506753444835ec5800008111155b1561358757613555600a6111ff602d54601754612c7090919063ffffffff16565b601755602d5460185461356e91600a916111ff91612c70565b601855602d5460195461350d91600a916111ff91612c70565b6753444835ec580000811180156135a65750676f05b59d3b2000008111155b156135f9576135c7600a6111ff602e54601754612c7090919063ffffffff16565b601755602e546018546135e091600a916111ff91612c70565b601855602e5460195461350d91600a916111ff91612c70565b676f05b59d3b200000811180156136185750678ac7230489e800008111155b1561366b57613639600a6111ff602f54601754612c7090919063ffffffff16565b601755602f5460185461365291600a916111ff91612c70565b601855602f5460195461350d91600a916111ff91612c70565b678ac7230489e800008111156136cd57613697600a6111ff603054601754612c7090919063ffffffff16565b6017556030546018546136b091600a916111ff91612c70565b6018556030546019546136c991600a916111ff91612c70565b6019555b505b6136ec601954610f8260185460175461237190919063ffffffff16565b60165550565b601a546017819055601c546018819055601e546019819055613465929091610f829190612371565b60265460178190556028546018819055602a546019819055613465929091610f829190612371565b600060208083528351808285015260005b8181101561376f57858101830151858201604001528201613753565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113f557600080fd5b80356137b081613790565b919050565b600080604083850312156137c857600080fd5b82356137d381613790565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b80151581146113f557600080fd5b80356137b0816137f7565b6000806040838503121561382357600080fd5b823567ffffffffffffffff8082111561383b57600080fd5b818501915085601f83011261384f57600080fd5b8135602082821115613863576138636137e1565b8160051b604051601f19603f83011681018181108682111715613888576138886137e1565b6040529283528183019350848101820192898411156138a657600080fd5b948201945b838610156138cb576138bc866137a5565b855294820194938201936138ab565b96506138da9050878201613805565b9450505050509250929050565b600080600080600060a086880312156138ff57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60006020828403121561393457600080fd5b5035919050565b60006020828403121561394d57600080fd5b813561237d816137f7565b60006020828403121561396a57600080fd5b813561237d81613790565b60008060006060848603121561398a57600080fd5b505081359360208301359350604090920135919050565b6000806000606084860312156139b657600080fd5b83356139c181613790565b925060208401356139d181613790565b929592945050506040919091013590565b600080604083850312156139f557600080fd5b8235613a0081613790565b91506020830135613a1081613790565b809150509250929050565b600181811c90821680613a2f57607f821691505b602082108103613a4f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613a9357613a93613a6b565b5060010190565b60208082526015908201527424b73b30b634b210313637b1b5b99031b7bab73a1760591b604082015260600190565b80820180821115610d3157610d31613a6b565b600060208284031215613aee57600080fd5b5051919050565b600060208284031215613b0757600080fd5b815161237d816137f7565b600082613b2f57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610d3157610d31613a6b565b634e487b7160e01b600052602160045260246000fd5b8082028115828204841417610d3157610d31613a6b565b600060208284031215613c0e57600080fd5b815161237d81613790565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613c695784516001600160a01b031683529383019391830191600101613c44565b50506001600160a01b0396909616606085015250505060800152939250505056fea264697066735822122035d1e583217c9d9d38e32e39013dbdd3d3f07c2a2a7201c5ef96eea58178f4d164736f6c63430008110033

Deployed Bytecode Sourcemap

35058:24052:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15907:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18258:201;;;;;;;;;;-1:-1:-1;18258:201:0;;;;;:::i;:::-;;:::i;:::-;;;1327:14:1;;1320:22;1302:41;;1290:2;1275:18;18258:201:0;1162:187:1;36095:35:0;;;;;;;;;;;;;;;;;;;1500:25:1;;;1488:2;1473:18;36095:35:0;1354:177:1;49266:185:0;;;;;;;;;;-1:-1:-1;49266:185:0;;;;;:::i;:::-;;:::i;51300:673::-;;;;;;;;;;-1:-1:-1;51300:673:0;;;;;:::i;:::-;;:::i;51981:160::-;;;;;;;;;;-1:-1:-1;51981:160:0;;;;;:::i;:::-;;:::i;37515:41::-;;;;;;;;;;;;;;;;17027:108;;;;;;;;;;-1:-1:-1;17115:12:0;;17027:108;;46214:101;;;;;;;;;;-1:-1:-1;46214:101:0;;;;;:::i;:::-;;:::i;48817:441::-;;;;;;;;;;-1:-1:-1;48817:441:0;;;;;:::i;:::-;;:::i;50404:406::-;;;;;;;;;;-1:-1:-1;50404:406:0;;;;;:::i;:::-;;:::i;48408:401::-;;;;;;;;;;-1:-1:-1;48408:401:0;;;;;:::i;:::-;;:::i;37087:36::-;;;;;;;;;;;;;;;;19039:295;;;;;;;;;;-1:-1:-1;19039:295:0;;;;;:::i;:::-;;:::i;50006:390::-;;;;;;;;;;-1:-1:-1;50006:390:0;;;;;:::i;:::-;;:::i;37467:41::-;;;;;;;;;;;;;;;;46919:308;;;;;;;;;;-1:-1:-1;46919:308:0;;;;;:::i;:::-;;:::i;36794:31::-;;;;;;;;;;;;;;;;16869:93;;;;;;;;;;-1:-1:-1;16869:93:0;;16952:2;5186:36:1;;5174:2;5159:18;16869:93:0;5044:184:1;19743:238:0;;;;;;;;;;-1:-1:-1;19743:238:0;;;;;:::i;:::-;;:::i;37195:35::-;;;;;;;;;;;;;;;;37612:45;;;;;;;;;;;;;;;;58322:247;;;;;;;;;;;;;:::i;36691:33::-;;;;;;;;;;;;;;;;45780:113;;;;;;;;;;-1:-1:-1;45780:113:0;;;;;:::i;:::-;;:::i;45673:99::-;;;;;;;;;;-1:-1:-1;45673:99:0;;;;;:::i;:::-;;:::i;35953:39::-;;;;;;;;;;;;;;;;57058:149;;;;;;;;;;;;;:::i;35589:31::-;;;;;;;;;;-1:-1:-1;35589:31:0;;;;;;;;;;;17198:127;;;;;;;;;;-1:-1:-1;17198:127:0;;;;;:::i;:::-;;:::i;2670:103::-;;;;;;;;;;;;;:::i;36981:34::-;;;;;;;;;;;;;;;;37300:39;;;;;;;;;;;;;;;;47989:411;;;;;;;;;;-1:-1:-1;47989:411:0;;;;;:::i;:::-;;:::i;57878:189::-;;;;;;;;;;;;;:::i;35908:38::-;;;;;;;;;;;;;;;;2022:87;;;;;;;;;;-1:-1:-1;2095:6:0;;2022:87;;-1:-1:-1;;;;;2095:6:0;;;5379:51:1;;5367:2;5352:18;2022:87:0;5233:203:1;37563:42:0;;;;;;;;;;;;;;;;16126:104;;;;;;;;;;;;;:::i;36602:29::-;;;;;;;;;;;;;;;;36278:42;;;;;;;;;;;;36316:4;36278:42;;36889:30;;;;;;;;;;;;;;;;35800:35;;;;;;;;;;-1:-1:-1;35800:35:0;;;;-1:-1:-1;;;35800:35:0;;;;;;20484:436;;;;;;;;;;-1:-1:-1;20484:436:0;;;;;:::i;:::-;;:::i;35718:30::-;;;;;;;;;;-1:-1:-1;35718:30:0;;;;;;;;;;;46000:91;;;;;;;;;;-1:-1:-1;46000:91:0;;;;;:::i;:::-;;:::i;17531:193::-;;;;;;;;;;-1:-1:-1;17531:193:0;;;;;:::i;:::-;;:::i;35627:35::-;;;;;;;;;;-1:-1:-1;35627:35:0;;;;;;;;;;;35999:41;;;;;;;;;;;;;;;;47235:278;;;;;;;;;;-1:-1:-1;47235:278:0;;;;;:::i;:::-;;:::i;47525:456::-;;;;;;;;;;-1:-1:-1;47525:456:0;;;;;:::i;:::-;;:::i;35669:42::-;;;;;;;;;;-1:-1:-1;35669:42:0;;;;;;;;;;;36049:37;;;;;;;;;;;;;;;;36327:44;;;;;;;;;;;;36369:2;36327:44;;57219:156;;;;;;;;;;;;;:::i;36510:30::-;;;;;;;;;;;;;;;;52149:178;;;;;;;;;;-1:-1:-1;52149:178:0;;;;;:::i;:::-;;:::i;57549:321::-;;;;;;;;;;-1:-1:-1;57549:321:0;;;;;:::i;:::-;;:::i;44962:703::-;;;;;;;;;;-1:-1:-1;44962:703:0;;;;;:::i;:::-;;:::i;58075:239::-;;;;;;;;;;;;;:::i;17787:151::-;;;;;;;;;;-1:-1:-1;17787:151:0;;;;;:::i;:::-;;:::i;46099:107::-;;;;;;;;;;-1:-1:-1;46099:107:0;;;;;:::i;:::-;;:::i;45901:91::-;;;;;;;;;;-1:-1:-1;45901:91:0;;;;;:::i;:::-;;:::i;37419:41::-;;;;;;;;;;;;;;;;49681:317;;;;;;;;;;-1:-1:-1;49681:317:0;;;;;:::i;:::-;;:::i;50818:474::-;;;;;;;;;;-1:-1:-1;50818:474:0;;;;;:::i;:::-;;:::i;46615:292::-;;;;;;;;;;-1:-1:-1;46615:292:0;;;;;:::i;:::-;;:::i;35755:38::-;;;;;;;;;;-1:-1:-1;35755:38:0;;;;-1:-1:-1;;;35755:38:0;;;;;;2928:201;;;;;;;;;;-1:-1:-1;2928:201:0;;;;;:::i;:::-;;:::i;46323:284::-;;;;;;;;;;-1:-1:-1;46323:284:0;;;;;:::i;:::-;;:::i;58577:455::-;;;;;;;;;;-1:-1:-1;58577:455:0;;;;;:::i;:::-;;:::i;57383:158::-;;;;;;;;;;;;;:::i;49463:206::-;;;;;;;;;;-1:-1:-1;49463:206:0;;;;;:::i;:::-;;:::i;44838:116::-;;;;;;;;;;-1:-1:-1;44838:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;44924:22:0;44900:4;44924:22;;;:14;:22;;;;;;;;;44838:116;35530:23;;;;;;;;;;-1:-1:-1;35530:23:0;;;;;;;;15907:100;15961:13;15994:5;15987:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15907:100;:::o;18258:201::-;18341:4;739:10;18397:32;739:10;18413:7;18422:6;18397:8;:32::i;:::-;18447:4;18440:11;;;18258:201;;;;;:::o;49266:185::-;1908:13;:11;:13::i;:::-;49366:6:::1;49361:82;49382:8;:15;49378:1;:19;49361:82;;;49439:4;49404:19;:32;49424:8;49433:1;49424:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49404:32:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49404:32:0;:39;;-1:-1:-1;;49404:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49399:3;::::1;::::0;::::1;:::i;:::-;;;;49361:82;;;;49266:185:::0;;:::o;51300:673::-;1908:13;:11;:13::i;:::-;51525:21:::1;:46:::0;;;51582:21:::1;:46:::0;;;51639:21:::1;:46:::0;;;51696:22:::1;:48:::0;;;51755:25:::1;:54:::0;;;51825:140:::1;::::0;;6882:25:1;;;6938:2;6923:18;;6916:34;;;6966:18;;;6959:34;;;7024:2;7009:18;;7002:34;;;7067:3;7052:19;;7045:35;;;51825:140:0::1;::::0;6869:3:1;6854:19;51825:140:0::1;;;;;;;51300:673:::0;;;;;:::o;51981:160::-;1908:13;:11;:13::i;:::-;52070:2:::1;52060:6;:12;;52052:46;;;;-1:-1:-1::0;;;52052:46:0::1;;;;;;;:::i;:::-;;;;;;;;;52109:15;:24:::0;51981:160::o;46214:101::-;1908:13;:11;:13::i;:::-;46283:16:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;46283:24:0::1;-1:-1:-1::0;;46283:24:0;;::::1;::::0;;;::::1;::::0;;46214:101::o;48817:441::-;1908:13;:11;:13::i;:::-;-1:-1:-1;;;;;48902:21:0;::::1;48894:68;;;::::0;-1:-1:-1;;;48894:68:0;;7643:2:1;48894:68:0::1;::::0;::::1;7625:21:1::0;7682:2;7662:18;;;7655:30;7721:34;7701:18;;;7694:62;-1:-1:-1;;;7772:18:1;;;7765:32;7814:19;;48894:68:0::1;7441:398:1::0;48894:68:0::1;48993:14;::::0;;-1:-1:-1;;;;;48993:14:0;;::::1;49011:5;48973:35:::0;;;:19:::1;:35;::::0;;;;;;;:43;;-1:-1:-1;;48973:43:0;;::::1;::::0;;;49059:14;;;::::1;49027:47:::0;;:31:::1;:47:::0;;;;;;:55;;;::::1;::::0;;49093:39;;-1:-1:-1;;;;;;49093:39:0::1;::::0;;::::1;::::0;;::::1;::::0;;49143:35;;;;;;;;;:42;;;::::1;-1:-1:-1::0;49143:42:0;;::::1;::::0;;;49228:14;;;;::::1;49196:47:::0;;;;;;;:54;;;;::::1;;::::0;;48817:441::o;50404:406::-;1908:13;:11;:13::i;:::-;50582:3:::1;50528:50;50562:15:::0;50528:29:::1;:12:::0;50545:11;50528:16:::1;:29::i;:::-;:33:::0;::::1;:50::i;:::-;:57;;50520:100;;;::::0;-1:-1:-1;;;50520:100:0;;8046:2:1;50520:100:0::1;::::0;::::1;8028:21:1::0;8085:2;8065:18;;;8058:30;8124:32;8104:18;;;8097:60;8174:18;;50520:100:0::1;7844:354:1::0;50520:100:0::1;50631:11;:26:::0;;;50668:10:::1;:24:::0;;;50703:14:::1;:32:::0;;;50751:51:::1;::::0;;8405:25:1;;;8446:18;;;8439:34;;;8489:18;;8482:34;;;50751:51:0::1;::::0;8393:2:1;8378:18;50751:51:0::1;;;;;;;;50404:406:::0;;;:::o;48408:401::-;1908:13;:11;:13::i;:::-;-1:-1:-1;;;;;48485:17:0;::::1;48477:60;;;::::0;-1:-1:-1;;;48477:60:0;;8729:2:1;48477:60:0::1;::::0;::::1;8711:21:1::0;8768:2;8748:18;;;8741:30;8807:32;8787:18;;;8780:60;8857:18;;48477:60:0::1;8527:354:1::0;48477:60:0::1;48568:10;::::0;;-1:-1:-1;;;;;48568:10:0;;::::1;48582:5;48548:31:::0;;;:19:::1;:31;::::0;;;;;;;:39;;-1:-1:-1;;48548:39:0;;::::1;::::0;;;48630:10;;;::::1;48598:43:::0;;:31:::1;:43:::0;;;;;;:51;;;::::1;::::0;;48660:31;;-1:-1:-1;;;;;;48660:31:0::1;::::0;;::::1;::::0;;::::1;::::0;;48702;;;;;;;;;:38;;;::::1;-1:-1:-1::0;48702:38:0;;::::1;::::0;;;48783:10;;;;::::1;48751:43:::0;;;;;;;:50;;;;::::1;;::::0;;48408:401::o;19039:295::-;19170:4;739:10;19228:38;19244:4;739:10;19259:6;19228:15;:38::i;:::-;19277:27;19287:4;19293:2;19297:6;19277:9;:27::i;:::-;-1:-1:-1;19322:4:0;;19039:295;-1:-1:-1;;;;19039:295:0:o;50006:390::-;1908:13;:11;:13::i;:::-;50177:3:::1;50126:47;50158:14:::0;50126:27:::1;:11:::0;50142:10;50126:15:::1;:27::i;:47::-;:54;;50118:98;;;::::0;-1:-1:-1;;;50118:98:0;;9088:2:1;50118:98:0::1;::::0;::::1;9070:21:1::0;9127:2;9107:18;;;9100:30;9166:33;9146:18;;;9139:61;9217:18;;50118:98:0::1;8886:355:1::0;50118:98:0::1;50227:10;:24:::0;;;50262:9:::1;:22:::0;;;50295:13:::1;:30:::0;;;50341:47:::1;::::0;;8405:25:1;;;8461:2;8446:18;;8439:34;;;8489:18;;;8482:34;;;50341:47:0::1;::::0;8393:2:1;8378:18;50341:47:0::1;8203:319:1::0;46919:308:0;1908:13;:11;:13::i;:::-;47030:30:::1;47055:4;47030:20;47048:1;47030:13;17115:12:::0;;;17027:108;47030:13:::1;:17:::0;::::1;:20::i;:::-;:24:::0;::::1;:30::i;:::-;47009:16;:52;;47001:122;;;::::0;-1:-1:-1;;;47001:122:0;;9448:2:1;47001:122:0::1;::::0;::::1;9430:21:1::0;9487:2;9467:18;;;9460:30;9526:34;9506:18;;;9499:62;9597:27;9577:18;;;9570:55;9642:19;;47001:122:0::1;9246:421:1::0;47001:122:0::1;47134:15;:34:::0;;;47184:35:::1;::::0;1500:25:1;;;47184:35:0::1;::::0;1488:2:1;1473:18;47184:35:0::1;;;;;;;;46919:308:::0;:::o;19743:238::-;19831:4;739:10;19887:64;739:10;19903:7;19940:10;19912:25;739:10;19903:7;19912:9;:25::i;:::-;:38;;;;:::i;:::-;19887:8;:64::i;58322:247::-;58420:14;;58368:7;;;;58410:38;;58440:7;;58410:25;;-1:-1:-1;;;;;58420:14:0;58410:9;:25::i;:38::-;58480:10;;58501:14;;58480:36;;-1:-1:-1;;;58480:36:0;;-1:-1:-1;;;;;58501:14:0;;;58480:36;;;5379:51:1;58388:60:0;;-1:-1:-1;58459:18:0;;58480:10;;;:20;;5352:18:1;;58480:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58459:57;-1:-1:-1;58534:27:0;58459:57;58549:11;58534:14;:27::i;:::-;58527:34;;;;58322:247;:::o;45780:113::-;1908:13;:11;:13::i;:::-;45855:22:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45855:30:0;;::::1;::::0;;;::::1;::::0;;45780:113::o;45673:99::-;1908:13;:11;:13::i;:::-;45741:15:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45741:23:0;;::::1;::::0;;;::::1;::::0;;45673:99::o;57058:149::-;1908:13;:11;:13::i;:::-;57104:23:::1;57130:24;57148:4;57130:9;:24::i;:::-;57104:50;;57165:34;57183:15;57165:17;:34::i;:::-;57093:114;57058:149::o:0;17198:127::-;-1:-1:-1;;;;;17299:18:0;17272:7;17299:18;;;;;;;;;;;;17198:127::o;2670:103::-;1908:13;:11;:13::i;:::-;2735:30:::1;2762:1;2735:18;:30::i;:::-;2670:103::o:0;47989:411::-;1908:13;:11;:13::i;:::-;-1:-1:-1;;;;;48068:18:0;::::1;48060:62;;;::::0;-1:-1:-1;;;48060:62:0;;10193:2:1;48060:62:0::1;::::0;::::1;10175:21:1::0;10232:2;10212:18;;;10205:30;10271:33;10251:18;;;10244:61;10322:18;;48060:62:0::1;9991:355:1::0;48060:62:0::1;48153:11;::::0;;-1:-1:-1;;;;;48153:11:0;;::::1;48168:5;48133:32:::0;;;:19:::1;:32;::::0;;;;;;;:40;;-1:-1:-1;;48133:40:0;;::::1;::::0;;;48216:11;;;::::1;48184:44:::0;;:31:::1;:44:::0;;;;;;:52;;;::::1;::::0;;48247:33;;-1:-1:-1;;;;;;48247:33:0::1;::::0;;::::1;::::0;;::::1;::::0;;48291:32;;;;;;;;;:39;;;::::1;-1:-1:-1::0;48291:39:0;;::::1;::::0;;;48373:11;;;;::::1;48341:44:::0;;;;;;;:51;;;;::::1;;::::0;;47989:411::o;57878:189::-;1908:13;:11;:13::i;:::-;35880:19:::1;57930:12;:23:::0;;;57964:13:::1;:24:::0;;;57999:15:::1;:26:::0;58036:15:::1;:23:::0;;-1:-1:-1;;58036:23:0::1;::::0;;57878:189::o;16126:104::-;16182:13;16215:7;16208:14;;;;;:::i;20484:436::-;20577:4;739:10;20577:4;20660:25;739:10;20677:7;20660:9;:25::i;:::-;20633:52;;20724:15;20704:16;:35;;20696:85;;;;-1:-1:-1;;;20696:85:0;;10553:2:1;20696:85:0;;;10535:21:1;10592:2;10572:18;;;10565:30;10631:34;10611:18;;;10604:62;-1:-1:-1;;;10682:18:1;;;10675:35;10727:19;;20696:85:0;10351:401:1;20696:85:0;20817:60;20826:5;20833:7;20861:15;20842:16;:34;20817:8;:60::i;46000:91::-;1908:13;:11;:13::i;:::-;46064:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;46064:19:0;;::::1;::::0;;;::::1;::::0;;46000:91::o;17531:193::-;17610:4;739:10;17666:28;739:10;17683:2;17687:6;17666:9;:28::i;47235:278::-;1908:13;:11;:13::i;:::-;47351:1:::1;47329:18;:23;;47321:80;;;::::0;-1:-1:-1;;;47321:80:0;;10959:2:1;47321:80:0::1;::::0;::::1;10941:21:1::0;10998:2;10978:18;;;10971:30;11037:34;11017:18;;;11010:62;-1:-1:-1;;;11088:18:1;;;11081:42;11140:19;;47321:80:0::1;10757:408:1::0;47321:80:0::1;47412:17;:38:::0;;;47466:39:::1;::::0;1500:25:1;;;47466:39:0::1;::::0;1488:2:1;1473:18;47466:39:0::1;1354:177:1::0;47525:456:0;1908:13;:11;:13::i;:::-;47643:32:::1;47668:6;47643:20;47661:1;47643:13;17115:12:::0;;;17027:108;47643:32:::1;47620:18;:56;;47612:122;;;::::0;-1:-1:-1;;;47612:122:0;;11372:2:1;47612:122:0::1;::::0;::::1;11354:21:1::0;11411:2;11391:18;;;11384:30;11450:34;11430:18;;;11423:62;-1:-1:-1;;;11501:18:1;;;11494:51;11562:19;;47612:122:0::1;11170:417:1::0;47612:122:0::1;47776:30;47801:4;47776:20;47794:1;47776:13;17115:12:::0;;;17027:108;47776:30:::1;47753:18;:54;;47745:119;;;::::0;-1:-1:-1;;;47745:119:0;;11794:2:1;47745:119:0::1;::::0;::::1;11776:21:1::0;11833:2;11813:18;;;11806:30;11872:34;11852:18;;;11845:62;-1:-1:-1;;;11923:18:1;;;11916:50;11983:19;;47745:119:0::1;11592:416:1::0;47745:119:0::1;47875:19;:40:::0;;;47931:42:::1;::::0;1500:25:1;;;47931:42:0::1;::::0;1488:2:1;1473:18;47931:42:0::1;1354:177:1::0;57219:156:0;1908:13;:11;:13::i;:::-;57302:21:::1;57334:33;57302:21:::0;57334:13:::1;:33::i;52149:178::-:0;1908:13;:11;:13::i;:::-;52245:6:::1;52235;:16;;52227:50;;;;-1:-1:-1::0;;;52227:50:0::1;;;;;;;:::i;:::-;52288:22;:31:::0;52149:178::o;57549:321::-;1908:13;:11;:13::i;:::-;57642:4:::1;-1:-1:-1::0;;;;;57627:20:0;::::1;::::0;57619:58:::1;;;::::0;-1:-1:-1;;;57619:58:0;;12215:2:1;57619:58:0::1;::::0;::::1;12197:21:1::0;12254:2;12234:18;;;12227:30;12293:27;12273:18;;;12266:55;12338:18;;57619:58:0::1;12013:349:1::0;57619:58:0::1;57696:36;::::0;-1:-1:-1;;;57696:36:0;;57726:4:::1;57696:36;::::0;::::1;5379:51:1::0;57735:1:0::1;::::0;-1:-1:-1;;;;;57696:21:0;::::1;::::0;::::1;::::0;5352:18:1;;57696:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;57688:62;;;::::0;-1:-1:-1;;;57688:62:0;;12569:2:1;57688:62:0::1;::::0;::::1;12551:21:1::0;12608:1;12588:18;;;12581:29;-1:-1:-1;;;12626:18:1;;;12619:39;12675:18;;57688:62:0::1;12367:332:1::0;57688:62:0::1;57775:36;::::0;-1:-1:-1;;;57775:36:0;;57805:4:::1;57775:36;::::0;::::1;5379:51:1::0;57761:11:0::1;::::0;-1:-1:-1;;;;;57775:21:0;::::1;::::0;::::1;::::0;5352:18:1;;57775:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57822:40;::::0;-1:-1:-1;;;57822:40:0;;57843:10:::1;57822:40;::::0;::::1;12878:51:1::0;12945:18;;;12938:34;;;57761:50:0;;-1:-1:-1;;;;;;57822:20:0;::::1;::::0;::::1;::::0;12851:18:1;;57822:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44962:703::-:0;1908:13;:11;:13::i;:::-;45036:11:::1;::::0;::::1;;45035:12;45027:48;;;::::0;-1:-1:-1;;;45027:48:0;;13435:2:1;45027:48:0::1;::::0;::::1;13417:21:1::0;13474:2;13454:18;;;13447:30;13513:25;13493:18;;;13486:53;13556:18;;45027:48:0::1;13233:347:1::0;45027:48:0::1;45104:2;45094:6;:12;;45086:46;;;;-1:-1:-1::0;;;45086:46:0::1;;;;;;;:::i;:::-;45158:25;45178:4;45158:15;35880:19;45171:1;45158:12;:15::i;:25::-;45143:12;:40:::0;45210:25:::1;45230:4;45210:15;35880:19;45223:1;45210:12;:15::i;:25::-;45194:13;:41:::0;45264:25:::1;45284:4;45264:15;35880:19;45277:1;45264:12;:15::i;:25::-;45246:15;:43:::0;45320:2:::1;45300:17;:22:::0;45355:26:::1;45375:5;45355:15;35880:19;45368:1;45355:12;:15::i;:26::-;45333:19;:48:::0;45392:11:::1;:18:::0;;-1:-1:-1;;45494:18:0;;;;;45542:12:::1;45523:16;:31:::0;;;45565:18:::1;:27:::0;;;45608:49:::1;::::0;;13759:25:1;;;13815:2;13800:18;;13793:34;;;45608:49:0::1;::::0;13732:18:1;45608:49:0::1;13585:248:1::0;58075:239:0;58178:14;;58126:7;;;;58168:25;;-1:-1:-1;;;;;58178:14:0;58168:9;:25::i;:::-;58225:10;;58246:14;;58225:36;;-1:-1:-1;;;58225:36:0;;-1:-1:-1;;;;;58246:14:0;;;58225:36;;;5379:51:1;58146:47:0;;-1:-1:-1;58204:18:0;;58225:10;;;:20;;5352:18:1;;58225:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58204:57;-1:-1:-1;58279:27:0;:11;58204:57;58279:15;:27::i;17787:151::-;-1:-1:-1;;;;;17903:18:0;;;17876:7;17903:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17787:151::o;46099:107::-;1908:13;:11;:13::i;:::-;46171:19:::1;:27:::0;;;::::1;;-1:-1:-1::0;;;46171:27:0::1;-1:-1:-1::0;;46171:27:0;;::::1;::::0;;;::::1;::::0;;46099:107::o;45901:91::-;1908:13;:11;:13::i;:::-;45965:11:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;45965:19:0;;::::1;::::0;;;::::1;::::0;;45901:91::o;49681:317::-;1908:13;:11;:13::i;:::-;49776:6:::1;49771:220;49792:8;:15;49788:1;:19;49771:220;;;49848:14;::::0;49833:11;;-1:-1:-1;;;;;49848:14:0;;::::1;::::0;49833:8;;49842:1;;49833:11;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;49833:29:0::1;;;49832:77;;;;-1:-1:-1::0;49891:16:0::1;::::0;49868:11;;-1:-1:-1;;;;;49891:16:0;;::::1;::::0;49868:8;;49877:1;;49868:11;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;49868:40:0::1;;;49832:77;:111;;;;;49937:4;-1:-1:-1::0;;;;;49914:28:0::1;:8;49923:1;49914:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;49914:28:0::1;;;49832:111;49829:150;;;49975:4;49945:14;:27;49960:8;49969:1;49960:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;49945:27:0::1;-1:-1:-1::0;;;;;49945:27:0::1;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;49829:150;49809:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49771:220;;50818:474:::0;1908:13;:11;:13::i;:::-;51024:3:::1;50958:62;51000:19:::0;50958:37:::1;:16:::0;50979:15;50958:20:::1;:37::i;:62::-;:69;;50950:112;;;::::0;-1:-1:-1;;;50950:112:0;;14040:2:1;50950:112:0::1;::::0;::::1;14022:21:1::0;14079:2;14059:18;;;14052:30;14118:32;14098:18;;;14091:60;14168:18;;50950:112:0::1;13838:354:1::0;50950:112:0::1;51073:15;:34:::0;;;51118:14:::1;:32:::0;;;51161:18:::1;:40:::0;;;51217:67:::1;::::0;;8405:25:1;;;8461:2;8446:18;;8439:34;;;8489:18;;;8482:34;;;51217:67:0::1;::::0;8393:2:1;8378:18;51217:67:0::1;8203:319:1::0;46615:292:0;1908:13;:11;:13::i;:::-;46720:30:::1;46745:4;46720:20;46738:1;46720:13;17115:12:::0;;;17027:108;46720:30:::1;46701:14;:50;;46693:118;;;::::0;-1:-1:-1;;;46693:118:0;;14399:2:1;46693:118:0::1;::::0;::::1;14381:21:1::0;14438:2;14418:18;;;14411:30;14477:34;14457:18;;;14450:62;14548:25;14528:18;;;14521:53;14591:19;;46693:118:0::1;14197:419:1::0;46693:118:0::1;46822:13;:30:::0;;;46868:31:::1;::::0;1500:25:1;;;46868:31:0::1;::::0;1488:2:1;1473:18;46868:31:0::1;1354:177:1::0;2928:201:0;1908:13;:11;:13::i;:::-;-1:-1:-1;;;;;3017:22:0;::::1;3009:73;;;::::0;-1:-1:-1;;;3009:73:0;;14823:2:1;3009:73:0::1;::::0;::::1;14805:21:1::0;14862:2;14842:18;;;14835:30;14901:34;14881:18;;;14874:62;-1:-1:-1;;;14952:18:1;;;14945:36;14998:19;;3009:73:0::1;14621:402:1::0;3009:73:0::1;3093:28;3112:8;3093:18;:28::i;46323:284::-:0;1908:13;:11;:13::i;:::-;46425:30:::1;46450:4;46425:20;46443:1;46425:13;17115:12:::0;;;17027:108;46425:30:::1;46407:13;:49;;46399:116;;;::::0;-1:-1:-1;;;46399:116:0;;15230:2:1;46399:116:0::1;::::0;::::1;15212:21:1::0;15269:2;15249:18;;;15242:30;15308:34;15288:18;;;15281:62;-1:-1:-1;;;15359:18:1;;;15352:52;15421:19;;46399:116:0::1;15028:418:1::0;46399:116:0::1;46526:12;:28:::0;;;46570:29:::1;::::0;1500:25:1;;;46570:29:0::1;::::0;1488:2:1;1473:18;46570:29:0::1;1354:177:1::0;58577:455:0;58691:14;;58638:7;;;;58681:25;;-1:-1:-1;;;;;58691:14:0;58681:9;:25::i;:::-;58732:10;;58753:14;;58732:36;;-1:-1:-1;;;58732:36:0;;-1:-1:-1;;;;;58753:14:0;;;58732:36;;;5379:51:1;58658:48:0;;-1:-1:-1;58717:12:0;;58732:10;;;:20;;5352:18:1;;58732:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58717:51;-1:-1:-1;58781:22:0;58806:24;:12;58823:6;58806:16;:24::i;:::-;58781:49;;58841:17;58861:40;58886:14;58861:20;:18;:20::i;:40::-;58841:60;-1:-1:-1;58912:20:0;58935:19;:4;58841:60;58935:8;:19::i;:::-;58912:42;-1:-1:-1;58974:50:0;59016:7;59001:9;58976:21;58912:42;58993:3;58976:16;:21::i;:::-;58975:35;;;;:::i;58974:50::-;58967:57;58577:455;-1:-1:-1;;;;;;;58577:455:0:o;57383:158::-;1908:13;:11;:13::i;:::-;57475:58:::1;::::0;57439:12:::1;::::0;57483:10:::1;::::0;57507:21:::1;::::0;57439:12;57475:58;57439:12;57475:58;57507:21;57483:10;57475:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;57383:158:0:o;49463:206::-;1908:13;:11;:13::i;:::-;49572:6:::1;49567:94;49588:8;:15;49584:1;:19;49567:94;;;49657:4;49610:31;:44;49642:8;49651:1;49642:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49610:44:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49610:44:0;:51;;-1:-1:-1;;49610:51:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49605:3;::::1;::::0;::::1;:::i;:::-;;;;49567:94;;24511:380:::0;-1:-1:-1;;;;;24647:19:0;;24639:68;;;;-1:-1:-1;;;24639:68:0;;16085:2:1;24639:68:0;;;16067:21:1;16124:2;16104:18;;;16097:30;16163:34;16143:18;;;16136:62;-1:-1:-1;;;16214:18:1;;;16207:34;16258:19;;24639:68:0;15883:400:1;24639:68:0;-1:-1:-1;;;;;24726:21:0;;24718:68;;;;-1:-1:-1;;;24718:68:0;;16490:2:1;24718:68:0;;;16472:21:1;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;-1:-1:-1;;;16619:18:1;;;16612:32;16661:19;;24718:68:0;16288:398:1;24718:68:0;-1:-1:-1;;;;;24799:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24851:32;;1500:25:1;;;24851:32:0;;1473:18:1;24851:32:0;;;;;;;24511:380;;;:::o;2187:132::-;2095:6;;-1:-1:-1;;;;;2095:6:0;739:10;2251:23;2243:68;;;;-1:-1:-1;;;2243:68:0;;16893:2:1;2243:68:0;;;16875:21:1;;;16912:18;;;16905:30;16971:34;16951:18;;;16944:62;17023:18;;2243:68:0;16691:356:1;6274:98:0;6332:7;6359:5;6363:1;6359;:5;:::i;:::-;6352:12;6274:98;-1:-1:-1;;;6274:98:0:o;25182:453::-;25317:24;25344:25;25354:5;25361:7;25344:9;:25::i;:::-;25317:52;;-1:-1:-1;;25384:16:0;:37;25380:248;;25466:6;25446:16;:26;;25438:68;;;;-1:-1:-1;;;25438:68:0;;17254:2:1;25438:68:0;;;17236:21:1;17293:2;17273:18;;;17266:30;17332:31;17312:18;;;17305:59;17381:18;;25438:68:0;17052:353:1;25438:68:0;25550:51;25559:5;25566:7;25594:6;25575:16;:25;25550:8;:51::i;40056:3137::-;-1:-1:-1;;;;;40154:12:0;;40146:62;;;;-1:-1:-1;;;40146:62:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40227:10:0;;40219:58;;;;-1:-1:-1;;;40219:58:0;;;;;;;:::i;:::-;40305:1;40296:6;:10;40288:64;;;;-1:-1:-1;;;40288:64:0;;18422:2:1;40288:64:0;;;18404:21:1;18461:2;18441:18;;;18434:30;18500:34;18480:18;;;18473:62;-1:-1:-1;;;18551:18:1;;;18544:39;18600:19;;40288:64:0;18220:405:1;40288:64:0;40429:14;;40380:4;;40365:12;;-1:-1:-1;;;;;40421:22:0;;;40429:14;;40421:22;40420:121;;40476:14;;-1:-1:-1;;;;;40470:20:0;;;40476:14;;40470:20;40469:72;;40517:24;40420:121;;40469:72;40494:20;40420:121;;;40447:19;40420:121;40395:146;;40564:7;2095:6;;-1:-1:-1;;;;;2095:6:0;;2022:87;40564:7;-1:-1:-1;;;;;40556:15:0;:4;-1:-1:-1;;;;;40556:15:0;;;:32;;;;-1:-1:-1;2095:6:0;;-1:-1:-1;;;;;40575:13:0;;;2095:6;;40575:13;;40556:32;:46;;;;-1:-1:-1;;;;;;40592:10:0;;;;40556:46;:60;;;;-1:-1:-1;;;;;;40606:10:0;;38026:42;40606:10;;40556:60;:74;;;;-1:-1:-1;40621:9:0;;;;;;;40620:10;40556:74;40552:2015;;;-1:-1:-1;;;;;40656:20:0;;;;;;:14;:20;;;;;;;;40655:21;:44;;;;-1:-1:-1;;;;;;40681:18:0;;;;;;:14;:18;;;;;;;;40680:19;40655:44;40647:69;;;;-1:-1:-1;;;40647:69:0;;18832:2:1;40647:69:0;;;18814:21:1;18871:2;18851:18;;;18844:30;-1:-1:-1;;;18890:18:1;;;18883:42;18942:18;;40647:69:0;18630:336:1;40647:69:0;40737:11;;;;40733:109;;-1:-1:-1;;;;;40758:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;40787:23:0;;;;;;:19;:23;;;;;;;;40758:52;40750:92;;;;-1:-1:-1;;;40750:92:0;;19173:2:1;40750:92:0;;;19155:21:1;19212:2;19192:18;;;19185:30;19251:29;19231:18;;;19224:57;19298:18;;40750:92:0;18971:351:1;40750:92:0;40863:15;;;;;;;40859:433;;;40917:16;;-1:-1:-1;;;;;40903:31:0;;;40917:16;;40903:31;;;;:64;;-1:-1:-1;40952:14:0;;-1:-1:-1;;;;;40938:29:0;;;40952:14;;40938:29;;40903:64;40899:378;;;41038:15;;41023:30;;:12;:30;:::i;:::-;41010:9;41000:20;;;;:9;:20;;;;;;:53;:103;;;;-1:-1:-1;41088:15:0;;41073:30;;:12;:30;:::i;:::-;-1:-1:-1;;;;;41057:13:0;;;;;;:9;:13;;;;;;:46;41000:103;40992:156;;;;-1:-1:-1;;;40992:156:0;;19662:2:1;40992:156:0;;;19644:21:1;19701:2;19681:18;;;19674:30;19740:34;19720:18;;;19713:62;-1:-1:-1;;;19791:18:1;;;19784:38;19839:19;;40992:156:0;19460:404:1;40992:156:0;41181:9;41171:20;;;;:9;:20;;;;;;41194:12;41171:35;;;;-1:-1:-1;;;;;41229:13:0;;;;;;:28;40899:378;41322:19;41312:6;:29;;;;;;;;:::i;:::-;;:64;;;;-1:-1:-1;41359:16:0;;-1:-1:-1;;;;;41345:31:0;;;41359:16;;41345:31;;41312:64;:104;;;;-1:-1:-1;;;;;;41381:35:0;;;;;;:31;:35;;;;;;;;41380:36;41312:104;41308:330;;;41455:12;;41445:6;:22;;41437:76;;;;-1:-1:-1;;;41437:76:0;;20203:2:1;41437:76:0;;;20185:21:1;20242:2;20222:18;;;20215:30;20281:34;20261:18;;;20254:62;-1:-1:-1;;;20332:18:1;;;20325:39;20381:19;;41437:76:0;20001:405:1;41437:76:0;41566:15;;41556:6;41540:13;41550:2;41540:9;:13::i;:::-;:22;;;;:::i;:::-;:41;;41532:90;;;;-1:-1:-1;;;41532:90:0;;20613:2:1;41532:90:0;;;20595:21:1;20652:2;20632:18;;;20625:30;20691:34;20671:18;;;20664:62;-1:-1:-1;;;20742:18:1;;;20735:34;20786:19;;41532:90:0;20411:400:1;41532:90:0;41680:20;41670:6;:30;;;;;;;;:::i;:::-;;:67;;;;-1:-1:-1;41720:16:0;;-1:-1:-1;;;;;41704:33:0;;;41720:16;;41704:33;;41670:67;:109;;;;-1:-1:-1;;;;;;41742:37:0;;;;;;:31;:37;;;;;;;;41741:38;41670:109;41666:890;;;41818:13;;41808:6;:23;;41800:78;;;;-1:-1:-1;;;41800:78:0;;21018:2:1;41800:78:0;;;21000:21:1;21057:2;21037:18;;;21030:30;21096:34;21076:18;;;21069:62;-1:-1:-1;;;21147:18:1;;;21140:40;21197:19;;41800:78:0;20816:406:1;41800:78:0;41915:47;41958:3;41915:38;41935:17;;41915:15;41925:4;41915:9;:15::i;:47::-;41905:6;:57;;41897:116;;;;-1:-1:-1;;;41897:116:0;;21429:2:1;41897:116:0;;;21411:21:1;21468:2;21448:18;;;21441:30;21507:34;21487:18;;;21480:62;-1:-1:-1;;;21558:18:1;;;21551:44;21612:19;;41897:116:0;21227:410:1;41897:116:0;42038:22;;;;;;;42034:505;;;42105:16;;-1:-1:-1;;;;;42089:33:0;;;42105:16;;42089:33;;;;:68;;-1:-1:-1;42142:14:0;;-1:-1:-1;;;;;42126:31:0;;;42142:14;;42126:31;;42089:68;42085:435;;;42239:22;;42224:37;;:12;:37;:::i;:::-;42211:9;42194:27;;;;:16;:27;;;;;;:67;:133;;;;-1:-1:-1;42305:22:0;;42290:37;;:12;:37;:::i;:::-;-1:-1:-1;;;;;42265:22:0;;;;;;:16;:22;;;;;;:62;42194:133;42186:177;;;;-1:-1:-1;;;42186:177:0;;21844:2:1;42186:177:0;;;21826:21:1;21883:2;21863:18;;;21856:30;21922:33;21902:18;;;21895:61;21973:18;;42186:177:0;21642:355:1;42186:177:0;42407:9;42390:27;;;;:16;:27;;;;;;42420:12;42390:42;;;;-1:-1:-1;;;;;42459:22:0;;;;;;:37;42085:435;-1:-1:-1;;;;;42582:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;42611:23:0;;;;;;:19;:23;;;;;;;;42582:52;:68;;;-1:-1:-1;42639:11:0;;;;;;;42638:12;42582:68;:132;;;-1:-1:-1;42656:19:0;;-1:-1:-1;;;42656:19:0;;;;42655:20;:58;;;;-1:-1:-1;42689:24:0;42679:6;:34;;;;;;;;:::i;:::-;;42655:58;42579:152;;;42726:5;42716:15;;42579:152;42744:23;42770:24;42788:4;42770:9;:24::i;:::-;42744:50;;42805:12;42839:19;;42821:15;:37;42820:75;;;;-1:-1:-1;42874:20:0;42864:6;:30;;;;;;;;:::i;:::-;;42820:75;42805:90;;42912:7;:22;;;;-1:-1:-1;42923:11:0;;;;;;;42912:22;:36;;;;-1:-1:-1;42939:9:0;;;;;;;42938:10;42912:36;:66;;;;-1:-1:-1;;;;;;42953:25:0;;;;;;:19;:25;;;;;;;;42952:26;42912:66;:94;;;;-1:-1:-1;;;;;;42983:23:0;;;;;;:19;:23;;;;;;;;42982:24;42912:94;42908:216;;;43023:9;:16;;-1:-1:-1;;43023:16:0;;;;;43054:26;43064:15;43054:9;:26::i;:::-;43095:9;:17;;-1:-1:-1;;43095:17:0;;;42908:216;43136:49;43151:4;43157:2;43161:6;43169:7;43178:6;43136:14;:49::i;:::-;40135:3058;;;;40056:3137;;;:::o;7012:98::-;7070:7;7097:5;7101:1;7097;:5;:::i;7411:98::-;7469:7;7496:5;7500:1;7496;:5;:::i;44191:476::-;44283:16;;;44297:1;44283:16;;;;;;;;44259:21;;44283:16;;;;;;;;;;-1:-1:-1;44283:16:0;44259:40;;44328:4;44310;44315:1;44310:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44310:23:0;;;:7;;;;;;;;;;:23;;;;44354:16;;:23;;;-1:-1:-1;;;44354:23:0;;;;:16;;;;;:21;;:23;;;;;44310:7;;44354:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44344:4;44349:1;44344:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44344:33:0;;;:7;;;;;;;;;:33;44420:16;;44388:63;;44405:4;;44420:16;44439:11;44388:8;:63::i;:::-;44462:16;;:197;;-1:-1:-1;;;44462:197:0;;-1:-1:-1;;;;;44462:16:0;;;;:67;;:197;;44544:11;;44462:16;;44586:4;;44613;;44633:15;;44462:197;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44248:419;44191:476;:::o;3289:191::-;3382:6;;;-1:-1:-1;;;;;3399:17:0;;;-1:-1:-1;;;;;;3399:17:0;;;;;;;3432:40;;3382:6;;;3399:17;3382:6;;3432:40;;3363:16;;3432:40;3352:128;3289:191;:::o;44683:147::-;44742:11;;-1:-1:-1;;;;;44742:11:0;:35;44763:13;:6;44774:1;44763:10;:13::i;:::-;44742:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44788:10:0;;-1:-1:-1;;;;;44788:10:0;:34;44808:13;:6;44819:1;44808:10;:13::i;:::-;44788:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44683:147;:::o;6655:98::-;6713:7;6740:5;6744:1;6740;:5;:::i;43201:982::-;43265:25;43294:56;43332:17;;43294:33;43313:13;;43294:14;;:18;;:33;;;;:::i;:56::-;43265:85;-1:-1:-1;43361:12:0;43398:20;;;:46;;-1:-1:-1;43422:22:0;;43398:46;43394:59;;;43446:7;;43201:982;:::o;43394:59::-;43487:19;;:26;;43511:1;43487:23;:26::i;:::-;43469:15;:44;43465:94;;;43533:19;;:26;;43557:1;43533:23;:26::i;:::-;43515:44;;43465:94;43572:34;43590:15;43572:17;:34::i;:::-;43627:18;43648:21;43627:42;;43680:17;43700:52;43734:17;43700:29;43715:13;;43700:10;:14;;:29;;;;:::i;:52::-;43680:72;;43763:21;43787:56;43825:17;43787:33;43802:17;;43787:10;:14;;:33;;;;:::i;:56::-;43881:1;43864:14;:18;;;43893:13;:17;;;43921;:21;;;43976:10;;43968:46;;43763:80;;-1:-1:-1;;;;;;43976:10:0;;44000:9;;43968:46;43881:1;43968:46;44000:9;43976:10;43968:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44046:14:0;;44038:54;;43955:59;;-1:-1:-1;;;;;;44046:14:0;;44074:13;;44038:54;;;;44074:13;44046:14;44038:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44124:11:0;;44116:59;;44025:67;;-1:-1:-1;;;;;;44124:11:0;;44149:21;;44116:59;;;;44149:21;44124:11;44116:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;43201:982:0:o;53301:334::-;53439:7;53434:87;;53448:15;:13;:15::i;:::-;53434:87;;;53488:33;53498:6;53506;53514;53488:9;:33::i;:::-;53479:42;;53434:87;53534:42;53550:6;53558:9;53569:6;53534:15;:42::i;:::-;53602:7;53597:30;;53611:16;53029:19;;53016:10;:32;53071:18;;53059:9;:30;53116:22;;53100:13;:38;53163:20;;53149:11;:34;53207:19;;53194:10;:32;53254:23;;53237:14;:40;52970:315;53611:16;53301:334;;;;;:::o;52335:623::-;52384:10;;:15;:33;;;;-1:-1:-1;52403:9:0;;:14;52384:33;:55;;;;-1:-1:-1;52421:13:0;;:18;52384:55;:75;;;;-1:-1:-1;52443:11:0;;:16;52384:75;:94;;;;-1:-1:-1;52463:10:0;;:15;52384:94;:117;;;;-1:-1:-1;52482:14:0;;:19;52384:117;52380:130;;;52335:623::o;52380:130::-;52544:10;;;52522:19;:32;52586:9;;;52565:18;:30;52631:13;;;52606:22;:38;52678:11;;;52655:20;:34;52722:10;;;52700:19;:32;52769:14;;;52743:23;:40;-1:-1:-1;52804:14:0;;;;52829:13;;;;52853:17;;;;52881:15;;;52907:14;;;52932:18;52335:623::o;53643:865::-;53736:7;53800:12;53778:18;;53759:16;;:37;;;;:::i;:::-;:53;53756:316;;53814:9;:7;:9::i;:::-;53756:316;;;53853:20;53843:6;:30;;;;;;;;:::i;:::-;;53839:233;;53875:16;53884:6;53875:8;:16::i;53839:233::-;53921:19;53911:6;:29;;;;;;;;:::i;:::-;;53907:165;;53942:9;:7;:9::i;53907:165::-;53981:24;53971:6;:34;;;;;;;;:::i;:::-;;53967:105;;54007:14;:12;:14::i;53967:105::-;54037:35;;-1:-1:-1;;;54037:35:0;;23618:2:1;54037:35:0;;;23600:21:1;23657:2;23637:18;;;23630:30;23696:27;23676:18;;;23669:55;23741:18;;54037:35:0;23416:349:1;53967:105:0;54120:10;;54093:12;;54120:14;54116:280;;54158:39;36316:4;54158:22;54169:10;;54158:6;:10;;:22;;;;:::i;:39::-;54151:46;;54248:10;;54237:8;;54230:4;:15;;;;:::i;:::-;:28;;;;:::i;:::-;54212:14;;:46;;;;;;;:::i;:::-;;;;-1:-1:-1;;54307:10:0;;54297:7;;54290:14;;:4;:14;:::i;:::-;:27;;;;:::i;:::-;54273:13;;:44;;;;;;;:::i;:::-;;;;-1:-1:-1;;54374:10:0;;54360:11;;54353:18;;:4;:18;:::i;:::-;:31;;;;:::i;:::-;54332:17;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;54116:280:0;54412:8;;54408:58;;54422:44;54438:6;54454:4;54461;54422:15;:44::i;:::-;54486:14;54496:4;54486:14;;:::i;:::-;;53643:865;-1:-1:-1;;;;;53643:865:0:o;21390:840::-;-1:-1:-1;;;;;21521:18:0;;21513:68;;;;-1:-1:-1;;;21513:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21600:16:0;;21592:64;;;;-1:-1:-1;;;21592:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21742:15:0;;21720:19;21742:15;;;;;;;;;;;21776:21;;;;21768:72;;;;-1:-1:-1;;;21768:72:0;;23972:2:1;21768:72:0;;;23954:21:1;24011:2;23991:18;;;23984:30;24050:34;24030:18;;;24023:62;-1:-1:-1;;;24101:18:1;;;24094:36;24147:19;;21768:72:0;23770:402:1;21768:72:0;-1:-1:-1;;;;;21876:15:0;;;:9;:15;;;;;;;;;;;21894:20;;;21876:38;;22094:13;;;;;;;;;;:23;;;;;;22146:26;;1500:25:1;;;22094:13:0;;22146:26;;1473:18:1;22146:26:0;;;;;;;22185:37;49266:185;54516:175;54566:3;54555:8;:14;;;54580:7;:13;;;54604:11;:17;;;54645:38;;:21;54566:3;;54645:12;:21::i;:38::-;54632:10;:51;54516:175::o;54699:1915::-;54764:11;;54753:8;:22;54796:10;;54786:7;:20;54831:14;;54817:11;:28;54861:16;;-1:-1:-1;;;54861:16:0;;;;54858:1685;;;54894:10;54907:22;54922:6;54907:14;:22::i;:::-;54894:35;;54952:7;54947:2;:12;:29;;;;;54969:7;54963:2;:13;;54947:29;54944:1588;;;55008:56;36369:2;55008:35;55021:21;;55008:8;;:12;;:35;;;;:::i;:56::-;54997:8;:67;55105:21;;55093:7;;:55;;36369:2;;55093:34;;:11;:34::i;:55::-;55083:7;:65;55197:21;;55181:11;;:59;;36369:2;;55181:38;;:15;:38::i;:59::-;55167:11;:73;54944:1588;;;55271:7;55266:2;:12;:29;;;;;55288:7;55282:2;:13;;55266:29;55262:1270;;;55327:56;36369:2;55327:35;55340:21;;55327:8;;:12;;:35;;;;:::i;:56::-;55316:8;:67;55424:21;;55412:7;;:55;;36369:2;;55412:34;;:11;:34::i;:55::-;55402:7;:65;55516:21;;55500:11;;:59;;36369:2;;55500:38;;:15;:38::i;55262:1270::-;55590:7;55585:2;:12;:29;;;;;55607:7;55601:2;:13;;55585:29;55581:951;;;55646:56;36369:2;55646:35;55659:21;;55646:8;;:12;;:35;;;;:::i;:56::-;55635:8;:67;55743:21;;55731:7;;:55;;36369:2;;55731:34;;:11;:34::i;:55::-;55721:7;:65;55835:21;;55819:11;;:59;;36369:2;;55819:38;;:15;:38::i;55581:951::-;55909:7;55904:2;:12;:30;;;;;55926:8;55920:2;:14;;55904:30;55900:632;;;55966:57;36369:2;55966:36;55979:22;;55966:8;;:12;;:36;;;;:::i;:57::-;55955:8;:68;56064:22;;56052:7;;:56;;36369:2;;56052:35;;:11;:35::i;:56::-;56042:7;:66;56157:22;;56141:11;;:60;;36369:2;;56141:39;;:15;:39::i;55900:632::-;56232:8;56227:2;:13;56223:309;;;56272:60;36369:2;56272:39;56285:25;;56272:8;;:12;;:39;;;;:::i;:60::-;56261:8;:71;56373:25;;56361:7;;:59;;36369:2;;56361:38;;:11;:38::i;:59::-;56351:7;:69;56469:25;;56453:11;;:63;;36369:2;;56453:42;;:15;:42::i;:63::-;56439:11;:77;56223:309;54879:1664;54858:1685;56568:38;56594:11;;56568:21;56581:7;;56568:8;;:12;;:21;;;;:::i;:38::-;56555:10;:51;-1:-1:-1;54699:1915:0:o;56622:198::-;56672:10;;56661:8;:21;;;56703:9;;56693:7;:19;;;56737:13;;56723:11;:27;;;56774:38;;56737:13;;56774:21;;56672:10;56774:12;:21::i;56828:218::-;56883:15;;56872:8;:26;;;56919:14;;56909:7;:24;;;56958:18;;56944:11;:32;;;57000:38;;56958:18;;57000:21;;56883:15;57000:12;:21::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:134;771:20;;800:31;771:20;800:31;:::i;:::-;703:134;;;:::o;842:315::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1026:9;1013:23;1045:31;1070:5;1045:31;:::i;:::-;1095:5;1147:2;1132:18;;;;1119:32;;-1:-1:-1;;;842:315:1:o;1536:127::-;1597:10;1592:3;1588:20;1585:1;1578:31;1628:4;1625:1;1618:15;1652:4;1649:1;1642:15;1668:118;1754:5;1747:13;1740:21;1733:5;1730:32;1720:60;;1776:1;1773;1766:12;1791:128;1856:20;;1885:28;1856:20;1885:28;:::i;1924:1191::-;2014:6;2022;2075:2;2063:9;2054:7;2050:23;2046:32;2043:52;;;2091:1;2088;2081:12;2043:52;2131:9;2118:23;2160:18;2201:2;2193:6;2190:14;2187:34;;;2217:1;2214;2207:12;2187:34;2255:6;2244:9;2240:22;2230:32;;2300:7;2293:4;2289:2;2285:13;2281:27;2271:55;;2322:1;2319;2312:12;2271:55;2358:2;2345:16;2380:4;2403:2;2399;2396:10;2393:36;;;2409:18;;:::i;:::-;2455:2;2452:1;2448:10;2487:2;2481:9;2550:2;2546:7;2541:2;2537;2533:11;2529:25;2521:6;2517:38;2605:6;2593:10;2590:22;2585:2;2573:10;2570:18;2567:46;2564:72;;;2616:18;;:::i;:::-;2652:2;2645:22;2702:18;;;2736:15;;;;-1:-1:-1;2778:11:1;;;2774:20;;;2806:19;;;2803:39;;;2838:1;2835;2828:12;2803:39;2862:11;;;;2882:148;2898:6;2893:3;2890:15;2882:148;;;2964:23;2983:3;2964:23;:::i;:::-;2952:36;;2915:12;;;;3008;;;;2882:148;;;3049:6;-1:-1:-1;3074:35:1;;-1:-1:-1;3090:18:1;;;3074:35;:::i;:::-;3064:45;;;;;;1924:1191;;;;;:::o;3120:454::-;3215:6;3223;3231;3239;3247;3300:3;3288:9;3279:7;3275:23;3271:33;3268:53;;;3317:1;3314;3307:12;3268:53;-1:-1:-1;;3340:23:1;;;3410:2;3395:18;;3382:32;;-1:-1:-1;3461:2:1;3446:18;;3433:32;;3512:2;3497:18;;3484:32;;-1:-1:-1;3563:3:1;3548:19;3535:33;;-1:-1:-1;3120:454:1;-1:-1:-1;3120:454:1:o;3579:180::-;3638:6;3691:2;3679:9;3670:7;3666:23;3662:32;3659:52;;;3707:1;3704;3697:12;3659:52;-1:-1:-1;3730:23:1;;3579:180;-1:-1:-1;3579:180:1:o;3764:241::-;3820:6;3873:2;3861:9;3852:7;3848:23;3844:32;3841:52;;;3889:1;3886;3879:12;3841:52;3928:9;3915:23;3947:28;3969:5;3947:28;:::i;4010:247::-;4069:6;4122:2;4110:9;4101:7;4097:23;4093:32;4090:52;;;4138:1;4135;4128:12;4090:52;4177:9;4164:23;4196:31;4221:5;4196:31;:::i;4262:316::-;4339:6;4347;4355;4408:2;4396:9;4387:7;4383:23;4379:32;4376:52;;;4424:1;4421;4414:12;4376:52;-1:-1:-1;;4447:23:1;;;4517:2;4502:18;;4489:32;;-1:-1:-1;4568:2:1;4553:18;;;4540:32;;4262:316;-1:-1:-1;4262:316:1:o;4583:456::-;4660:6;4668;4676;4729:2;4717:9;4708:7;4704:23;4700:32;4697:52;;;4745:1;4742;4735:12;4697:52;4784:9;4771:23;4803:31;4828:5;4803:31;:::i;:::-;4853:5;-1:-1:-1;4910:2:1;4895:18;;4882:32;4923:33;4882:32;4923:33;:::i;:::-;4583:456;;4975:7;;-1:-1:-1;;;5029:2:1;5014:18;;;;5001:32;;4583:456::o;5441:388::-;5509:6;5517;5570:2;5558:9;5549:7;5545:23;5541:32;5538:52;;;5586:1;5583;5576:12;5538:52;5625:9;5612:23;5644:31;5669:5;5644:31;:::i;:::-;5694:5;-1:-1:-1;5751:2:1;5736:18;;5723:32;5764:33;5723:32;5764:33;:::i;:::-;5816:7;5806:17;;;5441:388;;;;;:::o;5834:380::-;5913:1;5909:12;;;;5956;;;5977:61;;6031:4;6023:6;6019:17;6009:27;;5977:61;6084:2;6076:6;6073:14;6053:18;6050:38;6047:161;;6130:10;6125:3;6121:20;6118:1;6111:31;6165:4;6162:1;6155:15;6193:4;6190:1;6183:15;6047:161;;5834:380;;;:::o;6219:127::-;6280:10;6275:3;6271:20;6268:1;6261:31;6311:4;6308:1;6301:15;6335:4;6332:1;6325:15;6351:127;6412:10;6407:3;6403:20;6400:1;6393:31;6443:4;6440:1;6433:15;6467:4;6464:1;6457:15;6483:135;6522:3;6543:17;;;6540:43;;6563:18;;:::i;:::-;-1:-1:-1;6610:1:1;6599:13;;6483:135::o;7091:345::-;7293:2;7275:21;;;7332:2;7312:18;;;7305:30;-1:-1:-1;;;7366:2:1;7351:18;;7344:51;7427:2;7412:18;;7091:345::o;9672:125::-;9737:9;;;9758:10;;;9755:36;;;9771:18;;:::i;9802:184::-;9872:6;9925:2;9913:9;9904:7;9900:23;9896:32;9893:52;;;9941:1;9938;9931:12;9893:52;-1:-1:-1;9964:16:1;;9802:184;-1:-1:-1;9802:184:1:o;12983:245::-;13050:6;13103:2;13091:9;13082:7;13078:23;13074:32;13071:52;;;13119:1;13116;13109:12;13071:52;13151:9;13145:16;13170:28;13192:5;13170:28;:::i;15451:217::-;15491:1;15517;15507:132;;15561:10;15556:3;15552:20;15549:1;15542:31;15596:4;15593:1;15586:15;15624:4;15621:1;15614:15;15507:132;-1:-1:-1;15653:9:1;;15451:217::o;17410:401::-;17612:2;17594:21;;;17651:2;17631:18;;;17624:30;17690:34;17685:2;17670:18;;17663:62;-1:-1:-1;;;17756:2:1;17741:18;;17734:35;17801:3;17786:19;;17410:401::o;17816:399::-;18018:2;18000:21;;;18057:2;18037:18;;;18030:30;18096:34;18091:2;18076:18;;18069:62;-1:-1:-1;;;18162:2:1;18147:18;;18140:33;18205:3;18190:19;;17816:399::o;19327:128::-;19394:9;;;19415:11;;;19412:37;;;19429:18;;:::i;19869:127::-;19930:10;19925:3;19921:20;19918:1;19911:31;19961:4;19958:1;19951:15;19985:4;19982:1;19975:15;22002:168;22075:9;;;22106;;22123:15;;;22117:22;;22103:37;22093:71;;22144:18;;:::i;22175:251::-;22245:6;22298:2;22286:9;22277:7;22273:23;22269:32;22266:52;;;22314:1;22311;22304:12;22266:52;22346:9;22340:16;22365:31;22390:5;22365:31;:::i;22431:980::-;22693:4;22741:3;22730:9;22726:19;22772:6;22761:9;22754:25;22798:2;22836:6;22831:2;22820:9;22816:18;22809:34;22879:3;22874:2;22863:9;22859:18;22852:31;22903:6;22938;22932:13;22969:6;22961;22954:22;23007:3;22996:9;22992:19;22985:26;;23046:2;23038:6;23034:15;23020:29;;23067:1;23077:195;23091:6;23088:1;23085:13;23077:195;;;23156:13;;-1:-1:-1;;;;;23152:39:1;23140:52;;23247:15;;;;23212:12;;;;23188:1;23106:9;23077:195;;;-1:-1:-1;;;;;;;23328:32:1;;;;23323:2;23308:18;;23301:60;-1:-1:-1;;;23392:3:1;23377:19;23370:35;23289:3;22431:980;-1:-1:-1;;;22431:980:1:o

Swarm Source

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