ETH Price: $2,608.83 (-0.48%)

Token

AIKUCHI PROTOCOL ($AIKUCHI)
 

Overview

Max Total Supply

100,000,000 $AIKUCHI

Holders

50

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,211,713.198200043 $AIKUCHI

Value
$0.00
0x6c2287e4ada266d24bee17ee807a94453d289193
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:
AIKUCHIPROTOCOL

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-22
*/

/**

Total Supply: 100,000,000
Max Wallet: 3% (3,000,000 Tokens)
Max Buy: 3% (3,000,000 Tokens)
Max Sell: 1% (1,000,000 Tokens)
Buy / Sell Tax: 6% 

*/

pragma solidity ^0.8.13;

// SPDX-License-Identifier: MIT

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

////////// Contract /////////////

contract AIKUCHIPROTOCOL is IERC20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    event antiBotBan(address indexed value);

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _sellLock;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromBuyLock;
    EnumerableSet.AddressSet private _excludedFromStaking;

    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string private constant _name = 'AIKUCHI PROTOCOL';
    string private constant _symbol = '$AIKUCHI';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;//equals 100 000 000 tokens

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
    uint256 public autoBanTime = 30; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
    uint256 public enableAutoBlacklist = 0; //Leave 1 if using, set to 0 if not using.
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (1%))
    uint16 public constant SellLimitDivider=100;
    //Sellers get locked for MaxSellLockTime (put in seconds, works better especially if changing later) so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 0 seconds;
    //Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 0 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public Development=payable(0x67457c61A981186d9DA796aB841eec4eB7867Aa7);
    address public Marketing=payable(0x67457c61A981186d9DA796aB841eec4eB7867Aa7);
    //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 MaxBuy = 3000000 * 10**_decimals; // 10,000,000 tokens
    
    //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;

       
    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==Development||addr==Marketing;
    }

    //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 sellLockTime
        sellLockTime=0;
        
        //Sets buyLockTime
        buyLockTime=0;

        //Set Starting Tax 
        
        _buyTax=6;
        _sellTax=6;
        _transferTax=0;

        _burnTax=0;
        _liquidityTax=10;
        _stakingTax=90;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(Development);
        _excluded.add(Marketing);
        _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){
            if(!_excludedFromSellLock.contains(sender)){
                 //If seller sold less than sellLockTime(2h 50m) ago, sell is declined, can be disabled by Team         
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours 50 mins by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(21,000 Tokens at start, can be updated to circulating supply)
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            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 <= MaxBuy,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }

            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)) claimETH(sender);
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            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;
    
  
    uint8 public marketingShare=100;
    //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);
    }

    //Check if address is blacklisted
    function isBlacklisted(address addr) public view returns (bool){
        return _isBlacklisted.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 dividents 
    function _distributeStake(uint256 ETHamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (ETHamount * marketingShare) / 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 OnWithdrawETH(uint256 amount, address recipient);
    
    //withdraws all dividents of address
    function claimETH(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(); //ETH
        path[1] = 0x4Fabb145d64652a948d72533023f6E7A623C7C53; //BUSD Rewards - Option to enable.

        _uniswapv2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawETH(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;
    }
    uint256 currentAmountToSwap = 400000 * 10**_decimals;  // 400,000 tokens (0.4%)
    //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 = currentAmountToSwap;
        //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 selling
    function getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){
       uint256 lockTime=_sellLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getSellLockTimeInSeconds() public view returns(uint256){
        return sellLockTime;
    }
    
    function getcurrentAmountToSwap() public view returns (uint256){
          return currentAmountToSwap;
    }

    //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 sell lock of caller to the default sellLockTime should something go very wrong
    function AddressResetSellLock() public{
        _sellLock[msg.sender]=block.timestamp+sellLockTime;
    }
    
    //Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() public{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
    
    }

        //withdraws dividents of sender
    function Rewards() public{
        claimETH(msg.sender);
    }

    function getDividents(address addr) public view returns (uint256){
        if(isExcludedFromStaking(addr)) return toBePaid[addr];
        return _newDividentsOf(addr)+toBePaid[addr];
    }

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

    function CollectMarketingETH() public onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(Development).transfer((amount*25) / 100);
        payable(Marketing).transfer((amount*75) / 100);
    } 
    function TeamCollectXMarketingETH(uint256 amount) public onlyOwner{
        require(amount<=marketingBalance);
        marketingBalance-=amount;
        payable(Development).transfer((amount*25) / 100);
        payable(Marketing).transfer((amount*75) / 100);
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) public onlyOwner{
        manualConversion=manual;
    }
    
    function TeamChangeMaxBuy(uint256 newMaxBuy) public onlyOwner{
      MaxBuy=newMaxBuy * 10**_decimals;
    }
    
    function TeamChangeDevelopment(address newDevelopment) public onlyOwner{
      Development=payable(newDevelopment);
    }
    
    function TeamChangeMarketing(address newMarketing) public onlyOwner{
      Marketing=payable(newMarketing);
    }

    //Disables the timeLock after selling for everyone
    function TeamDisableSellLock(bool disabled) public onlyOwner{
        sellLockDisabled=disabled;
    }
    
    //Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) public onlyOwner{
        buyLockDisabled=disabled;
    }

    //Sets SellLockTime, needs to be lower than MaxSellLockTime
    function TeamSetSellLockTime(uint256 sellLockSeconds)public onlyOwner{
            require(sellLockSeconds<=MaxSellLockTime,"Sell Lock time too high");
            sellLockTime=sellLockSeconds;
    } 
    
    //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 CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) public onlyOwner{
        currentAmountToSwap = newSwapAmount;
    }
    
    //Allows wallet exclusion to be added after launch
    function AddWalletExclusion(address exclusionAdd) public onlyOwner{
        _excluded.add(exclusionAdd);
    }
    
    //Sets Taxes
    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 TeamChangeMarketingShare(uint8 newShare) public onlyOwner{
        require(newShare<=100); 
        marketingShare=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;     
    }

    //Adds address to blacklist and prevents sells, buys or transfers.
    function addAddressToBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.add(blacklistedAddress);
    }

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
    }
    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() public onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }

    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
    }

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

    function TeamExtendLiquidityLock(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 REL() 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(Development, amount);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function REM(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 TeamCollectRemainingETH() public onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp+DefaultLiquidityLockTime;
        (bool sent,) =Development.call{value: (address(this).balance)}("");
        require(sent);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

    // IERC20 - 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":"OnWithdrawETH","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","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":"AddressResetSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CollectMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Development","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Marketing","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":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"addToStaking","type":"bool"}],"name":"REM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Rewards","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"newDevelopment","type":"address"}],"name":"TeamChangeDevelopment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketing","type":"address"}],"name":"TeamChangeMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"TeamChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"TeamChangeMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCollectRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamCollectXMarketingETH","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":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamExtendLiquidityLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"TeamSetSellLockTime","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":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","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":"_getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBanTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"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":[],"name":"enableAutoBlacklist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressSellLockTimeInSeconds","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":"getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"getcurrentAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","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":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","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"}]

6080604052601e6010556000601155601280547367457c61a981186d9da796ab841eec4eb7867aa76001600160a01b03199182168117909255601380549091169091179055620000526009600a6200060f565b62000062906305f5e10062000620565b601481905560158190556016556200007d6009600a6200060f565b6200008c90622dc6c062000620565b601755601d805460ff19166064179055620000aa6009600a6200060f565b620000b99062061a8062000620565b602355348015620000c957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601454336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601980546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001b7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001dd919062000642565b6001600160a01b031663c9c6539630601960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000266919062000642565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002da919062000642565b601880546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003186009600a6200060f565b62000328906305f5e10062000620565b62000334919062000674565b6015556064620003476009600a6200060f565b62000357906305f5e10062000620565b62000363919062000674565b601655600060258190556027556018805465ffffffffffff1916655a0a00000606179055601254620003ad906005906001600160a01b03166200048a602090811b620020a817901c565b50601354620003d4906005906001600160a01b03166200048a602090811b620020a817901c565b50620003f03360056200048a60201b620020a81790919060201c565b506019546200041790600b906001600160a01b03166200048a602090811b620020a817901c565b5062000448601860069054906101000a90046001600160a01b0316600b6200048a60201b620020a81790919060201c565b506200046430600b6200048a60201b620020a81790919060201c565b506200048261dead600b6200048a60201b620020a81790919060201c565b505062000697565b6000620004a1836001600160a01b038416620004aa565b90505b92915050565b6000818152600183016020526040812054620004f357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004a4565b506000620004a4565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000553578160001904821115620005375762000537620004fc565b808516156200054557918102915b93841c939080029062000517565b509250929050565b6000826200056c57506001620004a4565b816200057b57506000620004a4565b81600181146200059457600281146200059f57620005bf565b6001915050620004a4565b60ff841115620005b357620005b3620004fc565b50506001821b620004a4565b5060208310610133831016604e8410600b8410161715620005e4575081810a620004a4565b620005f0838362000512565b8060001904821115620006075762000607620004fc565b029392505050565b6000620004a160ff8416836200055b565b60008160001904831182151516156200063d576200063d620004fc565b500290565b6000602082840312156200065557600080fd5b81516001600160a01b03811681146200066d57600080fd5b9392505050565b6000826200069257634e487b7160e01b600052601260045260246000fd5b500490565b613dcd80620006a76000396000f3fe6080604052600436106104315760003560e01c80637335307b11610227578063b766a3861161012d578063e68f136a116100b0578063f2c816ae11610077578063f2c816ae14610cfa578063f2fde38b14610d1a578063f88b0e4614610d3a578063fe002ec214610d50578063fe575a8714610d6557005b8063e68f136a14610c6f578063e69e03ee14610c8f578063e803050c14610ca4578063ebddcc1d14610cc4578063f00df36514610ce457005b8063d11edf74116100f4578063d11edf7414610ba9578063d51f383b14610bc9578063db886f2314610be9578063dd62ed3e14610c09578063e2fd002a14610c4f57005b8063b766a38614610b2a578063c280895414610b4a578063c3a3c03214610b5f578063c3f4f54f14610b74578063cd979a7e14610b8957005b8063893d20e8116101b55780639bf657701161017c5780639bf6577014610a8a5780639fa62d5f14610aaa578063a457c2d714610aca578063a9059cbb14610aea578063b58a56cd14610b0a57005b8063893d20e8146109d45780638da5cb5b14610a0657806394e8075d14610a2457806395d89b4114610a44578063998a866814610a7557005b8063828e8b7e116101f9578063828e8b7e146109555780638650e92a1461096a57806386d0ada8146109805780638728ecd11461099a578063887c60fb146109ba57005b80637335307b146108ea57806373ddf08e1461090a578063762bb2821461092a5780637b9e987a1461094057005b806335e82f3a1161033757806357ad67d1116102ba578063643daaea11610281578063643daaea146108355780636ea4caab146108555780636f89e4091461087557806370a082311461089f578063715018a6146108d557005b806357ad67d1146107d557806358e55365146107f55780635b80f6251461080b5780635c69f690146106be5780635ebbc3ca1461082057005b806344f3c83a116102fe57806344f3c83a1461075557806348e531641461076b5780634ada218b146107805780634cdaf0ae1461079f5780634f91e48c146107bf57005b806335e82f3a146106d357806339509351146106f35780633cc39b7a146107135780633da56f18146107295780634089b1701461073f57005b80631eb25d13116103bf5780633054f8a3116103865780633054f8a31461065b578063311a869714610675578063313ce5671461068a57806332ac487f1461069e5780633478154b146106be57005b80631eb25d131461059257806323b872dd146105a7578063243b529a146105c7578063269a6aae146105dc5780632973ef2d146105f257005b80630fd99e16116104035780630fd99e16146105015780631285073c1461052957806314ddc0951461054857806314e913771461055d57806318160ddd1461057d57005b80630241047b1461043a57806306fdde031461045a57806309218ee7146104a5578063095ea7b3146104d157005b3661043857005b005b34801561044657600080fd5b506104386104553660046137ac565b610d85565b34801561046657600080fd5b5060408051808201909152601081526f105252d550d21248141493d513d0d3d360821b60208201525b60405161049c91906137c5565b60405180910390f35b3480156104b157600080fd5b50601d546104bf9060ff1681565b60405160ff909116815260200161049c565b3480156104dd57600080fd5b506104f16104ec36600461382f565b610e8e565b604051901515815260200161049c565b34801561050d57600080fd5b50610516606481565b60405161ffff909116815260200161049c565b34801561053557600080fd5b506025545b60405190815260200161049c565b34801561055457600080fd5b5060275461053a565b34801561056957600080fd5b50610438610578366004613869565b610ea5565b34801561058957600080fd5b5060145461053a565b34801561059e57600080fd5b5061053a610ef1565b3480156105b357600080fd5b506104f16105c2366004613886565b610f0e565b3480156105d357600080fd5b50610438610fa5565b3480156105e857600080fd5b5061053a60105481565b3480156105fe57600080fd5b506018546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c00161049c565b34801561066757600080fd5b506026546104f19060ff1681565b34801561068157600080fd5b506104bf603281565b34801561069657600080fd5b5060096104bf565b3480156106aa57600080fd5b5061053a6106b93660046138c7565b610fe8565b3480156106ca57600080fd5b50610516600081565b3480156106df57600080fd5b506104386106ee3660046138c7565b61103e565b3480156106ff57600080fd5b506104f161070e36600461382f565b611082565b34801561071f57600080fd5b5061053a60215481565b34801561073557600080fd5b5061053a60115481565b34801561074b57600080fd5b5061053a601c5481565b34801561076157600080fd5b5061053a60275481565b34801561077757600080fd5b506104386110b9565b34801561078c57600080fd5b506028546104f190610100900460ff1681565b3480156107ab57600080fd5b506104386107ba3660046138c7565b6110d8565b3480156107cb57600080fd5b5061053a60165481565b3480156107e157600080fd5b506104386107f03660046138fa565b61113b565b34801561080157600080fd5b5061053a601e5481565b34801561081757600080fd5b5060235461053a565b34801561082c57600080fd5b5061043861126e565b34801561084157600080fd5b506104386108503660046137ac565b61133b565b34801561086157600080fd5b506104386108703660046137ac565b611386565b34801561088157600080fd5b5061088a6113db565b6040805192835260208301919091520161049c565b3480156108ab57600080fd5b5061053a6108ba3660046138c7565b6001600160a01b031660009081526001602052604090205490565b3480156108e157600080fd5b50610438611418565b3480156108f657600080fd5b506104f16109053660046138c7565b61149b565b34801561091657600080fd5b5061043861092536600461396e565b6114a8565b34801561093657600080fd5b5061053a60155481565b34801561094c57600080fd5b50610438611508565b34801561096157600080fd5b50610438611556565b34801561097657600080fd5b5061053a601a5481565b34801561098c57600080fd5b506028546104f19060ff1681565b3480156109a657600080fd5b5061053a6109b53660046138c7565b611575565b3480156109c657600080fd5b506024546104f19060ff1681565b3480156109e057600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161049c565b348015610a1257600080fd5b506000546001600160a01b03166109ee565b348015610a3057600080fd5b506012546109ee906001600160a01b031681565b348015610a5057600080fd5b506040805180820190915260088152672441494b5543484960c01b602082015261048f565b348015610a8157600080fd5b506104386115b4565b348015610a9657600080fd5b50610438610aa5366004613869565b611703565b348015610ab657600080fd5b50610438610ac5366004613989565b61174f565b348015610ad657600080fd5b506104f1610ae536600461382f565b6118d1565b348015610af657600080fd5b506104f1610b0536600461382f565b61194d565b348015610b1657600080fd5b50610438610b253660046138c7565b61195a565b348015610b3657600080fd5b50610438610b45366004613869565b6119b5565b348015610b5657600080fd5b50610438611a01565b348015610b6b57600080fd5b5061053a611a0a565b348015610b8057600080fd5b5061053a611a2a565b348015610b9557600080fd5b50610438610ba43660046138c7565b611a69565b348015610bb557600080fd5b50610438610bc43660046137ac565b611aad565b348015610bd557600080fd5b50610438610be43660046137ac565b611aeb565b348015610bf557600080fd5b506013546109ee906001600160a01b031681565b348015610c1557600080fd5b5061053a610c243660046139ab565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c5b57600080fd5b50610438610c6a3660046137ac565b611b77565b348015610c7b57600080fd5b50610438610c8a3660046138c7565b611bfc565b348015610c9b57600080fd5b5061053a611c57565b348015610cb057600080fd5b5061053a610cbf3660046138c7565b611cbd565b348015610cd057600080fd5b50610438610cdf366004613869565b611ce6565b348015610cf057600080fd5b5061053a601b5481565b348015610d0657600080fd5b50610438610d153660046138c7565b611f00565b348015610d2657600080fd5b50610438610d353660046138c7565b611f44565b348015610d4657600080fd5b5061053a60255481565b348015610d5c57600080fd5b5061043861203d565b348015610d7157600080fd5b506104f1610d803660046138c7565b61209b565b33610d986000546001600160a01b031690565b6001600160a01b031614610dc75760405162461bcd60e51b8152600401610dbe906139e4565b60405180910390fd5b601e54811115610dd657600080fd5b80601e6000828254610de89190613a2f565b90915550506012546001600160a01b03166108fc6064610e09846019613a46565b610e139190613a65565b6040518115909202916000818181858888f19350505050158015610e3b573d6000803e3d6000fd5b506013546001600160a01b03166108fc6064610e5884604b613a46565b610e629190613a65565b6040518115909202916000818181858888f19350505050158015610e8a573d6000803e3d6000fd5b5050565b6000610e9b3384846120bd565b5060015b92915050565b33610eb86000546001600160a01b031690565b6001600160a01b031614610ede5760405162461bcd60e51b8152600401610dbe906139e4565b6024805460ff1916911515919091179055565b610efd6009600a613b6b565b610f0b906305f5e100613a46565b81565b6000610f1b8484846121b0565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f865760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610dbe565b610f9a8533610f958685613a2f565b6120bd565b506001949350505050565b33610fb86000546001600160a01b031690565b6001600160a01b031614610fde5760405162461bcd60e51b8152600401610dbe906139e4565b610fe661240d565b565b6000610ff38261149b565b1561101357506001600160a01b0316600090815260208052604090205490565b6001600160a01b03821660009081526020805260409020546110348361254d565b610e9f9190613b7a565b336110516000546001600160a01b031690565b6001600160a01b0316146110775760405162461bcd60e51b8152600401610dbe906139e4565b610e8a600d826125d3565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610e9b918590610f95908690613b7a565b6025546110c69042613b7a565b33600090815260036020526040902055565b336110eb6000546001600160a01b031690565b6001600160a01b0316146111115760405162461bcd60e51b8152600401610dbe906139e4565b602880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b3361114e6000546001600160a01b031690565b6001600160a01b0316146111745760405162461bcd60e51b8152600401610dbe906139e4565b6000846111818789613b92565b61118b9190613b92565b90508060ff166064146111ef5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610dbe565b506018805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112816000546001600160a01b031690565b6001600160a01b0316146112a75760405162461bcd60e51b8152600401610dbe906139e4565b6029544210156112c95760405162461bcd60e51b8152600401610dbe90613bb7565b6112d561070842613b7a565b6029556012546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611325576040519150601f19603f3d011682016040523d82523d6000602084013e61132a565b606091505b505090508061133857600080fd5b50565b3361134e6000546001600160a01b031690565b6001600160a01b0316146113745760405162461bcd60e51b8152600401610dbe906139e4565b6113386113814283613b7a565b6125e8565b336113996000546001600160a01b031690565b6001600160a01b0316146113bf5760405162461bcd60e51b8152600401610dbe906139e4565b6113cb6009600a613b6b565b6113d59082613a46565b60175550565b6000806113ea6009600a613b6b565b6015546113f79190613a65565b6114036009600a613b6b565b6016546114109190613a65565b915091509091565b3361142b6000546001600160a01b031690565b6001600160a01b0316146114515760405162461bcd60e51b8152600401610dbe906139e4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610e9f600b836125fb565b336114bb6000546001600160a01b031690565b6001600160a01b0316146114e15760405162461bcd60e51b8152600401610dbe906139e4565b60648160ff1611156114f257600080fd5b601d805460ff191660ff92909216919091179055565b3361151b6000546001600160a01b031690565b6001600160a01b0316146115415760405162461bcd60e51b8152600401610dbe906139e4565b6028805461ff00191661010017905542600f55565b6027546115639042613b7a565b33600090815260046020526040902055565b6001600160a01b03811660009081526003602052604081205442811161159e5750600092915050565b6115a84282613a2f565b9392505050565b905090565b336115c76000546001600160a01b031690565b6001600160a01b0316146115ed5760405162461bcd60e51b8152600401610dbe906139e4565b60295442101561160f5760405162461bcd60e51b8152600401610dbe90613bb7565b6028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116859190613be1565b60125460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe9190613bfa565b505050565b336117166000546001600160a01b031690565b6001600160a01b03161461173c5760405162461bcd60e51b8152600401610dbe906139e4565b6028805460ff1916911515919091179055565b336117626000546001600160a01b031690565b6001600160a01b0316146117885760405162461bcd60e51b8152600401610dbe906139e4565b60646014546117979190613a65565b81106117a257600080fd5b6117ae6009600a613b6b565b6117b89083613a46565b91506117c66009600a613b6b565b6117d09082613a46565b90506000603260ff166014546117e69190613a65565b90506000606461ffff166014546117fd9190613a65565b9050818410156118635760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610dbe565b808310156118c45760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610dbe565b5050601591909155601655565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156119345760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610dbe565b6119433385610f958685613a2f565b5060019392505050565b6000610e9b3384846121b0565b3361196d6000546001600160a01b031690565b6001600160a01b0316146119935760405162461bcd60e51b8152600401610dbe906139e4565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b336119c86000546001600160a01b031690565b6001600160a01b0316146119ee5760405162461bcd60e51b8152600401610dbe906139e4565b6026805460ff1916911515919091179055565b610fe63361261d565b6000602954421015611a2457426029546115af9190613a2f565b50600090565b6000611a386009600a613b6b565b601454611a476009600a613b6b565b611a55906305f5e100613a46565b611a5f9190613a2f565b6115af9190613a65565b33611a7c6000546001600160a01b031690565b6001600160a01b031614611aa25760405162461bcd60e51b8152600401610dbe906139e4565b610e8a6005826120a8565b33611ac06000546001600160a01b031690565b6001600160a01b031614611ae65760405162461bcd60e51b8152600401610dbe906139e4565b602355565b33611afe6000546001600160a01b031690565b6001600160a01b031614611b245760405162461bcd60e51b8152600401610dbe906139e4565b8015611b725760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610dbe565b602555565b33611b8a6000546001600160a01b031690565b6001600160a01b031614611bb05760405162461bcd60e51b8152600401610dbe906139e4565b8015611bf75760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610dbe565b602755565b33611c0f6000546001600160a01b031690565b6001600160a01b031614611c355760405162461bcd60e51b8152600401610dbe906139e4565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b601454600090815b611c69600b6128e1565b811015611cb75760016000611c7f600b846128eb565b6001600160a01b03168152602081019190915260400160002054611ca39083613a2f565b915080611caf81613c17565b915050611c5f565b50919050565b6001600160a01b03811660009081526004602052604081205442811161159e5750600092915050565b33611cf96000546001600160a01b031690565b6001600160a01b031614611d1f5760405162461bcd60e51b8152600401610dbe906139e4565b602954421015611d415760405162461bcd60e51b8152600401610dbe90613bb7565b611d4d61070842613b7a565b6029556028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc69190613be1565b60195460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f9190613bfa565b5060195460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611e7b9030908690600090819084904290600401613c30565b6020604051808303816000875af1158015611e9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebe9190613be1565b506000611ecb8247613a2f565b90508415611ee157611edc816128f7565b611ef9565b80601e6000828254611ef39190613b7a565b90915550505b5050505050565b33611f136000546001600160a01b031690565b6001600160a01b031614611f395760405162461bcd60e51b8152600401610dbe906139e4565b610e8a600d826120a8565b33611f576000546001600160a01b031690565b6001600160a01b031614611f7d5760405162461bcd60e51b8152600401610dbe906139e4565b6001600160a01b038116611fe25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dbe565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336120506000546001600160a01b031690565b6001600160a01b0316146120765760405162461bcd60e51b8152600401610dbe906139e4565b601e805460009091556012546001600160a01b03166108fc6064610e09846019613a46565b6000610e9f600d836125fb565b60006115a8836001600160a01b0384166129c3565b6001600160a01b0383166121075760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610dbe565b6001600160a01b03821661214f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610dbe565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121fb5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610dbe565b6001600160a01b0382166122445760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610dbe565b60006122516005856125fb565b8061226257506122626005846125fb565b905060006001600160a01b03851630148061228557506001600160a01b03841630145b6019546018549192506001600160a01b0390811691600091888116600160301b909204161480156122c75750816001600160a01b0316866001600160a01b0316145b8061230257506018546001600160a01b03878116600160301b909204161480156123025750816001600160a01b0316876001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b90920416148061233c5750826001600160a01b0316886001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b9092041614806123765750836001600160a01b0316886001600160a01b0316145b905084806123815750825b806123895750855b1561239e57612399898989612a12565b612402565b602854610100900460ff166123f55760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610dbe565b6124028989898585612add565b505050505050505050565b6022805460ff19166001908117909155306000908152602091909152604081205460185490919061245390600160281b810460ff90811691640100000000900416613b92565b60ff169050600060235490508083108061246f575061ffff8216155b1561247c57505050612541565b60185460009061ffff84169061249d90640100000000900460ff1684613a46565b6124a79190613a65565b905060006124b58284613a2f565b905060006124c4600284613a65565b905060006124d28285613a2f565b905060006124e08483613b7a565b9050476124ec82613275565b60006124f88247613a2f565b90506000836125078684613a46565b6125119190613a65565b905061251d86826133ce565b60006125298447613a2f565b9050612534816128f7565b5050505050505050505050505b6022805460ff19169055565b6001600160a01b038116600090815260016020526040812054601a54829161257491613a46565b6001600160a01b0384166000908152601f60205260409020549091508110156125a05750600092915050565b6001600160a01b0383166000908152601f6020526040902054600160401b906125c99083613a2f565b6115a89190613a65565b60006115a8836001600160a01b03841661347d565b60295481116125f657600080fd5b602955565b6001600160a01b038116600090815260018301602052604081205415156115a8565b601954600160a01b900460ff161561263457600080fd5b6019805460ff60a01b1916600160a01b17905560006126528261149b565b1561267957506001600160a01b0381166000908152602080526040812080549190556126f6565b60006126848361254d565b6001600160a01b038416600090815260016020526040902054601a549192506126ac91613a46565b6001600160a01b0384166000908152601f6020908152604080832093909355805220546126da908290613b7a565b6001600160a01b03841660009081526020805260408120559150505b8060000361270f5750506019805460ff60a01b19169055565b80601c60008282546127219190613b7a565b90915550506040805160028082526060820183526000926020830190803683375050601954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b49190613c6b565b816000815181106127c7576127c7613c88565b60200260200101906001600160a01b031690816001600160a01b031681525050734fabb145d64652a948d72533023f6e7a623c7c538160018151811061280f5761280f613c88565b6001600160a01b03928316602091820292909201015260195460405163b6f9de9560e01b815291169063b6f9de9590849061285590600090869089904290600401613ce2565b6000604051808303818588803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506128c79050565b60405180910390a150506019805460ff60a01b1916905550565b6000610e9f825490565b60006115a8838361356a565b601d5460009060649061290d9060ff1684613a46565b6129179190613a65565b905060006129258284613a2f565b905081601e60008282546129399190613b7a565b909155505080156116fe5780601b60008282546129569190613b7a565b9091555060009050612966611c57565b90508060000361298d5781601e60008282546129829190613b7a565b909155506129bd9050565b8061299c600160401b84613a46565b6129a69190613a65565b601a60008282546129b79190613b7a565b90915550505b50505050565b6000818152600183016020526040812054612a0a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e9f565b506000610e9f565b6001600160a01b03831660009081526001602052604090205481811015612a765760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610dbe565b612a8084836135f0565b612a8a83836136af565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612acf91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b4b5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610dbe565b60008315612cfe57612b5e6007896125fb565b612bf3576001600160a01b03881660009081526003602052604090205442101580612b8b575060245460ff165b612bcc5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610dbe565b602554612bd99042613b7a565b6001600160a01b0389166000908152600360205260409020555b601654861115612c375760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610dbe565b612c42600d896125fb565b15612c865760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610dbe565b601054600f54612c969190613b7a565b4211158015612ca757506011546001145b15612ced57612cb7600d896120a8565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601854610100900460ff16613112565b8415612f0f57612d0f6009886125fb565b612da2576001600160a01b03871660009081526004602052604090205442101580612d3c575060265460ff165b612d7b5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610dbe565b602754612d889042613b7a565b6001600160a01b0388166000908152600460205260409020555b601554612daf8785613b7a565b1115612df05760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610dbe565b601754861115612e4d5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610dbe565b612e58600d886125fb565b15612e9c5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610dbe565b601054600f54612eac9190613b7a565b4211158015612ebd57506011546001145b15612f0357612ecd600d886120a8565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185460ff16613112565b612f1b6009600a613b6b565b8611612f2a57612f2a8861261d565b601554612f378785613b7a565b1115612f785760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610dbe565b612f836007896125fb565b612fed576001600160a01b03881660009081526003602052604090205442101580612fb0575060245460ff165b612fed5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610dbe565b612ff8600d896125fb565b156130455760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610dbe565b613050600d886125fb565b1561309d5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610dbe565b601054600f546130ad9190613b7a565b42111580156130be57506011546001145b15613104576130ce600d896120a8565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185462010000900460ff165b6018546001600160a01b03898116600160301b909204161480159061313a575060285460ff16155b8015613149575060225460ff16155b80156131525750835b1561315f5761315f61240d565b600061317b8783601860039054906101000a900460ff16613778565b6018549091506000906131af90899085906131aa9060ff6401000000008204811691600160281b900416613b92565b613778565b905060006131bd8284613b7a565b6131c7908a613a2f565b90506131d38b8a6135f0565b30600090815260016020526040812080548492906131f2908490613b7a565b92505081905550826014600082825461320b9190613a2f565b9091555061321b90508a826136af565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161326091815260200190565b60405180910390a35050505050505050505050565b60195461328d9030906001600160a01b0316836120bd565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132c2576132c2613c88565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561331b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333f9190613c6b565b8160018151811061335257613352613c88565b6001600160a01b03928316602091820292909201015260195460405163791ac94760e01b815291169063791ac94790613398908590600090869030904290600401613d17565b600060405180830381600087803b1580156133b257600080fd5b505af11580156133c6573d6000803e3d6000fd5b505050505050565b80602160008282546133e09190613b7a565b90915550506019546133fd9030906001600160a01b0316846120bd565b60195460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061343a9030908790600090819084904290600401613c30565b60606040518083038185885af1158015613458573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ef99190613d53565b600081815260018301602052604081205480156135605760006134a1600183613a2f565b85549091506000906134b590600190613a2f565b905060008660000182815481106134ce576134ce613c88565b90600052602060002001549050808760000184815481106134f1576134f1613c88565b60009182526020808320909101929092558281526001890190915260409020849055865487908061352457613524613d81565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610e9f565b6000915050610e9f565b815460009082106135c85760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610dbe565b8260000182815481106135dd576135dd613c88565b9060005260206000200154905092915050565b6001600160a01b038216600090815260016020526040812054613614908390613a2f565b905061361f8361149b565b15613644576001600160a01b0390921660009081526001602052604090209190915550565b600061364f8461254d565b6001600160a01b0385166000908152600160205260409020839055601a5490915061367b908390613a46565b6001600160a01b0385166000908152601f6020908152604080832093909355805290812080548392906129b7908490613b7a565b6001600160a01b0382166000908152600160205260408120546136d3908390613b7a565b90506136de8361149b565b15613703576001600160a01b0390921660009081526001602052604090209190915550565b600061370e8461254d565b905081601a5461371e9190613a46565b6001600160a01b0385166000908152601f602090815260408083209390935580529081208054839290613752908490613b7a565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff16866137909190613a46565b61379a9190613a46565b6137a49190613a65565b949350505050565b6000602082840312156137be57600080fd5b5035919050565b600060208083528351808285015260005b818110156137f2578581018301518582016040015282016137d6565b81811115613804576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461133857600080fd5b6000806040838503121561384257600080fd5b823561384d8161381a565b946020939093013593505050565b801515811461133857600080fd5b60006020828403121561387b57600080fd5b81356115a88161385b565b60008060006060848603121561389b57600080fd5b83356138a68161381a565b925060208401356138b68161381a565b929592945050506040919091013590565b6000602082840312156138d957600080fd5b81356115a88161381a565b803560ff811681146138f557600080fd5b919050565b60008060008060008060c0878903121561391357600080fd5b61391c876138e4565b955061392a602088016138e4565b9450613938604088016138e4565b9350613946606088016138e4565b9250613954608088016138e4565b915061396260a088016138e4565b90509295509295509295565b60006020828403121561398057600080fd5b6115a8826138e4565b6000806040838503121561399c57600080fd5b50508035926020909101359150565b600080604083850312156139be57600080fd5b82356139c98161381a565b915060208301356139d98161381a565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613a4157613a41613a19565b500390565b6000816000190483118215151615613a6057613a60613a19565b500290565b600082613a8257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613ac2578160001904821115613aa857613aa8613a19565b80851615613ab557918102915b93841c9390800290613a8c565b509250929050565b600082613ad957506001610e9f565b81613ae657506000610e9f565b8160018114613afc5760028114613b0657613b22565b6001915050610e9f565b60ff841115613b1757613b17613a19565b50506001821b610e9f565b5060208310610133831016604e8410600b8410161715613b45575081810a610e9f565b613b4f8383613a87565b8060001904821115613b6357613b63613a19565b029392505050565b60006115a860ff841683613aca565b60008219821115613b8d57613b8d613a19565b500190565b600060ff821660ff84168060ff03821115613baf57613baf613a19565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613bf357600080fd5b5051919050565b600060208284031215613c0c57600080fd5b81516115a88161385b565b600060018201613c2957613c29613a19565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613c7d57600080fd5b81516115a88161381a565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613cd75781516001600160a01b031687529582019590820190600101613cb2565b509495945050505050565b848152608060208201526000613cfb6080830186613c9e565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000613d3660a0830186613c9e565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613d6857600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220d933d009bd93e2c9918b7d783af5c33dfdb275e0cdf307ce569e48ab546ed1e764736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106104315760003560e01c80637335307b11610227578063b766a3861161012d578063e68f136a116100b0578063f2c816ae11610077578063f2c816ae14610cfa578063f2fde38b14610d1a578063f88b0e4614610d3a578063fe002ec214610d50578063fe575a8714610d6557005b8063e68f136a14610c6f578063e69e03ee14610c8f578063e803050c14610ca4578063ebddcc1d14610cc4578063f00df36514610ce457005b8063d11edf74116100f4578063d11edf7414610ba9578063d51f383b14610bc9578063db886f2314610be9578063dd62ed3e14610c09578063e2fd002a14610c4f57005b8063b766a38614610b2a578063c280895414610b4a578063c3a3c03214610b5f578063c3f4f54f14610b74578063cd979a7e14610b8957005b8063893d20e8116101b55780639bf657701161017c5780639bf6577014610a8a5780639fa62d5f14610aaa578063a457c2d714610aca578063a9059cbb14610aea578063b58a56cd14610b0a57005b8063893d20e8146109d45780638da5cb5b14610a0657806394e8075d14610a2457806395d89b4114610a44578063998a866814610a7557005b8063828e8b7e116101f9578063828e8b7e146109555780638650e92a1461096a57806386d0ada8146109805780638728ecd11461099a578063887c60fb146109ba57005b80637335307b146108ea57806373ddf08e1461090a578063762bb2821461092a5780637b9e987a1461094057005b806335e82f3a1161033757806357ad67d1116102ba578063643daaea11610281578063643daaea146108355780636ea4caab146108555780636f89e4091461087557806370a082311461089f578063715018a6146108d557005b806357ad67d1146107d557806358e55365146107f55780635b80f6251461080b5780635c69f690146106be5780635ebbc3ca1461082057005b806344f3c83a116102fe57806344f3c83a1461075557806348e531641461076b5780634ada218b146107805780634cdaf0ae1461079f5780634f91e48c146107bf57005b806335e82f3a146106d357806339509351146106f35780633cc39b7a146107135780633da56f18146107295780634089b1701461073f57005b80631eb25d13116103bf5780633054f8a3116103865780633054f8a31461065b578063311a869714610675578063313ce5671461068a57806332ac487f1461069e5780633478154b146106be57005b80631eb25d131461059257806323b872dd146105a7578063243b529a146105c7578063269a6aae146105dc5780632973ef2d146105f257005b80630fd99e16116104035780630fd99e16146105015780631285073c1461052957806314ddc0951461054857806314e913771461055d57806318160ddd1461057d57005b80630241047b1461043a57806306fdde031461045a57806309218ee7146104a5578063095ea7b3146104d157005b3661043857005b005b34801561044657600080fd5b506104386104553660046137ac565b610d85565b34801561046657600080fd5b5060408051808201909152601081526f105252d550d21248141493d513d0d3d360821b60208201525b60405161049c91906137c5565b60405180910390f35b3480156104b157600080fd5b50601d546104bf9060ff1681565b60405160ff909116815260200161049c565b3480156104dd57600080fd5b506104f16104ec36600461382f565b610e8e565b604051901515815260200161049c565b34801561050d57600080fd5b50610516606481565b60405161ffff909116815260200161049c565b34801561053557600080fd5b506025545b60405190815260200161049c565b34801561055457600080fd5b5060275461053a565b34801561056957600080fd5b50610438610578366004613869565b610ea5565b34801561058957600080fd5b5060145461053a565b34801561059e57600080fd5b5061053a610ef1565b3480156105b357600080fd5b506104f16105c2366004613886565b610f0e565b3480156105d357600080fd5b50610438610fa5565b3480156105e857600080fd5b5061053a60105481565b3480156105fe57600080fd5b506018546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c00161049c565b34801561066757600080fd5b506026546104f19060ff1681565b34801561068157600080fd5b506104bf603281565b34801561069657600080fd5b5060096104bf565b3480156106aa57600080fd5b5061053a6106b93660046138c7565b610fe8565b3480156106ca57600080fd5b50610516600081565b3480156106df57600080fd5b506104386106ee3660046138c7565b61103e565b3480156106ff57600080fd5b506104f161070e36600461382f565b611082565b34801561071f57600080fd5b5061053a60215481565b34801561073557600080fd5b5061053a60115481565b34801561074b57600080fd5b5061053a601c5481565b34801561076157600080fd5b5061053a60275481565b34801561077757600080fd5b506104386110b9565b34801561078c57600080fd5b506028546104f190610100900460ff1681565b3480156107ab57600080fd5b506104386107ba3660046138c7565b6110d8565b3480156107cb57600080fd5b5061053a60165481565b3480156107e157600080fd5b506104386107f03660046138fa565b61113b565b34801561080157600080fd5b5061053a601e5481565b34801561081757600080fd5b5060235461053a565b34801561082c57600080fd5b5061043861126e565b34801561084157600080fd5b506104386108503660046137ac565b61133b565b34801561086157600080fd5b506104386108703660046137ac565b611386565b34801561088157600080fd5b5061088a6113db565b6040805192835260208301919091520161049c565b3480156108ab57600080fd5b5061053a6108ba3660046138c7565b6001600160a01b031660009081526001602052604090205490565b3480156108e157600080fd5b50610438611418565b3480156108f657600080fd5b506104f16109053660046138c7565b61149b565b34801561091657600080fd5b5061043861092536600461396e565b6114a8565b34801561093657600080fd5b5061053a60155481565b34801561094c57600080fd5b50610438611508565b34801561096157600080fd5b50610438611556565b34801561097657600080fd5b5061053a601a5481565b34801561098c57600080fd5b506028546104f19060ff1681565b3480156109a657600080fd5b5061053a6109b53660046138c7565b611575565b3480156109c657600080fd5b506024546104f19060ff1681565b3480156109e057600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161049c565b348015610a1257600080fd5b506000546001600160a01b03166109ee565b348015610a3057600080fd5b506012546109ee906001600160a01b031681565b348015610a5057600080fd5b506040805180820190915260088152672441494b5543484960c01b602082015261048f565b348015610a8157600080fd5b506104386115b4565b348015610a9657600080fd5b50610438610aa5366004613869565b611703565b348015610ab657600080fd5b50610438610ac5366004613989565b61174f565b348015610ad657600080fd5b506104f1610ae536600461382f565b6118d1565b348015610af657600080fd5b506104f1610b0536600461382f565b61194d565b348015610b1657600080fd5b50610438610b253660046138c7565b61195a565b348015610b3657600080fd5b50610438610b45366004613869565b6119b5565b348015610b5657600080fd5b50610438611a01565b348015610b6b57600080fd5b5061053a611a0a565b348015610b8057600080fd5b5061053a611a2a565b348015610b9557600080fd5b50610438610ba43660046138c7565b611a69565b348015610bb557600080fd5b50610438610bc43660046137ac565b611aad565b348015610bd557600080fd5b50610438610be43660046137ac565b611aeb565b348015610bf557600080fd5b506013546109ee906001600160a01b031681565b348015610c1557600080fd5b5061053a610c243660046139ab565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c5b57600080fd5b50610438610c6a3660046137ac565b611b77565b348015610c7b57600080fd5b50610438610c8a3660046138c7565b611bfc565b348015610c9b57600080fd5b5061053a611c57565b348015610cb057600080fd5b5061053a610cbf3660046138c7565b611cbd565b348015610cd057600080fd5b50610438610cdf366004613869565b611ce6565b348015610cf057600080fd5b5061053a601b5481565b348015610d0657600080fd5b50610438610d153660046138c7565b611f00565b348015610d2657600080fd5b50610438610d353660046138c7565b611f44565b348015610d4657600080fd5b5061053a60255481565b348015610d5c57600080fd5b5061043861203d565b348015610d7157600080fd5b506104f1610d803660046138c7565b61209b565b33610d986000546001600160a01b031690565b6001600160a01b031614610dc75760405162461bcd60e51b8152600401610dbe906139e4565b60405180910390fd5b601e54811115610dd657600080fd5b80601e6000828254610de89190613a2f565b90915550506012546001600160a01b03166108fc6064610e09846019613a46565b610e139190613a65565b6040518115909202916000818181858888f19350505050158015610e3b573d6000803e3d6000fd5b506013546001600160a01b03166108fc6064610e5884604b613a46565b610e629190613a65565b6040518115909202916000818181858888f19350505050158015610e8a573d6000803e3d6000fd5b5050565b6000610e9b3384846120bd565b5060015b92915050565b33610eb86000546001600160a01b031690565b6001600160a01b031614610ede5760405162461bcd60e51b8152600401610dbe906139e4565b6024805460ff1916911515919091179055565b610efd6009600a613b6b565b610f0b906305f5e100613a46565b81565b6000610f1b8484846121b0565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610f865760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610dbe565b610f9a8533610f958685613a2f565b6120bd565b506001949350505050565b33610fb86000546001600160a01b031690565b6001600160a01b031614610fde5760405162461bcd60e51b8152600401610dbe906139e4565b610fe661240d565b565b6000610ff38261149b565b1561101357506001600160a01b0316600090815260208052604090205490565b6001600160a01b03821660009081526020805260409020546110348361254d565b610e9f9190613b7a565b336110516000546001600160a01b031690565b6001600160a01b0316146110775760405162461bcd60e51b8152600401610dbe906139e4565b610e8a600d826125d3565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610e9b918590610f95908690613b7a565b6025546110c69042613b7a565b33600090815260036020526040902055565b336110eb6000546001600160a01b031690565b6001600160a01b0316146111115760405162461bcd60e51b8152600401610dbe906139e4565b602880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b3361114e6000546001600160a01b031690565b6001600160a01b0316146111745760405162461bcd60e51b8152600401610dbe906139e4565b6000846111818789613b92565b61118b9190613b92565b90508060ff166064146111ef5760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610dbe565b506018805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112816000546001600160a01b031690565b6001600160a01b0316146112a75760405162461bcd60e51b8152600401610dbe906139e4565b6029544210156112c95760405162461bcd60e51b8152600401610dbe90613bb7565b6112d561070842613b7a565b6029556012546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611325576040519150601f19603f3d011682016040523d82523d6000602084013e61132a565b606091505b505090508061133857600080fd5b50565b3361134e6000546001600160a01b031690565b6001600160a01b0316146113745760405162461bcd60e51b8152600401610dbe906139e4565b6113386113814283613b7a565b6125e8565b336113996000546001600160a01b031690565b6001600160a01b0316146113bf5760405162461bcd60e51b8152600401610dbe906139e4565b6113cb6009600a613b6b565b6113d59082613a46565b60175550565b6000806113ea6009600a613b6b565b6015546113f79190613a65565b6114036009600a613b6b565b6016546114109190613a65565b915091509091565b3361142b6000546001600160a01b031690565b6001600160a01b0316146114515760405162461bcd60e51b8152600401610dbe906139e4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610e9f600b836125fb565b336114bb6000546001600160a01b031690565b6001600160a01b0316146114e15760405162461bcd60e51b8152600401610dbe906139e4565b60648160ff1611156114f257600080fd5b601d805460ff191660ff92909216919091179055565b3361151b6000546001600160a01b031690565b6001600160a01b0316146115415760405162461bcd60e51b8152600401610dbe906139e4565b6028805461ff00191661010017905542600f55565b6027546115639042613b7a565b33600090815260046020526040902055565b6001600160a01b03811660009081526003602052604081205442811161159e5750600092915050565b6115a84282613a2f565b9392505050565b905090565b336115c76000546001600160a01b031690565b6001600160a01b0316146115ed5760405162461bcd60e51b8152600401610dbe906139e4565b60295442101561160f5760405162461bcd60e51b8152600401610dbe90613bb7565b6028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116859190613be1565b60125460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe9190613bfa565b505050565b336117166000546001600160a01b031690565b6001600160a01b03161461173c5760405162461bcd60e51b8152600401610dbe906139e4565b6028805460ff1916911515919091179055565b336117626000546001600160a01b031690565b6001600160a01b0316146117885760405162461bcd60e51b8152600401610dbe906139e4565b60646014546117979190613a65565b81106117a257600080fd5b6117ae6009600a613b6b565b6117b89083613a46565b91506117c66009600a613b6b565b6117d09082613a46565b90506000603260ff166014546117e69190613a65565b90506000606461ffff166014546117fd9190613a65565b9050818410156118635760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610dbe565b808310156118c45760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610dbe565b5050601591909155601655565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156119345760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610dbe565b6119433385610f958685613a2f565b5060019392505050565b6000610e9b3384846121b0565b3361196d6000546001600160a01b031690565b6001600160a01b0316146119935760405162461bcd60e51b8152600401610dbe906139e4565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b336119c86000546001600160a01b031690565b6001600160a01b0316146119ee5760405162461bcd60e51b8152600401610dbe906139e4565b6026805460ff1916911515919091179055565b610fe63361261d565b6000602954421015611a2457426029546115af9190613a2f565b50600090565b6000611a386009600a613b6b565b601454611a476009600a613b6b565b611a55906305f5e100613a46565b611a5f9190613a2f565b6115af9190613a65565b33611a7c6000546001600160a01b031690565b6001600160a01b031614611aa25760405162461bcd60e51b8152600401610dbe906139e4565b610e8a6005826120a8565b33611ac06000546001600160a01b031690565b6001600160a01b031614611ae65760405162461bcd60e51b8152600401610dbe906139e4565b602355565b33611afe6000546001600160a01b031690565b6001600160a01b031614611b245760405162461bcd60e51b8152600401610dbe906139e4565b8015611b725760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610dbe565b602555565b33611b8a6000546001600160a01b031690565b6001600160a01b031614611bb05760405162461bcd60e51b8152600401610dbe906139e4565b8015611bf75760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610dbe565b602755565b33611c0f6000546001600160a01b031690565b6001600160a01b031614611c355760405162461bcd60e51b8152600401610dbe906139e4565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b601454600090815b611c69600b6128e1565b811015611cb75760016000611c7f600b846128eb565b6001600160a01b03168152602081019190915260400160002054611ca39083613a2f565b915080611caf81613c17565b915050611c5f565b50919050565b6001600160a01b03811660009081526004602052604081205442811161159e5750600092915050565b33611cf96000546001600160a01b031690565b6001600160a01b031614611d1f5760405162461bcd60e51b8152600401610dbe906139e4565b602954421015611d415760405162461bcd60e51b8152600401610dbe90613bb7565b611d4d61070842613b7a565b6029556028546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611da2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc69190613be1565b60195460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f9190613bfa565b5060195460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611e7b9030908690600090819084904290600401613c30565b6020604051808303816000875af1158015611e9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebe9190613be1565b506000611ecb8247613a2f565b90508415611ee157611edc816128f7565b611ef9565b80601e6000828254611ef39190613b7a565b90915550505b5050505050565b33611f136000546001600160a01b031690565b6001600160a01b031614611f395760405162461bcd60e51b8152600401610dbe906139e4565b610e8a600d826120a8565b33611f576000546001600160a01b031690565b6001600160a01b031614611f7d5760405162461bcd60e51b8152600401610dbe906139e4565b6001600160a01b038116611fe25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610dbe565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336120506000546001600160a01b031690565b6001600160a01b0316146120765760405162461bcd60e51b8152600401610dbe906139e4565b601e805460009091556012546001600160a01b03166108fc6064610e09846019613a46565b6000610e9f600d836125fb565b60006115a8836001600160a01b0384166129c3565b6001600160a01b0383166121075760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610dbe565b6001600160a01b03821661214f5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610dbe565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121fb5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610dbe565b6001600160a01b0382166122445760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610dbe565b60006122516005856125fb565b8061226257506122626005846125fb565b905060006001600160a01b03851630148061228557506001600160a01b03841630145b6019546018549192506001600160a01b0390811691600091888116600160301b909204161480156122c75750816001600160a01b0316866001600160a01b0316145b8061230257506018546001600160a01b03878116600160301b909204161480156123025750816001600160a01b0316876001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b90920416148061233c5750826001600160a01b0316886001600160a01b0316145b6018549091506000906001600160a01b03898116600160301b9092041614806123765750836001600160a01b0316886001600160a01b0316145b905084806123815750825b806123895750855b1561239e57612399898989612a12565b612402565b602854610100900460ff166123f55760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610dbe565b6124028989898585612add565b505050505050505050565b6022805460ff19166001908117909155306000908152602091909152604081205460185490919061245390600160281b810460ff90811691640100000000900416613b92565b60ff169050600060235490508083108061246f575061ffff8216155b1561247c57505050612541565b60185460009061ffff84169061249d90640100000000900460ff1684613a46565b6124a79190613a65565b905060006124b58284613a2f565b905060006124c4600284613a65565b905060006124d28285613a2f565b905060006124e08483613b7a565b9050476124ec82613275565b60006124f88247613a2f565b90506000836125078684613a46565b6125119190613a65565b905061251d86826133ce565b60006125298447613a2f565b9050612534816128f7565b5050505050505050505050505b6022805460ff19169055565b6001600160a01b038116600090815260016020526040812054601a54829161257491613a46565b6001600160a01b0384166000908152601f60205260409020549091508110156125a05750600092915050565b6001600160a01b0383166000908152601f6020526040902054600160401b906125c99083613a2f565b6115a89190613a65565b60006115a8836001600160a01b03841661347d565b60295481116125f657600080fd5b602955565b6001600160a01b038116600090815260018301602052604081205415156115a8565b601954600160a01b900460ff161561263457600080fd5b6019805460ff60a01b1916600160a01b17905560006126528261149b565b1561267957506001600160a01b0381166000908152602080526040812080549190556126f6565b60006126848361254d565b6001600160a01b038416600090815260016020526040902054601a549192506126ac91613a46565b6001600160a01b0384166000908152601f6020908152604080832093909355805220546126da908290613b7a565b6001600160a01b03841660009081526020805260408120559150505b8060000361270f5750506019805460ff60a01b19169055565b80601c60008282546127219190613b7a565b90915550506040805160028082526060820183526000926020830190803683375050601954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612790573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b49190613c6b565b816000815181106127c7576127c7613c88565b60200260200101906001600160a01b031690816001600160a01b031681525050734fabb145d64652a948d72533023f6e7a623c7c538160018151811061280f5761280f613c88565b6001600160a01b03928316602091820292909201015260195460405163b6f9de9560e01b815291169063b6f9de9590849061285590600090869089904290600401613ce2565b6000604051808303818588803b15801561286e57600080fd5b505af1158015612882573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506128c79050565b60405180910390a150506019805460ff60a01b1916905550565b6000610e9f825490565b60006115a8838361356a565b601d5460009060649061290d9060ff1684613a46565b6129179190613a65565b905060006129258284613a2f565b905081601e60008282546129399190613b7a565b909155505080156116fe5780601b60008282546129569190613b7a565b9091555060009050612966611c57565b90508060000361298d5781601e60008282546129829190613b7a565b909155506129bd9050565b8061299c600160401b84613a46565b6129a69190613a65565b601a60008282546129b79190613b7a565b90915550505b50505050565b6000818152600183016020526040812054612a0a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e9f565b506000610e9f565b6001600160a01b03831660009081526001602052604090205481811015612a765760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610dbe565b612a8084836135f0565b612a8a83836136af565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612acf91815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612b4b5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610dbe565b60008315612cfe57612b5e6007896125fb565b612bf3576001600160a01b03881660009081526003602052604090205442101580612b8b575060245460ff165b612bcc5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610dbe565b602554612bd99042613b7a565b6001600160a01b0389166000908152600360205260409020555b601654861115612c375760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610dbe565b612c42600d896125fb565b15612c865760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610dbe565b601054600f54612c969190613b7a565b4211158015612ca757506011546001145b15612ced57612cb7600d896120a8565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601854610100900460ff16613112565b8415612f0f57612d0f6009886125fb565b612da2576001600160a01b03871660009081526004602052604090205442101580612d3c575060265460ff165b612d7b5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610dbe565b602754612d889042613b7a565b6001600160a01b0388166000908152600460205260409020555b601554612daf8785613b7a565b1115612df05760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610dbe565b601754861115612e4d5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610dbe565b612e58600d886125fb565b15612e9c5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610dbe565b601054600f54612eac9190613b7a565b4211158015612ebd57506011546001145b15612f0357612ecd600d886120a8565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185460ff16613112565b612f1b6009600a613b6b565b8611612f2a57612f2a8861261d565b601554612f378785613b7a565b1115612f785760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610dbe565b612f836007896125fb565b612fed576001600160a01b03881660009081526003602052604090205442101580612fb0575060245460ff165b612fed5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610dbe565b612ff8600d896125fb565b156130455760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610dbe565b613050600d886125fb565b1561309d5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610dbe565b601054600f546130ad9190613b7a565b42111580156130be57506011546001145b15613104576130ce600d896120a8565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060185462010000900460ff165b6018546001600160a01b03898116600160301b909204161480159061313a575060285460ff16155b8015613149575060225460ff16155b80156131525750835b1561315f5761315f61240d565b600061317b8783601860039054906101000a900460ff16613778565b6018549091506000906131af90899085906131aa9060ff6401000000008204811691600160281b900416613b92565b613778565b905060006131bd8284613b7a565b6131c7908a613a2f565b90506131d38b8a6135f0565b30600090815260016020526040812080548492906131f2908490613b7a565b92505081905550826014600082825461320b9190613a2f565b9091555061321b90508a826136af565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161326091815260200190565b60405180910390a35050505050505050505050565b60195461328d9030906001600160a01b0316836120bd565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106132c2576132c2613c88565b6001600160a01b03928316602091820292909201810191909152601954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561331b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333f9190613c6b565b8160018151811061335257613352613c88565b6001600160a01b03928316602091820292909201015260195460405163791ac94760e01b815291169063791ac94790613398908590600090869030904290600401613d17565b600060405180830381600087803b1580156133b257600080fd5b505af11580156133c6573d6000803e3d6000fd5b505050505050565b80602160008282546133e09190613b7a565b90915550506019546133fd9030906001600160a01b0316846120bd565b60195460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061343a9030908790600090819084904290600401613c30565b60606040518083038185885af1158015613458573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ef99190613d53565b600081815260018301602052604081205480156135605760006134a1600183613a2f565b85549091506000906134b590600190613a2f565b905060008660000182815481106134ce576134ce613c88565b90600052602060002001549050808760000184815481106134f1576134f1613c88565b60009182526020808320909101929092558281526001890190915260409020849055865487908061352457613524613d81565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610e9f565b6000915050610e9f565b815460009082106135c85760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610dbe565b8260000182815481106135dd576135dd613c88565b9060005260206000200154905092915050565b6001600160a01b038216600090815260016020526040812054613614908390613a2f565b905061361f8361149b565b15613644576001600160a01b0390921660009081526001602052604090209190915550565b600061364f8461254d565b6001600160a01b0385166000908152600160205260409020839055601a5490915061367b908390613a46565b6001600160a01b0385166000908152601f6020908152604080832093909355805290812080548392906129b7908490613b7a565b6001600160a01b0382166000908152600160205260408120546136d3908390613b7a565b90506136de8361149b565b15613703576001600160a01b0390921660009081526001602052604090209190915550565b600061370e8461254d565b905081601a5461371e9190613a46565b6001600160a01b0385166000908152601f602090815260408083209390935580529081208054839290613752908490613b7a565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff16866137909190613a46565b61379a9190613a46565b6137a49190613a65565b949350505050565b6000602082840312156137be57600080fd5b5035919050565b600060208083528351808285015260005b818110156137f2578581018301518582016040015282016137d6565b81811115613804576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461133857600080fd5b6000806040838503121561384257600080fd5b823561384d8161381a565b946020939093013593505050565b801515811461133857600080fd5b60006020828403121561387b57600080fd5b81356115a88161385b565b60008060006060848603121561389b57600080fd5b83356138a68161381a565b925060208401356138b68161381a565b929592945050506040919091013590565b6000602082840312156138d957600080fd5b81356115a88161381a565b803560ff811681146138f557600080fd5b919050565b60008060008060008060c0878903121561391357600080fd5b61391c876138e4565b955061392a602088016138e4565b9450613938604088016138e4565b9350613946606088016138e4565b9250613954608088016138e4565b915061396260a088016138e4565b90509295509295509295565b60006020828403121561398057600080fd5b6115a8826138e4565b6000806040838503121561399c57600080fd5b50508035926020909101359150565b600080604083850312156139be57600080fd5b82356139c98161381a565b915060208301356139d98161381a565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613a4157613a41613a19565b500390565b6000816000190483118215151615613a6057613a60613a19565b500290565b600082613a8257634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115613ac2578160001904821115613aa857613aa8613a19565b80851615613ab557918102915b93841c9390800290613a8c565b509250929050565b600082613ad957506001610e9f565b81613ae657506000610e9f565b8160018114613afc5760028114613b0657613b22565b6001915050610e9f565b60ff841115613b1757613b17613a19565b50506001821b610e9f565b5060208310610133831016604e8410600b8410161715613b45575081810a610e9f565b613b4f8383613a87565b8060001904821115613b6357613b63613a19565b029392505050565b60006115a860ff841683613aca565b60008219821115613b8d57613b8d613a19565b500190565b600060ff821660ff84168060ff03821115613baf57613baf613a19565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613bf357600080fd5b5051919050565b600060208284031215613c0c57600080fd5b81516115a88161385b565b600060018201613c2957613c29613a19565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613c7d57600080fd5b81516115a88161381a565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613cd75781516001600160a01b031687529582019590820190600101613cb2565b509495945050505050565b848152608060208201526000613cfb6080830186613c9e565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000613d3660a0830186613c9e565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613d6857600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220d933d009bd93e2c9918b7d783af5c33dfdb275e0cdf307ce569e48ab546ed1e764736f6c634300080d0033

Deployed Bytecode Sourcemap

27539:36320:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53116:269;;;;;;;;;;-1:-1:-1;53116:269:0;;;;;:::i;:::-;;:::i;61513:94::-;;;;;;;;;;-1:-1:-1;61594:5:0;;;;;;;;;;;;-1:-1:-1;;;61594:5:0;;;;61513:94;;;;;;;:::i;:::-;;;;;;;;40971:31;;;;;;;;;;-1:-1:-1;40971:31:0;;;;;;;;;;;973:4:1;961:17;;;943:36;;931:2;916:18;40971:31:0;801:184:1;62398:161:0;;;;;;;;;;-1:-1:-1;62398:161:0;;;;;:::i;:::-;;:::i;:::-;;;1611:14:1;;1604:22;1586:41;;1574:2;1559:18;62398:161:0;1446:187:1;29102:43:0;;;;;;;;;;;;29142:3;29102:43;;;;;1812:6:1;1800:19;;;1782:38;;1770:2;1755:18;29102:43:0;1638:188:1;51125:102:0;;;;;;;;;;-1:-1:-1;51207:12:0;;51125:102;;;1977:25:1;;;1965:2;1950:18;51125:102:0;1831:177:1;51696:100:0;;;;;;;;;;-1:-1:-1;51777:11:0;;51696:100;;54028:104;;;;;;;;;;-1:-1:-1;54028:104:0;;;;;:::i;:::-;;:::i;61823:108::-;;;;;;;;;;-1:-1:-1;61905:18:0;;61823:108;;28425:64;;;;;;;;;;;;;:::i;62872:392::-;;;;;;;;;;-1:-1:-1;62872:392:0;;;;;:::i;:::-;;:::i;56085:81::-;;;;;;;;;;;;;:::i;28652:31::-;;;;;;;;;;;;;;;;50531:244;;;;;;;;;;-1:-1:-1;50702:8:0;;50531:244;;;50702:8;;;;;;3130:25:1;;50711:13:0;;;;;3186:2:1;3171:18;;3164:34;-1:-1:-1;;;50725:11:0;;;;3214:18:1;;;3207:34;;;;50737:7:0;;;3272:2:1;3257:18;;3250:34;50702:8:0;50745;;;;3315:3:1;3300:19;;3293:35;50754:12:0;;;;;3359:3:1;3344:19;;3337:35;3117:3;3102:19;50531:244:0;2843:535:1;52762:27:0;;;;;;;;;;-1:-1:-1;52762:27:0;;;;;;;;28988:44;;;;;;;;;;;;29030:2;28988:44;;61721:94;;;;;;;;;;-1:-1:-1;28417:1:0;61721:94;;52381:191;;;;;;;;;;-1:-1:-1;52381:191:0;;;;;:::i;:::-;;:::i;29288:49::-;;;;;;;;;;;;29328:9;29288:49;;57466:143;;;;;;;;;;-1:-1:-1;57466:143:0;;;;;:::i;:::-;;:::i;63299:205::-;;;;;;;;;;-1:-1:-1;63299:205:0;;;;;:::i;:::-;;:::i;46734:25::-;;;;;;;;;;;;;;;;28833:38;;;;;;;;;;;;;;;;40927:27;;;;;;;;;;;;;;;;52796:26;;;;;;;;;;;;;;;;51940:107;;;;;;;;;;;;;:::i;57737:26::-;;;;;;;;;;-1:-1:-1;57737:26:0;;;;;;;;;;;58046:146;;;;;;;;;;-1:-1:-1;58046:146:0;;;;;:::i;:::-;;:::i;30223:46::-;;;;;;;;;;;;;;;;55306:492;;;;;;;;;;-1:-1:-1;55306:492:0;;;;;:::i;:::-;;:::i;41054:31::-;;;;;;;;;;;;;;;;51239:110;;;;;;;;;;-1:-1:-1;51322:19:0;;51239:110;;60674:311;;;;;;;;;;;;;:::i;58399:153::-;;;;;;;;;;-1:-1:-1;58399:153:0;;;;;:::i;:::-;;:::i;53592:110::-;;;;;;;;;;-1:-1:-1;53592:110:0;;;;;:::i;:::-;;:::i;50374:149::-;;;;;;;;;;;;;:::i;:::-;;;;4510:25:1;;;4566:2;4551:18;;4544:34;;;;4483:18;50374:149:0;4336:248:1;61939:121:0;;;;;;;;;;-1:-1:-1;61939:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;62034:18:0;62007:7;62034:18;;;:9;:18;;;;;;;61939:121;9400:140;;;;;;;;;;;;;:::i;41538:132::-;;;;;;;;;;-1:-1:-1;41538:132:0;;;;;:::i;:::-;;:::i;55875:142::-;;;;;;;;;;-1:-1:-1;55875:142:0;;;;;:::i;:::-;;:::i;30167:49::-;;;;;;;;;;;;;;;;57851:127;;;;;;;;;;;;;:::i;52150:110::-;;;;;;;;;;;;;:::i;40713:29::-;;;;;;;;;;;;;;;;52829:28;;;;;;;;;;-1:-1:-1;52829:28:0;;;;;;;;50844:275;;;;;;;;;;-1:-1:-1;50844:275:0;;;;;:::i;:::-;;:::i;52693:28::-;;;;;;;;;;-1:-1:-1;52693:28:0;;;;;;;;61411:94;;;;;;;;;;-1:-1:-1;61463:7:0;8824:6;-1:-1:-1;;;;;8824:6:0;61411:94;;;-1:-1:-1;;;;;4940:32:1;;;4922:51;;4910:2;4895:18;61411:94:0;4776:203:1;8759:79:0;;;;;;;;;;-1:-1:-1;8797:7:0;8824:6;-1:-1:-1;;;;;8824:6:0;8759:79;;29695:78;;;;;;;;;;-1:-1:-1;29695:78:0;;;;-1:-1:-1;;;;;29695:78:0;;;61615:98;;;;;;;;;;-1:-1:-1;61698:7:0;;;;;;;;;;;;-1:-1:-1;;;61698:7:0;;;;61615:98;;58853:466;;;;;;;;;;;;;:::i;53470:110::-;;;;;;;;;;-1:-1:-1;53470:110:0;;;;;:::i;:::-;;:::i;56275:895::-;;;;;;;;;;-1:-1:-1;56275:895:0;;;;;:::i;:::-;;:::i;63512:342::-;;;;;;;;;;-1:-1:-1;63512:342:0;;;;;:::i;:::-;;:::i;62068:167::-;;;;;;;;;;-1:-1:-1;62068:167:0;;;;;:::i;:::-;;:::i;53849:115::-;;;;;;;;;;-1:-1:-1;53849:115:0;;;;;:::i;:::-;;:::i;54199:102::-;;;;;;;;;;-1:-1:-1;54199:102:0;;;;;:::i;:::-;;:::i;52309:64::-;;;;;;;;;;;;;:::i;50009:220::-;;;;;;;;;;;;;:::i;50237:129::-;;;;;;;;;;;;;:::i;55164:112::-;;;;;;;;;;-1:-1:-1;55164:112:0;;;;;:::i;:::-;;:::i;54971:125::-;;;;;;;;;;-1:-1:-1;54971:125:0;;;;;:::i;:::-;;:::i;54374:202::-;;;;;;;;;;-1:-1:-1;54374:202:0;;;;;:::i;:::-;;:::i;29780:76::-;;;;;;;;;;-1:-1:-1;29780:76:0;;;;-1:-1:-1;;;;;29780:76:0;;;62243:147;;;;;;;;;;-1:-1:-1;62243:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;62354:19:0;;;62327:7;62354:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;62243:147;54652:195;;;;;;;;;;-1:-1:-1;54652:195:0;;;;;:::i;:::-;;:::i;53714:123::-;;;;;;;;;;-1:-1:-1;53714:123:0;;;;;:::i;:::-;;:::i;41911:411::-;;;;;;;;;;;;;:::i;51417:273::-;;;;;;;;;;-1:-1:-1;51417:273:0;;;;;:::i;:::-;;:::i;59377:1211::-;;;;;;;;;;-1:-1:-1;59377:1211:0;;;;;:::i;:::-;;:::i;40824:33::-;;;;;;;;;;;;;;;;57250:135;;;;;;;;;;-1:-1:-1;57250:135:0;;;;;:::i;:::-;;:::i;9695:236::-;;;;;;;;;;-1:-1:-1;9695:236:0;;;;;:::i;:::-;;:::i;52728:27::-;;;;;;;;;;;;;;;;52867:242;;;;;;;;;;;;;:::i;41717:118::-;;;;;;;;;;-1:-1:-1;41717:118:0;;;;;:::i;:::-;;:::i;53116:269::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;;;;;;;;;53209:16:::1;;53201:6;:24;;53193:33;;;::::0;::::1;;53255:6;53237:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;53280:11:0::1;::::0;-1:-1:-1;;;;;53280:11:0::1;53272:48;53316:3;53303:9;:6:::0;53310:2:::1;53303:9;:::i;:::-;53302:17;;;;:::i;:::-;53272:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;53339:9:0::1;::::0;-1:-1:-1;;;;;53339:9:0::1;53331:46;53373:3;53360:9;:6:::0;53367:2:::1;53360:9;:::i;:::-;53359:17;;;;:::i;:::-;53331:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53116:269:::0;:::o;62398:161::-;62475:4;62492:37;62501:10;62513:7;62522:6;62492:8;:37::i;:::-;-1:-1:-1;62547:4:0;62398:161;;;;;:::o;54028:104::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;54099:16:::1;:25:::0;;-1:-1:-1;;54099:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54028:104::o;28425:64::-;28476:13;28417:1;28476:2;:13;:::i;:::-;28464:25;;:9;:25;:::i;:::-;28425:64;:::o;62872:392::-;62972:4;62989:36;62999:6;63007:9;63018:6;62989:9;:36::i;:::-;-1:-1:-1;;;;;63065:19:0;;63038:24;63065:19;;;:11;:19;;;;;;;;63085:10;63065:31;;;;;;;;63115:26;;;;63107:59;;;;-1:-1:-1;;;63107:59:0;;8233:2:1;63107:59:0;;;8215:21:1;8272:2;8252:18;;;8245:30;-1:-1:-1;;;8291:18:1;;;8284:50;8351:18;;63107:59:0;8031:344:1;63107:59:0;63179:55;63188:6;63196:10;63208:25;63227:6;63208:16;:25;:::i;:::-;63179:8;:55::i;:::-;-1:-1:-1;63252:4:0;;62872:392;-1:-1:-1;;;;62872:392:0:o;56085:81::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;56138:20:::1;:18;:20::i;:::-;56085:81::o:0;52381:191::-;52438:7;52460:27;52482:4;52460:21;:27::i;:::-;52457:53;;;-1:-1:-1;;;;;;52496:14:0;;;;;:8;:14;;;;;;;52381:191::o;52457:53::-;-1:-1:-1;;;;;52550:14:0;;;;;;:8;:14;;;;;;52528:21;52559:4;52528:15;:21::i;:::-;:36;;;;:::i;57466:143::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;57560:41:::1;:14;57582:18:::0;57560:21:::1;:41::i;63299:205::-:0;63407:10;63381:4;63428:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;63428:32:0;;;;;;;;;;63381:4;;63398:76;;63419:7;;63428:45;;63463:10;;63428:45;:::i;51940:107::-;52027:12;;52011:28;;:15;:28;:::i;:::-;51999:10;51989:21;;;;:9;:21;;;;;:50;51940:107::o;58046:146::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;58140:22:::1;:44:::0;;-1:-1:-1;;;;;58140:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;58140:44:0;;::::1;::::0;;;::::1;::::0;;58046:146::o;55306:492::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;55461:14:::1;55501:12:::0;55476:24:::1;55486:14:::0;55476:9;:24:::1;:::i;:::-;:37;;;;:::i;:::-;55461:52;;55532:8;:13;;55542:3;55532:13;55524:64;;;::::0;-1:-1:-1;;;55524:64:0;;8924:2:1;55524:64:0::1;::::0;::::1;8906:21:1::0;8963:2;8943:18;;;8936:30;9002:34;8982:18;;;8975:62;-1:-1:-1;;;9053:18:1;;;9046:36;9099:19;;55524:64:0::1;8722:402:1::0;55524:64:0::1;-1:-1:-1::0;55601:8:0::1;:18:::0;;::::1;55766:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;55739:16:0;;::::1;55601:18;55739:16;-1:-1:-1::0;;55669:24:0;;::::1;-1:-1:-1::0;;;55669:24:0::1;55739:16:::0;;;;-1:-1:-1;;55630:28:0;;::::1;::::0;::::1;-1:-1:-1::0;;55601:18:0;;::::1;::::0;::::1;55630:28:::0;;;;-1:-1:-1;;55630:28:0;;;;;;;;;;::::1;55739:16:::0;;;;;;;;55714:14;::::1;55739:16:::0;;;;;;;::::1;55766:24;::::0;;;::::1;::::0;;55306:492::o;60674:311::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;60763:20:::1;;60744:15;:39;;60736:68;;;;-1:-1:-1::0;;;60736:68:0::1;;;;;;;:::i;:::-;60836:40;29666:4;60836:15;:40;:::i;:::-;60815:20;:61:::0;60901:11:::1;::::0;:52:::1;::::0;60888:9:::1;::::0;-1:-1:-1;;;;;60901:11:0::1;::::0;60926:21:::1;::::0;60888:9;60901:52;60888:9;60901:52;60926:21;60901:11;:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60887:66;;;60972:4;60964:13;;;::::0;::::1;;60725:260;60674:311::o:0;58399:153::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;58487:57:::1;58509:34;58528:15;58509:18:::0;:34:::1;:::i;:::-;58487:21;:57::i;53592:110::-:0;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;53681:13:::1;28417:1;53681:2;:13;:::i;:::-;53669:25;::::0;:9;:25:::1;:::i;:::-;53662:6;:32:::0;-1:-1:-1;53592:110:0:o;50374:149::-;50415:15;;50476:13;28417:1;50476:2;:13;:::i;:::-;50463:12;;:26;;;;:::i;:::-;50501:13;28417:1;50501:2;:13;:::i;:::-;50491:9;;:23;;;;:::i;:::-;50456:59;;;;50374:149;;:::o;9400:140::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;9499:1:::1;9483:6:::0;;9462:40:::1;::::0;-1:-1:-1;;;;;9483:6:0;;::::1;::::0;9462:40:::1;::::0;9499:1;;9462:40:::1;9530:1;9513:19:::0;;-1:-1:-1;;;;;;9513:19:0::1;::::0;;9400:140::o;41538:132::-;41604:4;41627:35;:20;41657:4;41627:29;:35::i;55875:142::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;55970:3:::1;55960:8;:13;;;;55952:22;;;::::0;::::1;;55986:14;:23:::0;;-1:-1:-1;;55986:23:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;55875:142::o;57851:127::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;57908:14:::1;:19:::0;;-1:-1:-1;;57908:19:0::1;;;::::0;;57955:15:::1;57938:16;:32:::0;57851:127::o;52150:110::-;52235:11;;52219:27;;:15;:27;:::i;:::-;52207:10;52198:20;;;;:8;:20;;;;;:48;52150:110::o;50844:275::-;-1:-1:-1;;;;;50965:25:0;;50930:7;50965:25;;;:9;:25;;;;;;51013:15;51003:25;;51000:71;;-1:-1:-1;51059:1:0;;50844:275;-1:-1:-1;;50844:275:0:o;51000:71::-;51087:24;51096:15;51087:8;:24;:::i;:::-;51080:31;50844:275;-1:-1:-1;;;50844:275:0:o;61490:7::-;61483:14;;61411:94;:::o;58853:466::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;58981:20:::1;;58962:15;:39;;58954:68;;;;-1:-1:-1::0;;;58954:68:0::1;;;;;;;:::i;:::-;59092:22;::::0;59143:39:::1;::::0;-1:-1:-1;;;59143:39:0;;59176:4:::1;59143:39;::::0;::::1;4922:51:1::0;59092:22:0;;;::::1;-1:-1:-1::0;;;;;59092:22:0::1;::::0;59043:30:::1;::::0;59092:22;;59143:24:::1;::::0;4895:18:1;;59143:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59281:11;::::0;59257:44:::1;::::0;-1:-1:-1;;;59257:44:0;;-1:-1:-1;;;;;59281:11:0;;::::1;59257:44;::::0;::::1;10047:51:1::0;10114:18;;;10107:34;;;59126:56:0;;-1:-1:-1;59257:23:0;::::1;::::0;::::1;::::0;10020:18:1;;59257:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58885:434;;58853:466::o:0;53470:110::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;53549:16:::1;:23:::0;;-1:-1:-1;;53549:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53470:110::o;56275:895::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;56511:3:::1;56492:18;;:22;;;;:::i;:::-;56479:12;:35;56471:44;;;::::0;::::1;;56593:13;28417:1;56593:2;:13;:::i;:::-;56577:29;::::0;:15;:29:::1;:::i;:::-;56561:45:::0;-1:-1:-1;56643:13:0::1;28417:1;56643:2;:13;:::i;:::-;56630:26;::::0;:12;:26:::1;:::i;:::-;56617:39;;56723:26;29030:2;56750:38;;:18;;:38;;;;:::i;:::-;56723:65;;56799:23;29142:3;56823:35;;:18;;:35;;;;:::i;:::-;56799:59;;56897:18;56880:15;:35;;56871:103;;;::::0;-1:-1:-1;;;56871:103:0;;10604:2:1;56871: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;;56871:103:0::1;10402:407:1::0;56871:103:0::1;57008:15;56994:12;:29;;56985:94;;;::::0;-1:-1:-1;;;56985:94:0;;11016:2:1;56985: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;;56985:94:0::1;10814:404:1::0;56985:94:0::1;-1:-1:-1::0;;57092:12:0::1;:30:::0;;;;57133:9:::1;:24:::0;56275:895::o;63512:342::-;63655:10;63599:4;63643:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;63643:32:0;;;;;;;;;;63694:35;;;;63686:60;;;;-1:-1:-1;;;63686:60:0;;11425:2:1;63686:60:0;;;11407:21:1;11464:2;11444:18;;;11437:30;-1:-1:-1;;;11483:18:1;;;11476:42;11535:18;;63686:60:0;11223:336:1;63686:60:0;63759:65;63768:10;63780:7;63789:34;63808:15;63789:16;:34;:::i;63759:65::-;-1:-1:-1;63842:4:0;;63512:342;-1:-1:-1;;;63512:342:0:o;62068:167::-;62148:4;62165:40;62175:10;62187:9;62198:6;62165:9;:40::i;53849:115::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;53925:9:::1;:31:::0;;-1:-1:-1;;;;;;53925:31:0::1;-1:-1:-1::0;;;;;53925:31:0;;;::::1;::::0;;;::::1;::::0;;53849:115::o;54199:102::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;54269:15:::1;:24:::0;;-1:-1:-1;;54269:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54199:102::o;52309:64::-;52345:20;52354:10;52345:8;:20::i;50009:220::-;50074:7;50112:20;;50096:15;:36;50093:110;;;50176:15;50155:20;;:36;;;;:::i;50093:110::-;-1:-1:-1;50220:1:0;;50009:220::o;50237:129::-;50284:7;50345:13;28417:1;50345:2;:13;:::i;:::-;50325:18;;28476:13;28417:1;28476:2;:13;:::i;:::-;28464:25;;:9;:25;:::i;:::-;50311:32;;;;:::i;:::-;50310:48;;;;:::i;55164:112::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;55241:27:::1;:9;55255:12:::0;55241:13:::1;:27::i;54971:125::-:0;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;55053:19:::1;:35:::0;54971:125::o;54374:202::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;54466:32;;54458:67:::1;;;::::0;-1:-1:-1;;;54458:67:0;;11766:2:1;54458:67:0::1;::::0;::::1;11748:21:1::0;11805:2;11785:18;;;11778:30;11844:25;11824:18;;;11817:53;11887:18;;54458:67:0::1;11564:347:1::0;54458:67:0::1;54540:12;:28:::0;54374:202::o;54652:195::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;54742:30;;54734:64:::1;;;::::0;-1:-1:-1;;;54734:64:0;;12118:2:1;54734:64:0::1;::::0;::::1;12100:21:1::0;12157:2;12137:18;;;12130:30;-1:-1:-1;;;12176:18:1;;;12169:52;12238:18;;54734:64:0::1;11916:346:1::0;54734:64:0::1;54813:11;:26:::0;54652:195::o;53714:123::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;53794:11:::1;:35:::0;;-1:-1:-1;;;;;;53794:35:0::1;-1:-1:-1::0;;;;;53794:35:0;;;::::1;::::0;;;::::1;::::0;;53714:123::o;41911:411::-;41993:18;;41959:7;;;42168:123;42184:29;:20;:27;:29::i;:::-;42182:1;:31;42168:123;;;42242:9;:37;42252:26;:20;42276:1;42252:23;:26::i;:::-;-1:-1:-1;;;;;42242:37:0;;;;;;;;;;;;-1:-1:-1;42242:37:0;;42234:45;;;;:::i;:::-;;-1:-1:-1;42215:3:0;;;;:::i;:::-;;;;42168:123;;;-1:-1:-1;42308:6:0;41911:411;-1:-1:-1;41911:411:0:o;51417:273::-;-1:-1:-1;;;;;51537:24:0;;51502:7;51537:24;;;:8;:24;;;;;;51584:15;51574:25;;51571:71;;-1:-1:-1;51630:1:0;;51417:273;-1:-1:-1;;51417:273:0:o;59377:1211::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;59521:20:::1;;59502:15;:39;;59494:68;;;;-1:-1:-1::0;;;59494:68:0::1;;;;;;;:::i;:::-;59594:40;29666:4;59594:15;:40;:::i;:::-;59573:20;:61:::0;59694:22:::1;::::0;59745:39:::1;::::0;-1:-1:-1;;;59745:39:0;;59778:4:::1;59745:39;::::0;::::1;4922:51:1::0;59694:22:0;;;::::1;-1:-1:-1::0;;;;;59694:22:0::1;::::0;59645:30:::1;::::0;59694:22;;59745:24:::1;::::0;4895:18:1;;59745:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59828:16;::::0;59797:56:::1;::::0;-1:-1:-1;;;59797:56:0;;-1:-1:-1;;;;;59828:16:0;;::::1;59797:56;::::0;::::1;10047:51:1::0;10114:18;;;10107:34;;;59728:56:0;;-1:-1:-1;59797:22:0;::::1;::::0;::::1;::::0;10020:18:1;;59797:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60130:16:0::1;::::0;:218:::1;::::0;-1:-1:-1;;;60130:218:0;;60098:21:::1;::::0;-1:-1:-1;;;;;60130:16:0::1;::::0;:64:::1;::::0;:218:::1;::::0;60217:4:::1;::::0;60237:6;;60070:25:::1;::::0;;;60217:4;;60318:15:::1;::::0;60130:218:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60359:21:0::1;60383:39;60405:17:::0;60383:21:::1;:39;:::i;:::-;60359:63;;60436:12;60433:146;;;60464:31;60481:13;60464:16;:31::i;:::-;60433:146;;;60554:13;60536:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60433:146:0::1;59425:1163;;;;59377:1211:::0;:::o;57250:135::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;57339:38:::1;:14;57358:18:::0;57339::::1;:38::i;9695:236::-:0;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9776:22:0;::::1;9768:73;;;::::0;-1:-1:-1;;;9768:73:0;;13221:2:1;9768:73:0::1;::::0;::::1;13203:21:1::0;13260:2;13240:18;;;13233:30;13299:34;13279:18;;;13272:62;-1:-1:-1;;;13350:18:1;;;13343:36;13396:19;;9768:73:0::1;13019:402:1::0;9768:73:0::1;9878:6;::::0;;9857:38:::1;::::0;-1:-1:-1;;;;;9857:38:0;;::::1;::::0;9878:6;::::1;::::0;9857:38:::1;::::0;::::1;9906:6;:17:::0;;-1:-1:-1;;;;;;9906:17:0::1;-1:-1:-1::0;;;;;9906:17:0;;;::::1;::::0;;;::::1;::::0;;9695:236::o;52867:242::-;8982:10;8971:7;8797;8824:6;-1:-1:-1;;;;;8824:6:0;;8759:79;8971:7;-1:-1:-1;;;;;8971:21:0;;8963:66;;;;-1:-1:-1;;;8963:66:0;;;;;;;:::i;:::-;52940:16:::1;::::0;;52925:14:::1;52967:18:::0;;;53004:11:::1;::::0;-1:-1:-1;;;;;53004:11:0::1;52996:48;53040:3;53027:9;52940:16:::0;53034:2:::1;53027:9;:::i;41717:118::-:0;41775:4;41798:29;:14;41822:4;41798:23;:29::i;24446:152::-;24516:4;24540:50;24545:3;-1:-1:-1;;;;;24565:23:0;;24540:4;:50::i;62565:299::-;-1:-1:-1;;;;;62658:19:0;;62650:49;;;;-1:-1:-1;;;62650:49:0;;13628:2:1;62650:49:0;;;13610:21:1;13667:2;13647:18;;;13640:30;-1:-1:-1;;;13686:18:1;;;13679:47;13743:18;;62650:49:0;13426:341:1;62650:49:0;-1:-1:-1;;;;;62718:21:0;;62710:49;;;;-1:-1:-1;;;62710:49:0;;13974:2:1;62710:49:0;;;13956:21:1;14013:2;13993:18;;;13986:30;-1:-1:-1;;;14032:18:1;;;14025:45;14087:18;;62710:49:0;13772:339:1;62710:49:0;-1:-1:-1;;;;;62772:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;62824:32;;1977:25:1;;;62824:32:0;;1950:18:1;62824:32:0;;;;;;;62565:299;;;:::o;32719:1544::-;-1:-1:-1;;;;;32815:20:0;;32807:51;;;;-1:-1:-1;;;32807:51:0;;14318:2:1;32807:51:0;;;14300:21:1;14357:2;14337:18;;;14330:30;-1:-1:-1;;;14376:18:1;;;14369:48;14434:18;;32807:51:0;14116:342:1;32807:51:0;-1:-1:-1;;;;;32877:23:0;;32869:52;;;;-1:-1:-1;;;32869:52:0;;14665:2:1;32869:52:0;;;14647:21:1;14704:2;14684:18;;;14677:30;-1:-1:-1;;;14723:18:1;;;14716:46;14779:18;;32869:52:0;14463:340:1;32869:52:0;33014:15;33033:26;:9;33052:6;33033:18;:26::i;:::-;:59;;;-1:-1:-1;33063:29:0;:9;33082;33063:18;:29::i;:::-;33014:79;-1:-1:-1;33192:23:0;-1:-1:-1;;;;;33217:21:0;;33233:4;33217:21;;:49;;-1:-1:-1;;;;;;33242:24:0;;33261:4;33242:24;33217:49;33405:16;;33472:21;;33192:75;;-1:-1:-1;;;;;;33405:16:0;;;;33373:23;;33462:31;;;-1:-1:-1;;;33472:21:0;;;;33462:31;:63;;;;;33510:15;-1:-1:-1;;;;;33497:28:0;:9;-1:-1:-1;;;;;33497:28:0;;33462:63;33461:144;;;-1:-1:-1;33554:21:0;;-1:-1:-1;;;;;33541:34:0;;;-1:-1:-1;;;33554:21:0;;;;33541:34;:63;;;;;33589:15;-1:-1:-1;;;;;33579:25:0;:6;-1:-1:-1;;;;;33579:25:0;;33541:63;33727:21;;33433:173;;-1:-1:-1;33708:10:0;;-1:-1:-1;;;;;33719:29:0;;;-1:-1:-1;;;33727:21:0;;;;33719:29;;:57;;;33761:15;-1:-1:-1;;;;;33751:25:0;:6;-1:-1:-1;;;;;33751:25:0;;33719:57;33810:21;;33708:68;;-1:-1:-1;33787:11:0;;-1:-1:-1;;;;;33799:32:0;;;-1:-1:-1;;;33810:21:0;;;;33799:32;;:63;;;33847:15;-1:-1:-1;;;;;33834:28:0;:9;-1:-1:-1;;;;;33834:28:0;;33799:63;33787:75;;33903:18;:41;;;;33925:19;33903:41;:55;;;;33948:10;33903:55;33900:356;;;33974:43;33991:6;33999:9;34010:6;33974:16;:43::i;:::-;33900:356;;;34136:14;;;;;;;34128:49;;;;-1:-1:-1;;;34128:49:0;;15010:2:1;34128:49:0;;;14992:21:1;15049:2;15029:18;;;15022:30;15088:25;15068:18;;;15061:53;15131:18;;34128:49:0;14808:347:1;34128:49:0;34192:52;34207:6;34214:9;34224:6;34231:5;34237:6;34192:14;:52::i;:::-;32796:1467;;;;;;32719:1544;;;:::o;47222:1628::-;46887:27;:34;;-1:-1:-1;;46887:34:0;46917:4;46887:34;;;;;;47324:4:::1;46887:27:::0;47306:24;;;::::1;::::0;;;;;;;;47371:11:::1;::::0;47306:24;;46887:27;47357:25:::1;::::0;-1:-1:-1;;;47371:11:0;::::1;46887:34:::0;47371:11;;::::1;::::0;47357:13;;::::1;;:25;:::i;:::-;47341:41;;;;47393:19;47415;;47393:41;;47561:11;47545:15;:27;:40;;;-1:-1:-1::0;47574:11:0::1;::::0;::::1;::::0;47545:40:::1;47542:77;;;47601:7;;;;;47542:77;47739:13;::::0;47700:25:::1;::::0;47726:36:::1;::::0;::::1;::::0;47727:25:::1;::::0;47739:13;;::::1;;;47727:11:::0;:25:::1;:::i;:::-;47726:36;;;;:::i;:::-;47700:62:::0;-1:-1:-1;47773:25:0::1;47800:29;47700:62:::0;47800:11;:29:::1;:::i;:::-;47773:56:::0;-1:-1:-1;47890:16:0::1;47907:19;47925:1;47907:17:::0;:19:::1;:::i;:::-;47890:36:::0;-1:-1:-1;47937:19:0::1;47957:26;47890:36:::0;47957:17;:26:::1;:::i;:::-;47937:46:::0;-1:-1:-1;48066:17:0::1;48084:29;48096:17:::0;47937:46;48084:29:::1;:::i;:::-;48066:47:::0;-1:-1:-1;48228:21:0::1;48260:27;48066:47:::0;48260:16:::1;:27::i;:::-;48298:14;48314:41;48338:17:::0;48314:21:::1;:41;:::i;:::-;48298:58:::0;-1:-1:-1;48456:14:0::1;48494:9:::0;48474:18:::1;48481:11:::0;48298:58;48474:18:::1;:::i;:::-;48473:30;;;;:::i;:::-;48456:47;;48514:31;48528:8;48538:6;48514:13;:31::i;:::-;48668:21;48691:41;48715:17:::0;48691:21:::1;:41;:::i;:::-;48668:65;;48811:31;48828:13;48811:16;:31::i;:::-;47271:1579;;;;;;;;;;;;46932:1;46944:27:::0;:35;;-1:-1:-1;;46944:35:0;;;47222:1628::o;43948:427::-;-1:-1:-1;;;;;44069:17:0;;44011:7;44069:17;;;:9;:17;;;;;;44052:14;;44011:7;;44052:34;;;:::i;:::-;-1:-1:-1;;;;;44249:25:0;;;;;;:17;:25;;;;;;44031:55;;-1:-1:-1;44238:36:0;;44235:49;;;-1:-1:-1;44283:1:0;;43948:427;-1:-1:-1;;43948:427:0:o;44235:49::-;-1:-1:-1;;;;;44316:25:0;;;;;;:17;:25;;;;;;-1:-1:-1;;;40632:5:0;44303:38;;:10;:38;:::i;:::-;44302:65;;;;:::i;24774:158::-;24847:4;24871:53;24879:3;-1:-1:-1;;;;;24899:23:0;;24871:7;:53::i;58558:230::-;58714:20;;58700:13;:34;58692:43;;;;;;58746:20;:34;58558:230::o;25018:167::-;-1:-1:-1;;;;;25152:23:0;;25098:4;21827:19;;;:12;;;:19;;;;;;:24;;25122:55;21730:129;45318:1236;45377:14;;-1:-1:-1;;;45377:14:0;;;;45376:15;45368:24;;;;;;45403:14;:19;;-1:-1:-1;;;;45403:19:0;-1:-1:-1;;;45403:19:0;;;;45461:27;45483:4;45461:21;:27::i;:::-;45458:495;;;-1:-1:-1;;;;;;45575:14:0;;;;;;:8;:14;;;;;;;45604:16;;;45458:495;;;45661:17;45679:21;45695:4;45679:15;:21::i;:::-;-1:-1:-1;;;;;45811:15:0;;;;;;:9;:15;;;;;;45794:14;;45661:39;;-1:-1:-1;45794:32:0;;;:::i;:::-;-1:-1:-1;;;;;45768:23:0;;;;;;:17;:23;;;;;;;;:58;;;;45886:14;;;;:24;;45901:9;;45886:24;:::i;:::-;-1:-1:-1;;;;;45925:14:0;;45940:1;45925:14;;;:8;:14;;;;;:16;45879:31;-1:-1:-1;;45458:495:0;45966:6;45974:1;45966:9;45963:106;;-1:-1:-1;;46016:14:0;:20;;-1:-1:-1;;;;46016:20:0;;;45318:1236::o;45963:106::-;46093:6;46079:12;;:20;;;;;;;:::i;:::-;;;;-1:-1:-1;;46134:16:0;;;46148:1;46134:16;;;;;;;;46110:21;;46134:16;;;;;;;;-1:-1:-1;;46171:16:0;;:23;;;-1:-1:-1;;;46171:23:0;;;;46110:40;;-1:-1:-1;;;;;;46171:16:0;;;;:21;;-1:-1:-1;46171:23:0;;;;;;;;;;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46161:4;46166:1;46161:7;;;;;;;;:::i;:::-;;;;;;:33;-1:-1:-1;;;;;46161:33:0;;;-1:-1:-1;;;;;46161:33:0;;;;;46221:42;46211:4;46216:1;46211:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46211:52:0;;;:7;;;;;;;;;:52;46311:16;;:151;;-1:-1:-1;;;46311:151:0;;:16;;;:67;;46386:6;;46311:151;;:16;;46416:4;;46431;;46446:15;;46311:151;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46488:27:0;;;16835:25:1;;;-1:-1:-1;;;;;16896:32:1;;16891:2;16876:18;;16869:60;46488:27:0;;-1:-1:-1;16808:18:1;;-1:-1:-1;46488:27:0;;-1:-1:-1;16661:274:1;46488:27:0;;;;;;;;-1:-1:-1;;46526:14:0;:20;;-1:-1:-1;;;;46526:20:0;;;-1:-1:-1;45318:1236:0:o;25271:117::-;25334:7;25361:19;25369:3;22028:18;;21945:109;25732:158;25806:7;25857:22;25861:3;25873:5;25857:3;:22::i;44445:758::-;44580:14;;44542:22;;44598:3;;44568:26;;44580:14;;44568:9;:26;:::i;:::-;44567:34;;;;:::i;:::-;44542:59;-1:-1:-1;44612:14:0;44629:26;44542:59;44629:9;:26;:::i;:::-;44612:43;;44685:14;44667:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;44723:10:0;;44719:477;;44772:6;44750:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;44793:19:0;;-1:-1:-1;44813:17:0;:15;:17::i;:::-;44793:37;;44924:11;44939:1;44924:16;44920:265;;44981:6;44961:16;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;44920:265:0;;-1:-1:-1;44920:265:0;;45157:11;45122:31;-1:-1:-1;;;45122:6:0;:31;:::i;:::-;45121:47;;;;:::i;:::-;45102:14;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;44920:265:0;44735:461;44498:705;;44445:758;:::o;19501:414::-;19564:4;21827:19;;;:12;;;:19;;;;;;19581:327;;-1:-1:-1;19624:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19807:18;;19785:19;;;:12;;;:19;;;;;;:40;;;;19840:11;;19581:327;-1:-1:-1;19891:5:0;19884:12;;39328:440;-1:-1:-1;;;;;39447:17:0;;39423:21;39447:17;;;:9;:17;;;;;;39483:23;;;;39475:60;;;;-1:-1:-1;;;39475:60:0;;17142:2:1;39475:60:0;;;17124:21:1;17181:2;17161:18;;;17154:30;-1:-1:-1;;;17200:18:1;;;17193:54;17264:18;;39475:60:0;16940:348:1;39475:60:0;39591:27;39604:6;39611;39591:12;:27::i;:::-;39671:28;39681:9;39692:6;39671:9;:28::i;:::-;39741:9;-1:-1:-1;;;;;39725:33:0;39734:6;-1:-1:-1;;;;;39725:33:0;;39751:6;39725:33;;;;1977:25:1;;1965:2;1950:18;;1831:177;39725:33:0;;;;;;;;39412:356;39328:440;;;:::o;34364:4902::-;-1:-1:-1;;;;;34507:20:0;;;34480:24;34507:20;;;:9;:20;;;;;;;34562:17;;;;;;;;34598:23;;;;34590:60;;;;-1:-1:-1;;;34590:60:0;;17142:2:1;34590:60:0;;;17124:21:1;17181:2;17161:18;;;17154:30;-1:-1:-1;;;17200:18:1;;;17193:54;17264:18;;34590:60:0;16940:348:1;34590:60:0;34663:9;34686:6;34683:3257;;;34712:38;:21;34743:6;34712:30;:38::i;:::-;34708:427;;-1:-1:-1;;;;;34900:17:0;;;;;;:9;:17;;;;;;34919:15;-1:-1:-1;34900:34:0;;:52;;-1:-1:-1;34936:16:0;;;;34900:52;34892:82;;;;-1:-1:-1;;;34892:82:0;;17495:2:1;34892:82:0;;;17477:21:1;17534:2;17514:18;;;17507:30;-1:-1:-1;;;17553:18:1;;;17546:48;17611:18;;34892:82:0;17293:342:1;34892:82:0;35107:12;;35091:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;35073:17:0;;;;;;:9;:17;;;;;:46;34708:427;35276:9;;35268:6;:17;;35260:44;;;;-1:-1:-1;;;35260:44:0;;17842:2:1;35260:44:0;;;17824:21:1;17881:2;17861:18;;;17854:30;-1:-1:-1;;;17900:18:1;;;17893:45;17955:18;;35260:44:0;17640:339:1;35260:44:0;35327:31;:14;35351:6;35327:23;:31::i;:::-;:40;35319:73;;;;-1:-1:-1;;;35319:73:0;;18186:2:1;35319:73:0;;;18168:21:1;18225:2;18205:18;;;18198:30;-1:-1:-1;;;18244:18:1;;;18237:50;18304:18;;35319:73:0;17984:344:1;35319:73:0;35451:11;;35432:16;;:30;;;;:::i;:::-;35413:15;:49;;:77;;;;;35466:19;;35489:1;35466:24;35413:77;35409:186;;;35511:26;:14;35530:6;35511:18;:26::i;:::-;-1:-1:-1;35561:18:0;;-1:-1:-1;;;;;35561:18:0;;;;;;;;35409:186;-1:-1:-1;35615:8:0;;;;;;;34683:3257;;;35648:5;35645:2295;;;35673:40;:20;35703:9;35673:29;:40::i;:::-;35669:427;;-1:-1:-1;;;;;35862:19:0;;;;;;:8;:19;;;;;;35883:15;-1:-1:-1;35862:36:0;;:53;;-1:-1:-1;35900:15:0;;;;35862:53;35854:81;;;;-1:-1:-1;;;35854:81:0;;18535:2:1;35854:81:0;;;18517:21:1;18574:2;18554:18;;;18547:30;-1:-1:-1;;;18593:18:1;;;18586:46;18649:18;;35854:81:0;18333:340:1;35854:81:0;36069:11;;36053:27;;:15;:27;:::i;:::-;-1:-1:-1;;;;;36033:19:0;;;;;;:8;:19;;;;;:47;35669:427;36234:12;;36209:23;36226:6;36209:16;:23;:::i;:::-;:37;;36201:65;;;;-1:-1:-1;;;36201:65:0;;18880:2:1;36201:65:0;;;18862:21:1;18919:2;18899:18;;;18892:30;-1:-1:-1;;;18938:18:1;;;18931:46;18994:18;;36201:65:0;18678:340:1;36201:65:0;36299:6;;36289;:16;;36281:62;;;;-1:-1:-1;;;36281:62:0;;19225:2:1;36281:62:0;;;19207:21:1;19264:2;19244:18;;;19237:30;19303:34;19283:18;;;19276:62;-1:-1:-1;;;19354:18:1;;;19347:32;19396:19;;36281:62:0;19023:398:1;36281:62:0;36366:34;:14;36390:9;36366:23;:34::i;:::-;:43;36358:76;;;;-1:-1:-1;;;36358:76:0;;18186:2:1;36358:76:0;;;18168:21:1;18225:2;18205:18;;;18198:30;-1:-1:-1;;;18244:18:1;;;18237:50;18304:18;;36358:76:0;17984:344:1;36358:76:0;36493:11;;36474:16;;:30;;;;:::i;:::-;36455:15;:49;;:77;;;;;36508:19;;36531:1;36508:24;36455:77;36451:192;;;36553:29;:14;36572:9;36553:18;:29::i;:::-;-1:-1:-1;36606:21:0;;-1:-1:-1;;;;;36606:21:0;;;;;;;;36451:192;-1:-1:-1;36663:7:0;;;;35645:2295;;;36910:15;28417:1;36910:2;:15;:::i;:::-;36902:6;:23;36899:44;;36927:16;36936:6;36927:8;:16::i;:::-;37082:12;;37057:23;37074:6;37057:16;:23;:::i;:::-;:37;;37049:65;;;;-1:-1:-1;;;37049:65:0;;18880:2:1;37049:65:0;;;18862:21:1;18919:2;18899:18;;;18892:30;-1:-1:-1;;;18938:18:1;;;18931:46;18994:18;;37049:65:0;18678:340:1;37049:65:0;37346:38;:21;37377:6;37346:30;:38::i;:::-;37342:139;;-1:-1:-1;;;;;37411:17:0;;;;;;:9;:17;;;;;;37430:15;-1:-1:-1;37411:34:0;;:52;;-1:-1:-1;37447:16:0;;;;37411:52;37403:78;;;;-1:-1:-1;;;37403:78:0;;19628:2:1;37403:78:0;;;19610:21:1;19667:2;19647:18;;;19640:30;-1:-1:-1;;;19686:18:1;;;19679:44;19740:18;;37403:78:0;19426:338:1;37403:78:0;37518:31;:14;37542:6;37518:23;:31::i;:::-;:40;37510:80;;;;-1:-1:-1;;;37510:80:0;;19971:2:1;37510:80:0;;;19953:21:1;20010:2;19990:18;;;19983:30;20049:29;20029:18;;;20022:57;20096:18;;37510:80:0;19769:351:1;37510:80:0;37613:34;:14;37637:9;37613:23;:34::i;:::-;:43;37605:86;;;;-1:-1:-1;;;37605:86:0;;20327:2:1;37605:86:0;;;20309:21:1;20366:2;20346:18;;;20339:30;20405:32;20385:18;;;20378:60;20455:18;;37605:86:0;20125:354:1;37605:86:0;37750:11;;37731:16;;:30;;;;:::i;:::-;37712:15;:49;;:77;;;;;37765:19;;37788:1;37765:24;37712:77;37708:186;;;37810:26;:14;37829:6;37810:18;:26::i;:::-;-1:-1:-1;37860:18:0;;-1:-1:-1;;;;;37860:18:0;;;;;;;;37708:186;-1:-1:-1;37914:12:0;;;;;;;35645:2295;38277:21;;-1:-1:-1;;;;;38269:29:0;;;-1:-1:-1;;;38277:21:0;;;;38269:29;;;;38268:52;;-1:-1:-1;38303:16:0;;;;38302:17;38268:52;:84;;;;-1:-1:-1;38324:27:0;;;;38323:28;38268:84;:92;;;;;38354:6;38268:92;38265:130;;;38375:20;:18;:20::i;:::-;38464:23;38488:36;38502:6;38510:3;38515:8;;;;;;;;;;;38488:13;:36::i;:::-;38693:13;;38464:60;;-1:-1:-1;38632:21:0;;38654:53;;38668:6;;38676:3;;38681:25;;38693:13;;;;;;;-1:-1:-1;;;38681:11:0;;;:25;:::i;:::-;38654:13;:53::i;:::-;38632:75;-1:-1:-1;38771:19:0;38799:31;38632:75;38799:15;:31;:::i;:::-;38791:40;;:6;:40;:::i;:::-;38771:60;;38889:27;38902:6;38909;38889:12;:27::i;:::-;39011:4;38993:24;;;;:9;:24;;;;;:41;;39021:13;;38993:24;:41;;39021:13;;38993:41;:::i;:::-;;;;;;;;39089:15;39069:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;39159:33:0;;-1:-1:-1;39169:9:0;39180:11;39159:9;:33::i;:::-;39234:9;-1:-1:-1;;;;;39218:38:0;39227:6;-1:-1:-1;;;;;39218:38:0;;39244:11;39218:38;;;;1977:25:1;;1965:2;1950:18;;1831:177;39218:38:0;;;;;;;;34469:4797;;;;;;34364:4902;;;;;:::o;48900:461::-;48993:16;;48961:58;;48978:4;;-1:-1:-1;;;;;48993:16:0;49012:6;48961:8;:58::i;:::-;49054:16;;;49068:1;49054:16;;;;;;;;49030:21;;49054:16;;;;;;;;;;-1:-1:-1;49054:16:0;49030:40;;49099:4;49081;49086:1;49081:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49081:23:0;;;:7;;;;;;;;;;:23;;;;49125:16;;:23;;;-1:-1:-1;;;49125:23:0;;;;:16;;;;;:21;;:23;;;;;49081:7;;49125:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49115:4;49120:1;49115:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49115:33:0;;;:7;;;;;;;;;:33;49161:16;;:192;;-1:-1:-1;;;49161:192:0;;:16;;;:67;;:192;;49243:6;;49161:16;;49280:4;;49307;;49327:15;;49161:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48950:411;48900:461;:::o;49488:401::-;49582:9;49570:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;49634:16:0;;49602:63;;49619:4;;-1:-1:-1;;;;;49634:16:0;49653:11;49602:8;:63::i;:::-;49676:16;;:205;;-1:-1:-1;;;49676:205:0;;-1:-1:-1;;;;;49676:16:0;;;;:32;;49716:9;;49676:205;;49749:4;;49769:11;;49676:16;;;;49749:4;;49855:15;;49676:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20091:1553::-;20157:4;20296:19;;;:12;;;:19;;;;;;20332:15;;20328:1309;;20694:21;20718:14;20731:1;20718:10;:14;:::i;:::-;20767:18;;20694:38;;-1:-1:-1;20747:17:0;;20767:22;;20788:1;;20767:22;:::i;:::-;20747:42;;21034:17;21054:3;:11;;21066:9;21054:22;;;;;;;;:::i;:::-;;;;;;;;;21034:42;;21200:9;21171:3;:11;;21183:13;21171:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21277:23;;;:12;;;:23;;;;;;:36;;;21438:17;;21277:3;;21438:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21533:3;:12;;:19;21546:5;21533:19;;;;;;;;;;;21526:26;;;21576:4;21569:11;;;;;;;;20328:1309;21620:5;21613:12;;;;;22398:204;22493:18;;22465:7;;22493:26;-1:-1:-1;22485:73:0;;;;-1:-1:-1;;;22485:73:0;;21716:2:1;22485:73:0;;;21698:21:1;21755:2;21735:18;;;21728:30;21794:34;21774:18;;;21767:62;-1:-1:-1;;;21845:18:1;;;21838:32;21887:19;;22485:73:0;21514:398:1;22485:73:0;22576:3;:11;;22588:5;22576:18;;;;;;;;:::i;:::-;;;;;;;;;22569:25;;22398:204;;;;:::o;43154:648::-;-1:-1:-1;;;;;43289:15:0;;43271:17;43289:15;;;:9;:15;;;;;;:22;;43305:6;;43289:22;:::i;:::-;43271:40;;43335:27;43357:4;43335:21;:27::i;:::-;43332:102;;;-1:-1:-1;;;;;43377:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;43154:648:0:o;43332:102::-;43499:15;43515:21;43531:4;43515:15;:21::i;:::-;-1:-1:-1;;;;;43574:15:0;;;;;;:9;:15;;;;;:25;;;43683:14;;43499:37;;-1:-1:-1;43683:26:0;;43590:9;;43683:26;:::i;:::-;-1:-1:-1;;;;;43657:23:0;;;;;;:17;:23;;;;;;;;:52;;;;43770:14;;;;;:23;;43786:7;;43657:23;43770;;43786:7;;43770:23;:::i;42417:645::-;-1:-1:-1;;;;;42549:15:0;;42531:17;42549:15;;;:9;:15;;;;;;:22;;42565:6;;42549:22;:::i;:::-;42531:40;;42595:27;42617:4;42595:21;:27::i;:::-;42592:102;;;-1:-1:-1;;;;;42637:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42417:645:0:o;42592:102::-;42759:15;42775:21;42791:4;42775:15;:21::i;:::-;42759:37;;42897:9;42880:14;;:26;;;;:::i;:::-;-1:-1:-1;;;;;42854:23:0;;;;;;:17;:23;;;;;;;;:52;;;;42967:14;;;;;:23;;42983:7;;42854:23;42967;;42983:7;;42967:23;:::i;:::-;;;;-1:-1:-1;;;;;;;;43029:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;42417:645:0:o;39823:156::-;39913:7;39966:5;39952:10;39941:21;;39948:3;39941:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;39940:31;;;;:::i;:::-;39933:38;39823:156;-1:-1:-1;;;;39823:156:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:597::-;311:4;340:2;369;358:9;351:21;401:6;395:13;444:6;439:2;428:9;424:18;417:34;469:1;479:140;493:6;490:1;487:13;479:140;;;588:14;;;584:23;;578:30;554:17;;;573:2;550:26;543:66;508:10;;479:140;;;637:6;634:1;631:13;628:91;;;707:1;702:2;693:6;682:9;678:22;674:31;667:42;628:91;-1:-1:-1;780:2:1;759:15;-1:-1:-1;;755:29:1;740:45;;;;787:2;736:54;;199:597;-1:-1:-1;;;199:597:1:o;990:131::-;-1:-1:-1;;;;;1065:31:1;;1055:42;;1045:70;;1111:1;1108;1101:12;1126:315;1194:6;1202;1255:2;1243:9;1234:7;1230:23;1226:32;1223:52;;;1271:1;1268;1261:12;1223:52;1310:9;1297:23;1329:31;1354:5;1329:31;:::i;:::-;1379:5;1431:2;1416:18;;;;1403:32;;-1:-1:-1;;;1126:315:1:o;2013:118::-;2099:5;2092:13;2085:21;2078:5;2075:32;2065:60;;2121:1;2118;2111:12;2136:241;2192:6;2245:2;2233:9;2224:7;2220:23;2216:32;2213:52;;;2261:1;2258;2251:12;2213:52;2300:9;2287:23;2319:28;2341:5;2319:28;:::i;2382:456::-;2459:6;2467;2475;2528:2;2516:9;2507:7;2503:23;2499:32;2496:52;;;2544:1;2541;2534:12;2496:52;2583:9;2570:23;2602:31;2627:5;2602:31;:::i;:::-;2652:5;-1:-1:-1;2709:2:1;2694:18;;2681:32;2722:33;2681:32;2722:33;:::i;:::-;2382:456;;2774:7;;-1:-1:-1;;;2828:2:1;2813:18;;;;2800:32;;2382:456::o;3383:247::-;3442:6;3495:2;3483:9;3474:7;3470:23;3466:32;3463:52;;;3511:1;3508;3501:12;3463:52;3550:9;3537:23;3569:31;3594:5;3569:31;:::i;3635:156::-;3701:20;;3761:4;3750:16;;3740:27;;3730:55;;3781:1;3778;3771:12;3730:55;3635:156;;;:::o;3796:535::-;3888:6;3896;3904;3912;3920;3928;3981:3;3969:9;3960:7;3956:23;3952:33;3949:53;;;3998:1;3995;3988:12;3949:53;4021:27;4038:9;4021:27;:::i;:::-;4011:37;;4067:36;4099:2;4088:9;4084:18;4067:36;:::i;:::-;4057:46;;4122:36;4154:2;4143:9;4139:18;4122:36;:::i;:::-;4112:46;;4177:36;4209:2;4198:9;4194:18;4177:36;:::i;:::-;4167:46;;4232:37;4264:3;4253:9;4249:19;4232:37;:::i;:::-;4222:47;;4288:37;4320:3;4309:9;4305:19;4288:37;:::i;:::-;4278:47;;3796:535;;;;;;;;:::o;4589:182::-;4646:6;4699:2;4687:9;4678:7;4674:23;4670:32;4667:52;;;4715:1;4712;4705:12;4667:52;4738:27;4755:9;4738:27;:::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:356::-;5832:2;5814:21;;;5851:18;;;5844:30;5910:34;5905:2;5890:18;;5883:62;5977:2;5962:18;;5630:356::o;5991:127::-;6052:10;6047:3;6043:20;6040:1;6033:31;6083:4;6080:1;6073:15;6107:4;6104:1;6097:15;6123:125;6163:4;6191:1;6188;6185:8;6182:34;;;6196:18;;:::i;:::-;-1:-1:-1;6233:9:1;;6123:125::o;6253:168::-;6293:7;6359:1;6355;6351:6;6347:14;6344:1;6341:21;6336:1;6329:9;6322:17;6318:45;6315:71;;;6366:18;;:::i;:::-;-1:-1:-1;6406:9:1;;6253:168::o;6426:217::-;6466:1;6492;6482:132;;6536:10;6531:3;6527:20;6524:1;6517:31;6571:4;6568:1;6561:15;6599:4;6596:1;6589:15;6482:132;-1:-1:-1;6628:9:1;;6426:217::o;6648:422::-;6737:1;6780:5;6737:1;6794:270;6815:7;6805:8;6802:21;6794:270;;;6874:4;6870:1;6866:6;6862:17;6856:4;6853:27;6850:53;;;6883:18;;:::i;:::-;6933:7;6923:8;6919:22;6916:55;;;6953:16;;;;6916:55;7032:22;;;;6992:15;;;;6794:270;;;6798:3;6648:422;;;;;:::o;7075:806::-;7124:5;7154:8;7144:80;;-1:-1:-1;7195:1:1;7209:5;;7144:80;7243:4;7233:76;;-1:-1:-1;7280:1:1;7294:5;;7233:76;7325:4;7343:1;7338:59;;;;7411:1;7406:130;;;;7318:218;;7338:59;7368:1;7359:10;;7382:5;;;7406:130;7443:3;7433:8;7430:17;7427:43;;;7450:18;;:::i;:::-;-1:-1:-1;;7506:1:1;7492:16;;7521:5;;7318:218;;7620:2;7610:8;7607:16;7601:3;7595:4;7592:13;7588:36;7582:2;7572:8;7569:16;7564:2;7558:4;7555:12;7551:35;7548:77;7545:159;;;-1:-1:-1;7657:19:1;;;7689:5;;7545:159;7736:34;7761:8;7755:4;7736:34;:::i;:::-;7806:6;7802:1;7798:6;7794:19;7785:7;7782:32;7779:58;;;7817:18;;:::i;:::-;7855:20;;7075:806;-1:-1:-1;;;7075:806:1:o;7886:140::-;7944:5;7973:47;8014:4;8004:8;8000:19;7994:4;7973:47;:::i;8380:128::-;8420:3;8451:1;8447:6;8444:1;8441:13;8438:39;;;8457:18;;:::i;:::-;-1:-1:-1;8493:9:1;;8380:128::o;8513:204::-;8551:3;8587:4;8584:1;8580:12;8619:4;8616:1;8612:12;8654:3;8648:4;8644:14;8639:3;8636:23;8633:49;;;8662:18;;:::i;:::-;8698:13;;8513:204;-1:-1:-1;;;8513:204:1:o;9129:340::-;9331:2;9313:21;;;9370:2;9350:18;;;9343:30;-1:-1:-1;;;9404:2:1;9389:18;;9382:46;9460:2;9445:18;;9129:340::o;9684:184::-;9754:6;9807:2;9795:9;9786:7;9782:23;9778:32;9775:52;;;9823:1;9820;9813:12;9775:52;-1:-1:-1;9846:16:1;;9684:184;-1:-1:-1;9684:184:1:o;10152:245::-;10219:6;10272:2;10260:9;10251:7;10247:23;10243:32;10240:52;;;10288:1;10285;10278:12;10240:52;10320:9;10314:16;10339:28;10361:5;10339:28;:::i;12267:135::-;12306:3;12327:17;;;12324:43;;12347:18;;:::i;:::-;-1:-1:-1;12394:1:1;12383:13;;12267:135::o;12407:607::-;-1:-1:-1;;;;;12766:15:1;;;12748:34;;12813:2;12798:18;;12791:34;;;;12856:2;12841:18;;12834:34;;;;12899:2;12884:18;;12877:34;;;;12948:15;;;12942:3;12927:19;;12920:44;12728:3;12980:19;;12973:35;;;;12697:3;12682:19;;12407:607::o;15292:251::-;15362:6;15415:2;15403:9;15394:7;15390:23;15386:32;15383:52;;;15431:1;15428;15421:12;15383:52;15463:9;15457:16;15482:31;15507:5;15482:31;:::i;15548:127::-;15609:10;15604:3;15600:20;15597:1;15590:31;15640:4;15637:1;15630:15;15664:4;15661:1;15654:15;15680:461;15733:3;15771:5;15765:12;15798:6;15793:3;15786:19;15824:4;15853:2;15848:3;15844:12;15837:19;;15890:2;15883:5;15879:14;15911:1;15921:195;15935:6;15932:1;15929:13;15921:195;;;16000:13;;-1:-1:-1;;;;;15996:39:1;15984:52;;16056:12;;;;16091:15;;;;16032:1;15950:9;15921:195;;;-1:-1:-1;16132:3:1;;15680:461;-1:-1:-1;;;;;15680:461:1:o;16146:510::-;16417:6;16406:9;16399:25;16460:3;16455:2;16444:9;16440:18;16433:31;16380:4;16481:57;16533:3;16522:9;16518:19;16510:6;16481:57;:::i;:::-;-1:-1:-1;;;;;16574:32:1;;;;16569:2;16554:18;;16547:60;-1:-1:-1;16638:2:1;16623:18;16616:34;16473:65;16146:510;-1:-1:-1;;16146:510:1:o;20484:582::-;20783:6;20772:9;20765:25;20826:6;20821:2;20810:9;20806:18;20799:34;20869:3;20864:2;20853:9;20849:18;20842:31;20746:4;20890:57;20942:3;20931:9;20927:19;20919:6;20890:57;:::i;:::-;-1:-1:-1;;;;;20983:32:1;;;;20978:2;20963:18;;20956:60;-1:-1:-1;21047:3:1;21032:19;21025:35;20882:65;20484:582;-1:-1:-1;;;20484:582:1:o;21071:306::-;21159:6;21167;21175;21228:2;21216:9;21207:7;21203:23;21199:32;21196:52;;;21244:1;21241;21234:12;21196:52;21273:9;21267:16;21257:26;;21323:2;21312:9;21308:18;21302:25;21292:35;;21367:2;21356:9;21352:18;21346:25;21336:35;;21071:306;;;;;:::o;21382:127::-;21443:10;21438:3;21434:20;21431:1;21424:31;21474:4;21471:1;21464:15;21498:4;21495:1;21488:15

Swarm Source

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