ETH Price: $3,091.38 (+0.68%)
Gas: 7 Gwei

Token

MADARA (MAD)
 

Overview

Max Total Supply

1,000,000,000 MAD

Holders

135

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
292,488.746976802244037828 MAD

Value
$0.00
0xdf8aca60a304fe56cd312daa9bc97a9ad8b9aaba
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:
MADARA

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-27
*/

/*
Track you memecoins portfolio at your fingertips !
Twitter  : https://twitter.com/madaraapp
Telegram : https://t.me/madaraapp
Medium   : https://medium.com/@MadaraApp
Website  : https://www.madara.app/
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;
pragma experimental ABIEncoderV2;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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");

        (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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

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

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

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

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

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

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


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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}


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

    function WETH() external pure returns (address);

    function WBNB() external pure returns (address);

    function WAVAX() external pure returns (address);

    function WHT() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function addLiquidityBNB(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function addLiquidityAVAX(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function addLiquidityHT(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);

    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}


interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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

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

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

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

}

contract MADARA is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    address private dead = 0x000000000000000000000000000000000000dEaD;
    uint256 public maxLiqFee = 10;
    uint256 public maxTaxFee = 10; 
    uint256 public maxDevFee = 10;
    uint256 public minMxTxPercentage = 50;
    uint256 public maxSellTaxFee = 20;
    uint256 public prevLiqFee;
    uint256 public prevTaxFee;
    uint256 public prevDevFee;
    uint256 public prevSellFee;
    
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    mapping (address => bool) private _isdevWallet;
    
    address[] private _excluded;
    address public _devWalletAddress;     // team wallet here
    address public router;
    address public basePair;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    bool public mintedByDxsale = true;
    string private _name;
    string private _symbol;
    uint8 private _decimals;
    
    uint256 public _taxFee;
    uint256 private _previousTaxFee;
    
    uint256 public _liquidityFee;
    uint256 private _previousLiquidityFee;
    
    uint256 public _devFee;
    uint256 private _previousDevFee = _devFee;

    uint256 public _sellTaxFee;
    uint256 private _previousSellFee;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled;
    
    uint256 public _maxTxAmount;
    uint256 public numTokensSellToAddToLiquidity;
    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {
        _name = "MADARA";
        _symbol = "MAD";
        _decimals = 18;
        _tTotal = 1000000000000000000000000000;
        _rTotal = (MAX - (MAX % _tTotal));
        router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        basePair = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;    
        _rOwned[_msgSender()] = _rTotal;
        
        maxTaxFee = 10;        
        maxLiqFee = 10;
        maxDevFee = 10;
        minMxTxPercentage = 50;
        maxSellTaxFee = 20; 
        _taxFee = 0;
        _previousTaxFee = _taxFee;     
        _liquidityFee = 0;
        _previousLiquidityFee = _liquidityFee;
        _devFee = 4;
        _previousDevFee = _devFee;
        _sellTaxFee = 0;  
        _previousSellFee = _sellTaxFee;      
        _devWalletAddress = 0x34A91e6fD78ABf93f10c370c184E1be4970933d3;

        _maxTxAmount = _tTotal;
        numTokensSellToAddToLiquidity = _tTotal.mul(1).div(1000);

        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);
         // Create a uniswap pair for this new token
        uniswapV2Pair = UniSwapFactory(_uniswapV2Router.factory())
            .createPair(address(this), basePair);

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_devWalletAddress] = true;
    
        //set wallet provided to true
        _isdevWallet[_devWalletAddress] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function getWrapAddr() public view returns (address){

        return basePair;

    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }
    
    function excludeFromFee(address account) public onlyOwner {
        require(!_isExcludedFromFee[account], "Account is already excluded");
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        require(_isExcludedFromFee[account], "Account is already included");
        _isExcludedFromFee[account] = false;
    }
    
    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
         require(taxFee >= 0 && taxFee <=maxTaxFee,"taxFee out of range");
        _taxFee = taxFee;
    }
    
    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
         require(liquidityFee >= 0 && liquidityFee <=maxLiqFee,"liquidityFee out of range");
        _liquidityFee = liquidityFee;
    }
    
    function setDevFeePercent(uint256 devFee) external onlyOwner() {
        require(devFee >= 0 && devFee <=maxDevFee,"teamFee out of range");
        _devFee = devFee;
    }      

    function setSellTaxFeePercent(uint256 sellTaxFee) external onlyOwner() {
         require(sellTaxFee >= 0 && sellTaxFee <=maxSellTaxFee,"taxFee out of range");
        _sellTaxFee = sellTaxFee;
    }
   
    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        require(maxTxPercent >= minMxTxPercentage && maxTxPercent <=100,"maxTxPercent out of range");
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10**2
        );
    }
        
    function setDevWalletAddress(address _addr) public onlyOwner {
        require(!_isdevWallet[_addr], "Wallet address already set");
        if (!_isExcludedFromFee[_addr]) {
            excludeFromFee(_addr);
        }
        _isdevWallet[_addr] = true;
        _devWalletAddress = _addr;
    }

    function replaceDevWalletAddress(address _addr, address _newAddr) public onlyOwner {
        require(_isdevWallet[_addr], "Wallet address not set previously");
        if (_isExcludedFromFee[_addr]) {
            includeInFee(_addr);
        }
        _isdevWallet[_addr] = false;
        if (_devWalletAddress == _addr){
            setDevWalletAddress(_newAddr);
        }
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
    
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDev) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, tDev, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity, tDev);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tDev = calculateDevFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub(tDev);
        return (tTransferAmount, tFee, tLiquidity, tDev);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tDev, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rDev = tDev.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rDev);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function _takeDev(uint256 tDev) private {
        uint256 currentRate = _getRate();
        uint256 rDev = tDev.mul(currentRate);
        _rOwned[_devWalletAddress] = _rOwned[_devWalletAddress].add(rDev);
        if(_isExcluded[_devWalletAddress])
            _tOwned[_devWalletAddress] = _tOwned[_devWalletAddress].add(tDev);
    }    
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
            return _amount.mul(_taxFee).div(
                10**2
            );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function calculateDevFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_devFee).div(
            10**2
        );
    }    
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0 && _devFee == 0) return;
        
        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        _previousDevFee = _devFee;
        _previousSellFee = _sellTaxFee;
        
        _taxFee = 0;
        _liquidityFee = 0;
        _devFee = 0;
        _sellTaxFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
        _devFee = _previousDevFee;
        _sellTaxFee = _previousSellFee;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

        //Special case when sell is uniswapV2Pair
        if (to == address(uniswapV2Pair)){
            _taxFee = _sellTaxFee;
        }

        if(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        
        if(contractTokenBalance >= _maxTxAmount)
        {
            contractTokenBalance = _maxTxAmount;
        }
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);

        //reset tax fees
        restoreAllFee();
    }

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

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

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

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

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> WHT
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = getWrapAddr();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

        catch(bytes memory) {

            try uniswapV2Router.swapExactTokensForBNBSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of ETH
                path,
                address(this),
                block.timestamp
            ) {}
            catch(bytes memory) {
                try uniswapV2Router.swapExactTokensForAVAXSupportingFeeOnTransferTokens(
                    tokenAmount,
                    0, // accept any amount of ETH
                    path,
                    address(this),
                    block.timestamp
                ){}

                catch(bytes memory) {
                    try uniswapV2Router.swapExactTokensForHTSupportingFeeOnTransferTokens(
                        tokenAmount,
                        0, // accept any amount of ETH
                        path,
                        address(this),
                        block.timestamp
                    ){}
                    catch(bytes memory) {

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


                    }


                }

            }

        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity

        try uniswapV2Router.addLiquidityETH{value : ETHAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            dead,
            block.timestamp
        ) {

        }

        catch (bytes memory) {
            try uniswapV2Router.addLiquidityBNB{value : ETHAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                dead,
                block.timestamp
            ) {

            }
            catch (bytes memory) {
                try uniswapV2Router.addLiquidityAVAX{value : ETHAmount}(
                    address(this),
                    tokenAmount,
                    0, // slippage is unavoidable
                    0, // slippage is unavoidable
                    dead,
                    block.timestamp
                ) {

                }
                catch (bytes memory) {
                    try uniswapV2Router.addLiquidityHT{value : ETHAmount}(
                        address(this),
                        tokenAmount,
                        0, // slippage is unavoidable
                        0, // slippage is unavoidable
                        dead,
                        block.timestamp
                    ) {

                    }
                    catch (bytes memory) {

                        uniswapV2Router.addLiquidityETH{value : ETHAmount}(
                            address(this),
                            tokenAmount,
                            0, // slippage is unavoidable
                            0, // slippage is unavoidable
                            dead,
                            block.timestamp
                        );
                    }

                }

            }
        }

    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        } 
        
        //if(!takeFee)
        //    restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDev) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDev) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeLiquidity(tLiquidity);
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDev) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeLiquidity(tLiquidity);
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tDev) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _takeDev(tDev);        
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function disableFees() public onlyOwner {
        prevLiqFee = _liquidityFee;
        prevTaxFee = _taxFee;
        prevDevFee = _devFee;
        prevSellFee = _sellTaxFee;
        _maxTxAmount = _tTotal;
        _liquidityFee = 0;
        _taxFee = 0;
        _devFee = 0;
        _sellTaxFee = 0;
        swapAndLiquifyEnabled = false;
        
    }
    
    function enableFees() public onlyOwner {
        
        _maxTxAmount = _tTotal;
        _liquidityFee = prevLiqFee;
        _taxFee = prevTaxFee;
        _devFee = prevDevFee;
        _sellTaxFee = prevSellFee;
        swapAndLiquifyEnabled = 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":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_devWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getWrapAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minMxTxPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedByDxsale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevLiqFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevTaxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_newAddr","type":"address"}],"name":"replaceDevWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"setDevFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDevWalletAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellTaxFee","type":"uint256"}],"name":"setSellTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600180546001600160a01b03191661dead178155600a60028190556003819055600455603260055560146006556018805460ff191690911790556020546021553480156200005157600080fd5b506200005d336200041c565b604080518082019091526006808252654d414441524160d01b60209092019182526200008c916019916200048f565b506040805180820190915260038082526213505160ea1b6020909201918252620000b991601a916200048f565b50601b805460ff191660121790556b033b2e3c9fd0803ce80000006015819055620000e790600019620005f0565b620000f59060001962000599565b6016819055601380546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556014805490911673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055600b60006200014e3390565b6001600160a01b03168152602080820192909252604001600090812092909255600a60038190556002819055600490815560326005556014600655601c839055601d839055601e839055601f8390558082556021556022829055602391909155601280546001600160a01b0319167334a91e6fd78abf93f10c370c184e1be4970933d3179055601554602581905562000210916103e891620001fc916001906200166f6200046c821b17901c565b6200048160201b6200167b1790919060201c565b6026556013546040805163c45a015560e01b815290516001600160a01b0390921691829163c45a0155916004808301926020929190829003018186803b1580156200025a57600080fd5b505afa1580156200026f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000295919062000535565b6014546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c6539690604401602060405180830381600087803b158015620002e257600080fd5b505af1158015620002f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031d919062000535565b6001600160601b0319606091821b811660a0529082901b166080526001600e6000620003516000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600e845282812080548616600190811790915560128054841683528483208054881683179055549092168152601090935291208054909216179055620003c53390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6015546040516200040d91815260200190565b60405180910390a35062000633565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006200047a828462000577565b9392505050565b60006200047a828462000560565b8280546200049d90620005b3565b90600052602060002090601f016020900481019282620004c157600085556200050c565b82601f10620004dc57805160ff19168380011785556200050c565b828001600101855582156200050c579182015b828111156200050c578251825591602001919060010190620004ef565b506200051a9291506200051e565b5090565b5b808211156200051a57600081556001016200051f565b6000602082840312156200054857600080fd5b81516001600160a01b03811681146200047a57600080fd5b6000826200057257620005726200061d565b500490565b600081600019048311821515161562000594576200059462000607565b500290565b600082821015620005ae57620005ae62000607565b500390565b600181811c90821680620005c857607f821691505b60208210811415620005ea57634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200060257620006026200061d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c60a05160601c613184620006c16000396000818161065f015281816118d501526119e301526000818161045f01528181612092015281816120ce0152818161218201528181612236015281816122ea0152818161239e0152818161241e0152818161245d0152818161253901528181612615015281816126f101526127cd01526131846000f3fe60806040526004361061036f5760003560e01c80636bc87c3a116101c6578063b425bac3116100f7578063d51b31ac11610095578063dd62ed3e1161006f578063dd62ed3e146109ad578063ea2f0b37146109f3578063f2fde38b14610a13578063f887ea4014610a3357600080fd5b8063d51b31ac14610957578063d543dbeb1461096d578063d7034bd61461098d57600080fd5b8063c7992f9a116100d1578063c7992f9a146108f6578063ce404b231461090c578063d0e0352314610921578063d12a76881461094157600080fd5b8063b425bac3146108a0578063bf2e2c52146108c0578063c49b9a80146108d657600080fd5b80638ee88c5311610164578063a457c2d71161013e578063a457c2d714610834578063a9059cbb14610854578063aa45026b14610874578063aceafe091461088a57600080fd5b80638ee88c53146107e157806395d89b41146108015780639b33d9d11461081657600080fd5b8063790ed1c3116101a0578063790ed1c31461075e5780637d1db4a51461077457806388f820201461078a5780638da5cb5b146107c357600080fd5b80636bc87c3a1461071357806370a0823114610729578063715018a61461074957600080fd5b8063368f5bd5116102a05780634549b0391161023e5780634a74bb02116102185780634a74bb02146106815780635342acb4146106a057806355924646146106d95780635930919b146106f357600080fd5b80634549b03914610617578063475877d91461063757806349bd5a5e1461064d57600080fd5b80633b124fe71161027a5780633b124fe7146105ab5780633bd5d173146105c1578063430ca090146105e1578063437823ec146105f757600080fd5b8063368f5bd514610556578063379e29191461056b578063395093511461058b57600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104de5780632d838119146104fe578063313ce5671461051e578063324f8dbf1461054057600080fd5b806318160ddd14610499578063200a692d146104ae578063220f6696146104c457600080fd5b8063120a061211610349578063120a0612146103f857806313114a9d1461041857806315ed604f146104375780631694505e1461044d57600080fd5b8063061c82d01461037b57806306fdde031461039d578063095ea7b3146103c857600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004612e6f565b610a53565b005b3480156103a957600080fd5b506103b2610ad3565b6040516103bf9190612f14565b60405180910390f35b3480156103d457600080fd5b506103e86103e3366004612e2a565b610b65565b60405190151581526020016103bf565b34801561040457600080fd5b5061039b610413366004612da0565b610b7c565b34801561042457600080fd5b506017545b6040519081526020016103bf565b34801561044357600080fd5b5061042960075481565b34801561045957600080fd5b506104817f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103bf565b3480156104a557600080fd5b50601554610429565b3480156104ba57600080fd5b5061042960225481565b3480156104d057600080fd5b506024546103e89060ff1681565b3480156104ea57600080fd5b506103e86104f9366004612dee565b610c6f565b34801561050a57600080fd5b50610429610519366004612e6f565b610cd8565b34801561052a57600080fd5b50601b5460405160ff90911681526020016103bf565b34801561054c57600080fd5b5061042960055481565b34801561056257600080fd5b5061039b610d5c565b34801561057757600080fd5b5061039b610586366004612e6f565b610db5565b34801561059757600080fd5b506103e86105a6366004612e2a565b610e2d565b3480156105b757600080fd5b50610429601c5481565b3480156105cd57600080fd5b5061039b6105dc366004612e6f565b610e63565b3480156105ed57600080fd5b5061042960025481565b34801561060357600080fd5b5061039b610612366004612da0565b610f4f565b34801561062357600080fd5b50610429610632366004612e88565b611006565b34801561064357600080fd5b5061042960085481565b34801561065957600080fd5b506104817f000000000000000000000000000000000000000000000000000000000000000081565b34801561068d57600080fd5b506024546103e890610100900460ff1681565b3480156106ac57600080fd5b506103e86106bb366004612da0565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156106e557600080fd5b506018546103e89060ff1681565b3480156106ff57600080fd5b50601454610481906001600160a01b031681565b34801561071f57600080fd5b50610429601e5481565b34801561073557600080fd5b50610429610744366004612da0565b611095565b34801561075557600080fd5b5061039b6110f4565b34801561076a57600080fd5b50610429600a5481565b34801561078057600080fd5b5061042960255481565b34801561079657600080fd5b506103e86107a5366004612da0565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156107cf57600080fd5b506000546001600160a01b0316610481565b3480156107ed57600080fd5b5061039b6107fc366004612e6f565b61112a565b34801561080d57600080fd5b506103b26111ab565b34801561082257600080fd5b506014546001600160a01b0316610481565b34801561084057600080fd5b506103e861084f366004612e2a565b6111ba565b34801561086057600080fd5b506103e861086f366004612e2a565b611209565b34801561088057600080fd5b5061042960205481565b34801561089657600080fd5b5061042960045481565b3480156108ac57600080fd5b50601254610481906001600160a01b031681565b3480156108cc57600080fd5b5061042960095481565b3480156108e257600080fd5b5061039b6108f1366004612e54565b611216565b34801561090257600080fd5b5061042960035481565b34801561091857600080fd5b5061039b611294565b34801561092d57600080fd5b5061039b61093c366004612e6f565b6112fb565b34801561094d57600080fd5b5061042960265481565b34801561096357600080fd5b5061042960065481565b34801561097957600080fd5b5061039b610988366004612e6f565b611372565b34801561099957600080fd5b5061039b6109a8366004612dbb565b611421565b3480156109b957600080fd5b506104296109c8366004612dbb565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156109ff57600080fd5b5061039b610a0e366004612da0565b611521565b348015610a1f57600080fd5b5061039b610a2e366004612da0565b6115d4565b348015610a3f57600080fd5b50601354610481906001600160a01b031681565b6000546001600160a01b03163314610a865760405162461bcd60e51b8152600401610a7d90612f69565b60405180910390fd5b600354811115610ace5760405162461bcd60e51b8152602060048201526013602482015272746178466565206f7574206f662072616e676560681b6044820152606401610a7d565b601c55565b606060198054610ae29061307f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0e9061307f565b8015610b5b5780601f10610b3057610100808354040283529160200191610b5b565b820191906000526020600020905b815481529060010190602001808311610b3e57829003601f168201915b5050505050905090565b6000610b72338484611687565b5060015b92915050565b6000546001600160a01b03163314610ba65760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b03811660009081526010602052604090205460ff1615610c0f5760405162461bcd60e51b815260206004820152601a60248201527f57616c6c6574206164647265737320616c7265616479207365740000000000006044820152606401610a7d565b6001600160a01b0381166000908152600e602052604090205460ff16610c3857610c3881610f4f565b6001600160a01b03166000818152601060205260409020805460ff19166001179055601280546001600160a01b0319169091179055565b6000610c7c8484846117ab565b610cce8433610cc985604051806060016040528060288152602001613102602891396001600160a01b038a166000908152600d602090815260408083203384529091529020549190611aba565b611687565b5060019392505050565b6000601654821115610d3f5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a7d565b6000610d49611ae6565b9050610d55838261167b565b9392505050565b6000546001600160a01b03163314610d865760405162461bcd60e51b8152600401610a7d90612f69565b601554602555600754601e55600854601c55600954602055600a546022556024805461ff001916610100179055565b6000546001600160a01b03163314610ddf5760405162461bcd60e51b8152600401610a7d90612f69565b600454811115610e285760405162461bcd60e51b81526020600482015260146024820152737465616d466565206f7574206f662072616e676560601b6044820152606401610a7d565b602055565b336000818152600d602090815260408083206001600160a01b03871684529091528120549091610b72918590610cc99086611b09565b336000818152600f602052604090205460ff1615610ed85760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a7d565b6000610ee383611b15565b5050506001600160a01b0386166000908152600b6020526040902054939450610f1193925084915050611b70565b6001600160a01b0383166000908152600b6020526040902055601654610f379082611b70565b601655601754610f479084611b09565b601755505050565b6000546001600160a01b03163314610f795760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b0381166000908152600e602052604090205460ff1615610fe25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a7d565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b600060155483111561105a5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a7d565b8161107a57600061106a84611b15565b50949650610b7695505050505050565b600061108584611b15565b50939650610b7695505050505050565b6001600160a01b0381166000908152600f602052604081205460ff16156110d257506001600160a01b03166000908152600c602052604090205490565b6001600160a01b0382166000908152600b6020526040902054610b7690610cd8565b6000546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610a7d90612f69565b6111286000611b7c565b565b6000546001600160a01b031633146111545760405162461bcd60e51b8152600401610a7d90612f69565b6002548111156111a65760405162461bcd60e51b815260206004820152601960248201527f6c6971756964697479466565206f7574206f662072616e6765000000000000006044820152606401610a7d565b601e55565b6060601a8054610ae29061307f565b6000610b723384610cc98560405180606001604052806025815260200161312a60259139336000908152600d602090815260408083206001600160a01b038d1684529091529020549190611aba565b6000610b723384846117ab565b6000546001600160a01b031633146112405760405162461bcd60e51b8152600401610a7d90612f69565b602480548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061128990831515815260200190565b60405180910390a150565b6000546001600160a01b031633146112be5760405162461bcd60e51b8152600401610a7d90612f69565b601e8054600755601c80546008556020805460095560228054600a5560155460255560009384905591839055829055556024805461ff0019169055565b6000546001600160a01b031633146113255760405162461bcd60e51b8152600401610a7d90612f69565b60065481111561136d5760405162461bcd60e51b8152602060048201526013602482015272746178466565206f7574206f662072616e676560681b6044820152606401610a7d565b602255565b6000546001600160a01b0316331461139c5760405162461bcd60e51b8152600401610a7d90612f69565b60055481101580156113af575060648111155b6113fb5760405162461bcd60e51b815260206004820152601960248201527f6d6178547850657263656e74206f7574206f662072616e6765000000000000006044820152606401610a7d565b61141b60646114158360155461166f90919063ffffffff16565b9061167b565b60255550565b6000546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b03821660009081526010602052604090205460ff166114bd5760405162461bcd60e51b815260206004820152602160248201527f57616c6c65742061646472657373206e6f74207365742070726576696f75736c6044820152607960f81b6064820152608401610a7d565b6001600160a01b0382166000908152600e602052604090205460ff16156114e7576114e782611521565b6001600160a01b038083166000818152601060205260409020805460ff19169055601254909116141561151d5761151d81610b7c565b5050565b6000546001600160a01b0316331461154b5760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b0381166000908152600e602052604090205460ff166115b35760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a7d565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6000546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b0381166116635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a7d565b61166c81611b7c565b50565b6000610d558284613049565b6000610d558284613027565b6001600160a01b0383166116e95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a7d565b6001600160a01b03821661174a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a7d565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661180f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a7d565b6001600160a01b0382166118715760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a7d565b600081116118d35760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a7d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561191457602254601c555b6000546001600160a01b0384811691161480159061194057506000546001600160a01b03838116911614155b156119a8576025548111156119a85760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a7d565b60006119b330611095565b905060255481106119c357506025545b602654811080159081906119da575060245460ff16155b8015611a1857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611a2b5750602454610100900460ff165b15611a3e576026549150611a3e82611bcc565b6001600160a01b0385166000908152600e602052604090205460019060ff1680611a8057506001600160a01b0385166000908152600e602052604090205460ff165b15611a89575060005b611a9586868684611c6a565b611ab2601d54601c55601f54601e55602154602055602354602255565b505050505050565b60008184841115611ade5760405162461bcd60e51b8152600401610a7d9190612f14565b505050900390565b6000806000611af3611dd1565b9092509050611b02828261167b565b9250505090565b6000610d55828461300f565b6000806000806000806000806000806000611b2f8c611f53565b93509350935093506000806000611b508f878787611b4b611ae6565b611fa8565b919f509d509b509599509397509195509350505050919395979092949650565b6000610d558284613068565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6024805460ff191660011790556000611be682600261167b565b90506000611bf48383611b70565b905047611c008361200a565b6000611c0c4783611b70565b9050611c188382612418565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506024805460ff19169055505050565b80611c7757611c7761287e565b6001600160a01b0384166000908152600f602052604090205460ff168015611cb857506001600160a01b0383166000908152600f602052604090205460ff16155b15611ccd57611cc88484846128cd565b611dcb565b6001600160a01b0384166000908152600f602052604090205460ff16158015611d0e57506001600160a01b0383166000908152600f602052604090205460ff165b15611d1e57611cc8848484612a13565b6001600160a01b0384166000908152600f602052604090205460ff16158015611d6057506001600160a01b0383166000908152600f602052604090205460ff16155b15611d7057611cc8848484612ad2565b6001600160a01b0384166000908152600f602052604090205460ff168015611db057506001600160a01b0383166000908152600f602052604090205460ff165b15611dc057611cc8848484612b2c565b611dcb848484612ad2565b50505050565b6016546015546000918291825b601154811015611f235782600b600060118481548110611e0057611e006130eb565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611e6b575081600c600060118481548110611e4457611e446130eb565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611e8157601654601554945094505050509091565b611ec7600b600060118481548110611e9b57611e9b6130eb565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611b70565b9250611f0f600c600060118481548110611ee357611ee36130eb565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611b70565b915080611f1b816130ba565b915050611dde565b50601554601654611f339161167b565b821015611f4a576016546015549350935050509091565b90939092509050565b6000806000806000611f6486612bb5565b90506000611f7187612bd1565b90506000611f7e88612bed565b90506000611f9882611f9285818d89611b70565b90611b70565b9993985091965094509092505050565b6000808080611fb7898661166f565b90506000611fc5898761166f565b90506000611fd3898861166f565b90506000611fe1898961166f565b90506000611ff582611f9285818989611b70565b949d949c50929a509298505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061203f5761203f6130eb565b6001600160a01b039283166020918202929092010152601454168160018151811061206c5761206c6130eb565b60200260200101906001600160a01b031690816001600160a01b0316815250506120b7307f000000000000000000000000000000000000000000000000000000000000000084611687565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061210c908590600090869030904290600401612f9e565b600060405180830381600087803b15801561212657600080fd5b505af1925050508015612137575060015b61151d573d808015612165576040519150601f19603f3d011682016040523d82523d6000602084013e61216a565b606091505b5060405163d46d2f8360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d46d2f83906121c0908690600090879030904290600401612f9e565b600060405180830381600087803b1580156121da57600080fd5b505af19250505080156121eb575060015b612413573d808015612219576040519150601f19603f3d011682016040523d82523d6000602084013e61221e565b606091505b50604051633b158ab160e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063762b156290612274908790600090889030904290600401612f9e565b600060405180830381600087803b15801561228e57600080fd5b505af192505050801561229f575060015b611dcb573d8080156122cd576040519150601f19603f3d011682016040523d82523d6000602084013e6122d2565b606091505b506040516312d70e6d60e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906325ae1cda90612328908890600090899030904290600401612f9e565b600060405180830381600087803b15801561234257600080fd5b505af1925050508015612353575060015b612410573d808015612381576040519150601f19603f3d011682016040523d82523d6000602084013e612386565b606091505b5060405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906123dc9089906000908a9030904290600401612f9e565b600060405180830381600087803b1580156123f657600080fd5b505af115801561240a573d6000803e3d6000fd5b50505050505b50505b505050565b612443307f000000000000000000000000000000000000000000000000000000000000000084611687565b60015460405163f305d71960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f305d7199285926124a1923092899260009283929116904290600401612ed9565b6060604051808303818588803b1580156124ba57600080fd5b505af1935050505080156124eb575060408051601f3d908101601f191682019092526124e891810190612eab565b60015b612410573d808015612519576040519150601f19603f3d011682016040523d82523d6000602084013e61251e565b606091505b506001546040516375576a2160e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263eaaed44292869261257d9230928a9260009283929116904290600401612ed9565b6060604051808303818588803b15801561259657600080fd5b505af1935050505080156125c7575060408051601f3d908101601f191682019092526125c491810190612eab565b60015b611ab2573d8080156125f5576040519150601f19603f3d011682016040523d82523d6000602084013e6125fa565b606091505b50600154604051637c8d9fb960e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f91b3f729287926126599230928b9260009283929116904290600401612ed9565b6060604051808303818588803b15801561267257600080fd5b505af1935050505080156126a3575060408051601f3d908101601f191682019092526126a091810190612eab565b60015b612875573d8080156126d1576040519150601f19603f3d011682016040523d82523d6000602084013e6126d6565b606091505b50600154604051630798368960e41b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263798368909288926127359230928c9260009283929116904290600401612ed9565b6060604051808303818588803b15801561274e57600080fd5b505af19350505050801561277f575060408051601f3d908101601f1916820190925261277c91810190612eab565b60015b61286c573d8080156127ad576040519150601f19603f3d011682016040523d82523d6000602084013e6127b2565b606091505b5060015460405163f305d71960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263f305d7199289926128119230928d9260009283929116904290600401612ed9565b6060604051808303818588803b15801561282a57600080fd5b505af115801561283e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128639190612eab565b50505050612410565b50505050611dcb565b50505050505050565b601c5415801561288e5750601e54155b801561289a5750602054155b156128a157565b601c8054601d55601e8054601f5560208054602155602280546023556000938490559183905582905555565b60008060008060008060006128e188611b15565b965096509650965096509650965061292788600c60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6001600160a01b038b166000908152600c6020908152604080832093909355600b905220546129569088611b70565b6001600160a01b03808c166000908152600b602052604080822093909355908b16815220546129859087611b09565b6001600160a01b038a166000908152600b60205260409020556129a782612c09565b6129b081612c91565b6129ba8584612d50565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516129ff91815260200190565b60405180910390a350505050505050505050565b6000806000806000806000612a2788611b15565b9650965096509650965096509650612a6d87600b60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6001600160a01b03808c166000908152600b6020908152604080832094909455918c168152600c9091522054612aa39085611b09565b6001600160a01b038a166000908152600c6020908152604080832093909355600b905220546129859087611b09565b6000806000806000806000612ae688611b15565b965096509650965096509650965061295687600b60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6000806000806000806000612b4088611b15565b9650965096509650965096509650612b8688600c60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6001600160a01b038b166000908152600c6020908152604080832093909355600b90522054612a6d9088611b70565b6000610b766064611415601c548561166f90919063ffffffff16565b6000610b766064611415601e548561166f90919063ffffffff16565b6000610b7660646114156020548561166f90919063ffffffff16565b6000612c13611ae6565b90506000612c21838361166f565b306000908152600b6020526040902054909150612c3e9082611b09565b306000908152600b6020908152604080832093909355600f9052205460ff161561241357306000908152600c6020526040902054612c7c9084611b09565b306000908152600c6020526040902055505050565b6000612c9b611ae6565b90506000612ca9838361166f565b6012546001600160a01b03166000908152600b6020526040902054909150612cd19082611b09565b601280546001600160a01b039081166000908152600b602090815260408083209590955592549091168152600f909152205460ff1615612413576012546001600160a01b03166000908152600c6020526040902054612d309084611b09565b6012546001600160a01b03166000908152600c6020526040902055505050565b601654612d5d9083611b70565b601655601754612d6d9082611b09565b6017555050565b80356001600160a01b0381168114612d8b57600080fd5b919050565b80358015158114612d8b57600080fd5b600060208284031215612db257600080fd5b610d5582612d74565b60008060408385031215612dce57600080fd5b612dd783612d74565b9150612de560208401612d74565b90509250929050565b600080600060608486031215612e0357600080fd5b612e0c84612d74565b9250612e1a60208501612d74565b9150604084013590509250925092565b60008060408385031215612e3d57600080fd5b612e4683612d74565b946020939093013593505050565b600060208284031215612e6657600080fd5b610d5582612d90565b600060208284031215612e8157600080fd5b5035919050565b60008060408385031215612e9b57600080fd5b82359150612de560208401612d90565b600080600060608486031215612ec057600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b81811015612f4157858101830151858201604001528201612f25565b81811115612f53576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612fee5784516001600160a01b031683529383019391830191600101612fc9565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613022576130226130d5565b500190565b60008261304457634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613063576130636130d5565b500290565b60008282101561307a5761307a6130d5565b500390565b600181811c9082168061309357607f821691505b602082108114156130b457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130ce576130ce6130d5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122065baab22496511f26d5c26c5d6848e45692ff6be451d3ec8020105c9fbcf149464736f6c63430008070033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c80636bc87c3a116101c6578063b425bac3116100f7578063d51b31ac11610095578063dd62ed3e1161006f578063dd62ed3e146109ad578063ea2f0b37146109f3578063f2fde38b14610a13578063f887ea4014610a3357600080fd5b8063d51b31ac14610957578063d543dbeb1461096d578063d7034bd61461098d57600080fd5b8063c7992f9a116100d1578063c7992f9a146108f6578063ce404b231461090c578063d0e0352314610921578063d12a76881461094157600080fd5b8063b425bac3146108a0578063bf2e2c52146108c0578063c49b9a80146108d657600080fd5b80638ee88c5311610164578063a457c2d71161013e578063a457c2d714610834578063a9059cbb14610854578063aa45026b14610874578063aceafe091461088a57600080fd5b80638ee88c53146107e157806395d89b41146108015780639b33d9d11461081657600080fd5b8063790ed1c3116101a0578063790ed1c31461075e5780637d1db4a51461077457806388f820201461078a5780638da5cb5b146107c357600080fd5b80636bc87c3a1461071357806370a0823114610729578063715018a61461074957600080fd5b8063368f5bd5116102a05780634549b0391161023e5780634a74bb02116102185780634a74bb02146106815780635342acb4146106a057806355924646146106d95780635930919b146106f357600080fd5b80634549b03914610617578063475877d91461063757806349bd5a5e1461064d57600080fd5b80633b124fe71161027a5780633b124fe7146105ab5780633bd5d173146105c1578063430ca090146105e1578063437823ec146105f757600080fd5b8063368f5bd514610556578063379e29191461056b578063395093511461058b57600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104de5780632d838119146104fe578063313ce5671461051e578063324f8dbf1461054057600080fd5b806318160ddd14610499578063200a692d146104ae578063220f6696146104c457600080fd5b8063120a061211610349578063120a0612146103f857806313114a9d1461041857806315ed604f146104375780631694505e1461044d57600080fd5b8063061c82d01461037b57806306fdde031461039d578063095ea7b3146103c857600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004612e6f565b610a53565b005b3480156103a957600080fd5b506103b2610ad3565b6040516103bf9190612f14565b60405180910390f35b3480156103d457600080fd5b506103e86103e3366004612e2a565b610b65565b60405190151581526020016103bf565b34801561040457600080fd5b5061039b610413366004612da0565b610b7c565b34801561042457600080fd5b506017545b6040519081526020016103bf565b34801561044357600080fd5b5061042960075481565b34801561045957600080fd5b506104817f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016103bf565b3480156104a557600080fd5b50601554610429565b3480156104ba57600080fd5b5061042960225481565b3480156104d057600080fd5b506024546103e89060ff1681565b3480156104ea57600080fd5b506103e86104f9366004612dee565b610c6f565b34801561050a57600080fd5b50610429610519366004612e6f565b610cd8565b34801561052a57600080fd5b50601b5460405160ff90911681526020016103bf565b34801561054c57600080fd5b5061042960055481565b34801561056257600080fd5b5061039b610d5c565b34801561057757600080fd5b5061039b610586366004612e6f565b610db5565b34801561059757600080fd5b506103e86105a6366004612e2a565b610e2d565b3480156105b757600080fd5b50610429601c5481565b3480156105cd57600080fd5b5061039b6105dc366004612e6f565b610e63565b3480156105ed57600080fd5b5061042960025481565b34801561060357600080fd5b5061039b610612366004612da0565b610f4f565b34801561062357600080fd5b50610429610632366004612e88565b611006565b34801561064357600080fd5b5061042960085481565b34801561065957600080fd5b506104817f000000000000000000000000b11bb53414cfacbcf5579b91d2f8cd6e6280936981565b34801561068d57600080fd5b506024546103e890610100900460ff1681565b3480156106ac57600080fd5b506103e86106bb366004612da0565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156106e557600080fd5b506018546103e89060ff1681565b3480156106ff57600080fd5b50601454610481906001600160a01b031681565b34801561071f57600080fd5b50610429601e5481565b34801561073557600080fd5b50610429610744366004612da0565b611095565b34801561075557600080fd5b5061039b6110f4565b34801561076a57600080fd5b50610429600a5481565b34801561078057600080fd5b5061042960255481565b34801561079657600080fd5b506103e86107a5366004612da0565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156107cf57600080fd5b506000546001600160a01b0316610481565b3480156107ed57600080fd5b5061039b6107fc366004612e6f565b61112a565b34801561080d57600080fd5b506103b26111ab565b34801561082257600080fd5b506014546001600160a01b0316610481565b34801561084057600080fd5b506103e861084f366004612e2a565b6111ba565b34801561086057600080fd5b506103e861086f366004612e2a565b611209565b34801561088057600080fd5b5061042960205481565b34801561089657600080fd5b5061042960045481565b3480156108ac57600080fd5b50601254610481906001600160a01b031681565b3480156108cc57600080fd5b5061042960095481565b3480156108e257600080fd5b5061039b6108f1366004612e54565b611216565b34801561090257600080fd5b5061042960035481565b34801561091857600080fd5b5061039b611294565b34801561092d57600080fd5b5061039b61093c366004612e6f565b6112fb565b34801561094d57600080fd5b5061042960265481565b34801561096357600080fd5b5061042960065481565b34801561097957600080fd5b5061039b610988366004612e6f565b611372565b34801561099957600080fd5b5061039b6109a8366004612dbb565b611421565b3480156109b957600080fd5b506104296109c8366004612dbb565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156109ff57600080fd5b5061039b610a0e366004612da0565b611521565b348015610a1f57600080fd5b5061039b610a2e366004612da0565b6115d4565b348015610a3f57600080fd5b50601354610481906001600160a01b031681565b6000546001600160a01b03163314610a865760405162461bcd60e51b8152600401610a7d90612f69565b60405180910390fd5b600354811115610ace5760405162461bcd60e51b8152602060048201526013602482015272746178466565206f7574206f662072616e676560681b6044820152606401610a7d565b601c55565b606060198054610ae29061307f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0e9061307f565b8015610b5b5780601f10610b3057610100808354040283529160200191610b5b565b820191906000526020600020905b815481529060010190602001808311610b3e57829003601f168201915b5050505050905090565b6000610b72338484611687565b5060015b92915050565b6000546001600160a01b03163314610ba65760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b03811660009081526010602052604090205460ff1615610c0f5760405162461bcd60e51b815260206004820152601a60248201527f57616c6c6574206164647265737320616c7265616479207365740000000000006044820152606401610a7d565b6001600160a01b0381166000908152600e602052604090205460ff16610c3857610c3881610f4f565b6001600160a01b03166000818152601060205260409020805460ff19166001179055601280546001600160a01b0319169091179055565b6000610c7c8484846117ab565b610cce8433610cc985604051806060016040528060288152602001613102602891396001600160a01b038a166000908152600d602090815260408083203384529091529020549190611aba565b611687565b5060019392505050565b6000601654821115610d3f5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610a7d565b6000610d49611ae6565b9050610d55838261167b565b9392505050565b6000546001600160a01b03163314610d865760405162461bcd60e51b8152600401610a7d90612f69565b601554602555600754601e55600854601c55600954602055600a546022556024805461ff001916610100179055565b6000546001600160a01b03163314610ddf5760405162461bcd60e51b8152600401610a7d90612f69565b600454811115610e285760405162461bcd60e51b81526020600482015260146024820152737465616d466565206f7574206f662072616e676560601b6044820152606401610a7d565b602055565b336000818152600d602090815260408083206001600160a01b03871684529091528120549091610b72918590610cc99086611b09565b336000818152600f602052604090205460ff1615610ed85760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610a7d565b6000610ee383611b15565b5050506001600160a01b0386166000908152600b6020526040902054939450610f1193925084915050611b70565b6001600160a01b0383166000908152600b6020526040902055601654610f379082611b70565b601655601754610f479084611b09565b601755505050565b6000546001600160a01b03163314610f795760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b0381166000908152600e602052604090205460ff1615610fe25760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a7d565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b600060155483111561105a5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610a7d565b8161107a57600061106a84611b15565b50949650610b7695505050505050565b600061108584611b15565b50939650610b7695505050505050565b6001600160a01b0381166000908152600f602052604081205460ff16156110d257506001600160a01b03166000908152600c602052604090205490565b6001600160a01b0382166000908152600b6020526040902054610b7690610cd8565b6000546001600160a01b0316331461111e5760405162461bcd60e51b8152600401610a7d90612f69565b6111286000611b7c565b565b6000546001600160a01b031633146111545760405162461bcd60e51b8152600401610a7d90612f69565b6002548111156111a65760405162461bcd60e51b815260206004820152601960248201527f6c6971756964697479466565206f7574206f662072616e6765000000000000006044820152606401610a7d565b601e55565b6060601a8054610ae29061307f565b6000610b723384610cc98560405180606001604052806025815260200161312a60259139336000908152600d602090815260408083206001600160a01b038d1684529091529020549190611aba565b6000610b723384846117ab565b6000546001600160a01b031633146112405760405162461bcd60e51b8152600401610a7d90612f69565b602480548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061128990831515815260200190565b60405180910390a150565b6000546001600160a01b031633146112be5760405162461bcd60e51b8152600401610a7d90612f69565b601e8054600755601c80546008556020805460095560228054600a5560155460255560009384905591839055829055556024805461ff0019169055565b6000546001600160a01b031633146113255760405162461bcd60e51b8152600401610a7d90612f69565b60065481111561136d5760405162461bcd60e51b8152602060048201526013602482015272746178466565206f7574206f662072616e676560681b6044820152606401610a7d565b602255565b6000546001600160a01b0316331461139c5760405162461bcd60e51b8152600401610a7d90612f69565b60055481101580156113af575060648111155b6113fb5760405162461bcd60e51b815260206004820152601960248201527f6d6178547850657263656e74206f7574206f662072616e6765000000000000006044820152606401610a7d565b61141b60646114158360155461166f90919063ffffffff16565b9061167b565b60255550565b6000546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b03821660009081526010602052604090205460ff166114bd5760405162461bcd60e51b815260206004820152602160248201527f57616c6c65742061646472657373206e6f74207365742070726576696f75736c6044820152607960f81b6064820152608401610a7d565b6001600160a01b0382166000908152600e602052604090205460ff16156114e7576114e782611521565b6001600160a01b038083166000818152601060205260409020805460ff19169055601254909116141561151d5761151d81610b7c565b5050565b6000546001600160a01b0316331461154b5760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b0381166000908152600e602052604090205460ff166115b35760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a7d565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6000546001600160a01b031633146115fe5760405162461bcd60e51b8152600401610a7d90612f69565b6001600160a01b0381166116635760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a7d565b61166c81611b7c565b50565b6000610d558284613049565b6000610d558284613027565b6001600160a01b0383166116e95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a7d565b6001600160a01b03821661174a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a7d565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661180f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a7d565b6001600160a01b0382166118715760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a7d565b600081116118d35760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610a7d565b7f000000000000000000000000b11bb53414cfacbcf5579b91d2f8cd6e628093696001600160a01b0316826001600160a01b0316141561191457602254601c555b6000546001600160a01b0384811691161480159061194057506000546001600160a01b03838116911614155b156119a8576025548111156119a85760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a7d565b60006119b330611095565b905060255481106119c357506025545b602654811080159081906119da575060245460ff16155b8015611a1857507f000000000000000000000000b11bb53414cfacbcf5579b91d2f8cd6e628093696001600160a01b0316856001600160a01b031614155b8015611a2b5750602454610100900460ff165b15611a3e576026549150611a3e82611bcc565b6001600160a01b0385166000908152600e602052604090205460019060ff1680611a8057506001600160a01b0385166000908152600e602052604090205460ff165b15611a89575060005b611a9586868684611c6a565b611ab2601d54601c55601f54601e55602154602055602354602255565b505050505050565b60008184841115611ade5760405162461bcd60e51b8152600401610a7d9190612f14565b505050900390565b6000806000611af3611dd1565b9092509050611b02828261167b565b9250505090565b6000610d55828461300f565b6000806000806000806000806000806000611b2f8c611f53565b93509350935093506000806000611b508f878787611b4b611ae6565b611fa8565b919f509d509b509599509397509195509350505050919395979092949650565b6000610d558284613068565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6024805460ff191660011790556000611be682600261167b565b90506000611bf48383611b70565b905047611c008361200a565b6000611c0c4783611b70565b9050611c188382612418565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506024805460ff19169055505050565b80611c7757611c7761287e565b6001600160a01b0384166000908152600f602052604090205460ff168015611cb857506001600160a01b0383166000908152600f602052604090205460ff16155b15611ccd57611cc88484846128cd565b611dcb565b6001600160a01b0384166000908152600f602052604090205460ff16158015611d0e57506001600160a01b0383166000908152600f602052604090205460ff165b15611d1e57611cc8848484612a13565b6001600160a01b0384166000908152600f602052604090205460ff16158015611d6057506001600160a01b0383166000908152600f602052604090205460ff16155b15611d7057611cc8848484612ad2565b6001600160a01b0384166000908152600f602052604090205460ff168015611db057506001600160a01b0383166000908152600f602052604090205460ff165b15611dc057611cc8848484612b2c565b611dcb848484612ad2565b50505050565b6016546015546000918291825b601154811015611f235782600b600060118481548110611e0057611e006130eb565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611e6b575081600c600060118481548110611e4457611e446130eb565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611e8157601654601554945094505050509091565b611ec7600b600060118481548110611e9b57611e9b6130eb565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611b70565b9250611f0f600c600060118481548110611ee357611ee36130eb565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611b70565b915080611f1b816130ba565b915050611dde565b50601554601654611f339161167b565b821015611f4a576016546015549350935050509091565b90939092509050565b6000806000806000611f6486612bb5565b90506000611f7187612bd1565b90506000611f7e88612bed565b90506000611f9882611f9285818d89611b70565b90611b70565b9993985091965094509092505050565b6000808080611fb7898661166f565b90506000611fc5898761166f565b90506000611fd3898861166f565b90506000611fe1898961166f565b90506000611ff582611f9285818989611b70565b949d949c50929a509298505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061203f5761203f6130eb565b6001600160a01b039283166020918202929092010152601454168160018151811061206c5761206c6130eb565b60200260200101906001600160a01b031690816001600160a01b0316815250506120b7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611687565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061210c908590600090869030904290600401612f9e565b600060405180830381600087803b15801561212657600080fd5b505af1925050508015612137575060015b61151d573d808015612165576040519150601f19603f3d011682016040523d82523d6000602084013e61216a565b606091505b5060405163d46d2f8360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d46d2f83906121c0908690600090879030904290600401612f9e565b600060405180830381600087803b1580156121da57600080fd5b505af19250505080156121eb575060015b612413573d808015612219576040519150601f19603f3d011682016040523d82523d6000602084013e61221e565b606091505b50604051633b158ab160e11b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063762b156290612274908790600090889030904290600401612f9e565b600060405180830381600087803b15801561228e57600080fd5b505af192505050801561229f575060015b611dcb573d8080156122cd576040519150601f19603f3d011682016040523d82523d6000602084013e6122d2565b606091505b506040516312d70e6d60e11b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16906325ae1cda90612328908890600090899030904290600401612f9e565b600060405180830381600087803b15801561234257600080fd5b505af1925050508015612353575060015b612410573d808015612381576040519150601f19603f3d011682016040523d82523d6000602084013e612386565b606091505b5060405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906123dc9089906000908a9030904290600401612f9e565b600060405180830381600087803b1580156123f657600080fd5b505af115801561240a573d6000803e3d6000fd5b50505050505b50505b505050565b612443307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611687565b60015460405163f305d71960e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263f305d7199285926124a1923092899260009283929116904290600401612ed9565b6060604051808303818588803b1580156124ba57600080fd5b505af1935050505080156124eb575060408051601f3d908101601f191682019092526124e891810190612eab565b60015b612410573d808015612519576040519150601f19603f3d011682016040523d82523d6000602084013e61251e565b606091505b506001546040516375576a2160e11b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263eaaed44292869261257d9230928a9260009283929116904290600401612ed9565b6060604051808303818588803b15801561259657600080fd5b505af1935050505080156125c7575060408051601f3d908101601f191682019092526125c491810190612eab565b60015b611ab2573d8080156125f5576040519150601f19603f3d011682016040523d82523d6000602084013e6125fa565b606091505b50600154604051637c8d9fb960e11b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263f91b3f729287926126599230928b9260009283929116904290600401612ed9565b6060604051808303818588803b15801561267257600080fd5b505af1935050505080156126a3575060408051601f3d908101601f191682019092526126a091810190612eab565b60015b612875573d8080156126d1576040519150601f19603f3d011682016040523d82523d6000602084013e6126d6565b606091505b50600154604051630798368960e41b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263798368909288926127359230928c9260009283929116904290600401612ed9565b6060604051808303818588803b15801561274e57600080fd5b505af19350505050801561277f575060408051601f3d908101601f1916820190925261277c91810190612eab565b60015b61286c573d8080156127ad576040519150601f19603f3d011682016040523d82523d6000602084013e6127b2565b606091505b5060015460405163f305d71960e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81169263f305d7199289926128119230928d9260009283929116904290600401612ed9565b6060604051808303818588803b15801561282a57600080fd5b505af115801561283e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128639190612eab565b50505050612410565b50505050611dcb565b50505050505050565b601c5415801561288e5750601e54155b801561289a5750602054155b156128a157565b601c8054601d55601e8054601f5560208054602155602280546023556000938490559183905582905555565b60008060008060008060006128e188611b15565b965096509650965096509650965061292788600c60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6001600160a01b038b166000908152600c6020908152604080832093909355600b905220546129569088611b70565b6001600160a01b03808c166000908152600b602052604080822093909355908b16815220546129859087611b09565b6001600160a01b038a166000908152600b60205260409020556129a782612c09565b6129b081612c91565b6129ba8584612d50565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516129ff91815260200190565b60405180910390a350505050505050505050565b6000806000806000806000612a2788611b15565b9650965096509650965096509650612a6d87600b60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6001600160a01b03808c166000908152600b6020908152604080832094909455918c168152600c9091522054612aa39085611b09565b6001600160a01b038a166000908152600c6020908152604080832093909355600b905220546129859087611b09565b6000806000806000806000612ae688611b15565b965096509650965096509650965061295687600b60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6000806000806000806000612b4088611b15565b9650965096509650965096509650612b8688600c60008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611b7090919063ffffffff16565b6001600160a01b038b166000908152600c6020908152604080832093909355600b90522054612a6d9088611b70565b6000610b766064611415601c548561166f90919063ffffffff16565b6000610b766064611415601e548561166f90919063ffffffff16565b6000610b7660646114156020548561166f90919063ffffffff16565b6000612c13611ae6565b90506000612c21838361166f565b306000908152600b6020526040902054909150612c3e9082611b09565b306000908152600b6020908152604080832093909355600f9052205460ff161561241357306000908152600c6020526040902054612c7c9084611b09565b306000908152600c6020526040902055505050565b6000612c9b611ae6565b90506000612ca9838361166f565b6012546001600160a01b03166000908152600b6020526040902054909150612cd19082611b09565b601280546001600160a01b039081166000908152600b602090815260408083209590955592549091168152600f909152205460ff1615612413576012546001600160a01b03166000908152600c6020526040902054612d309084611b09565b6012546001600160a01b03166000908152600c6020526040902055505050565b601654612d5d9083611b70565b601655601754612d6d9082611b09565b6017555050565b80356001600160a01b0381168114612d8b57600080fd5b919050565b80358015158114612d8b57600080fd5b600060208284031215612db257600080fd5b610d5582612d74565b60008060408385031215612dce57600080fd5b612dd783612d74565b9150612de560208401612d74565b90509250929050565b600080600060608486031215612e0357600080fd5b612e0c84612d74565b9250612e1a60208501612d74565b9150604084013590509250925092565b60008060408385031215612e3d57600080fd5b612e4683612d74565b946020939093013593505050565b600060208284031215612e6657600080fd5b610d5582612d90565b600060208284031215612e8157600080fd5b5035919050565b60008060408385031215612e9b57600080fd5b82359150612de560208401612d90565b600080600060608486031215612ec057600080fd5b8351925060208401519150604084015190509250925092565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208083528351808285015260005b81811015612f4157858101830151858201604001528201612f25565b81811115612f53576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612fee5784516001600160a01b031683529383019391830191600101612fc9565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115613022576130226130d5565b500190565b60008261304457634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613063576130636130d5565b500290565b60008282101561307a5761307a6130d5565b500390565b600181811c9082168061309357607f821691505b602082108114156130b457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156130ce576130ce6130d5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122065baab22496511f26d5c26c5d6848e45692ff6be451d3ec8020105c9fbcf149464736f6c63430008070033

Deployed Bytecode Sourcemap

31058:25760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38763:174;;;;;;;;;;-1:-1:-1;38763:174:0;;;;;:::i;:::-;;:::i;:::-;;35136:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36048:161;;;;;;;;;;-1:-1:-1;36048:161:0;;;;;:::i;:::-;;:::i;:::-;;;3324:14:1;;3317:22;3299:41;;3287:2;3272:18;36048:161:0;3159:187:1;39859:302:0;;;;;;;;;;-1:-1:-1;39859:302:0;;;;;:::i;:::-;;:::i;37169:87::-;;;;;;;;;;-1:-1:-1;37238:10:0;;37169:87;;;11597:25:1;;;11585:2;11570:18;37169:87:0;11451:177:1;31439:25:0;;;;;;;;;;;;;;;;32662:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2503:32:1;;;2485:51;;2473:2;2458:18;32662:51:0;2339:203:1;35413:95:0;;;;;;;;;;-1:-1:-1;35493:7:0;;35413:95;;32588:26;;;;;;;;;;;;;;;;32771:28;;;;;;;;;;-1:-1:-1;32771:28:0;;;;;;;;36217:313;;;;;;;;;;-1:-1:-1;36217:313:0;;;;;:::i;:::-;;:::i;38096:253::-;;;;;;;;;;-1:-1:-1;38096:253:0;;;;;:::i;:::-;;:::i;35322:83::-;;;;;;;;;;-1:-1:-1;35388:9:0;;35322:83;;35388:9;;;;13084:36:1;;13072:2;13057:18;35322:83:0;12942:184:1;31355:37:0;;;;;;;;;;;;;;;;56539:274;;;;;;;;;;;;;:::i;39177:174::-;;;;;;;;;;-1:-1:-1;39177:174:0;;;;;:::i;:::-;;:::i;36538:218::-;;;;;;;;;;-1:-1:-1;36538:218:0;;;;;:::i;:::-;;:::i;32351:22::-;;;;;;;;;;;;;;;;37264:378;;;;;;;;;;-1:-1:-1;37264:378:0;;;;;:::i;:::-;;:::i;31246:29::-;;;;;;;;;;;;;;;;38361:190;;;;;;;;;;-1:-1:-1;38361:190:0;;;;;:::i;:::-;;:::i;37650:438::-;;;;;;;;;;-1:-1:-1;37650:438:0;;;;;:::i;:::-;;:::i;31471:25::-;;;;;;;;;;;;;;;;32720:38;;;;;;;;;;;;;;;32806:33;;;;;;;;;;-1:-1:-1;32806:33:0;;;;;;;;;;;44830:123;;;;;;;;;;-1:-1:-1;44830:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;44918:27:0;44894:4;44918:27;;;:18;:27;;;;;;;;;44830:123;32219:33;;;;;;;;;;-1:-1:-1;32219:33:0;;;;;;;;32047:23;;;;;;;;;;-1:-1:-1;32047:23:0;;;;-1:-1:-1;;;;;32047:23:0;;;32424:28;;;;;;;;;;;;;;;;35516:198;;;;;;;;;;-1:-1:-1;35516:198:0;;;;;:::i;:::-;;:::i;20582:103::-;;;;;;;;;;;;;:::i;31535:26::-;;;;;;;;;;;;;;;;32852:27;;;;;;;;;;;;;;;;37041:120;;;;;;;;;;-1:-1:-1;37041:120:0;;;;;:::i;:::-;-1:-1:-1;;;;;37133:20:0;37109:4;37133:20;;;:11;:20;;;;;;;;;37041:120;19931:87;;;;;;;;;;-1:-1:-1;19977:7:0;20004:6;-1:-1:-1;;;;;20004:6:0;19931:87;;38949:216;;;;;;;;;;-1:-1:-1;38949:216:0;;;;;:::i;:::-;;:::i;35227:87::-;;;;;;;;;;;;;:::i;35038:90::-;;;;;;;;;;-1:-1:-1;35110:8:0;;-1:-1:-1;;;;;35110:8:0;35038:90;;36764:269;;;;;;;;;;-1:-1:-1;36764:269:0;;;;;:::i;:::-;;:::i;35722:167::-;;;;;;;;;;-1:-1:-1;35722:167:0;;;;;:::i;:::-;;:::i;32509:22::-;;;;;;;;;;;;;;;;31319:29;;;;;;;;;;;;;;;;31956:32;;;;;;;;;;-1:-1:-1;31956:32:0;;;;-1:-1:-1;;;;;31956:32:0;;;31503:25;;;;;;;;;;;;;;;;40566:171;;;;;;;;;;-1:-1:-1;40566:171:0;;;;;:::i;:::-;;:::i;31282:29::-;;;;;;;;;;;;;;;;56163:364;;;;;;;;;;;;;:::i;39365:202::-;;;;;;;;;;-1:-1:-1;39365:202:0;;;;;:::i;:::-;;:::i;32886:44::-;;;;;;;;;;;;;;;;31399:33;;;;;;;;;;;;;;;;39578:265;;;;;;;;;;-1:-1:-1;39578:265:0;;;;;:::i;:::-;;:::i;40169:389::-;;;;;;;;;;-1:-1:-1;40169:389:0;;;;;:::i;:::-;;:::i;35897:143::-;;;;;;;;;;-1:-1:-1;35897:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;36005:18:0;;;35978:7;36005:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35897:143;38563:188;;;;;;;;;;-1:-1:-1;38563:188:0;;;;;:::i;:::-;;:::i;20840:201::-;;;;;;;;;;-1:-1:-1;20840:201:0;;;;;:::i;:::-;;:::i;32019:21::-;;;;;;;;;;-1:-1:-1;32019:21:0;;;;-1:-1:-1;;;;;32019:21:0;;;38763:174;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;;;;;;;;;38870:9:::1;;38861:6;:18;;38838:64;;;::::0;-1:-1:-1;;;38838:64:0;;11305:2:1;38838:64:0::1;::::0;::::1;11287:21:1::0;11344:2;11324:18;;;11317:30;-1:-1:-1;;;11363:18:1;;;11356:49;11422:18;;38838:64:0::1;11103:343:1::0;38838:64:0::1;38913:7;:16:::0;38763:174::o;35136:83::-;35173:13;35206:5;35199:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35136:83;:::o;36048:161::-;36123:4;36140:39;10527:10;36163:7;36172:6;36140:8;:39::i;:::-;-1:-1:-1;36197:4:0;36048:161;;;;;:::o;39859:302::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39940:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;::::1;;39939:20;39931:59;;;::::0;-1:-1:-1;;;39931:59:0;;10132:2:1;39931:59:0::1;::::0;::::1;10114:21:1::0;10171:2;10151:18;;;10144:30;10210:28;10190:18;;;10183:56;10256:18;;39931:59:0::1;9930:350:1::0;39931:59:0::1;-1:-1:-1::0;;;;;40006:25:0;::::1;;::::0;;;:18:::1;:25;::::0;;;;;::::1;;40001:80;;40048:21;40063:5;40048:14;:21::i;:::-;-1:-1:-1::0;;;;;40091:19:0::1;;::::0;;;:12:::1;:19;::::0;;;;:26;;-1:-1:-1;;40091:26:0::1;40113:4;40091:26;::::0;;40128:17:::1;:25:::0;;-1:-1:-1;;;;;;40128:25:0::1;::::0;;::::1;::::0;;39859:302::o;36217:313::-;36315:4;36332:36;36342:6;36350:9;36361:6;36332:9;:36::i;:::-;36379:121;36388:6;10527:10;36410:89;36448:6;36410:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36410:19:0;;;;;;:11;:19;;;;;;;;10527:10;36410:33;;;;;;;;;;:37;:89::i;:::-;36379:8;:121::i;:::-;-1:-1:-1;36518:4:0;36217:313;;;;;:::o;38096:253::-;38162:7;38201;;38190;:18;;38182:73;;;;-1:-1:-1;;;38182:73:0;;5148:2:1;38182:73:0;;;5130:21:1;5187:2;5167:18;;;5160:30;5226:34;5206:18;;;5199:62;-1:-1:-1;;;5277:18:1;;;5270:40;5327:19;;38182:73:0;4946:406:1;38182:73:0;38266:19;38289:10;:8;:10::i;:::-;38266:33;-1:-1:-1;38317:24:0;:7;38266:33;38317:11;:24::i;:::-;38310:31;38096:253;-1:-1:-1;;;38096:253:0:o;56539:274::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;56614:7:::1;::::0;56599:12:::1;:22:::0;56648:10:::1;::::0;56632:13:::1;:26:::0;56679:10:::1;::::0;56669:7:::1;:20:::0;-1:-1:-1;56710:10:0;56700:7:::1;:20:::0;56745:11:::1;::::0;56731::::1;:25:::0;56767:21:::1;:28:::0;;-1:-1:-1;;56767:28:0::1;;;::::0;;56539:274::o;39177:174::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;39283:9:::1;;39274:6;:18;;39251:65;;;::::0;-1:-1:-1;;;39251:65:0;;8621:2:1;39251:65:0::1;::::0;::::1;8603:21:1::0;8660:2;8640:18;;;8633:30;-1:-1:-1;;;8679:18:1;;;8672:50;8739:18;;39251:65:0::1;8419:344:1::0;39251:65:0::1;39327:7;:16:::0;39177:174::o;36538:218::-;10527:10;36626:4;36675:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36675:34:0;;;;;;;;;;36626:4;;36643:83;;36666:7;;36675:50;;36714:10;36675:38;:50::i;37264:378::-;10527:10;37316:14;37365:19;;;:11;:19;;;;;;;;37364:20;37356:77;;;;-1:-1:-1;;;37356:77:0;;10892:2:1;37356:77:0;;;10874:21:1;10931:2;10911:18;;;10904:30;10970:34;10950:18;;;10943:62;-1:-1:-1;;;11021:18:1;;;11014:42;11073:19;;37356:77:0;10690:408:1;37356:77:0;37445:15;37470:19;37481:7;37470:10;:19::i;:::-;-1:-1:-1;;;;;;;;37518:15:0;;;;;;:7;:15;;;;;;37444:45;;-1:-1:-1;37518:28:0;;:15;-1:-1:-1;37444:45:0;;-1:-1:-1;;37518:19:0;:28::i;:::-;-1:-1:-1;;;;;37500:15:0;;;;;;:7;:15;;;;;:46;37567:7;;:20;;37579:7;37567:11;:20::i;:::-;37557:7;:30;37611:10;;:23;;37626:7;37611:14;:23::i;:::-;37598:10;:36;-1:-1:-1;;;37264:378:0:o;38361:190::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38439:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;38438:28;38430:68;;;::::0;-1:-1:-1;;;38430:68:0;;6369:2:1;38430:68:0::1;::::0;::::1;6351:21:1::0;6408:2;6388:18;;;6381:30;6447:29;6427:18;;;6420:57;6494:18;;38430:68:0::1;6167:351:1::0;38430:68:0::1;-1:-1:-1::0;;;;;38509:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;38509:34:0::1;38539:4;38509:34;::::0;;38361:190::o;37650:438::-;37740:7;37779;;37768;:18;;37760:62;;;;-1:-1:-1;;;37760:62:0;;7081:2:1;37760:62:0;;;7063:21:1;7120:2;7100:18;;;7093:30;7159:33;7139:18;;;7132:61;7210:18;;37760:62:0;6879:355:1;37760:62:0;37838:17;37833:248;;37873:15;37898:19;37909:7;37898:10;:19::i;:::-;-1:-1:-1;37872:45:0;;-1:-1:-1;37932:14:0;;-1:-1:-1;;;;;;37932:14:0;37833:248;37981:23;38013:19;38024:7;38013:10;:19::i;:::-;-1:-1:-1;37979:53:0;;-1:-1:-1;38047:22:0;;-1:-1:-1;;;;;;38047:22:0;35516:198;-1:-1:-1;;;;;35606:20:0;;35582:7;35606:20;;;:11;:20;;;;;;;;35602:49;;;-1:-1:-1;;;;;;35635:16:0;;;;;:7;:16;;;;;;;35516:198::o;35602:49::-;-1:-1:-1;;;;;35689:16:0;;;;;;:7;:16;;;;;;35669:37;;:19;:37::i;20582:103::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;20647:30:::1;20674:1;20647:18;:30::i;:::-;20582:103::o:0;38949:216::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;39080:9:::1;;39065:12;:24;;39036:82;;;::::0;-1:-1:-1;;;39036:82:0;;4794:2:1;39036:82:0::1;::::0;::::1;4776:21:1::0;4833:2;4813:18;;;4806:30;4872:27;4852:18;;;4845:55;4917:18;;39036:82:0::1;4592:349:1::0;39036:82:0::1;39129:13;:28:::0;38949:216::o;35227:87::-;35266:13;35299:7;35292:14;;;;;:::i;36764:269::-;36857:4;36874:129;10527:10;36897:7;36906:96;36945:15;36906:96;;;;;;;;;;;;;;;;;10527:10;36906:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36906:34:0;;;;;;;;;;;;:38;:96::i;35722:167::-;35800:4;35817:42;10527:10;35841:9;35852:6;35817:9;:42::i;40566:171::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;40643:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;40643:32:0;;::::1;;::::0;;40691:38:::1;::::0;::::1;::::0;::::1;::::0;40667:8;3324:14:1;3317:22;3299:41;;3287:2;3272:18;;3159:187;40691:38:0::1;;;;;;;;40566:171:::0;:::o;56163:364::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;56227:13:::1;::::0;;56214:10:::1;:26:::0;56264:7:::1;::::0;;56251:10:::1;:20:::0;56295:7:::1;::::0;;56282:10:::1;:20:::0;56327:11:::1;::::0;;56313::::1;:25:::0;-1:-1:-1;56364:7:0;56349:12:::1;:22:::0;-1:-1:-1;56382:17:0;;;;56410:11;;;;56432;;;56454:15;56480:21:::1;:29:::0;;-1:-1:-1;;56480:29:0::1;::::0;;56163:364::o;39365:202::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;39488:13:::1;;39475:10;:26;;39448:76;;;::::0;-1:-1:-1;;;39448:76:0;;11305:2:1;39448:76:0::1;::::0;::::1;11287:21:1::0;11344:2;11324:18;;;11317:30;-1:-1:-1;;;11363:18:1;;;11356:49;11422:18;;39448:76:0::1;11103:343:1::0;39448:76:0::1;39535:11;:24:::0;39365:202::o;39578:265::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;39681:17:::1;;39665:12;:33;;:55;;;;;39717:3;39702:12;:18;;39665:55;39657:92;;;::::0;-1:-1:-1;;;39657:92:0;;9372:2:1;39657:92:0::1;::::0;::::1;9354:21:1::0;9411:2;9391:18;;;9384:30;9450:27;9430:18;;;9423:55;9495:18;;39657:92:0::1;9170:349:1::0;39657:92:0::1;39775:60;39819:5;39775:25;39787:12;39775:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:60::i;:::-;39760:12;:75:::0;-1:-1:-1;39578:265:0:o;40169:389::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40271:19:0;::::1;;::::0;;;:12:::1;:19;::::0;;;;;::::1;;40263:65;;;::::0;-1:-1:-1;;;40263:65:0;;8970:2:1;40263:65:0::1;::::0;::::1;8952:21:1::0;9009:2;8989:18;;;8982:30;9048:34;9028:18;;;9021:62;-1:-1:-1;;;9099:18:1;;;9092:31;9140:19;;40263:65:0::1;8768:397:1::0;40263:65:0::1;-1:-1:-1::0;;;;;40343:25:0;::::1;;::::0;;;:18:::1;:25;::::0;;;;;::::1;;40339:77;;;40385:19;40398:5;40385:12;:19::i;:::-;-1:-1:-1::0;;;;;40426:19:0;;::::1;40448:5;40426:19:::0;;;:12:::1;:19;::::0;;;;:27;;-1:-1:-1;;40426:27:0::1;::::0;;40468:17:::1;::::0;;;::::1;:26;40464:87;;;40510:29;40530:8;40510:19;:29::i;:::-;40169:389:::0;;:::o;38563:188::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38638:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;38630:67;;;::::0;-1:-1:-1;;;38630:67:0;;6725:2:1;38630:67:0::1;::::0;::::1;6707:21:1::0;6764:2;6744:18;;;6737:30;6803:29;6783:18;;;6776:57;6850:18;;38630:67:0::1;6523:351:1::0;38630:67:0::1;-1:-1:-1::0;;;;;38708:27:0::1;38738:5;38708:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;38708:35:0::1;::::0;;38563:188::o;20840:201::-;19977:7;20004:6;-1:-1:-1;;;;;20004:6:0;10527:10;20151:23;20143:68;;;;-1:-1:-1;;;20143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20929:22:0;::::1;20921:73;;;::::0;-1:-1:-1;;;20921:73:0;;5559:2:1;20921:73:0::1;::::0;::::1;5541:21:1::0;5598:2;5578:18;;;5571:30;5637:34;5617:18;;;5610:62;-1:-1:-1;;;5688:18:1;;;5681:36;5734:19;;20921:73:0::1;5357:402:1::0;20921:73:0::1;21005:28;21024:8;21005:18;:28::i;:::-;20840:201:::0;:::o;6480:98::-;6538:7;6565:5;6569:1;6565;:5;:::i;6879:98::-;6937:7;6964:5;6968:1;6964;:5;:::i;44961:337::-;-1:-1:-1;;;;;45054:19:0;;45046:68;;;;-1:-1:-1;;;45046:68:0;;10487:2:1;45046:68:0;;;10469:21:1;10526:2;10506:18;;;10499:30;10565:34;10545:18;;;10538:62;-1:-1:-1;;;10616:18:1;;;10609:34;10660:19;;45046:68:0;10285:400:1;45046:68:0;-1:-1:-1;;;;;45133:21:0;;45125:68;;;;-1:-1:-1;;;45125:68:0;;5966:2:1;45125:68:0;;;5948:21:1;6005:2;5985:18;;;5978:30;6044:34;6024:18;;;6017:62;-1:-1:-1;;;6095:18:1;;;6088:32;6137:19;;45125:68:0;5764:398:1;45125:68:0;-1:-1:-1;;;;;45206:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;45258:32;;11597:25:1;;;45258:32:0;;11570:18:1;45258:32:0;;;;;;;44961:337;;;:::o;45306:2013::-;-1:-1:-1;;;;;45428:18:0;;45420:68;;;;-1:-1:-1;;;45420:68:0;;9726:2:1;45420:68:0;;;9708:21:1;9765:2;9745:18;;;9738:30;9804:34;9784:18;;;9777:62;-1:-1:-1;;;9855:18:1;;;9848:35;9900:19;;45420:68:0;9524:401:1;45420:68:0;-1:-1:-1;;;;;45507:16:0;;45499:64;;;;-1:-1:-1;;;45499:64:0;;4390:2:1;45499:64:0;;;4372:21:1;4429:2;4409:18;;;4402:30;4468:34;4448:18;;;4441:62;-1:-1:-1;;;4519:18:1;;;4512:33;4562:19;;45499:64:0;4188:399:1;45499:64:0;45591:1;45582:6;:10;45574:64;;;;-1:-1:-1;;;45574:64:0;;8211:2:1;45574:64:0;;;8193:21:1;8250:2;8230:18;;;8223:30;8289:34;8269:18;;;8262:62;-1:-1:-1;;;8340:18:1;;;8333:39;8389:19;;45574:64:0;8009:405:1;45574:64:0;45720:13;-1:-1:-1;;;;;45706:28:0;:2;-1:-1:-1;;;;;45706:28:0;;45702:81;;;45760:11;;45750:7;:21;45702:81;19977:7;20004:6;-1:-1:-1;;;;;45798:15:0;;;20004:6;;45798:15;;;;:32;;-1:-1:-1;19977:7:0;20004:6;-1:-1:-1;;;;;45817:13:0;;;20004:6;;45817:13;;45798:32;45795:125;;;45863:12;;45853:6;:22;;45845:75;;;;-1:-1:-1;;;45845:75:0;;7441:2:1;45845:75:0;;;7423:21:1;7480:2;7460:18;;;7453:30;7519:34;7499:18;;;7492:62;-1:-1:-1;;;7570:18:1;;;7563:38;7618:19;;45845:75:0;7239:404:1;45845:75:0;46215:28;46246:24;46264:4;46246:9;:24::i;:::-;46215:55;;46318:12;;46294:20;:36;46291:112;;-1:-1:-1;46379:12:0;;46291:112;46474:29;;46450:53;;;;;;;46532;;-1:-1:-1;46569:16:0;;;;46568:17;46532:53;:91;;;;;46610:13;-1:-1:-1;;;;;46602:21:0;:4;-1:-1:-1;;;;;46602:21:0;;;46532:91;:129;;;;-1:-1:-1;46640:21:0;;;;;;;46532:129;46514:318;;;46711:29;;46688:52;;46784:36;46799:20;46784:14;:36::i;:::-;-1:-1:-1;;;;;47040:24:0;;46913:12;47040:24;;;:18;:24;;;;;;46928:4;;47040:24;;;:50;;-1:-1:-1;;;;;;47068:22:0;;;;;;:18;:22;;;;;;;;47040:50;47037:96;;;-1:-1:-1;47116:5:0;47037:96;47219:38;47234:4;47239:2;47242:6;47249:7;47219:14;:38::i;:::-;47296:15;44670;;44660:7;:25;44712:21;;44696:13;:37;44754:15;;44744:7;:25;44794:16;;44780:11;:30;44616:202;47296:15;45409:1910;;;45306:2013;;;:::o;8021:240::-;8141:7;8202:12;8194:6;;;;8186:29;;;;-1:-1:-1;;;8186:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;8237:5:0;;;8021:240::o;42226:163::-;42267:7;42288:15;42305;42324:19;:17;:19::i;:::-;42287:56;;-1:-1:-1;42287:56:0;-1:-1:-1;42361:20:0;42287:56;;42361:11;:20::i;:::-;42354:27;;;;42226:163;:::o;5742:98::-;5800:7;5827:5;5831:1;5827;:5;:::i;40843:454::-;40902:7;40911;40920;40929;40938;40947;40956;40977:23;41002:12;41016:18;41036:12;41052:20;41064:7;41052:11;:20::i;:::-;40976:96;;;;;;;;41084:15;41101:23;41126:12;41142:56;41154:7;41163:4;41169:10;41181:4;41187:10;:8;:10::i;:::-;41142:11;:56::i;:::-;41083:115;;-1:-1:-1;41083:115:0;-1:-1:-1;41083:115:0;-1:-1:-1;41249:15:0;;-1:-1:-1;41266:4:0;;-1:-1:-1;41272:10:0;;-1:-1:-1;41284:4:0;-1:-1:-1;;;;40843:454:0;;;;;;;;;:::o;6123:98::-;6181:7;6208:5;6212:1;6208;:5;:::i;21201:191::-;21275:16;21294:6;;-1:-1:-1;;;;;21311:17:0;;;-1:-1:-1;;;;;;21311:17:0;;;;;;21344:40;;21294:6;;;;;;;21344:40;;21275:16;21344:40;21264:128;21201:191;:::o;47327:985::-;33237:16;:23;;-1:-1:-1;;33237:23:0;33256:4;33237:23;;;:16;47478:27:::1;:20:::0;47503:1:::1;47478:24;:27::i;:::-;47463:42:::0;-1:-1:-1;47516:17:0::1;47536:30;:20:::0;47463:42;47536:24:::1;:30::i;:::-;47516:50:::0;-1:-1:-1;47869:21:0::1;47935:22;47952:4:::0;47935:16:::1;:22::i;:::-;48088:18;48109:41;:21;48135:14:::0;48109:25:::1;:41::i;:::-;48088:62;;48200:35;48213:9;48224:10;48200:12;:35::i;:::-;48261:43;::::0;;12820:25:1;;;12876:2;12861:18;;12854:34;;;12904:18;;;12897:34;;;48261:43:0::1;::::0;12808:2:1;12793:18;48261:43:0::1;;;;;;;-1:-1:-1::0;;33283:16:0;:24;;-1:-1:-1;;33283:24:0;;;-1:-1:-1;;;47327:985:0:o;52669:839::-;52780:7;52776:40;;52802:14;:12;:14::i;:::-;-1:-1:-1;;;;;52841:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;52865:22:0;;;;;;:11;:22;;;;;;;;52864:23;52841:46;52837:597;;;52904:48;52926:6;52934:9;52945:6;52904:21;:48::i;:::-;52837:597;;;-1:-1:-1;;;;;52975:19:0;;;;;;:11;:19;;;;;;;;52974:20;:46;;;;-1:-1:-1;;;;;;52998:22:0;;;;;;:11;:22;;;;;;;;52974:46;52970:464;;;53037:46;53057:6;53065:9;53076:6;53037:19;:46::i;52970:464::-;-1:-1:-1;;;;;53106:19:0;;;;;;:11;:19;;;;;;;;53105:20;:47;;;;-1:-1:-1;;;;;;53130:22:0;;;;;;:11;:22;;;;;;;;53129:23;53105:47;53101:333;;;53169:44;53187:6;53195:9;53206:6;53169:17;:44::i;53101:333::-;-1:-1:-1;;;;;53235:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;53258:22:0;;;;;;:11;:22;;;;;;;;53235:45;53231:203;;;53297:48;53319:6;53327:9;53338:6;53297:21;:48::i;53231:203::-;53378:44;53396:6;53404:9;53415:6;53378:17;:44::i;:::-;52669:839;;;;:::o;42397:561::-;42494:7;;42530;;42447;;;;;42554:289;42578:9;:16;42574:20;;42554:289;;;42644:7;42620;:21;42628:9;42638:1;42628:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42628:12:0;42620:21;;;;;;;;;;;;;:31;;:66;;;42679:7;42655;:21;42663:9;42673:1;42663:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42663:12:0;42655:21;;;;;;;;;;;;;:31;42620:66;42616:97;;;42696:7;;42705;;42688:25;;;;;;;42397:561;;:::o;42616:97::-;42738:34;42750:7;:21;42758:9;42768:1;42758:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42758:12:0;42750:21;;;;;;;;;;;;;42738:7;;:11;:34::i;:::-;42728:44;;42797:34;42809:7;:21;42817:9;42827:1;42817:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;42817:12:0;42809:21;;;;;;;;;;;;;42797:7;;:11;:34::i;:::-;42787:44;-1:-1:-1;42596:3:0;;;;:::i;:::-;;;;42554:289;;;-1:-1:-1;42879:7:0;;42867;;:20;;:11;:20::i;:::-;42857:7;:30;42853:61;;;42897:7;;42906;;42889:25;;;;;;42397:561;;:::o;42853:61::-;42933:7;;42942;;-1:-1:-1;42397:561:0;-1:-1:-1;42397:561:0:o;41305:405::-;41365:7;41374;41383;41392;41412:12;41427:24;41443:7;41427:15;:24::i;:::-;41412:39;;41462:18;41483:30;41505:7;41483:21;:30::i;:::-;41462:51;;41524:12;41539:24;41555:7;41539:15;:24::i;:::-;41524:39;-1:-1:-1;41574:23:0;41600:43;41524:39;41600:33;41622:10;41600:33;:7;41612:4;41600:11;:17::i;:::-;:21;;:33::i;:43::-;41574:69;41679:4;;-1:-1:-1;41685:10:0;;-1:-1:-1;41685:10:0;-1:-1:-1;41305:405:0;;-1:-1:-1;;;41305:405:0:o;41718:500::-;41847:7;;;;41903:24;:7;41915:11;41903;:24::i;:::-;41885:42;-1:-1:-1;41938:12:0;41953:21;:4;41962:11;41953:8;:21::i;:::-;41938:36;-1:-1:-1;41985:18:0;42006:27;:10;42021:11;42006:14;:27::i;:::-;41985:48;-1:-1:-1;42044:12:0;42059:21;:4;42068:11;42059:8;:21::i;:::-;42044:36;-1:-1:-1;42091:23:0;42117:43;42044:36;42117:33;42139:10;42117:33;:7;42129:4;42117:11;:17::i;:43::-;42179:7;;;;-1:-1:-1;42205:4:0;;-1:-1:-1;41718:500:0;;-1:-1:-1;;;;;;;;;41718:500:0:o;48320:2057::-;48469:16;;;48483:1;48469:16;;;;;;;;48445:21;;48469:16;;;;;;;;;;-1:-1:-1;48469:16:0;48445:40;;48514:4;48496;48501:1;48496:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48496:23:0;;;:7;;;;;;;;;:23;35110:8;;;48530:4;48535:1;48530:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;48530:23:0;;;-1:-1:-1;;;;;48530:23:0;;;;;48566:62;48583:4;48598:15;48616:11;48566:8;:62::i;:::-;48671:224;;-1:-1:-1;;;48671:224:0;;-1:-1:-1;;;;;48671:15:0;:66;;;;:224;;48752:11;;48778:1;;48822:4;;48849;;48869:15;;48671:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48667:1703;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48951:248:0;;-1:-1:-1;;;48951:248:0;;-1:-1:-1;;;;;48951:15:0;:66;;;;:248;;49036:11;;49066:1;;49114:4;;49145;;49169:15;;48951:248;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48947:1410;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49259:273:0;;-1:-1:-1;;;49259:273:0;;-1:-1:-1;;;;;49259:15:0;:67;;;;:273;;49349:11;;49383:1;;49435:4;;49470;;49498:15;;49259:273;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49255:1085;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49601:295:0;;-1:-1:-1;;;49601:295:0;;-1:-1:-1;;;;;49601:15:0;:65;;;;:295;;49693:11;;49731:1;;49787:4;;49826;;49858:15;;49601:295;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49597:720;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49969:320:0;;-1:-1:-1;;;49969:320:0;;-1:-1:-1;;;;;49969:15:0;:66;;;;:320;;50066:11;;50108:1;;50168:4;;50211;;50247:15;;49969:320;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49920:397;49597:720;49554:786;49216:1141;48947:1410;48910:1460;40169:389;;:::o;50385:2203::-;50533:62;50550:4;50565:15;50583:11;50533:8;:62::i;:::-;50849:4;;50644:250;;-1:-1:-1;;;50644:250:0;;-1:-1:-1;;;;;50644:15:0;:31;;;;;50684:9;;50644:250;;50717:4;;50737:11;;50763:1;;;;50849:4;;;50868:15;;50644:250;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50644:250:0;;;;;;;;-1:-1:-1;;50644:250:0;;;;;;;;;;;;:::i;:::-;;;50640:1939;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51186:4:0;;50961:278;;-1:-1:-1;;;50961:278:0;;-1:-1:-1;;;;;50961:15:0;:31;;;;;51001:9;;50961:278;;51038:4;;51062:11;;51092:1;;;;51186:4;;;51209:15;;50961:278;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50961:278:0;;;;;;;;-1:-1:-1;;50961:278:0;;;;;;;;;;;;:::i;:::-;;;50957:1611;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51562:4:0;;51316:307;;-1:-1:-1;;;51316:307:0;;-1:-1:-1;;;;;51316:15:0;:32;;;;;51357:9;;51316:307;;51398:4;;51426:11;;51460:1;;;;51562:4;;;51589:15;;51316:307;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51316:307:0;;;;;;;;-1:-1:-1;;51316:307:0;;;;;;;;;;;;:::i;:::-;;;51312:1239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51976:4:0;;51712:333;;-1:-1:-1;;;51712:333:0;;-1:-1:-1;;;;;51712:15:0;:30;;;;;51751:9;;51712:333;;51796:4;;51828:11;;51866:1;;;;51976:4;;;52007:15;;51712:333;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51712:333:0;;;;;;;;-1:-1:-1;;51712:333:0;;;;;;;;;;;;:::i;:::-;;;51708:822;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52429:4:0;;52144:362;;-1:-1:-1;;;52144:362:0;;-1:-1:-1;;;;;52144:15:0;:31;;;;;52184:9;;52144:362;;52233:4;;52269:11;;52311:1;;;;52429:4;;;52464:15;;52144:362;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52094:436;51708:822;;;;;;51664:887;51312:1239;;;;;;51272:1296;48910:1460;40169:389;;:::o;44213:391::-;44259:7;;:12;:34;;;;-1:-1:-1;44275:13:0;;:18;44259:34;:50;;;;-1:-1:-1;44297:7:0;;:12;44259:50;44256:62;;;44213:391::o;44256:62::-;44356:7;;;44338:15;:25;44398:13;;;44374:21;:37;44440:7;;;44422:15;:25;44477:11;;;44458:16;:30;-1:-1:-1;44509:11:0;;;;44531:17;;;;44559:11;;;44581:15;44213:391::o;54698:605::-;54801:15;54818:23;54843:12;54857:23;54882:12;54896:18;54916:12;54932:19;54943:7;54932:10;:19::i;:::-;54800:151;;;;;;;;;;;;;;54980:28;55000:7;54980;:15;54988:6;-1:-1:-1;;;;;54980:15:0;-1:-1:-1;;;;;54980:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;54962:15:0;;;;;;:7;:15;;;;;;;;:46;;;;55037:7;:15;;;;:28;;55057:7;55037:19;:28::i;:::-;-1:-1:-1;;;;;55019:15:0;;;;;;;:7;:15;;;;;;:46;;;;55097:18;;;;;;;:39;;55120:15;55097:22;:39::i;:::-;-1:-1:-1;;;;;55076:18:0;;;;;;:7;:18;;;;;:60;55150:26;55165:10;55150:14;:26::i;:::-;55187:14;55196:4;55187:8;:14::i;:::-;55212:23;55224:4;55230;55212:11;:23::i;:::-;55268:9;-1:-1:-1;;;;;55251:44:0;55260:6;-1:-1:-1;;;;;55251:44:0;;55279:15;55251:44;;;;11597:25:1;;11585:2;11570:18;;11451:177;55251:44:0;;;;;;;;54789:514;;;;;;;54698:605;;;:::o;54065:625::-;54166:15;54183:23;54208:12;54222:23;54247:12;54261:18;54281:12;54297:19;54308:7;54297:10;:19::i;:::-;54165:151;;;;;;;;;;;;;;54345:28;54365:7;54345;:15;54353:6;-1:-1:-1;;;;;54345:15:0;-1:-1:-1;;;;;54345:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;54327:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;54405:18;;;;;:7;:18;;;;;:39;;54428:15;54405:22;:39::i;:::-;-1:-1:-1;;;;;54384:18:0;;;;;;:7;:18;;;;;;;;:60;;;;54476:7;:18;;;;:39;;54499:15;54476:22;:39::i;53516:541::-;53615:15;53632:23;53657:12;53671:23;53696:12;53710:18;53730:12;53746:19;53757:7;53746:10;:19::i;:::-;53614:151;;;;;;;;;;;;;;53794:28;53814:7;53794;:15;53802:6;-1:-1:-1;;;;;53794:15:0;-1:-1:-1;;;;;53794:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;55311:689::-;55414:15;55431:23;55456:12;55470:23;55495:12;55509:18;55529:12;55545:19;55556:7;55545:10;:19::i;:::-;55413:151;;;;;;;;;;;;;;55593:28;55613:7;55593;:15;55601:6;-1:-1:-1;;;;;55593:15:0;-1:-1:-1;;;;;55593:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;55575:15:0;;;;;;:7;:15;;;;;;;;:46;;;;55650:7;:15;;;;:28;;55670:7;55650:19;:28::i;43691:166::-;43755:7;43786:63;43829:5;43786:20;43798:7;;43786;:11;;:20;;;;:::i;43865:166::-;43935:7;43962:61;44007:5;43962:26;43974:13;;43962:7;:11;;:26;;;;:::i;44043:154::-;44107:7;44134:55;44173:5;44134:20;44146:7;;44134;:11;;:20;;;;:::i;42970:355::-;43033:19;43056:10;:8;:10::i;:::-;43033:33;-1:-1:-1;43077:18:0;43098:27;:10;43033:33;43098:14;:27::i;:::-;43177:4;43161:22;;;;:7;:22;;;;;;43077:48;;-1:-1:-1;43161:38:0;;43077:48;43161:26;:38::i;:::-;43152:4;43136:22;;;;:7;:22;;;;;;;;:63;;;;43213:11;:26;;;;;;43210:107;;;43295:4;43279:22;;;;:7;:22;;;;;;:38;;43306:10;43279:26;:38::i;:::-;43270:4;43254:22;;;;:7;:22;;;;;:63;43022:303;;42970:355;:::o;43337:338::-;43388:19;43410:10;:8;:10::i;:::-;43388:32;-1:-1:-1;43431:12:0;43446:21;:4;43388:32;43446:8;:21::i;:::-;43515:17;;-1:-1:-1;;;;;43515:17:0;43507:26;;;;:7;:26;;;;;;43431:36;;-1:-1:-1;43507:36:0;;43431;43507:30;:36::i;:::-;43486:17;;;-1:-1:-1;;;;;43486:17:0;;;43478:26;;;;:7;:26;;;;;;;;:65;;;;43569:17;;;;;43557:30;;:11;:30;;;;;;;43554:113;;;43639:17;;-1:-1:-1;;;;;43639:17:0;43631:26;;;;:7;:26;;;;;;:36;;43662:4;43631:30;:36::i;:::-;43610:17;;-1:-1:-1;;;;;43610:17:0;43602:26;;;;:7;:26;;;;;:65;43377:298;;43337:338;:::o;56008:147::-;56086:7;;:17;;56098:4;56086:11;:17::i;:::-;56076:7;:27;56127:10;;:20;;56142:4;56127:14;:20::i;:::-;56114:10;:33;-1:-1:-1;;56008:147:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:254::-;1214:6;1222;1275:2;1263:9;1254:7;1250:23;1246:32;1243:52;;;1291:1;1288;1281:12;1243:52;1314:29;1333:9;1314:29;:::i;:::-;1304:39;1390:2;1375:18;;;;1362:32;;-1:-1:-1;;;1146:254:1:o;1405:180::-;1461:6;1514:2;1502:9;1493:7;1489:23;1485:32;1482:52;;;1530:1;1527;1520:12;1482:52;1553:26;1569:9;1553:26;:::i;1590:180::-;1649:6;1702:2;1690:9;1681:7;1677:23;1673:32;1670:52;;;1718:1;1715;1708:12;1670:52;-1:-1:-1;1741:23:1;;1590:180;-1:-1:-1;1590:180:1:o;1775:248::-;1840:6;1848;1901:2;1889:9;1880:7;1876:23;1872:32;1869:52;;;1917:1;1914;1907:12;1869:52;1953:9;1940:23;1930:33;;1982:35;2013:2;2002:9;1998:18;1982:35;:::i;2028:306::-;2116:6;2124;2132;2185:2;2173:9;2164:7;2160:23;2156:32;2153:52;;;2201:1;2198;2191:12;2153:52;2230:9;2224:16;2214:26;;2280:2;2269:9;2265:18;2259:25;2249:35;;2324:2;2313:9;2309:18;2303:25;2293:35;;2028:306;;;;;:::o;2547:607::-;-1:-1:-1;;;;;2906:15:1;;;2888:34;;2953:2;2938:18;;2931:34;;;;2996:2;2981:18;;2974:34;;;;3039:2;3024:18;;3017:34;;;;3088:15;;;3082:3;3067:19;;3060:44;2868:3;3120:19;;3113:35;;;;2837:3;2822:19;;2547:607::o;3586:597::-;3698:4;3727:2;3756;3745:9;3738:21;3788:6;3782:13;3831:6;3826:2;3815:9;3811:18;3804:34;3856:1;3866:140;3880:6;3877:1;3874:13;3866:140;;;3975:14;;;3971:23;;3965:30;3941:17;;;3960:2;3937:26;3930:66;3895:10;;3866:140;;;4024:6;4021:1;4018:13;4015:91;;;4094:1;4089:2;4080:6;4069:9;4065:22;4061:31;4054:42;4015:91;-1:-1:-1;4167:2:1;4146:15;-1:-1:-1;;4142:29:1;4127:45;;;;4174:2;4123:54;;3586:597;-1:-1:-1;;;3586:597:1:o;7648:356::-;7850:2;7832:21;;;7869:18;;;7862:30;7928:34;7923:2;7908:18;;7901:62;7995:2;7980:18;;7648:356::o;11633:980::-;11895:4;11943:3;11932:9;11928:19;11974:6;11963:9;11956:25;12000:2;12038:6;12033:2;12022:9;12018:18;12011:34;12081:3;12076:2;12065:9;12061:18;12054:31;12105:6;12140;12134:13;12171:6;12163;12156:22;12209:3;12198:9;12194:19;12187:26;;12248:2;12240:6;12236:15;12222:29;;12269:1;12279:195;12293:6;12290:1;12287:13;12279:195;;;12358:13;;-1:-1:-1;;;;;12354:39:1;12342:52;;12449:15;;;;12414:12;;;;12390:1;12308:9;12279:195;;;-1:-1:-1;;;;;;;12530:32:1;;;;12525:2;12510:18;;12503:60;-1:-1:-1;;;12594:3:1;12579:19;12572:35;12491:3;11633:980;-1:-1:-1;;;11633:980:1:o;13131:128::-;13171:3;13202:1;13198:6;13195:1;13192:13;13189:39;;;13208:18;;:::i;:::-;-1:-1:-1;13244:9:1;;13131:128::o;13264:217::-;13304:1;13330;13320:132;;13374:10;13369:3;13365:20;13362:1;13355:31;13409:4;13406:1;13399:15;13437:4;13434:1;13427:15;13320:132;-1:-1:-1;13466:9:1;;13264:217::o;13486:168::-;13526:7;13592:1;13588;13584:6;13580:14;13577:1;13574:21;13569:1;13562:9;13555:17;13551:45;13548:71;;;13599:18;;:::i;:::-;-1:-1:-1;13639:9:1;;13486:168::o;13659:125::-;13699:4;13727:1;13724;13721:8;13718:34;;;13732:18;;:::i;:::-;-1:-1:-1;13769:9:1;;13659:125::o;13789:380::-;13868:1;13864:12;;;;13911;;;13932:61;;13986:4;13978:6;13974:17;13964:27;;13932:61;14039:2;14031:6;14028:14;14008:18;14005:38;14002:161;;;14085:10;14080:3;14076:20;14073:1;14066:31;14120:4;14117:1;14110:15;14148:4;14145:1;14138:15;14002:161;;13789:380;;;:::o;14174:135::-;14213:3;-1:-1:-1;;14234:17:1;;14231:43;;;14254:18;;:::i;:::-;-1:-1:-1;14301:1:1;14290:13;;14174:135::o;14314:127::-;14375:10;14370:3;14366:20;14363:1;14356:31;14406:4;14403:1;14396:15;14430:4;14427:1;14420:15;14446:127;14507:10;14502:3;14498:20;14495:1;14488:31;14538:4;14535:1;14528:15;14562:4;14559:1;14552:15

Swarm Source

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