ETH Price: $2,918.98 (+3.53%)
 

Overview

Max Total Supply

1,000,000,000,000 $MVT

Holders

294

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
11,217,300,289.1 $MVT

Value
$0.00
0xaE6D0E8003517448CaaAaaFb49B644Eb3ccEe0Ce
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:
MetaVault

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.8.4;

// SPDX-License-Identifier: UNLICENSED

interface IBEP20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IuniswapV2ERC20 {
    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;
}

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 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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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;
}



/**
 * @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 {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

//MetaVault Contract /////////////

contract MetaVault is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromBuyLock;
    EnumerableSet.AddressSet private _excludedFromStaking;
    //Token Info
    string private constant _name = 'MetaVault';
    string private constant _symbol = '$MVT';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000000000 * 10**_decimals;//equals 1 000 000 000 000 tokens

    //Divider for the MaxBalance based on circulating Supply (1%)
    uint8 public constant BalanceLimitDivider=100;
    //Divider for sellLimit based on circulating Supply (0.1%)
    uint16 public constant SellLimitDivider=1000;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 30;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public TeamWallet=payable(0x65a89aB0402596cbDbF779dD8455B821109B6F14);
    address public LoanWallet=payable(0x60296fc78fcAc8937693EE0Cd6428A9324eD52Bd);
    //TestNet
    //address private constant uniswapV2Router=0xE592427A0AEce92De3Edee1F18E0157C05861564;
    //MainNet
    address private constant uniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
	uint256 private antiWhale = 1000000000 * 10**_decimals;
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _stakingTax;

    //Tracks the current contract sell amount. (Not users) -- Can be updated by owner after launch to prevent massive contract sells.
    uint256 private _setSellAmount = 1000000000 * 10**_decimals;

       
    address private _uniswapV2PairAddress; 
    IuniswapV2Router02 private  _uniswapV2Router;
    
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==TeamWallet||addr==LoanWallet;
    }

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // uniswapV2 Router
        _uniswapV2Router = IuniswapV2Router02(uniswapV2Router);
        //Creates a uniswapV2 Pair
        _uniswapV2PairAddress = IuniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
		
		//Sets buyLockTime
        buyLockTime=30;

        //Set Starting Tax 
        
        _buyTax=10;
        _sellTax=10;
        _transferTax=10;

        _burnTax=0;
        _liquidityTax=20;
        _stakingTax=80;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(LoanWallet);
        _excluded.add(msg.sender);
        //excludes uniswapV2 Router, pair, contract and burn address from staking
        _excludedFromStaking.add(address(_uniswapV2Router));
        _excludedFromStaking.add(_uniswapV2PairAddress);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD);
    
    }

    //Transfer functionality///

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between uniswapV2Router and uniswapV2Pair are tax and lock free
        address uniswapV2Router=address(_uniswapV2Router);
        bool isLiquidityTransfer = ((sender == _uniswapV2PairAddress && recipient == uniswapV2Router) 
        || (recipient == _uniswapV2PairAddress && sender == uniswapV2Router));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_uniswapV2PairAddress|| sender == uniswapV2Router;
        bool isSell=recipient==_uniswapV2PairAddress|| recipient == uniswapV2Router;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP and stakingETH, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            //Sells can't exceed the sell limit(21,000 Tokens at start, can be updated to circulating supply)
            require(amount<=sellLimit,"Dump protection");
            tax=_sellTax;


        } else if(isBuy){
			if(!_excludedFromBuyLock.contains(recipient)){
                 //If buyer bought less than buyLockTime(2h 50m) ago, buy is declined, can be disabled by Team         
                require(_buyLock[recipient]<=block.timestamp||buyLockDisabled,"Buyer in buyLock");
                //Sets the time buyers get locked(2 hours 50 mins by default)
                _buyLock[recipient]=block.timestamp+buyLockTime;
            }
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
			require(amount <= antiWhale,"Tx amount exceeding max buy amount");
            tax=_buyTax;

        } else {//Transfer
            //withdraws ETH when sending less or equal to 1 Token
            //that way you can withdraw without connecting to any dApp.
            //might needs higher gas limit
            if(amount<=10**(_decimals)) claimBTC(sender);
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            tax=_transferTax;

        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapV2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapV2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _stakingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token and handles staking
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);

    }

    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }

     //ETH Autostake/////////////////////////////////////////////////////////////////////////////////////////
       //Autostake uses the balances of each holder to redistribute auto generated ETH.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawETH can be used for any holder to withdraw ETH at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //lock for the withdraw
    bool private _isWithdrawing;
    //Multiplier to add some accuracy to profitPerShare
    uint256 private constant DistributionMultiplier = 2**64;
    //profit for each share a holder holds, a share equals a token.
    uint256 public profitPerShare;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalStakingReward;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    
    //marketing share starts at 50% 
    //its capped to 50% max, the percentage of the staking that gets used for
    //marketing/paying the team
    uint8 public StakingShare=50;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of the already paid out(or missed) shares of each staker
    mapping(address => uint256) private alreadyPaidShares;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, uniswapV2 and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isExcludedFromStaking(address addr) public view returns (bool){
        return _excludedFromStaking.contains(addr);
    }

    //Total shares equals circulating supply minus excluded Balances
    function _getTotalShares() public view returns (uint256){
        uint256 shares=_circulatingSupply;
        //substracts all excluded from shares, excluded list is limited to 30
        // to avoid creating a Honeypot through OutOfGas exeption
        for(uint i=0; i<_excludedFromStaking.length(); i++){
            shares-=_balances[_excludedFromStaking.at(i)];
        }
        return shares;
    }

    //adds Token to balances, adds new ETH to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token, adds ETH to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //sets newBalance
        _balances[addr]=newAmount;
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
    }
    
    
    //gets the not dividents of a staker that aren't in the toBePaid mapping 
    //returns wrong value for excluded accounts
    function _newDividentsOf(address staker) private view returns (uint256) {
        uint256 fullPayout = profitPerShare * _balances[staker];
        // if theres an overflow for some unexpected reason, return 0, instead of 
        // an exeption to still make trades possible
        if(fullPayout<alreadyPaidShares[staker]) return 0;
        return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier;
    }

    //distributes ETH between marketing share and dividends 
    function _distributeStake(uint256 ETHAmount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (ETHAmount * StakingShare) / 100;
        uint256 amount = ETHAmount - marketingSplit;

       marketingBalance+=marketingSplit;
       
        if (amount > 0) {
            totalStakingReward += amount;
            uint256 totalShares=_getTotalShares();
            //when there are 0 shares, add everything to marketing budget
            if (totalShares == 0) {
                marketingBalance += amount;
            }else{
                //Increases profit per share based on current total shares
                profitPerShare += ((amount * DistributionMultiplier) / totalShares);
            }
        }
    }
    event OnWithdrawBTC(uint256 amount, address recipient);
    
    //withdraws all dividents of address
    function claimBTC(address addr) private{
        require(!_isWithdrawing);
        _isWithdrawing=true;
        uint256 amount;
        if(isExcludedFromStaking(addr)){
            //if excluded just withdraw remaining toBePaid ETH
            amount=toBePaid[addr];
            toBePaid[addr]=0;
        }
        else{
            uint256 newAmount=_newDividentsOf(addr);
            //sets payout mapping to current amount
            alreadyPaidShares[addr] = profitPerShare * _balances[addr];
            //the amount to be paid 
            amount=toBePaid[addr]+newAmount;
            toBePaid[addr]=0;
        }
        if(amount==0){//no withdraw if 0 amount
            _isWithdrawing=false;
            return;
        }
        totalPayouts+=amount;
        address[] memory path = new address[](2);
        path[0] = _uniswapV2Router.WETH(); //WETH
        path[1] = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;  //WETH

        _uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawBTC(amount, addr);
        _isWithdrawing=false;
    }

    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////

    //tracks auto generated ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_stakingTax;
        uint256 tokenToSwap = _setSellAmount;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqETHToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance, so swap won't touch any staked ETH
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining ETH between stakers and Marketing
        _distributeStake(distributeETH);
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapV2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ETHamount) private {
        totalLPETH=ETHamount;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ETHamount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    //public functions /////////////////////////////////////////////////////////////////////////////////////

    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function getBurnedTokens() public view returns(uint256){
        return (InitialSupply-_circulatingSupply)/10**_decimals;
    }

    function getLimits() public view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10**_decimals, sellLimit/10**_decimals);
    }

    function getTaxes() public view returns(uint256 burnTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_stakingTax,_buyTax,_sellTax,_transferTax);
    }
	
    //How long is a given address still locked from buying
	function getAddressBuyLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_buyLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getBuyLockTimeInSeconds() public view returns(uint256){
        return buyLockTime;
    }
    
    //Functions every wallet can call
	
	//Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() public{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
    }
	
    function getDividents(address addr) public view returns (uint256){
        if(isExcludedFromStaking(addr)) return toBePaid[addr];
        return _newDividentsOf(addr)+toBePaid[addr];
    }

    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
 
	bool public buyLockDisabled;
    uint256 public buyLockTime;
    bool public manualConversion; 

    function TeamWithdrawALLMarketingETH() public onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer(amount*3/4);
        payable(LoanWallet).transfer(amount*1/4);
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) public onlyOwner{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        payable(TeamWallet).transfer(amount*3/4);
        payable(LoanWallet).transfer(amount*1/4);
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) public onlyOwner{
        manualConversion=manual;
    }
	
	function TeamChangeAntiWhale(uint256 newAntiWhale) public onlyOwner{
      antiWhale=newAntiWhale * 10**_decimals;
    }
    
    function TeamChangeTeamWallet(address newTeamWallet) public onlyOwner{
      TeamWallet=payable(newTeamWallet);
    }
    
    function TeamChangeLoanWallet(address newLoanWallet) public onlyOwner{
      LoanWallet=payable(newLoanWallet);
    }

	
	//Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) public onlyOwner{
        buyLockDisabled=disabled;
    }
	
	//Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds)public onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
    } 
    
    //Allows wallet exclusion to be added after launch
    function AddWalletExclusion(address exclusionAdd) public onlyOwner{
        _excluded.add(exclusionAdd);
    }
    
    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 stakingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+stakingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _stakingTax=stakingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;
    }

    //How much of the staking tax should be allocated for marketing
    function TeamChangeStakingShare(uint8 newShare) public onlyOwner{
        require(newShare<=50); 
        StakingShare=newShare;
    }
    //manually converts contract token to LP and staking ETH
    function TeamCreateLPandETH() public onlyOwner{
    _swapContractToken();
    }
    
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100);
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;     
    }

    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() public onlyOwner{
        tradingEnabled=true;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
    }

    //Contract TokenToSwap change function.
    function changeTokenToSwapAmount(uint256 _setAmountToSwap) public onlyOwner {
        _setSellAmount = _setAmountToSwap;
    }

    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(TeamWallet, amount);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity(bool addToStaking) public onlyOwner{
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapV2Router),amount);
        //Removes Liquidity and either distributes liquidity ETH to stakers, or 
        // adds them to marketing Balance
        //Token will be converted
        //to Liquidity and Staking ETH again
        uint256 initialETHBalance = address(this).balance;
        _uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        if(addToStaking){
            _distributeStake(newETHBalance);
        }
        else{
            marketingBalance+=newETHBalance;
        }

    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamRemoveRemainingETH() public onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

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

    function getOwner() external view override returns (address) {
        return owner();
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address _owner, address spender) external view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    // IBEP20 - Helpers

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

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":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"OnWithdrawBTC","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"AddWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"AddressResetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LoanWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"StakingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAntiWhale","type":"uint256"}],"name":"TeamChangeAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLoanWallet","type":"address"}],"name":"TeamChangeLoanWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeStakingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"TeamChangeTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"addToStaking","type":"bool"}],"name":"TeamRemoveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"stakingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawALLMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_getTotalShares","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":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_setAmountToSwap","type":"uint256"}],"name":"changeTokenToSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getDividents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","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":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a80546001600160a01b03199081167365a89ab0402596cbdbf779dd8455b821109b6f14178255600b80549091167360296fc78fcac8937693ee0cd6428a9324ed52bd17905562000059906009906200062f565b6200006a9064e8d4a5100062000640565b600c819055600d819055600e55620000856009600a6200062f565b6200009590633b9aca0062000640565b600f55620000a66009600a6200062f565b620000b690633b9aca0062000640565b6011556017805460ff19166032179055348015620000d357600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601380546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001bc57600080fd5b505afa158015620001d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f7919062000662565b6001600160a01b031663c9c6539630601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200025557600080fd5b505afa1580156200026a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000290919062000662565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002d957600080fd5b505af1158015620002ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000314919062000662565b601280546001600160a01b0319166001600160a01b03929092169190911790556064620003446009600a6200062f565b620003559064e8d4a5100062000640565b62000361919062000694565b600d556103e8620003756009600a6200062f565b620003869064e8d4a5100062000640565b62000392919062000694565b600e55601e601d556010805465ffffffffffff1916655014000a0a0a179055600a54620003d7906004906001600160a01b0316620004aa602090811b62001d0817901c565b50600b54620003fe906004906001600160a01b0316620004aa602090811b62001d0817901c565b506200041a336004620004aa60201b62001d081790919060201c565b5060135462000441906008906001600160a01b0316620004aa602090811b62001d0817901c565b5060125462000468906008906001600160a01b0316620004aa602090811b62001d0817901c565b5062000484306008620004aa60201b62001d081790919060201c565b50620004a261dead6008620004aa60201b62001d081790919060201c565b5050620006b7565b6000620004c1836001600160a01b038416620004ca565b90505b92915050565b60008181526001830160205260408120546200051357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004c4565b506000620004c4565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005735781600019048211156200055757620005576200051c565b808516156200056557918102915b93841c939080029062000537565b509250929050565b6000826200058c57506001620004c4565b816200059b57506000620004c4565b8160018114620005b45760028114620005bf57620005df565b6001915050620004c4565b60ff841115620005d357620005d36200051c565b50506001821b620004c4565b5060208310610133831016604e8410600b841016171562000604575081810a620004c4565b62000610838362000532565b80600019048211156200062757620006276200051c565b029392505050565b6000620004c160ff8416836200057b565b60008160001904831182151516156200065d576200065d6200051c565b500290565b6000602082840312156200067557600080fd5b81516001600160a01b03811681146200068d57600080fd5b9392505050565b600082620006b257634e487b7160e01b600052601260045260246000fd5b500490565b61357e80620006c76000396000f3fe60806040526004361061038c5760003560e01c806370a08231116101da578063a457c2d711610101578063dd62ed3e1161009a578063e8d834a61161006c578063e8d834a614610adb578063f00df36514610afb578063f2fde38b14610b11578063f3430eab14610b3157005b8063dd62ed3e14610a40578063e2fd002a14610a86578063e69e03ee14610aa6578063e803050c14610abb57005b8063c3a3c032116100d3578063c3a3c032146109d6578063c3f4f54f146109eb578063cd979a7e14610a00578063daf9a47a14610a2057005b8063a457c2d714610956578063a9059cbb14610976578063b766a38614610996578063b830a637146109b657005b8063893d20e8116101735780639bc845fb116101455780639bc845fb146108dc5780639bf65770146108fc5780639fa62d5f1461091c578063a06dc32e1461093c57005b8063893d20e8146108715780638da5cb5b1461087157806390b57abe1461088f57806395d89b41146108af57005b80637b9e987a116101ac5780637b9e987a14610817578063828e8b7e1461082c5780638650e92a1461084157806386d0ada81461085757005b806370a0823114610796578063715018a6146107cc5780637335307b146107e1578063762bb2821461080157005b80633c7a309b116102be5780634e68b1b91161025757806358e553651161022957806358e55365146107095780635c69f6901461071f578063677a8870146107345780636f89e4091461076c57005b80634e68b1b91461069e5780634f91e48c146106be57806357ad67d1146106d457806358e1df92146106f457005b806344f3c83a1161029057806344f3c83a146106345780634ada218b1461064a5780634cbf8e24146106695780634cdaf0ae1461067e57005b80633c7a309b146105d35780633cc39b7a146105e85780634089b170146105fe5780634476f35a1461061457005b8063243b529a11610330578063311a869711610302578063311a869714610558578063313ce5671461057f57806332ac487f1461059357806339509351146105b357005b8063243b529a1461049b5780632973ef2d146104b05780632c889d18146105195780633054f8a31461053957005b806314ddc0951161036957806314ddc0951461043257806318160ddd146104515780631eb25d131461046657806323b872dd1461047b57005b806306fdde0314610395578063095ea7b3146103d95780630fd99e161461040957005b3661039357005b005b3480156103a157600080fd5b5060408051808201909152600981526813595d1855985d5b1d60ba1b60208201525b6040516103d09190612f71565b60405180910390f35b3480156103e557600080fd5b506103f96103f4366004612fdb565b610b51565b60405190151581526020016103d0565b34801561041557600080fd5b5061041f6103e881565b60405161ffff90911681526020016103d0565b34801561043e57600080fd5b50601d545b6040519081526020016103d0565b34801561045d57600080fd5b50600c54610443565b34801561047257600080fd5b50610443610b68565b34801561048757600080fd5b506103f9610496366004613007565b610b86565b3480156104a757600080fd5b50610393610c22565b3480156104bc57600080fd5b506010546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103d0565b34801561052557600080fd5b50610393610534366004613048565b610c65565b34801561054557600080fd5b50601c546103f990610100900460ff1681565b34801561056457600080fd5b5061056d606481565b60405160ff90911681526020016103d0565b34801561058b57600080fd5b50600961056d565b34801561059f57600080fd5b506104436105ae366004613061565b610cb3565b3480156105bf57600080fd5b506103f96105ce366004612fdb565b610d0b565b3480156105df57600080fd5b50610393610d42565b3480156105f457600080fd5b50610443601b5481565b34801561060a57600080fd5b5061044360165481565b34801561062057600080fd5b5061039361062f366004613048565b610eaf565b34801561064057600080fd5b50610443601d5481565b34801561065657600080fd5b50601e546103f990610100900460ff1681565b34801561067557600080fd5b50610393610faf565b34801561068a57600080fd5b50610393610699366004613061565b611079565b3480156106aa57600080fd5b506103936106b9366004613094565b6110dc565b3480156106ca57600080fd5b50610443600e5481565b3480156106e057600080fd5b506103936106ef3660046130af565b61113c565b34801561070057600080fd5b5061039361126f565b34801561071557600080fd5b5061044360185481565b34801561072b57600080fd5b5061041f601e81565b34801561074057600080fd5b50600a54610754906001600160a01b031681565b6040516001600160a01b0390911681526020016103d0565b34801561077857600080fd5b506107816112cd565b604080519283526020830191909152016103d0565b3480156107a257600080fd5b506104436107b1366004613061565b6001600160a01b031660009081526001602052604090205490565b3480156107d857600080fd5b5061039361130a565b3480156107ed57600080fd5b506103f96107fc366004613061565b61138d565b34801561080d57600080fd5b50610443600d5481565b34801561082357600080fd5b5061039361139a565b34801561083857600080fd5b506103936113e4565b34801561084d57600080fd5b5061044360145481565b34801561086357600080fd5b50601e546103f99060ff1681565b34801561087d57600080fd5b506000546001600160a01b0316610754565b34801561089b57600080fd5b506103936108aa366004613048565b611408565b3480156108bb57600080fd5b506040805180820190915260048152630913559560e21b60208201526103c3565b3480156108e857600080fd5b506103936108f7366004613061565b611446565b34801561090857600080fd5b50610393610917366004613131565b6114a1565b34801561092857600080fd5b5061039361093736600461314e565b6114ed565b34801561094857600080fd5b5060175461056d9060ff1681565b34801561096257600080fd5b506103f9610971366004612fdb565b611670565b34801561098257600080fd5b506103f9610991366004612fdb565b6116ec565b3480156109a257600080fd5b506103936109b1366004613131565b6116f9565b3480156109c257600080fd5b50600b54610754906001600160a01b031681565b3480156109e257600080fd5b5061044361174c565b3480156109f757600080fd5b5061044361176c565b348015610a0c57600080fd5b50610393610a1b366004613061565b6117ac565b348015610a2c57600080fd5b50610393610a3b366004613048565b6117f0565b348015610a4c57600080fd5b50610443610a5b366004613170565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a9257600080fd5b50610393610aa1366004613048565b611845565b348015610ab257600080fd5b506104436118cd565b348015610ac757600080fd5b50610443610ad6366004613061565b611933565b348015610ae757600080fd5b50610393610af6366004613131565b61196d565b348015610b0757600080fd5b5061044360155481565b348015610b1d57600080fd5b50610393610b2c366004613061565b611bb4565b348015610b3d57600080fd5b50610393610b4c366004613061565b611cad565b6000610b5e338484611d1d565b5060015b92915050565b610b746009600a6132a3565b610b839064e8d4a510006132b2565b81565b6000610b93848484611e10565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610c035760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b60448201526064015b60405180910390fd5b610c178533610c1286856132d1565b611d1d565b506001949350505050565b33610c356000546001600160a01b031690565b6001600160a01b031614610c5b5760405162461bcd60e51b8152600401610bfa906132e8565b610c63612051565b565b33610c786000546001600160a01b031690565b6001600160a01b031614610c9e5760405162461bcd60e51b8152600401610bfa906132e8565b610cb0610cab428361331d565b612191565b50565b6000610cbe8261138d565b15610cdf57506001600160a01b03166000908152601a602052604090205490565b6001600160a01b0382166000908152601a6020526040902054610d01836121a4565b610b62919061331d565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b5e918590610c1290869061331d565b33610d556000546001600160a01b031690565b6001600160a01b031614610d7b5760405162461bcd60e51b8152600401610bfa906132e8565b601f54421015610d9d5760405162461bcd60e51b8152600401610bfa90613335565b601e546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e22919061335f565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaa9190613378565b505050565b33610ec26000546001600160a01b031690565b6001600160a01b031614610ee85760405162461bcd60e51b8152600401610bfa906132e8565b601854811115610ef757600080fd5b8060186000828254610f0991906132d1565b9091555050600a546001600160a01b03166108fc6004610f2a8460036132b2565b610f349190613395565b6040518115909202916000818181858888f19350505050158015610f5c573d6000803e3d6000fd5b50600b546001600160a01b03166108fc6004610f798460016132b2565b610f839190613395565b6040518115909202916000818181858888f19350505050158015610fab573d6000803e3d6000fd5b5050565b33610fc26000546001600160a01b031690565b6001600160a01b031614610fe85760405162461bcd60e51b8152600401610bfa906132e8565b601f5442101561100a5760405162461bcd60e51b8152600401610bfa90613335565b6110166107084261331d565b601f55600a546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611066576040519150601f19603f3d011682016040523d82523d6000602084013e61106b565b606091505b5050905080610cb057600080fd5b3361108c6000546001600160a01b031690565b6001600160a01b0316146110b25760405162461bcd60e51b8152600401610bfa906132e8565b601e80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336110ef6000546001600160a01b031690565b6001600160a01b0316146111155760405162461bcd60e51b8152600401610bfa906132e8565b60328160ff16111561112657600080fd5b6017805460ff191660ff92909216919091179055565b3361114f6000546001600160a01b031690565b6001600160a01b0316146111755760405162461bcd60e51b8152600401610bfa906132e8565b60008461118287896133b7565b61118c91906133b7565b90508060ff166064146111f05760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610bfa565b506010805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112826000546001600160a01b031690565b6001600160a01b0316146112a85760405162461bcd60e51b8152600401610bfa906132e8565b601880546000909155600a546001600160a01b03166108fc6004610f2a8460036132b2565b6000806112dc6009600a6132a3565b600d546112e99190613395565b6112f56009600a6132a3565b600e546113029190613395565b915091509091565b3361131d6000546001600160a01b031690565b6001600160a01b0316146113435760405162461bcd60e51b8152600401610bfa906132e8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610b6260088361222a565b336113ad6000546001600160a01b031690565b6001600160a01b0316146113d35760405162461bcd60e51b8152600401610bfa906132e8565b601e805461ff001916610100179055565b601d546113f1904261331d565b33600090815260036020526040902055565b905090565b3361141b6000546001600160a01b031690565b6001600160a01b0316146114415760405162461bcd60e51b8152600401610bfa906132e8565b601155565b336114596000546001600160a01b031690565b6001600160a01b03161461147f5760405162461bcd60e51b8152600401610bfa906132e8565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b336114b46000546001600160a01b031690565b6001600160a01b0316146114da5760405162461bcd60e51b8152600401610bfa906132e8565b601e805460ff1916911515919091179055565b336115006000546001600160a01b031690565b6001600160a01b0316146115265760405162461bcd60e51b8152600401610bfa906132e8565b6064600c546115359190613395565b811061154057600080fd5b61154c6009600a6132a3565b61155690836132b2565b91506115646009600a6132a3565b61156e90826132b2565b90506000606460ff16600c546115849190613395565b905060006103e861ffff16600c5461159c9190613395565b9050818410156116025760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610bfa565b808310156116635760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610bfa565b5050600d91909155600e55565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156116d35760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610bfa565b6116e23385610c1286856132d1565b5060019392505050565b6000610b5e338484611e10565b3361170c6000546001600160a01b031690565b6001600160a01b0316146117325760405162461bcd60e51b8152600401610bfa906132e8565b601c80549115156101000261ff0019909216919091179055565b6000601f544210156117665742601f5461140391906132d1565b50600090565b600061177a6009600a6132a3565b600c546117896009600a6132a3565b6117989064e8d4a510006132b2565b6117a291906132d1565b6114039190613395565b336117bf6000546001600160a01b031690565b6001600160a01b0316146117e55760405162461bcd60e51b8152600401610bfa906132e8565b610fab600482611d08565b336118036000546001600160a01b031690565b6001600160a01b0316146118295760405162461bcd60e51b8152600401610bfa906132e8565b6118356009600a6132a3565b61183f90826132b2565b600f5550565b336118586000546001600160a01b031690565b6001600160a01b03161461187e5760405162461bcd60e51b8152600401610bfa906132e8565b601e8111156118c85760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610bfa565b601d55565b600c54600090815b6118df600861224c565b81101561192d57600160006118f5600884612256565b6001600160a01b0316815260208101919091526040016000205461191990836132d1565b915080611925816133dc565b9150506118d5565b50919050565b6001600160a01b03811660009081526003602052604081205442811161195c5750600092915050565b61196642826132d1565b9392505050565b336119806000546001600160a01b031690565b6001600160a01b0316146119a65760405162461bcd60e51b8152600401610bfa906132e8565b601f544210156119c85760405162461bcd60e51b8152600401610bfa90613335565b6119d46107084261331d565b601f55601e546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015611a2457600080fd5b505afa158015611a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c919061335f565b60135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015611aac57600080fd5b505af1158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae49190613378565b5060135460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611b2090309086906000908190849042906004016133f7565b602060405180830381600087803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b72919061335f565b506000611b7f82476132d1565b90508415611b9557611b9081612262565b611bad565b8060186000828254611ba7919061331d565b90915550505b5050505050565b33611bc76000546001600160a01b031690565b6001600160a01b031614611bed5760405162461bcd60e51b8152600401610bfa906132e8565b6001600160a01b038116611c525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bfa565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b33611cc06000546001600160a01b031690565b6001600160a01b031614611ce65760405162461bcd60e51b8152600401610bfa906132e8565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000611966836001600160a01b03841661232b565b6001600160a01b038316611d675760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610bfa565b6001600160a01b038216611daf5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610bfa565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e5b5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610bfa565b6001600160a01b038216611ea45760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610bfa565b6000611eb160048561222a565b80611ec25750611ec260048461222a565b905060006001600160a01b038516301480611ee557506001600160a01b03841630145b6013546012549192506001600160a01b03908116916000918881169116148015611f205750816001600160a01b0316866001600160a01b0316145b80611f5457506012546001600160a01b038781169116148015611f545750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b0389811691161480611f875750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b0389811691161480611fba5750836001600160a01b0316886001600160a01b0316145b90508480611fc55750825b80611fcd5750855b15611fe257611fdd89898961237a565b612046565b601e54610100900460ff166120395760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610bfa565b6120468989898585612445565b505050505050505050565b601c805460ff19166001908117909155306000908152602091909152604081205460105490919061209790600160281b810460ff908116916401000000009004166133b7565b60ff16905060006011549050808310806120b3575061ffff8216155b156120c057505050612185565b60105460009061ffff8416906120e190640100000000900460ff16846132b2565b6120eb9190613395565b905060006120f982846132d1565b90506000612108600284613395565b9050600061211682856132d1565b90506000612124848361331d565b90504761213082612843565b600061213c82476132d1565b905060008361214b86846132b2565b6121559190613395565b905061216186826129ab565b600061216d84476132d1565b905061217881612262565b5050505050505050505050505b601c805460ff19169055565b601f54811161219f57600080fd5b601f55565b6001600160a01b03811660009081526001602052604081205460145482916121cb916132b2565b6001600160a01b0384166000908152601960205260409020549091508110156121f75750600092915050565b6001600160a01b038316600090815260196020526040902054600160401b9061222090836132d1565b6119669190613395565b6001600160a01b03811660009081526001830160205260408120541515611966565b6000610b62825490565b60006119668383612a57565b6017546000906064906122789060ff16846132b2565b6122829190613395565b9050600061229082846132d1565b905081601860008282546122a4919061331d565b90915550508015610eaa5780601560008282546122c1919061331d565b90915550600090506122d16118cd565b9050806122f55781601860008282546122ea919061331d565b909155506123259050565b80612304600160401b846132b2565b61230e9190613395565b6014600082825461231f919061331d565b90915550505b50505050565b600081815260018301602052604081205461237257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b62565b506000610b62565b6001600160a01b038316600090815260016020526040902054818110156123de5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bfa565b6123e88483612add565b6123f28383612b9e565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161243791815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156124b35760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bfa565b6000831561251057600e548611156124ff5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610bfa565b50601054610100900460ff166126e7565b84156126705761252160068861222a565b6125b9576001600160a01b038716600090815260036020526040902054421015806125535750601c54610100900460ff165b6125925760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610bfa565b601d5461259f904261331d565b6001600160a01b0388166000908152600360205260409020555b600d546125c6878561331d565b11156126075760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610bfa565b600f548611156126645760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610bfa565b5060105460ff166126e7565b61267c6009600a6132a3565b861161268b5761268b88612c69565b600d54612698878561331d565b11156126d95760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610bfa565b5060105462010000900460ff165b6012546001600160a01b038981169116148015906127085750601e5460ff16155b80156127175750601c5460ff16155b80156127205750835b1561272d5761272d612051565b60006127498783601060039054906101000a900460ff16612f3d565b60105490915060009061277d90899085906127789060ff6401000000008204811691600160281b9004166133b7565b612f3d565b9050600061278b828461331d565b612795908a6132d1565b90506127a18b8a612add565b30600090815260016020526040812080548492906127c090849061331d565b9250508190555082600c60008282546127d991906132d1565b909155506127e990508a82612b9e565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161282e91815260200190565b60405180910390a35050505050505050505050565b60135461285b9030906001600160a01b031683611d1d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061289057612890613432565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156128e457600080fd5b505afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291c9190613448565b8160018151811061292f5761292f613432565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac947906129759085906000908690309042906004016134a9565b600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050505050565b601b8190556013546129c89030906001600160a01b031684611d1d565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d719908390612a0590309087906000908190849042906004016133f7565b6060604051808303818588803b158015612a1e57600080fd5b505af1158015612a32573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bad91906134e5565b81546000908210612ab55760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610bfa565b826000018281548110612aca57612aca613432565b9060005260206000200154905092915050565b6001600160a01b038216600090815260016020526040812054612b019083906132d1565b9050612b0c8361138d565b15612b31576001600160a01b0390921660009081526001602052604090209190915550565b6000612b3c846121a4565b6001600160a01b0385166000908152600160205260409020839055601454909150612b689083906132b2565b6001600160a01b038516600090815260196020908152604080832093909355601a9052908120805483929061231f90849061331d565b6001600160a01b038216600090815260016020526040812054612bc290839061331d565b9050612bcd8361138d565b15612bf2576001600160a01b0390921660009081526001602052604090209190915550565b6000612bfd846121a4565b905081601454612c0d91906132b2565b6001600160a01b038516600090815260196020908152604080832093909355601a90529081208054839290612c4390849061331d565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b601354600160a01b900460ff1615612c8057600080fd5b6013805460ff60a01b1916600160a01b1790556000612c9e8261138d565b15612cc657506001600160a01b0381166000908152601a602052604081208054919055612d46565b6000612cd1836121a4565b6001600160a01b038416600090815260016020526040902054601454919250612cf9916132b2565b6001600160a01b038416600090815260196020908152604080832093909355601a90522054612d2990829061331d565b6001600160a01b0384166000908152601a60205260408120559150505b80612d5c5750506013805460ff60a01b19169055565b8060166000828254612d6e919061331d565b90915550506040805160028082526060820183526000926020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015612dd857600080fd5b505afa158015612dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e109190613448565b81600081518110612e2357612e23613432565b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612e6b57612e6b613432565b6001600160a01b03928316602091820292909201015260135460405163b6f9de9560e01b815291169063b6f9de95908490612eb190600090869089904290600401613513565b6000604051808303818588803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f2b34268bcedbf9b655b19f5d555d15d0f7c2fb24be646909c8944a511fcf86f29450019150612f239050565b60405180910390a150506013805460ff60a01b1916905550565b60006127108260ff168460ff1686612f5591906132b2565b612f5f91906132b2565b612f699190613395565b949350505050565b600060208083528351808285015260005b81811015612f9e57858101830151858201604001528201612f82565b81811115612fb0576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610cb057600080fd5b60008060408385031215612fee57600080fd5b8235612ff981612fc6565b946020939093013593505050565b60008060006060848603121561301c57600080fd5b833561302781612fc6565b9250602084013561303781612fc6565b929592945050506040919091013590565b60006020828403121561305a57600080fd5b5035919050565b60006020828403121561307357600080fd5b813561196681612fc6565b803560ff8116811461308f57600080fd5b919050565b6000602082840312156130a657600080fd5b6119668261307e565b60008060008060008060c087890312156130c857600080fd5b6130d18761307e565b95506130df6020880161307e565b94506130ed6040880161307e565b93506130fb6060880161307e565b92506131096080880161307e565b915061311760a0880161307e565b90509295509295509295565b8015158114610cb057600080fd5b60006020828403121561314357600080fd5b813561196681613123565b6000806040838503121561316157600080fd5b50508035926020909101359150565b6000806040838503121561318357600080fd5b823561318e81612fc6565b9150602083013561319e81612fc6565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156131fa5781600019048211156131e0576131e06131a9565b808516156131ed57918102915b93841c93908002906131c4565b509250929050565b60008261321157506001610b62565b8161321e57506000610b62565b8160018114613234576002811461323e5761325a565b6001915050610b62565b60ff84111561324f5761324f6131a9565b50506001821b610b62565b5060208310610133831016604e8410600b841016171561327d575081810a610b62565b61328783836131bf565b806000190482111561329b5761329b6131a9565b029392505050565b600061196660ff841683613202565b60008160001904831182151516156132cc576132cc6131a9565b500290565b6000828210156132e3576132e36131a9565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115613330576133306131a9565b500190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60006020828403121561337157600080fd5b5051919050565b60006020828403121561338a57600080fd5b815161196681613123565b6000826133b257634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff038211156133d4576133d46131a9565b019392505050565b60006000198214156133f0576133f06131a9565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561345a57600080fd5b815161196681612fc6565b600081518084526020808501945080840160005b8381101561349e5781516001600160a01b031687529582019590820190600101613479565b509495945050505050565b85815284602082015260a0604082015260006134c860a0830186613465565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156134fa57600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061352c6080830186613465565b6001600160a01b0394909416604083015250606001529291505056fea264697066735822122085f36c3b6e8e65613da6d069cdad73d2dcca8752d54c3ecf9b39262f16bd078d64736f6c63430008090033

Deployed Bytecode

0x60806040526004361061038c5760003560e01c806370a08231116101da578063a457c2d711610101578063dd62ed3e1161009a578063e8d834a61161006c578063e8d834a614610adb578063f00df36514610afb578063f2fde38b14610b11578063f3430eab14610b3157005b8063dd62ed3e14610a40578063e2fd002a14610a86578063e69e03ee14610aa6578063e803050c14610abb57005b8063c3a3c032116100d3578063c3a3c032146109d6578063c3f4f54f146109eb578063cd979a7e14610a00578063daf9a47a14610a2057005b8063a457c2d714610956578063a9059cbb14610976578063b766a38614610996578063b830a637146109b657005b8063893d20e8116101735780639bc845fb116101455780639bc845fb146108dc5780639bf65770146108fc5780639fa62d5f1461091c578063a06dc32e1461093c57005b8063893d20e8146108715780638da5cb5b1461087157806390b57abe1461088f57806395d89b41146108af57005b80637b9e987a116101ac5780637b9e987a14610817578063828e8b7e1461082c5780638650e92a1461084157806386d0ada81461085757005b806370a0823114610796578063715018a6146107cc5780637335307b146107e1578063762bb2821461080157005b80633c7a309b116102be5780634e68b1b91161025757806358e553651161022957806358e55365146107095780635c69f6901461071f578063677a8870146107345780636f89e4091461076c57005b80634e68b1b91461069e5780634f91e48c146106be57806357ad67d1146106d457806358e1df92146106f457005b806344f3c83a1161029057806344f3c83a146106345780634ada218b1461064a5780634cbf8e24146106695780634cdaf0ae1461067e57005b80633c7a309b146105d35780633cc39b7a146105e85780634089b170146105fe5780634476f35a1461061457005b8063243b529a11610330578063311a869711610302578063311a869714610558578063313ce5671461057f57806332ac487f1461059357806339509351146105b357005b8063243b529a1461049b5780632973ef2d146104b05780632c889d18146105195780633054f8a31461053957005b806314ddc0951161036957806314ddc0951461043257806318160ddd146104515780631eb25d131461046657806323b872dd1461047b57005b806306fdde0314610395578063095ea7b3146103d95780630fd99e161461040957005b3661039357005b005b3480156103a157600080fd5b5060408051808201909152600981526813595d1855985d5b1d60ba1b60208201525b6040516103d09190612f71565b60405180910390f35b3480156103e557600080fd5b506103f96103f4366004612fdb565b610b51565b60405190151581526020016103d0565b34801561041557600080fd5b5061041f6103e881565b60405161ffff90911681526020016103d0565b34801561043e57600080fd5b50601d545b6040519081526020016103d0565b34801561045d57600080fd5b50600c54610443565b34801561047257600080fd5b50610443610b68565b34801561048757600080fd5b506103f9610496366004613007565b610b86565b3480156104a757600080fd5b50610393610c22565b3480156104bc57600080fd5b506010546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103d0565b34801561052557600080fd5b50610393610534366004613048565b610c65565b34801561054557600080fd5b50601c546103f990610100900460ff1681565b34801561056457600080fd5b5061056d606481565b60405160ff90911681526020016103d0565b34801561058b57600080fd5b50600961056d565b34801561059f57600080fd5b506104436105ae366004613061565b610cb3565b3480156105bf57600080fd5b506103f96105ce366004612fdb565b610d0b565b3480156105df57600080fd5b50610393610d42565b3480156105f457600080fd5b50610443601b5481565b34801561060a57600080fd5b5061044360165481565b34801561062057600080fd5b5061039361062f366004613048565b610eaf565b34801561064057600080fd5b50610443601d5481565b34801561065657600080fd5b50601e546103f990610100900460ff1681565b34801561067557600080fd5b50610393610faf565b34801561068a57600080fd5b50610393610699366004613061565b611079565b3480156106aa57600080fd5b506103936106b9366004613094565b6110dc565b3480156106ca57600080fd5b50610443600e5481565b3480156106e057600080fd5b506103936106ef3660046130af565b61113c565b34801561070057600080fd5b5061039361126f565b34801561071557600080fd5b5061044360185481565b34801561072b57600080fd5b5061041f601e81565b34801561074057600080fd5b50600a54610754906001600160a01b031681565b6040516001600160a01b0390911681526020016103d0565b34801561077857600080fd5b506107816112cd565b604080519283526020830191909152016103d0565b3480156107a257600080fd5b506104436107b1366004613061565b6001600160a01b031660009081526001602052604090205490565b3480156107d857600080fd5b5061039361130a565b3480156107ed57600080fd5b506103f96107fc366004613061565b61138d565b34801561080d57600080fd5b50610443600d5481565b34801561082357600080fd5b5061039361139a565b34801561083857600080fd5b506103936113e4565b34801561084d57600080fd5b5061044360145481565b34801561086357600080fd5b50601e546103f99060ff1681565b34801561087d57600080fd5b506000546001600160a01b0316610754565b34801561089b57600080fd5b506103936108aa366004613048565b611408565b3480156108bb57600080fd5b506040805180820190915260048152630913559560e21b60208201526103c3565b3480156108e857600080fd5b506103936108f7366004613061565b611446565b34801561090857600080fd5b50610393610917366004613131565b6114a1565b34801561092857600080fd5b5061039361093736600461314e565b6114ed565b34801561094857600080fd5b5060175461056d9060ff1681565b34801561096257600080fd5b506103f9610971366004612fdb565b611670565b34801561098257600080fd5b506103f9610991366004612fdb565b6116ec565b3480156109a257600080fd5b506103936109b1366004613131565b6116f9565b3480156109c257600080fd5b50600b54610754906001600160a01b031681565b3480156109e257600080fd5b5061044361174c565b3480156109f757600080fd5b5061044361176c565b348015610a0c57600080fd5b50610393610a1b366004613061565b6117ac565b348015610a2c57600080fd5b50610393610a3b366004613048565b6117f0565b348015610a4c57600080fd5b50610443610a5b366004613170565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a9257600080fd5b50610393610aa1366004613048565b611845565b348015610ab257600080fd5b506104436118cd565b348015610ac757600080fd5b50610443610ad6366004613061565b611933565b348015610ae757600080fd5b50610393610af6366004613131565b61196d565b348015610b0757600080fd5b5061044360155481565b348015610b1d57600080fd5b50610393610b2c366004613061565b611bb4565b348015610b3d57600080fd5b50610393610b4c366004613061565b611cad565b6000610b5e338484611d1d565b5060015b92915050565b610b746009600a6132a3565b610b839064e8d4a510006132b2565b81565b6000610b93848484611e10565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610c035760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b60448201526064015b60405180910390fd5b610c178533610c1286856132d1565b611d1d565b506001949350505050565b33610c356000546001600160a01b031690565b6001600160a01b031614610c5b5760405162461bcd60e51b8152600401610bfa906132e8565b610c63612051565b565b33610c786000546001600160a01b031690565b6001600160a01b031614610c9e5760405162461bcd60e51b8152600401610bfa906132e8565b610cb0610cab428361331d565b612191565b50565b6000610cbe8261138d565b15610cdf57506001600160a01b03166000908152601a602052604090205490565b6001600160a01b0382166000908152601a6020526040902054610d01836121a4565b610b62919061331d565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b5e918590610c1290869061331d565b33610d556000546001600160a01b031690565b6001600160a01b031614610d7b5760405162461bcd60e51b8152600401610bfa906132e8565b601f54421015610d9d5760405162461bcd60e51b8152600401610bfa90613335565b601e546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e22919061335f565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaa9190613378565b505050565b33610ec26000546001600160a01b031690565b6001600160a01b031614610ee85760405162461bcd60e51b8152600401610bfa906132e8565b601854811115610ef757600080fd5b8060186000828254610f0991906132d1565b9091555050600a546001600160a01b03166108fc6004610f2a8460036132b2565b610f349190613395565b6040518115909202916000818181858888f19350505050158015610f5c573d6000803e3d6000fd5b50600b546001600160a01b03166108fc6004610f798460016132b2565b610f839190613395565b6040518115909202916000818181858888f19350505050158015610fab573d6000803e3d6000fd5b5050565b33610fc26000546001600160a01b031690565b6001600160a01b031614610fe85760405162461bcd60e51b8152600401610bfa906132e8565b601f5442101561100a5760405162461bcd60e51b8152600401610bfa90613335565b6110166107084261331d565b601f55600a546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611066576040519150601f19603f3d011682016040523d82523d6000602084013e61106b565b606091505b5050905080610cb057600080fd5b3361108c6000546001600160a01b031690565b6001600160a01b0316146110b25760405162461bcd60e51b8152600401610bfa906132e8565b601e80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336110ef6000546001600160a01b031690565b6001600160a01b0316146111155760405162461bcd60e51b8152600401610bfa906132e8565b60328160ff16111561112657600080fd5b6017805460ff191660ff92909216919091179055565b3361114f6000546001600160a01b031690565b6001600160a01b0316146111755760405162461bcd60e51b8152600401610bfa906132e8565b60008461118287896133b7565b61118c91906133b7565b90508060ff166064146111f05760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610bfa565b506010805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112826000546001600160a01b031690565b6001600160a01b0316146112a85760405162461bcd60e51b8152600401610bfa906132e8565b601880546000909155600a546001600160a01b03166108fc6004610f2a8460036132b2565b6000806112dc6009600a6132a3565b600d546112e99190613395565b6112f56009600a6132a3565b600e546113029190613395565b915091509091565b3361131d6000546001600160a01b031690565b6001600160a01b0316146113435760405162461bcd60e51b8152600401610bfa906132e8565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610b6260088361222a565b336113ad6000546001600160a01b031690565b6001600160a01b0316146113d35760405162461bcd60e51b8152600401610bfa906132e8565b601e805461ff001916610100179055565b601d546113f1904261331d565b33600090815260036020526040902055565b905090565b3361141b6000546001600160a01b031690565b6001600160a01b0316146114415760405162461bcd60e51b8152600401610bfa906132e8565b601155565b336114596000546001600160a01b031690565b6001600160a01b03161461147f5760405162461bcd60e51b8152600401610bfa906132e8565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b336114b46000546001600160a01b031690565b6001600160a01b0316146114da5760405162461bcd60e51b8152600401610bfa906132e8565b601e805460ff1916911515919091179055565b336115006000546001600160a01b031690565b6001600160a01b0316146115265760405162461bcd60e51b8152600401610bfa906132e8565b6064600c546115359190613395565b811061154057600080fd5b61154c6009600a6132a3565b61155690836132b2565b91506115646009600a6132a3565b61156e90826132b2565b90506000606460ff16600c546115849190613395565b905060006103e861ffff16600c5461159c9190613395565b9050818410156116025760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610bfa565b808310156116635760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610bfa565b5050600d91909155600e55565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156116d35760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610bfa565b6116e23385610c1286856132d1565b5060019392505050565b6000610b5e338484611e10565b3361170c6000546001600160a01b031690565b6001600160a01b0316146117325760405162461bcd60e51b8152600401610bfa906132e8565b601c80549115156101000261ff0019909216919091179055565b6000601f544210156117665742601f5461140391906132d1565b50600090565b600061177a6009600a6132a3565b600c546117896009600a6132a3565b6117989064e8d4a510006132b2565b6117a291906132d1565b6114039190613395565b336117bf6000546001600160a01b031690565b6001600160a01b0316146117e55760405162461bcd60e51b8152600401610bfa906132e8565b610fab600482611d08565b336118036000546001600160a01b031690565b6001600160a01b0316146118295760405162461bcd60e51b8152600401610bfa906132e8565b6118356009600a6132a3565b61183f90826132b2565b600f5550565b336118586000546001600160a01b031690565b6001600160a01b03161461187e5760405162461bcd60e51b8152600401610bfa906132e8565b601e8111156118c85760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610bfa565b601d55565b600c54600090815b6118df600861224c565b81101561192d57600160006118f5600884612256565b6001600160a01b0316815260208101919091526040016000205461191990836132d1565b915080611925816133dc565b9150506118d5565b50919050565b6001600160a01b03811660009081526003602052604081205442811161195c5750600092915050565b61196642826132d1565b9392505050565b336119806000546001600160a01b031690565b6001600160a01b0316146119a65760405162461bcd60e51b8152600401610bfa906132e8565b601f544210156119c85760405162461bcd60e51b8152600401610bfa90613335565b6119d46107084261331d565b601f55601e546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015611a2457600080fd5b505afa158015611a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5c919061335f565b60135460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015611aac57600080fd5b505af1158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae49190613378565b5060135460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611b2090309086906000908190849042906004016133f7565b602060405180830381600087803b158015611b3a57600080fd5b505af1158015611b4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b72919061335f565b506000611b7f82476132d1565b90508415611b9557611b9081612262565b611bad565b8060186000828254611ba7919061331d565b90915550505b5050505050565b33611bc76000546001600160a01b031690565b6001600160a01b031614611bed5760405162461bcd60e51b8152600401610bfa906132e8565b6001600160a01b038116611c525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bfa565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b33611cc06000546001600160a01b031690565b6001600160a01b031614611ce65760405162461bcd60e51b8152600401610bfa906132e8565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000611966836001600160a01b03841661232b565b6001600160a01b038316611d675760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610bfa565b6001600160a01b038216611daf5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610bfa565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e5b5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610bfa565b6001600160a01b038216611ea45760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610bfa565b6000611eb160048561222a565b80611ec25750611ec260048461222a565b905060006001600160a01b038516301480611ee557506001600160a01b03841630145b6013546012549192506001600160a01b03908116916000918881169116148015611f205750816001600160a01b0316866001600160a01b0316145b80611f5457506012546001600160a01b038781169116148015611f545750816001600160a01b0316876001600160a01b0316145b6012549091506000906001600160a01b0389811691161480611f875750826001600160a01b0316886001600160a01b0316145b6012549091506000906001600160a01b0389811691161480611fba5750836001600160a01b0316886001600160a01b0316145b90508480611fc55750825b80611fcd5750855b15611fe257611fdd89898961237a565b612046565b601e54610100900460ff166120395760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610bfa565b6120468989898585612445565b505050505050505050565b601c805460ff19166001908117909155306000908152602091909152604081205460105490919061209790600160281b810460ff908116916401000000009004166133b7565b60ff16905060006011549050808310806120b3575061ffff8216155b156120c057505050612185565b60105460009061ffff8416906120e190640100000000900460ff16846132b2565b6120eb9190613395565b905060006120f982846132d1565b90506000612108600284613395565b9050600061211682856132d1565b90506000612124848361331d565b90504761213082612843565b600061213c82476132d1565b905060008361214b86846132b2565b6121559190613395565b905061216186826129ab565b600061216d84476132d1565b905061217881612262565b5050505050505050505050505b601c805460ff19169055565b601f54811161219f57600080fd5b601f55565b6001600160a01b03811660009081526001602052604081205460145482916121cb916132b2565b6001600160a01b0384166000908152601960205260409020549091508110156121f75750600092915050565b6001600160a01b038316600090815260196020526040902054600160401b9061222090836132d1565b6119669190613395565b6001600160a01b03811660009081526001830160205260408120541515611966565b6000610b62825490565b60006119668383612a57565b6017546000906064906122789060ff16846132b2565b6122829190613395565b9050600061229082846132d1565b905081601860008282546122a4919061331d565b90915550508015610eaa5780601560008282546122c1919061331d565b90915550600090506122d16118cd565b9050806122f55781601860008282546122ea919061331d565b909155506123259050565b80612304600160401b846132b2565b61230e9190613395565b6014600082825461231f919061331d565b90915550505b50505050565b600081815260018301602052604081205461237257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b62565b506000610b62565b6001600160a01b038316600090815260016020526040902054818110156123de5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bfa565b6123e88483612add565b6123f28383612b9e565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161243791815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156124b35760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610bfa565b6000831561251057600e548611156124ff5760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610bfa565b50601054610100900460ff166126e7565b84156126705761252160068861222a565b6125b9576001600160a01b038716600090815260036020526040902054421015806125535750601c54610100900460ff165b6125925760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610bfa565b601d5461259f904261331d565b6001600160a01b0388166000908152600360205260409020555b600d546125c6878561331d565b11156126075760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610bfa565b600f548611156126645760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610bfa565b5060105460ff166126e7565b61267c6009600a6132a3565b861161268b5761268b88612c69565b600d54612698878561331d565b11156126d95760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610bfa565b5060105462010000900460ff165b6012546001600160a01b038981169116148015906127085750601e5460ff16155b80156127175750601c5460ff16155b80156127205750835b1561272d5761272d612051565b60006127498783601060039054906101000a900460ff16612f3d565b60105490915060009061277d90899085906127789060ff6401000000008204811691600160281b9004166133b7565b612f3d565b9050600061278b828461331d565b612795908a6132d1565b90506127a18b8a612add565b30600090815260016020526040812080548492906127c090849061331d565b9250508190555082600c60008282546127d991906132d1565b909155506127e990508a82612b9e565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161282e91815260200190565b60405180910390a35050505050505050505050565b60135461285b9030906001600160a01b031683611d1d565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061289057612890613432565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156128e457600080fd5b505afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291c9190613448565b8160018151811061292f5761292f613432565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac947906129759085906000908690309042906004016134a9565b600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050505050565b601b8190556013546129c89030906001600160a01b031684611d1d565b60135460405163f305d71960e01b81526001600160a01b039091169063f305d719908390612a0590309087906000908190849042906004016133f7565b6060604051808303818588803b158015612a1e57600080fd5b505af1158015612a32573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611bad91906134e5565b81546000908210612ab55760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610bfa565b826000018281548110612aca57612aca613432565b9060005260206000200154905092915050565b6001600160a01b038216600090815260016020526040812054612b019083906132d1565b9050612b0c8361138d565b15612b31576001600160a01b0390921660009081526001602052604090209190915550565b6000612b3c846121a4565b6001600160a01b0385166000908152600160205260409020839055601454909150612b689083906132b2565b6001600160a01b038516600090815260196020908152604080832093909355601a9052908120805483929061231f90849061331d565b6001600160a01b038216600090815260016020526040812054612bc290839061331d565b9050612bcd8361138d565b15612bf2576001600160a01b0390921660009081526001602052604090209190915550565b6000612bfd846121a4565b905081601454612c0d91906132b2565b6001600160a01b038516600090815260196020908152604080832093909355601a90529081208054839290612c4390849061331d565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b601354600160a01b900460ff1615612c8057600080fd5b6013805460ff60a01b1916600160a01b1790556000612c9e8261138d565b15612cc657506001600160a01b0381166000908152601a602052604081208054919055612d46565b6000612cd1836121a4565b6001600160a01b038416600090815260016020526040902054601454919250612cf9916132b2565b6001600160a01b038416600090815260196020908152604080832093909355601a90522054612d2990829061331d565b6001600160a01b0384166000908152601a60205260408120559150505b80612d5c5750506013805460ff60a01b19169055565b8060166000828254612d6e919061331d565b90915550506040805160028082526060820183526000926020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015612dd857600080fd5b505afa158015612dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e109190613448565b81600081518110612e2357612e23613432565b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612e6b57612e6b613432565b6001600160a01b03928316602091820292909201015260135460405163b6f9de9560e01b815291169063b6f9de95908490612eb190600090869089904290600401613513565b6000604051808303818588803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f2b34268bcedbf9b655b19f5d555d15d0f7c2fb24be646909c8944a511fcf86f29450019150612f239050565b60405180910390a150506013805460ff60a01b1916905550565b60006127108260ff168460ff1686612f5591906132b2565b612f5f91906132b2565b612f699190613395565b949350505050565b600060208083528351808285015260005b81811015612f9e57858101830151858201604001528201612f82565b81811115612fb0576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610cb057600080fd5b60008060408385031215612fee57600080fd5b8235612ff981612fc6565b946020939093013593505050565b60008060006060848603121561301c57600080fd5b833561302781612fc6565b9250602084013561303781612fc6565b929592945050506040919091013590565b60006020828403121561305a57600080fd5b5035919050565b60006020828403121561307357600080fd5b813561196681612fc6565b803560ff8116811461308f57600080fd5b919050565b6000602082840312156130a657600080fd5b6119668261307e565b60008060008060008060c087890312156130c857600080fd5b6130d18761307e565b95506130df6020880161307e565b94506130ed6040880161307e565b93506130fb6060880161307e565b92506131096080880161307e565b915061311760a0880161307e565b90509295509295509295565b8015158114610cb057600080fd5b60006020828403121561314357600080fd5b813561196681613123565b6000806040838503121561316157600080fd5b50508035926020909101359150565b6000806040838503121561318357600080fd5b823561318e81612fc6565b9150602083013561319e81612fc6565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156131fa5781600019048211156131e0576131e06131a9565b808516156131ed57918102915b93841c93908002906131c4565b509250929050565b60008261321157506001610b62565b8161321e57506000610b62565b8160018114613234576002811461323e5761325a565b6001915050610b62565b60ff84111561324f5761324f6131a9565b50506001821b610b62565b5060208310610133831016604e8410600b841016171561327d575081810a610b62565b61328783836131bf565b806000190482111561329b5761329b6131a9565b029392505050565b600061196660ff841683613202565b60008160001904831182151516156132cc576132cc6131a9565b500290565b6000828210156132e3576132e36131a9565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115613330576133306131a9565b500190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b60006020828403121561337157600080fd5b5051919050565b60006020828403121561338a57600080fd5b815161196681613123565b6000826133b257634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff038211156133d4576133d46131a9565b019392505050565b60006000198214156133f0576133f06131a9565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561345a57600080fd5b815161196681612fc6565b600081518084526020808501945080840160005b8381101561349e5781516001600160a01b031687529582019590820190600101613479565b509495945050505050565b85815284602082015260a0604082015260006134c860a0830186613465565b6001600160a01b0394909416606083015250608001529392505050565b6000806000606084860312156134fa57600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061352c6080830186613465565b6001600160a01b0394909416604083015250606001529291505056fea264697066735822122085f36c3b6e8e65613da6d069cdad73d2dcca8752d54c3ecf9b39262f16bd078d64736f6c63430008090033

Deployed Bytecode Sourcemap

27383:31859:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56896:94;;;;;;;;;;-1:-1:-1;56977:5:0;;;;;;;;;;;;-1:-1:-1;;;56977:5:0;;;;56896:94;;;;;;;:::i;:::-;;;;;;;;57781:161;;;;;;;;;;-1:-1:-1;57781:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;57781:161:0;1072:187:1;28325:44:0;;;;;;;;;;;;28365:4;28325:44;;;;;1438:6:1;1426:19;;;1408:38;;1396:2;1381:18;28325:44:0;1264:188:1;48399:100:0;;;;;;;;;;-1:-1:-1;48480:11:0;;48399:100;;;1603:25:1;;;1591:2;1576:18;48399:100:0;1457:177:1;57206:108:0;;;;;;;;;;-1:-1:-1;57288:18:0;;57206:108;;28032:68;;;;;;;;;;;;;:::i;58255:392::-;;;;;;;;;;-1:-1:-1;58255:392:0;;;;;:::i;:::-;;:::i;51734:81::-;;;;;;;;;;;;;:::i;47810:244::-;;;;;;;;;;-1:-1:-1;47981:8:0;;47810:244;;;47981:8;;;;;;2387:25:1;;47990:13:0;;;;;2443:2:1;2428:18;;2421:34;-1:-1:-1;;;48004:11:0;;;;2471:18:1;;;2464:34;;;;48016:7:0;;;2529:2:1;2514:18;;2507:34;47981:8:0;48024;;;;2572:3:1;2557:19;;2550:35;48033:12:0;;;;;2616:3:1;2601:19;;2594:35;2374:3;2359:19;47810:244:0;2100:535:1;53747:158:0;;;;;;;;;;-1:-1:-1;53747:158:0;;;;;:::i;:::-;;:::i;49063:27::-;;;;;;;;;;-1:-1:-1;49063:27:0;;;;;;;;;;;28209:45;;;;;;;;;;;;28251:3;28209:45;;;;;2997:4:1;2985:17;;;2967:36;;2955:2;2940:18;28209:45:0;2825:184:1;57104:94:0;;;;;;;;;;-1:-1:-1;28024:1:0;57104:94;;48754:191;;;;;;;;;;-1:-1:-1;48754:191:0;;;;;:::i;:::-;;:::i;58682:205::-;;;;;;;;;;-1:-1:-1;58682:205:0;;;;;:::i;:::-;;:::i;54206:482::-;;;;;;;;;;;;;:::i;44102:25::-;;;;;;;;;;;;;;;;38347:27;;;;;;;;;;;;;;;;49411:256;;;;;;;;;;-1:-1:-1;49411:256:0;;;;;:::i;:::-;;:::i;49097:26::-;;;;;;;;;;;;;;;;52949;;;;;;;;;;-1:-1:-1;52949:26:0;;;;;;;;;;;56059:309;;;;;;;;;;;;;:::i;53213:146::-;;;;;;;;;;-1:-1:-1;53213:146:0;;;;;:::i;:::-;;:::i;51529:137::-;;;;;;;;;;-1:-1:-1;51529:137:0;;;;;:::i;:::-;;:::i;29352:46::-;;;;;;;;;;;;;;;;50960:492;;;;;;;;;;-1:-1:-1;50960:492:0;;;;;:::i;:::-;;:::i;49168:236::-;;;;;;;;;;;;;:::i;38617:31::-;;;;;;;;;;;;;;;;28506:41;;;;;;;;;;;;28545:2;28506:41;;28717:77;;;;;;;;;;-1:-1:-1;28717:77:0;;;;-1:-1:-1;;;;;28717:77:0;;;;;;-1:-1:-1;;;;;4318:32:1;;;4300:51;;4288:2;4273:18;28717:77:0;4154:203:1;47653:149:0;;;;;;;;;;;;;:::i;:::-;;;;4536:25:1;;;4592:2;4577:18;;4570:34;;;;4509:18;47653:149:0;4362:248:1;57322:121:0;;;;;;;;;;-1:-1:-1;57322:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;57417:18:0;57390:7;57417:18;;;:9;:18;;;;;;;57322:121;9243:140;;;;;;;;;;;;;:::i;39101:132::-;;;;;;;;;;-1:-1:-1;39101:132:0;;;;;:::i;:::-;;:::i;29296:49::-;;;;;;;;;;;;;;;;53063:84;;;;;;;;;;;;;:::i;48641:104::-;;;;;;;;;;;;;:::i;38133:29::-;;;;;;;;;;;;;;;;49130:28;;;;;;;;;;-1:-1:-1;49130:28:0;;;;;;;;56794:94;;;;;;;;;;-1:-1:-1;56846:7:0;8667:6;-1:-1:-1;;;;;8667:6:0;56794:94;;53412:128;;;;;;;;;;-1:-1:-1;53412:128:0;;;;;:::i;:::-;;:::i;56998:98::-;;;;;;;;;;-1:-1:-1;57081:7:0;;;;;;;;;;;;-1:-1:-1;;;57081:7:0;;;;56998:98;;50002:119;;;;;;;;;;-1:-1:-1;50002:119:0;;;;;:::i;:::-;;:::i;49752:110::-;;;;;;;;;;-1:-1:-1;49752:110:0;;;;;:::i;:::-;;:::i;51924:895::-;;;;;;;;;;-1:-1:-1;51924:895:0;;;;;:::i;:::-;;:::i;38537:28::-;;;;;;;;;;-1:-1:-1;38537:28:0;;;;;;;;58895:342;;;;;;;;;;-1:-1:-1;58895:342:0;;;;;:::i;:::-;;:::i;57451:167::-;;;;;;;;;;-1:-1:-1;57451:167:0;;;;;:::i;:::-;;:::i;50315:102::-;;;;;;;;;;-1:-1:-1;50315:102:0;;;;;:::i;:::-;;:::i;28801:77::-;;;;;;;;;;-1:-1:-1;28801:77:0;;;;-1:-1:-1;;;;;28801:77:0;;;47288:220;;;;;;;;;;;;;:::i;47516:129::-;;;;;;;;;;;;;:::i;50750:112::-;;;;;;;;;;-1:-1:-1;50750:112:0;;;;;:::i;:::-;;:::i;49868:122::-;;;;;;;;;;-1:-1:-1;49868:122:0;;;;;:::i;:::-;;:::i;57626:147::-;;;;;;;;;;-1:-1:-1;57626:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;57737:19:0;;;57710:7;57737:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;57626:147;50486:195;;;;;;;;;;-1:-1:-1;50486:195:0;;;;;:::i;:::-;;:::i;39311:411::-;;;;;;;;;;;;;:::i;48120:273::-;;;;;;;;;;-1:-1:-1;48120:273:0;;;;;:::i;:::-;;:::i;54746:1227::-;;;;;;;;;;-1:-1:-1;54746:1227:0;;;;;:::i;:::-;;:::i;38244:33::-;;;;;;;;;;;;;;;;9538:236;;;;;;;;;;-1:-1:-1;9538:236:0;;;;;:::i;:::-;;:::i;50133:119::-;;;;;;;;;;-1:-1:-1;50133:119:0;;;;;:::i;:::-;;:::i;57781:161::-;57858:4;57875:37;57884:10;57896:7;57905:6;57875:8;:37::i;:::-;-1:-1:-1;57930:4:0;57781:161;;;;;:::o;28032:68::-;28087:13;28024:1;28087:2;:13;:::i;:::-;28071:29;;:13;:29;:::i;:::-;28032:68;:::o;58255:392::-;58355:4;58372:36;58382:6;58390:9;58401:6;58372:9;:36::i;:::-;-1:-1:-1;;;;;58448:19:0;;58421:24;58448:19;;;:11;:19;;;;;;;;58468:10;58448:31;;;;;;;;58498:26;;;;58490:59;;;;-1:-1:-1;;;58490:59:0;;7520:2:1;58490:59:0;;;7502:21:1;7559:2;7539:18;;;7532:30;-1:-1:-1;;;7578:18:1;;;7571:50;7638:18;;58490:59:0;;;;;;;;;58562:55;58571:6;58579:10;58591:25;58610:6;58591:16;:25;:::i;:::-;58562:8;:55::i;:::-;-1:-1:-1;58635:4:0;;58255:392;-1:-1:-1;;;;58255:392:0:o;51734:81::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;51787:20:::1;:18;:20::i;:::-;51734:81::o:0;53747:158::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;53840:57:::1;53862:34;53881:15;53862:18:::0;:34:::1;:::i;:::-;53840:21;:57::i;:::-;53747:158:::0;:::o;48754:191::-;48811:7;48833:27;48855:4;48833:21;:27::i;:::-;48830:53;;;-1:-1:-1;;;;;;48869:14:0;;;;;:8;:14;;;;;;;48754:191::o;48830:53::-;-1:-1:-1;;;;;48923:14:0;;;;;;:8;:14;;;;;;48901:21;48932:4;48901:15;:21::i;:::-;:36;;;;:::i;58682:205::-;58790:10;58764:4;58811:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;58811:32:0;;;;;;;;;;58764:4;;58781:76;;58802:7;;58811:45;;58846:10;;58811:45;:::i;54206:482::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;54351:20:::1;;54332:15;:39;;54324:68;;;;-1:-1:-1::0;;;54324:68:0::1;;;;;;;:::i;:::-;54462:22;::::0;54513:39:::1;::::0;-1:-1:-1;;;54513:39:0;;54546:4:::1;54513:39;::::0;::::1;4300:51:1::0;54462:22:0;;;::::1;-1:-1:-1::0;;;;;54462:22:0::1;::::0;54413:30:::1;::::0;54462:22;;54513:24:::1;::::0;4273:18:1;;54513:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54651:10;::::0;54627:43:::1;::::0;-1:-1:-1;;;54627:43:0;;-1:-1:-1;;;;;54651:10:0;;::::1;54627:43;::::0;::::1;8999:51:1::0;9066:18;;;9059:34;;;54496:56:0;;-1:-1:-1;54627:23:0;::::1;::::0;::::1;::::0;8972:18:1;;54627:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54255:433;;54206:482::o:0;49411:256::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;49505:16:::1;;49497:6;:24;;49489:33;;;::::0;::::1;;49551:6;49533:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;49576:10:0::1;::::0;-1:-1:-1;;;;;49576:10:0::1;49568:40;49606:1;49597:8;:6:::0;49604:1:::1;49597:8;:::i;:::-;:10;;;;:::i;:::-;49568:40;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;49627:10:0::1;::::0;-1:-1:-1;;;;;49627:10:0::1;49619:40;49657:1;49648:8;:6:::0;49627:10;49648:8:::1;:::i;:::-;:10;;;;:::i;:::-;49619:40;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;49411:256:::0;:::o;56059:309::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;56147:20:::1;;56128:15;:39;;56120:68;;;;-1:-1:-1::0;;;56120:68:0::1;;;;;;;:::i;:::-;56220:40;28688:4;56220:15;:40;:::i;:::-;56199:20;:61:::0;56285:10:::1;::::0;:51:::1;::::0;56272:9:::1;::::0;-1:-1:-1;;;;;56285:10:0::1;::::0;56309:21:::1;::::0;56272:9;56285:51;56272:9;56285:51;56309:21;56285:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56271:65;;;56355:4;56347:13;;;::::0;::::1;53213:146:::0;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;53307:22:::1;:44:::0;;-1:-1:-1;;;;;53307:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;53307:44:0;;::::1;::::0;;;::::1;::::0;;53213:146::o;51529:137::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;51622:2:::1;51612:8;:12;;;;51604:21;;;::::0;::::1;;51637:12;:21:::0;;-1:-1:-1;;51637:21:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;51529:137::o;50960:492::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;51115:14:::1;51155:12:::0;51130:24:::1;51140:14:::0;51130:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;51115:52;;51186:8;:13;;51196:3;51186:13;51178:64;;;::::0;-1:-1:-1;;;51178:64:0;;10197:2:1;51178:64:0::1;::::0;::::1;10179:21:1::0;10236:2;10216:18;;;10209:30;10275:34;10255:18;;;10248:62;-1:-1:-1;;;10326:18:1;;;10319:36;10372:19;;51178:64:0::1;9995:402:1::0;51178:64:0::1;-1:-1:-1::0;51255:8:0::1;:18:::0;;::::1;51420:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;51393:16:0;;::::1;51255:18;51393:16;-1:-1:-1::0;;51323:24:0;;::::1;-1:-1:-1::0;;;51323:24:0::1;51393:16:::0;;;;-1:-1:-1;;51284:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;51255:18:0;;::::1;::::0;::::1;51284:28:::0;;;;-1:-1:-1;;51284:28:0;;;;;;;;;;::::1;51393:16:::0;;;;;;;;51368:14;::::1;51393:16:::0;;;;;;;::::1;51420:24;::::0;;;::::1;::::0;;50960:492::o;49168:236::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;49249:16:::1;::::0;;49234:14:::1;49276:18:::0;;;49313:10:::1;::::0;-1:-1:-1;;;;;49313:10:0::1;49305:40;49343:1;49334:8;49249:16:::0;49341:1:::1;49334:8;:::i;47653:149::-:0;47694:15;;47755:13;28024:1;47755:2;:13;:::i;:::-;47742:12;;:26;;;;:::i;:::-;47780:13;28024:1;47780:2;:13;:::i;:::-;47770:9;;:23;;;;:::i;:::-;47735:59;;;;47653:149;;:::o;9243:140::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;9342:1:::1;9326:6:::0;;9305:40:::1;::::0;-1:-1:-1;;;;;9326:6:0;;::::1;::::0;9305:40:::1;::::0;9342:1;;9305:40:::1;9373:1;9356:19:::0;;-1:-1:-1;;;;;;9356:19:0::1;::::0;;9243:140::o;39101:132::-;39167:4;39190:35;:20;39220:4;39190:29;:35::i;53063:84::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;53120:14:::1;:19:::0;;-1:-1:-1;;53120:19:0::1;;;::::0;;53063:84::o;48641:104::-;48726:11;;48710:27;;:15;:27;:::i;:::-;48698:10;48689:20;;;;:8;:20;;;;;:48;48641:104::o;56873:7::-;56866:14;;56794:94;:::o;53412:128::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;53499:14:::1;:33:::0;53412:128::o;50002:119::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;50080:10:::1;:33:::0;;-1:-1:-1;;;;;;50080:33:0::1;-1:-1:-1::0;;;;;50080:33:0;;;::::1;::::0;;;::::1;::::0;;50002:119::o;49752:110::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;49831:16:::1;:23:::0;;-1:-1:-1;;49831:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49752:110::o;51924:895::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;52160:3:::1;52141:18;;:22;;;;:::i;:::-;52128:12;:35;52120:44;;;::::0;::::1;;52242:13;28024:1;52242:2;:13;:::i;:::-;52226:29;::::0;:15;:29:::1;:::i;:::-;52210:45:::0;-1:-1:-1;52292:13:0::1;28024:1;52292:2;:13;:::i;:::-;52279:26;::::0;:12;:26:::1;:::i;:::-;52266:39;;52372:26;28251:3;52399:38;;:18;;:38;;;;:::i;:::-;52372:65;;52448:23;28365:4;52472:35;;:18;;:35;;;;:::i;:::-;52448:59;;52546:18;52529:15;:35;;52520:103;;;::::0;-1:-1:-1;;;52520:103:0;;10604:2:1;52520:103:0::1;::::0;::::1;10586:21:1::0;10643:2;10623:18;;;10616:30;10682:34;10662:18;;;10655:62;-1:-1:-1;;;10733:18:1;;;10726:41;10784:19;;52520:103:0::1;10402:407:1::0;52520:103:0::1;52657:15;52643:12;:29;;52634:94;;;::::0;-1:-1:-1;;;52634:94:0;;11016:2:1;52634:94:0::1;::::0;::::1;10998:21:1::0;11055:2;11035:18;;;11028:30;11094:34;11074:18;;;11067:62;-1:-1:-1;;;11145:18:1;;;11138:38;11193:19;;52634:94:0::1;10814:404:1::0;52634:94:0::1;-1:-1:-1::0;;52741:12:0::1;:30:::0;;;;52782:9:::1;:24:::0;51924:895::o;58895:342::-;59038:10;58982:4;59026:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;59026:32:0;;;;;;;;;;59077:35;;;;59069:60;;;;-1:-1:-1;;;59069:60:0;;11425:2:1;59069:60:0;;;11407:21:1;11464:2;11444:18;;;11437:30;-1:-1:-1;;;11483:18:1;;;11476:42;11535:18;;59069:60:0;11223:336:1;59069:60:0;59142:65;59151:10;59163:7;59172:34;59191:15;59172:16;:34;:::i;59142:65::-;-1:-1:-1;59225:4:0;;58895:342;-1:-1:-1;;;58895:342:0:o;57451:167::-;57531:4;57548:40;57558:10;57570:9;57581:6;57548:9;:40::i;50315:102::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;50385:15:::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;50385:24:0;;::::1;::::0;;;::::1;::::0;;50315:102::o;47288:220::-;47353:7;47391:20;;47375:15;:36;47372:110;;;47455:15;47434:20;;:36;;;;:::i;47372:110::-;-1:-1:-1;47499:1:0;;47288:220::o;47516:129::-;47563:7;47624:13;28024:1;47624:2;:13;:::i;:::-;47604:18;;28087:13;28024:1;28087:2;:13;:::i;:::-;28071:29;;:13;:29;:::i;:::-;47590:32;;;;:::i;:::-;47589:48;;;;:::i;50750:112::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;50827:27:::1;:9;50841:12:::0;50827:13:::1;:27::i;49868:122::-:0;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;49969:13:::1;28024:1;49969:2;:13;:::i;:::-;49954:28;::::0;:12;:28:::1;:::i;:::-;49944:9;:38:::0;-1:-1:-1;49868:122:0:o;50486:195::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;28545:2:::1;50576:30:::0;::::1;;50568:64;;;::::0;-1:-1:-1;;;50568:64:0;;11766:2:1;50568:64:0::1;::::0;::::1;11748:21:1::0;11805:2;11785:18;;;11778:30;-1:-1:-1;;;11824:18:1;;;11817:52;11886:18;;50568:64:0::1;11564:346:1::0;50568:64:0::1;50647:11;:26:::0;50486:195::o;39311:411::-;39393:18;;39359:7;;;39568:123;39584:29;:20;:27;:29::i;:::-;39582:1;:31;39568:123;;;39642:9;:37;39652:26;:20;39676:1;39652:23;:26::i;:::-;-1:-1:-1;;;;;39642:37:0;;;;;;;;;;;;-1:-1:-1;39642:37:0;;39634:45;;;;:::i;:::-;;-1:-1:-1;39615:3:0;;;;:::i;:::-;;;;39568:123;;;-1:-1:-1;39708:6:0;39311:411;-1:-1:-1;39311:411:0:o;48120:273::-;-1:-1:-1;;;;;48240:24:0;;48205:7;48240:24;;;:8;:24;;;;;;48287:15;48277:25;;48274:71;;-1:-1:-1;48333:1:0;;48120:273;-1:-1:-1;;48120:273:0:o;48274:71::-;48361:24;48370:15;48361:8;:24;:::i;:::-;48354:31;48120:273;-1:-1:-1;;;48120:273:0:o;54746:1227::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;54906:20:::1;;54887:15;:39;;54879:68;;;;-1:-1:-1::0;;;54879:68:0::1;;;;;;;:::i;:::-;54979:40;28688:4;54979:15;:40;:::i;:::-;54958:20;:61:::0;55079:22:::1;::::0;55130:39:::1;::::0;-1:-1:-1;;;55130:39:0;;55163:4:::1;55130:39;::::0;::::1;4300:51:1::0;55079:22:0;;;::::1;-1:-1:-1::0;;;;;55079:22:0::1;::::0;55030:30:::1;::::0;55079:22;;55130:24:::1;::::0;4273:18:1;;55130:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55213:16;::::0;55182:56:::1;::::0;-1:-1:-1;;;55182:56:0;;-1:-1:-1;;;;;55213:16:0;;::::1;55182:56;::::0;::::1;8999:51:1::0;9066:18;;;9059:34;;;55113:56:0;;-1:-1:-1;55182:22:0;::::1;::::0;::::1;::::0;8972:18:1;;55182:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;55515:16:0::1;::::0;:218:::1;::::0;-1:-1:-1;;;55515:218:0;;55483:21:::1;::::0;-1:-1:-1;;;;;55515:16:0::1;::::0;:64:::1;::::0;:218:::1;::::0;55602:4:::1;::::0;55622:6;;55455:25:::1;::::0;;;55602:4;;55703:15:::1;::::0;55515:218:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;55744:21:0::1;55768:39;55790:17:::0;55768:21:::1;:39;:::i;:::-;55744:63;;55821:12;55818:146;;;55849:31;55866:13;55849:16;:31::i;:::-;55818:146;;;55939:13;55921:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;55818:146:0::1;54810:1163;;;;54746:1227:::0;:::o;9538:236::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9619:22:0;::::1;9611:73;;;::::0;-1:-1:-1;;;9611:73:0;;12869:2:1;9611:73:0::1;::::0;::::1;12851:21:1::0;12908:2;12888:18;;;12881:30;12947:34;12927:18;;;12920:62;-1:-1:-1;;;12998:18:1;;;12991:36;13044:19;;9611:73:0::1;12667:402:1::0;9611:73:0::1;9721:6;::::0;;9700:38:::1;::::0;-1:-1:-1;;;;;9700:38:0;;::::1;::::0;9721:6;::::1;::::0;9700:38:::1;::::0;::::1;9749:6;:17:::0;;-1:-1:-1;;;;;;9749:17:0::1;-1:-1:-1::0;;;;;9749:17:0;;;::::1;::::0;;;::::1;::::0;;9538:236::o;50133:119::-;8825:10;8814:7;8640;8667:6;-1:-1:-1;;;;;8667:6:0;;8602:79;8814:7;-1:-1:-1;;;;;8814:21:0;;8806:66;;;;-1:-1:-1;;;8806:66:0;;;;;;;:::i;:::-;50211:10:::1;:33:::0;;-1:-1:-1;;;;;;50211:33:0::1;-1:-1:-1::0;;;;;50211:33:0;;;::::1;::::0;;;::::1;::::0;;50133:119::o;24289:152::-;24359:4;24383:50;24388:3;-1:-1:-1;;;;;24408:23:0;;24383:4;:50::i;57948:299::-;-1:-1:-1;;;;;58041:19:0;;58033:49;;;;-1:-1:-1;;;58033:49:0;;13276:2:1;58033:49:0;;;13258:21:1;13315:2;13295:18;;;13288:30;-1:-1:-1;;;13334:18:1;;;13327:47;13391:18;;58033:49:0;13074:341:1;58033:49:0;-1:-1:-1;;;;;58101:21:0;;58093:49;;;;-1:-1:-1;;;58093:49:0;;13622:2:1;58093:49:0;;;13604:21:1;13661:2;13641:18;;;13634:30;-1:-1:-1;;;13680:18:1;;;13673:45;13735:18;;58093:49:0;13420:339:1;58093:49:0;-1:-1:-1;;;;;58155:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;58207:32;;1603:25:1;;;58207:32:0;;1576:18:1;58207:32:0;;;;;;;57948:299;;;:::o;31969:1544::-;-1:-1:-1;;;;;32065:20:0;;32057:51;;;;-1:-1:-1;;;32057:51:0;;13966:2:1;32057:51:0;;;13948:21:1;14005:2;13985:18;;;13978:30;-1:-1:-1;;;14024:18:1;;;14017:48;14082:18;;32057:51:0;13764:342:1;32057:51:0;-1:-1:-1;;;;;32127:23:0;;32119:52;;;;-1:-1:-1;;;32119:52:0;;14313:2:1;32119:52:0;;;14295:21:1;14352:2;14332:18;;;14325:30;-1:-1:-1;;;14371:18:1;;;14364:46;14427:18;;32119:52:0;14111:340:1;32119:52:0;32264:15;32283:26;:9;32302:6;32283:18;:26::i;:::-;:59;;;-1:-1:-1;32313:29:0;:9;32332;32313:18;:29::i;:::-;32264:79;-1:-1:-1;32442:23:0;-1:-1:-1;;;;;32467:21:0;;32483:4;32467:21;;:49;;-1:-1:-1;;;;;;32492:24:0;;32511:4;32492:24;32467:49;32655:16;;32722:21;;32442:75;;-1:-1:-1;;;;;;32655:16:0;;;;32623:23;;32712:31;;;32722:21;;32712:31;:63;;;;;32760:15;-1:-1:-1;;;;;32747:28:0;:9;-1:-1:-1;;;;;32747:28:0;;32712:63;32711:144;;;-1:-1:-1;32804:21:0;;-1:-1:-1;;;;;32791:34:0;;;32804:21;;32791:34;:63;;;;;32839:15;-1:-1:-1;;;;;32829:25:0;:6;-1:-1:-1;;;;;32829:25:0;;32791:63;32977:21;;32683:173;;-1:-1:-1;32958:10:0;;-1:-1:-1;;;;;32969:29:0;;;32977:21;;32969:29;;:57;;;33011:15;-1:-1:-1;;;;;33001:25:0;:6;-1:-1:-1;;;;;33001:25:0;;32969:57;33060:21;;32958:68;;-1:-1:-1;33037:11:0;;-1:-1:-1;;;;;33049:32:0;;;33060:21;;33049:32;;:63;;;33097:15;-1:-1:-1;;;;;33084:28:0;:9;-1:-1:-1;;;;;33084:28:0;;33049:63;33037:75;;33153:18;:41;;;;33175:19;33153:41;:55;;;;33198:10;33153:55;33150:356;;;33224:43;33241:6;33249:9;33260:6;33224:16;:43::i;:::-;33150:356;;;33386:14;;;;;;;33378:49;;;;-1:-1:-1;;;33378:49:0;;14658:2:1;33378:49:0;;;14640:21:1;14697:2;14677:18;;;14670:30;14736:25;14716:18;;;14709:53;14779:18;;33378:49:0;14456:347:1;33378:49:0;33442:52;33457:6;33464:9;33474:6;33481:5;33487:6;33442:14;:52::i;:::-;32046:1467;;;;;;31969:1544;;;:::o;44507:1623::-;44255:27;:34;;-1:-1:-1;;44255:34:0;44285:4;44255:34;;;;;;44609:4:::1;44255:27:::0;44591:24;;;::::1;::::0;;;;;;;;44656:11:::1;::::0;44591:24;;44255:27;44642:25:::1;::::0;-1:-1:-1;;;44656:11:0;::::1;44255:34:::0;44656:11;;::::1;::::0;44642:13;;::::1;;:25;:::i;:::-;44626:41;;;;44678:19;44700:14;;44678:36;;44841:11;44825:15;:27;:40;;;-1:-1:-1::0;44854:11:0::1;::::0;::::1;::::0;44825:40:::1;44822:77;;;44881:7;;;;;44822:77;45019:13;::::0;44980:25:::1;::::0;45006:36:::1;::::0;::::1;::::0;45007:25:::1;::::0;45019:13;;::::1;;;45007:11:::0;:25:::1;:::i;:::-;45006:36;;;;:::i;:::-;44980:62:::0;-1:-1:-1;45053:25:0::1;45080:29;44980:62:::0;45080:11;:29:::1;:::i;:::-;45053:56:::0;-1:-1:-1;45170:16:0::1;45187:19;45205:1;45187:17:::0;:19:::1;:::i;:::-;45170:36:::0;-1:-1:-1;45217:19:0::1;45237:26;45170:36:::0;45237:17;:26:::1;:::i;:::-;45217:46:::0;-1:-1:-1;45346:17:0::1;45364:29;45376:17:::0;45217:46;45364:29:::1;:::i;:::-;45346:47:::0;-1:-1:-1;45508:21:0::1;45540:27;45346:47:::0;45540:16:::1;:27::i;:::-;45578:14;45594:41;45618:17:::0;45594:21:::1;:41;:::i;:::-;45578:58:::0;-1:-1:-1;45736:14:0::1;45774:9:::0;45754:18:::1;45761:11:::0;45578:58;45754:18:::1;:::i;:::-;45753:30;;;;:::i;:::-;45736:47;;45794:31;45808:8;45818:6;45794:13;:31::i;:::-;45948:21;45971:41;45995:17:::0;45971:21:::1;:41;:::i;:::-;45948:65;;46091:31;46108:13;46091:16;:31::i;:::-;44556:1574;;;;;;;;;;;;44300:1;44312:27:::0;:35;;-1:-1:-1;;44312:35:0;;;44507:1623::o;53911:230::-;54067:20;;54053:13;:34;54045:43;;;;;;54099:20;:34;53911:230::o;41348:427::-;-1:-1:-1;;;;;41469:17:0;;41411:7;41469:17;;;:9;:17;;;;;;41452:14;;41411:7;;41452:34;;;:::i;:::-;-1:-1:-1;;;;;41649:25:0;;;;;;:17;:25;;;;;;41431:55;;-1:-1:-1;41638:36:0;;41635:49;;;-1:-1:-1;41683:1:0;;41348:427;-1:-1:-1;;41348:427:0:o;41635:49::-;-1:-1:-1;;;;;41716:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;38052:5:0;41703:38;;:10;:38;:::i;:::-;41702:65;;;;:::i;24861:167::-;-1:-1:-1;;;;;24995:23:0;;24941:4;21670:19;;;:12;;;:19;;;;;;:24;;24965:55;21573:129;25114:117;25177:7;25204:19;25212:3;21871:18;;21788:109;25575:158;25649:7;25700:22;25704:3;25716:5;25700:3;:22::i;41845:756::-;41980:12;;41942:22;;41996:3;;41968:24;;41980:12;;41968:9;:24;:::i;:::-;41967:32;;;;:::i;:::-;41942:57;-1:-1:-1;42010:14:0;42027:26;41942:57;42027:9;:26;:::i;:::-;42010:43;;42083:14;42065:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;42121:10:0;;42117:477;;42170:6;42148:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;42191:19:0;;-1:-1:-1;42211:17:0;:15;:17::i;:::-;42191:37;-1:-1:-1;42322:16:0;42318:265;;42379:6;42359:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;42318:265:0;;-1:-1:-1;42318:265:0;;42555:11;42520:31;-1:-1:-1;;;42520:6:0;:31;:::i;:::-;42519:47;;;;:::i;:::-;42500:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;42318:265:0;42133:461;41898:703;;41845:756;:::o;19344:414::-;19407:4;21670:19;;;:12;;;:19;;;;;;19424:327;;-1:-1:-1;19467:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19650:18;;19628:19;;;:12;;;:19;;;;;;:40;;;;19683:11;;19424:327;-1:-1:-1;19734:5:0;19727:12;;36748:440;-1:-1:-1;;;;;36867:17:0;;36843:21;36867:17;;;:9;:17;;;;;;36903:23;;;;36895:60;;;;-1:-1:-1;;;36895:60:0;;15010:2:1;36895:60:0;;;14992:21:1;15049:2;15029:18;;;15022:30;-1:-1:-1;;;15068:18:1;;;15061:54;15132:18;;36895:60:0;14808:348:1;36895:60:0;37011:27;37024:6;37031;37011:12;:27::i;:::-;37091:28;37101:9;37112:6;37091:9;:28::i;:::-;37161:9;-1:-1:-1;;;;;37145:33:0;37154:6;-1:-1:-1;;;;;37145:33:0;;37171:6;37145:33;;;;1603:25:1;;1591:2;1576:18;;1457:177;37145:33:0;;;;;;;;36832:356;36748:440;;;:::o;33614:3072::-;-1:-1:-1;;;;;33757:20:0;;;33730:24;33757:20;;;:9;:20;;;;;;;33812:17;;;;;;;;33848:23;;;;33840:60;;;;-1:-1:-1;;;33840:60:0;;15010:2:1;33840:60:0;;;14992:21:1;15049:2;15029:18;;;15022:30;-1:-1:-1;;;15068:18:1;;;15061:54;15132:18;;33840:60:0;14808:348:1;33840:60:0;33913:9;33936:6;33933:1427;;;34085:9;;34077:6;:17;;34069:44;;;;-1:-1:-1;;;34069:44:0;;15363:2:1;34069:44:0;;;15345:21:1;15402:2;15382:18;;;15375:30;-1:-1:-1;;;15421:18:1;;;15414:45;15476:18;;34069:44:0;15161:339:1;34069:44:0;-1:-1:-1;34132:8:0;;;;;;;33933:1427;;;34165:5;34162:1198;;;34181:40;:20;34211:9;34181:29;:40::i;:::-;34177:427;;-1:-1:-1;;;;;34370:19:0;;;;;;:8;:19;;;;;;34391:15;-1:-1:-1;34370:36:0;;:53;;-1:-1:-1;34408:15:0;;;;;;;34370:53;34362:81;;;;-1:-1:-1;;;34362:81:0;;15707:2:1;34362:81:0;;;15689:21:1;15746:2;15726:18;;;15719:30;-1:-1:-1;;;15765:18:1;;;15758:46;15821:18;;34362:81:0;15505:340:1;34362:81:0;34577:11;;34561:27;;:15;:27;:::i;:::-;-1:-1:-1;;;;;34541:19:0;;;;;;:8;:19;;;;;:47;34177:427;34742:12;;34717:23;34734:6;34717:16;:23;:::i;:::-;:37;;34709:65;;;;-1:-1:-1;;;34709:65:0;;16052:2:1;34709:65:0;;;16034:21:1;16091:2;16071:18;;;16064:30;-1:-1:-1;;;16110:18:1;;;16103:46;16166:18;;34709:65:0;15850:340:1;34709:65:0;34798:9;;34788:6;:19;;34780:65;;;;-1:-1:-1;;;34780:65:0;;16397:2:1;34780:65:0;;;16379:21:1;16436:2;16416:18;;;16409:30;16475:34;16455:18;;;16448:62;-1:-1:-1;;;16526:18:1;;;16519:32;16568:19;;34780:65:0;16195:398:1;34780:65:0;-1:-1:-1;34864:7:0;;;;34162:1198;;;35111:15;28024:1;35111:2;:15;:::i;:::-;35103:6;:23;35100:44;;35128:16;35137:6;35128:8;:16::i;:::-;35283:12;;35258:23;35275:6;35258:16;:23;:::i;:::-;:37;;35250:65;;;;-1:-1:-1;;;35250:65:0;;16052:2:1;35250:65:0;;;16034:21:1;16091:2;16071:18;;;16064:30;-1:-1:-1;;;16110:18:1;;;16103:46;16166:18;;35250:65:0;15850:340:1;35250:65:0;-1:-1:-1;35334:12:0;;;;;;;34162:1198;35697:21;;-1:-1:-1;;;;;35689:29:0;;;35697:21;;35689:29;;;;35688:52;;-1:-1:-1;35723:16:0;;;;35722:17;35688:52;:84;;;;-1:-1:-1;35744:27:0;;;;35743:28;35688:84;:92;;;;;35774:6;35688:92;35685:130;;;35795:20;:18;:20::i;:::-;35884:23;35908:36;35922:6;35930:3;35935:8;;;;;;;;;;;35908:13;:36::i;:::-;36113:13;;35884:60;;-1:-1:-1;36052:21:0;;36074:53;;36088:6;;36096:3;;36101:25;;36113:13;;;;;;;-1:-1:-1;;;36101:11:0;;;:25;:::i;:::-;36074:13;:53::i;:::-;36052:75;-1:-1:-1;36191:19:0;36219:31;36052:75;36219:15;:31;:::i;:::-;36211:40;;:6;:40;:::i;:::-;36191:60;;36309:27;36322:6;36329;36309:12;:27::i;:::-;36431:4;36413:24;;;;:9;:24;;;;;:41;;36441:13;;36413:24;:41;;36441:13;;36413:41;:::i;:::-;;;;;;;;36509:15;36489:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36579:33:0;;-1:-1:-1;36589:9:0;36600:11;36579:9;:33::i;:::-;36654:9;-1:-1:-1;;;;;36638:38:0;36647:6;-1:-1:-1;;;;;36638:38:0;;36664:11;36638:38;;;;1603:25:1;;1591:2;1576:18;;1457:177;36638:38:0;;;;;;;;33719:2967;;;;;;33614:3072;;;;;:::o;46180:461::-;46273:16;;46241:58;;46258:4;;-1:-1:-1;;;;;46273:16:0;46292:6;46241:8;:58::i;:::-;46334:16;;;46348:1;46334:16;;;;;;;;46310:21;;46334:16;;;;;;;;;;-1:-1:-1;46334:16:0;46310:40;;46379:4;46361;46366:1;46361:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46361:23:0;;;:7;;;;;;;;;;:23;;;;46405:16;;:23;;;-1:-1:-1;;;46405:23:0;;;;:16;;;;;:21;;:23;;;;;46361:7;;46405:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46395:4;46400:1;46395:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46395:33:0;;;:7;;;;;;;;;:33;46441:16;;:192;;-1:-1:-1;;;46441:192:0;;:16;;;:67;;:192;;46523:6;;46441:16;;46560:4;;46587;;46607:15;;46441:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46230:411;46180:461;:::o;46768:400::-;46850:10;:20;;;46913:16;;46881:63;;46898:4;;-1:-1:-1;;;;;46913:16:0;46932:11;46881:8;:63::i;:::-;46955:16;;:205;;-1:-1:-1;;;46955:205:0;;-1:-1:-1;;;;;46955:16:0;;;;:32;;46995:9;;46955:205;;47028:4;;47048:11;;46955:16;;;;47028:4;;47134:15;;46955:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22241:204::-;22336:18;;22308:7;;22336:26;-1:-1:-1;22328:73:0;;;;-1:-1:-1;;;22328:73:0;;18684:2:1;22328:73:0;;;18666:21:1;18723:2;18703:18;;;18696:30;18762:34;18742:18;;;18735:62;-1:-1:-1;;;18813:18:1;;;18806:32;18855:19;;22328:73:0;18482:398:1;22328:73:0;22419:3;:11;;22431:5;22419:18;;;;;;;;:::i;:::-;;;;;;;;;22412:25;;22241:204;;;;:::o;40554:648::-;-1:-1:-1;;;;;40689:15:0;;40671:17;40689:15;;;:9;:15;;;;;;:22;;40705:6;;40689:22;:::i;:::-;40671:40;;40735:27;40757:4;40735:21;:27::i;:::-;40732:102;;;-1:-1:-1;;;;;40777:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;40554:648:0:o;40732:102::-;40899:15;40915:21;40931:4;40915:15;:21::i;:::-;-1:-1:-1;;;;;40974:15:0;;;;;;:9;:15;;;;;:25;;;41083:14;;40899:37;;-1:-1:-1;41083:26:0;;40990:9;;41083:26;:::i;:::-;-1:-1:-1;;;;;41057:23:0;;;;;;:17;:23;;;;;;;;:52;;;;41170:8;:14;;;;;:23;;41186:7;;41057:23;41170;;41186:7;;41170:23;:::i;39817:645::-;-1:-1:-1;;;;;39949:15:0;;39931:17;39949:15;;;:9;:15;;;;;;:22;;39965:6;;39949:22;:::i;:::-;39931:40;;39995:27;40017:4;39995:21;:27::i;:::-;39992:102;;;-1:-1:-1;;;;;40037:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;39817:645:0:o;39992:102::-;40159:15;40175:21;40191:4;40175:15;:21::i;:::-;40159:37;;40297:9;40280:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;40254:23:0;;;;;;:17;:23;;;;;;;;:52;;;;40367:8;:14;;;;;:23;;40383:7;;40254:23;40367;;40383:7;;40367:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;40429:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;39817:645:0:o;42716:1210::-;42775:14;;-1:-1:-1;;;42775:14:0;;;;42774:15;42766:24;;;;;;42801:14;:19;;-1:-1:-1;;;;42801:19:0;-1:-1:-1;;;42801:19:0;;;;42859:27;42881:4;42859:21;:27::i;:::-;42856:495;;;-1:-1:-1;;;;;;42973:14:0;;;;;;:8;:14;;;;;;;43002:16;;;42856:495;;;43059:17;43077:21;43093:4;43077:15;:21::i;:::-;-1:-1:-1;;;;;43209:15:0;;;;;;:9;:15;;;;;;43192:14;;43059:39;;-1:-1:-1;43192:32:0;;;:::i;:::-;-1:-1:-1;;;;;43166:23:0;;;;;;:17;:23;;;;;;;;:58;;;;43284:8;:14;;;;:24;;43299:9;;43284:24;:::i;:::-;-1:-1:-1;;;;;43323:14:0;;43338:1;43323:14;;;:8;:14;;;;;:16;43277:31;-1:-1:-1;;42856:495:0;43364:9;43361:106;;-1:-1:-1;;43414:14:0;:20;;-1:-1:-1;;;;43414:20:0;;;42716:1210::o;43361:106::-;43491:6;43477:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;43532:16:0;;;43546:1;43532:16;;;;;;;;43508:21;;43532:16;;;;;;;;-1:-1:-1;;43569:16:0;;:23;;;-1:-1:-1;;;43569:23:0;;;;43508:40;;-1:-1:-1;;;;;;43569:16:0;;;;:21;;-1:-1:-1;43569:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43559:4;43564:1;43559:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;43559:33:0;;;-1:-1:-1;;;;;43559:33:0;;;;;43620:42;43610:4;43615:1;43610:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43610:52:0;;;:7;;;;;;;;;:52;43683:16;;:151;;-1:-1:-1;;;43683:151:0;;:16;;;:67;;43758:6;;43683:151;;:16;;43788:4;;43803;;43818:15;;43683:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43860:27:0;;;19574:25:1;;;-1:-1:-1;;;;;19635:32:1;;19630:2;19615:18;;19608:60;43860:27:0;;-1:-1:-1;19547:18:1;;-1:-1:-1;43860:27:0;;-1:-1:-1;19400:274:1;43860:27:0;;;;;;;;-1:-1:-1;;43898:14:0;:20;;-1:-1:-1;;;;43898:20:0;;;-1:-1:-1;42716:1210:0:o;37243:156::-;37333:7;37386:5;37372:10;37361:21;;37368:3;37361:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37360:31;;;;:::i;:::-;37353:38;37243:156;-1:-1:-1;;;;37243:156:0:o;14:597: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;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1639:456::-;1716:6;1724;1732;1785:2;1773:9;1764:7;1760:23;1756:32;1753:52;;;1801:1;1798;1791:12;1753:52;1840:9;1827:23;1859:31;1884:5;1859:31;:::i;:::-;1909:5;-1:-1:-1;1966:2:1;1951:18;;1938:32;1979:33;1938:32;1979:33;:::i;:::-;1639:456;;2031:7;;-1:-1:-1;;;2085:2:1;2070:18;;;;2057:32;;1639:456::o;2640:180::-;2699:6;2752:2;2740:9;2731:7;2727:23;2723:32;2720:52;;;2768:1;2765;2758:12;2720:52;-1:-1:-1;2791:23:1;;2640:180;-1:-1:-1;2640:180:1:o;3014:247::-;3073:6;3126:2;3114:9;3105:7;3101:23;3097:32;3094:52;;;3142:1;3139;3132:12;3094:52;3181:9;3168:23;3200:31;3225:5;3200:31;:::i;3266:156::-;3332:20;;3392:4;3381:16;;3371:27;;3361:55;;3412:1;3409;3402:12;3361:55;3266:156;;;:::o;3427:182::-;3484:6;3537:2;3525:9;3516:7;3512:23;3508:32;3505:52;;;3553:1;3550;3543:12;3505:52;3576:27;3593:9;3576:27;:::i;3614:535::-;3706:6;3714;3722;3730;3738;3746;3799:3;3787:9;3778:7;3774:23;3770:33;3767:53;;;3816:1;3813;3806:12;3767:53;3839:27;3856:9;3839:27;:::i;:::-;3829:37;;3885:36;3917:2;3906:9;3902:18;3885:36;:::i;:::-;3875:46;;3940:36;3972:2;3961:9;3957:18;3940:36;:::i;:::-;3930:46;;3995:36;4027:2;4016:9;4012:18;3995:36;:::i;:::-;3985:46;;4050:37;4082:3;4071:9;4067:19;4050:37;:::i;:::-;4040:47;;4106:37;4138:3;4127:9;4123:19;4106:37;:::i;:::-;4096:47;;3614:535;;;;;;;;:::o;4615:118::-;4701:5;4694:13;4687:21;4680:5;4677:32;4667:60;;4723:1;4720;4713:12;4738:241;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;4902:9;4889:23;4921:28;4943:5;4921:28;:::i;4984:248::-;5052:6;5060;5113:2;5101:9;5092:7;5088:23;5084:32;5081:52;;;5129:1;5126;5119:12;5081:52;-1:-1:-1;;5152:23:1;;;5222:2;5207:18;;;5194:32;;-1:-1:-1;4984:248:1:o;5237:388::-;5305:6;5313;5366:2;5354:9;5345:7;5341:23;5337:32;5334:52;;;5382:1;5379;5372:12;5334:52;5421:9;5408:23;5440:31;5465:5;5440:31;:::i;:::-;5490:5;-1:-1:-1;5547:2:1;5532:18;;5519:32;5560:33;5519:32;5560:33;:::i;:::-;5612:7;5602:17;;;5237:388;;;;;:::o;5630:127::-;5691:10;5686:3;5682:20;5679:1;5672:31;5722:4;5719:1;5712:15;5746:4;5743:1;5736:15;5762:422;5851:1;5894:5;5851:1;5908:270;5929:7;5919:8;5916:21;5908:270;;;5988:4;5984:1;5980:6;5976:17;5970:4;5967:27;5964:53;;;5997:18;;:::i;:::-;6047:7;6037:8;6033:22;6030:55;;;6067:16;;;;6030:55;6146:22;;;;6106:15;;;;5908:270;;;5912:3;5762:422;;;;;:::o;6189:806::-;6238:5;6268:8;6258:80;;-1:-1:-1;6309:1:1;6323:5;;6258:80;6357:4;6347:76;;-1:-1:-1;6394:1:1;6408:5;;6347:76;6439:4;6457:1;6452:59;;;;6525:1;6520:130;;;;6432:218;;6452:59;6482:1;6473:10;;6496:5;;;6520:130;6557:3;6547:8;6544:17;6541:43;;;6564:18;;:::i;:::-;-1:-1:-1;;6620:1:1;6606:16;;6635:5;;6432:218;;6734:2;6724:8;6721:16;6715:3;6709:4;6706:13;6702:36;6696:2;6686:8;6683:16;6678:2;6672:4;6669:12;6665:35;6662:77;6659:159;;;-1:-1:-1;6771:19:1;;;6803:5;;6659:159;6850:34;6875:8;6869:4;6850:34;:::i;:::-;6920:6;6916:1;6912:6;6908:19;6899:7;6896:32;6893:58;;;6931:18;;:::i;:::-;6969:20;;6189:806;-1:-1:-1;;;6189:806:1:o;7000:140::-;7058:5;7087:47;7128:4;7118:8;7114:19;7108:4;7087:47;:::i;7145:168::-;7185:7;7251:1;7247;7243:6;7239:14;7236:1;7233:21;7228:1;7221:9;7214:17;7210:45;7207:71;;;7258:18;;:::i;:::-;-1:-1:-1;7298:9:1;;7145:168::o;7667:125::-;7707:4;7735:1;7732;7729:8;7726:34;;;7740:18;;:::i;:::-;-1:-1:-1;7777:9:1;;7667:125::o;7797:356::-;7999:2;7981:21;;;8018:18;;;8011:30;8077:34;8072:2;8057:18;;8050:62;8144:2;8129:18;;7797:356::o;8158:128::-;8198:3;8229:1;8225:6;8222:1;8219:13;8216:39;;;8235:18;;:::i;:::-;-1:-1:-1;8271:9:1;;8158:128::o;8291:340::-;8493:2;8475:21;;;8532:2;8512:18;;;8505:30;-1:-1:-1;;;8566:2:1;8551:18;;8544:46;8622:2;8607:18;;8291:340::o;8636:184::-;8706:6;8759:2;8747:9;8738:7;8734:23;8730:32;8727:52;;;8775:1;8772;8765:12;8727:52;-1:-1:-1;8798:16:1;;8636:184;-1:-1:-1;8636:184:1:o;9104:245::-;9171:6;9224:2;9212:9;9203:7;9199:23;9195:32;9192:52;;;9240:1;9237;9230:12;9192:52;9272:9;9266:16;9291:28;9313:5;9291:28;:::i;9354:217::-;9394:1;9420;9410:132;;9464:10;9459:3;9455:20;9452:1;9445:31;9499:4;9496:1;9489:15;9527:4;9524:1;9517:15;9410:132;-1:-1:-1;9556:9:1;;9354:217::o;9786:204::-;9824:3;9860:4;9857:1;9853:12;9892:4;9889:1;9885:12;9927:3;9921:4;9917:14;9912:3;9909:23;9906:49;;;9935:18;;:::i;:::-;9971:13;;9786:204;-1:-1:-1;;;9786:204:1:o;11915:135::-;11954:3;-1:-1:-1;;11975:17:1;;11972:43;;;11995:18;;:::i;:::-;-1:-1:-1;12042:1:1;12031:13;;11915:135::o;12055:607::-;-1:-1:-1;;;;;12414:15:1;;;12396:34;;12461:2;12446:18;;12439:34;;;;12504:2;12489:18;;12482:34;;;;12547:2;12532:18;;12525:34;;;;12596:15;;;12590:3;12575:19;;12568:44;12376:3;12628:19;;12621:35;;;;12345:3;12330:19;;12055:607::o;16730:127::-;16791:10;16786:3;16782:20;16779:1;16772:31;16822:4;16819:1;16812:15;16846:4;16843:1;16836:15;16862:251;16932:6;16985:2;16973:9;16964:7;16960:23;16956:32;16953:52;;;17001:1;16998;16991:12;16953:52;17033:9;17027:16;17052:31;17077:5;17052:31;:::i;17118:461::-;17171:3;17209:5;17203:12;17236:6;17231:3;17224:19;17262:4;17291:2;17286:3;17282:12;17275:19;;17328:2;17321:5;17317:14;17349:1;17359:195;17373:6;17370:1;17367:13;17359:195;;;17438:13;;-1:-1:-1;;;;;17434:39:1;17422:52;;17494:12;;;;17529:15;;;;17470:1;17388:9;17359:195;;;-1:-1:-1;17570:3:1;;17118:461;-1:-1:-1;;;;;17118:461:1:o;17584:582::-;17883:6;17872:9;17865:25;17926:6;17921:2;17910:9;17906:18;17899:34;17969:3;17964:2;17953:9;17949:18;17942:31;17846:4;17990:57;18042:3;18031:9;18027:19;18019:6;17990:57;:::i;:::-;-1:-1:-1;;;;;18083:32:1;;;;18078:2;18063:18;;18056:60;-1:-1:-1;18147:3:1;18132:19;18125:35;17982:65;17584:582;-1:-1:-1;;;17584:582:1:o;18171:306::-;18259:6;18267;18275;18328:2;18316:9;18307:7;18303:23;18299:32;18296:52;;;18344:1;18341;18334:12;18296:52;18373:9;18367:16;18357:26;;18423:2;18412:9;18408:18;18402:25;18392:35;;18467:2;18456:9;18452:18;18446:25;18436:35;;18171:306;;;;;:::o;18885:510::-;19156:6;19145:9;19138:25;19199:3;19194:2;19183:9;19179:18;19172:31;19119:4;19220:57;19272:3;19261:9;19257:19;19249:6;19220:57;:::i;:::-;-1:-1:-1;;;;;19313:32:1;;;;19308:2;19293:18;;19286:60;-1:-1:-1;19377:2:1;19362:18;19355:34;19212:65;18885:510;-1:-1:-1;;18885:510:1:o

Swarm Source

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