ETH Price: $2,972.35 (+3.75%)
Gas: 2 Gwei

Token

Ra Burns (RAB)
 

Overview

Max Total Supply

1,000,000 RAB

Holders

145

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
879.269165898106626453 RAB

Value
$0.00
0x92ff563ce14fc62a5a87961cabf1f98748fbbaee
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:
RABurns

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-02
*/

// Sources flattened with hardhat v2.10.2 https://hardhat.org

// File @openzeppelin/contracts/token/ERC20/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/math/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/access/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File contracts/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// File contracts/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

// File contracts/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File contracts/IUniswapV2Router02.sol

pragma solidity >=0.6.2;

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

// File contracts/RAB.sol

/**

ÔûêÔûêÔûêÔûêÔûêÔûêÔòùÔûæÔûæÔûêÔûêÔûêÔûêÔûêÔòùÔûæÔÇâÔÇâÔûêÔûêÔûêÔûêÔûêÔûêÔòùÔûæÔûêÔûêÔòùÔûæÔûæÔûæÔûêÔûêÔòùÔûêÔûêÔûêÔûêÔûêÔûêÔòùÔûæÔûêÔûêÔûêÔòùÔûæÔûæÔûêÔûêÔòùÔûæÔûêÔûêÔûêÔûêÔûêÔûêÔòù
ÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔÇâÔÇâÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔûêÔûêÔòæÔûæÔûæÔûæÔûêÔûêÔòæÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔûêÔûêÔûêÔûêÔòùÔûæÔûêÔûêÔòæÔûêÔûêÔòöÔòÉÔòÉÔòÉÔòÉÔòØ
ÔûêÔûêÔûêÔûêÔûêÔûêÔòöÔòØÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔòæÔÇâÔÇâÔûêÔûêÔûêÔûêÔûêÔûêÔòªÔòØÔûêÔûêÔòæÔûæÔûæÔûæÔûêÔûêÔòæÔûêÔûêÔûêÔûêÔûêÔûêÔòöÔòØÔûêÔûêÔòöÔûêÔûêÔòùÔûêÔûêÔòæÔòÜÔûêÔûêÔûêÔûêÔûêÔòùÔûæ
ÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòæÔÇâÔÇâÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔûêÔûêÔòæÔûæÔûæÔûæÔûêÔûêÔòæÔûêÔûêÔòöÔòÉÔòÉÔûêÔûêÔòùÔûêÔûêÔòæÔòÜÔûêÔûêÔûêÔûêÔòæÔûæÔòÜÔòÉÔòÉÔòÉÔûêÔûêÔòù
ÔûêÔûêÔòæÔûæÔûæÔûêÔûêÔòæÔûêÔûêÔòæÔûæÔûæÔûêÔûêÔòæÔÇâÔÇâÔûêÔûêÔûêÔûêÔûêÔûêÔòªÔòØÔòÜÔûêÔûêÔûêÔûêÔûêÔûêÔòöÔòØÔûêÔûêÔòæÔûæÔûæÔûêÔûêÔòæÔûêÔûêÔòæÔûæÔòÜÔûêÔûêÔûêÔòæÔûêÔûêÔûêÔûêÔûêÔûêÔòöÔòØ
ÔòÜÔòÉÔòØÔûæÔûæÔòÜÔòÉÔòØÔòÜÔòÉÔòØÔûæÔûæÔòÜÔòÉÔòØÔÇâÔÇâÔòÜÔòÉÔòÉÔòÉÔòÉÔòÉÔòØÔûæÔûæÔòÜÔòÉÔòÉÔòÉÔòÉÔòÉÔòØÔûæÔòÜÔòÉÔòØÔûæÔûæÔòÜÔòÉÔòØÔòÜÔòÉÔòØÔûæÔûæÔòÜÔòÉÔòÉÔòØÔòÜÔòÉÔòÉÔòÉÔòÉÔòÉÔòØÔûæ

                                        
                   ##                   
                  #####                 
                 #######                
               ##########   ##          
              ########### ###(          
            #####/ ###########          
           #####   ###########*         
           ####    #######  ####        
       #   ####     ######   ,###       
      ###  #####      #####    ###      
      ##### ####(        ####  /###     
       ###########         ###,###,     
        ###########    ##.  ######      
         ############   ### #####       
           ##########   ######          
               ####    ###             

­ƒöÑ Telegram: https://t.me/raburns

­ƒÉª Twitter: https://twitter.com/RABurnsToken

­ƒîÉ Website: https://raburns.xyz

$RAB Features:
    - Buy tax : 6%
    - Sell tax : 6%
        - 2% Burn (tokens removed from circulation)
        - 2% Dev/Marketing (to ensure project longevity)
        - 1% Liquidity (Tokens not swapped, but injected directly into LP to inflate K-Score / ensure higher floors & less dumps)
        - 1% Reflection (Ra gives rewards to his loyals)

    - 1% of supply max Buy/Sell tax restriction in functions
    - Contract is renounced
    - LP is burned
 */

pragma solidity 0.8.13;

// import "hardhat/console.sol";

contract RABurns is IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    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 _isExcludedFromRewards;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 public startSupply = 1e6 * 10**18;
    uint256 private _tTotal = 1e6 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    address private constant deadAddress = address(0xdead);

    string private _name = "Ra Burns";
    string private _symbol = "RAB";
    uint8 private _decimals = 18;

    uint256 public _reflectionFee = 1;
    uint256 private _previousReflectionTaxFee = _reflectionFee;

    uint256 public _burnFee = 2;
    uint256 private _previousBurnFee = _burnFee;

    uint256 public _devFee = 2;
    uint256 private _previousDevFee = _devFee;

    uint256 public _liqFee = 1;
    uint256 private _previousLiqFee = _liqFee;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inSwap;
    bool public swapEnabled = true;

    uint256 public _maxTxAmount = (_tTotal * 1) / 100; //1%
    uint256 private numTokensSellToAddToLiquidityAndDev =
        (_tTotal * 10) / 100000; //0.01%

    address private dev1 = 0xd07b5a6819afA155E74c28c72fe30db926be6152;
    address private dev2 = 0x90C824A56E87376dD394b51bC0fdAF10F1bA81AB;

    struct TValues {
        uint256 tTransferAmount;
        uint256 tReflection;
        uint256 tDev;
        uint256 tBurn;
        uint256 tLiq;
    }
    struct RValues {
        uint256 rAmount;
        uint256 rTransferAmount;
        uint256 rReflection;
        uint256 rDev;
        uint256 rBurn;
        uint256 rLiq;
    }

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapEnabledUpdated(bool enabled);
    event Swap(uint256 tokensSwapped, uint256 forDev, uint256 forLiq);
    event Burn(uint256 amount, uint256 newSupply);
    event Liquidity(uint256 amount);

    modifier lockTheSwap() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor() {
        _rOwned[_msgSender()] = _rTotal;

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

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;

        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(0xdead)] = true;
        excludeFromReward(uniswapV2Pair);
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    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 (_isExcludedFromRewards[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 _isExcludedFromRewards[account];
    }

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

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(
            !_isExcludedFromRewards[sender],
            "Excluded addresses cannot call this function"
        );
        (, RValues memory rValues) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rValues.rAmount);
        _rTotal = _rTotal.sub(rValues.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) {
            (, RValues memory rValues) = _getValues(tAmount);
            return rValues.rAmount;
        } else {
            (, RValues memory rValues) = _getValues(tAmount);
            return rValues.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 excludeFromReward(address account) public onlyOwner {
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(
            !_isExcludedFromRewards[account],
            "Account is already excluded"
        );
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcludedFromRewards[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromRewards[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function setBurnFeePercent(uint256 burnFee) external onlyOwner {
        _burnFee = burnFee;
    }

    function setDevFeePercent(uint256 devFee) external onlyOwner {
        _devFee = devFee;
    }

    function setReflectionFeePercent(uint256 reflectionFee) external onlyOwner {
        _reflectionFee = reflectionFee;
    }

    function setLiquidityFeePercent(uint256 liqFee) external onlyOwner {
        _liqFee = liqFee;
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(10**2);
    }

    function setSwapPercent(uint256 maxSwapPercent) external onlyOwner {
        numTokensSellToAddToLiquidityAndDev = _tTotal.mul(maxSwapPercent).div(
            10**5
        );
    }

    function setSwapEnabled(bool _enabled) public onlyOwner {
        swapEnabled = _enabled;
        emit SwapEnabledUpdated(_enabled);
    }

    function setDev1Address(address _dev1) external onlyOwner {
        dev1 = _dev1;
    }

    function setDev2Address(address _dev2) external onlyOwner {
        dev2 = _dev2;
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

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

    function _getValues(uint256 tAmount)
        private
        view
        returns (TValues memory tValues, RValues memory rValues)
    {
        tValues = _getTValues(tAmount);
        rValues = _getRValues(tAmount, tValues, _getRate());
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (TValues memory tValues)
    {
        tValues.tReflection = calculateReflectionFee(tAmount);
        tValues.tDev = calculateDevFee(tAmount);
        tValues.tBurn = calculateBurnFee(tAmount);
        tValues.tLiq = calculateLiqFee(tAmount);
        tValues.tTransferAmount = tAmount
            .sub(tValues.tReflection)
            .sub(tValues.tDev)
            .sub(tValues.tBurn)
            .sub(tValues.tLiq);
    }

    function _getRValues(
        uint256 tAmount,
        TValues memory tValues,
        uint256 currentRate
    ) private pure returns (RValues memory rValues) {
        rValues.rAmount = tAmount.mul(currentRate);
        rValues.rReflection = tValues.tReflection.mul(currentRate);
        rValues.rDev = tValues.tDev.mul(currentRate);
        rValues.rBurn = tValues.tBurn.mul(currentRate);
        rValues.rLiq = tValues.tLiq.mul(currentRate);
        rValues.rTransferAmount = rValues
            .rAmount
            .sub(rValues.rReflection)
            .sub(rValues.rDev)
            .sub(rValues.rBurn)
            .sub(rValues.rLiq);
    }

    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 _takeLiquidityAndDev(uint256 tLiquidity, uint256 tDev) private {
        uint256 currentRate = _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rDev = tDev.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity).add(
            rDev
        );
        if (_isExcludedFromRewards[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity).add(
                tDev
            );
    }

    function calculateReflectionFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        return _amount.mul(_reflectionFee).div(10**2);
    }

    function calculateDevFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_devFee).div(10**2);
    }

    function calculateBurnFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_burnFee).div(10**2);
    }

    function calculateLiqFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liqFee).div(10**2);
    }

    function removeAllFee() private {
        if (_reflectionFee == 0 && _devFee == 0 && _burnFee == 0) return;

        _previousReflectionTaxFee = _reflectionFee;
        _previousBurnFee = _burnFee;
        _previousDevFee = _devFee;
        _previousLiqFee = _liqFee;

        _devFee = 0;
        _burnFee = 0;
        _reflectionFee = 0;
        _liqFee = 0;
    }

    function restoreAllFee() private {
        _devFee = _previousDevFee;
        _burnFee = _previousBurnFee;
        _reflectionFee = _previousReflectionTaxFee;
        _liqFee = _previousLiqFee;
    }

    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");
        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 >=
            numTokensSellToAddToLiquidityAndDev;
        if (
            overMinTokenBalance &&
            !inSwap &&
            from != uniswapV2Pair &&
            swapEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidityAndDev;
            //add liquidity and dev fees
            swap(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);
    }

    function _burn(uint256 tBurn, uint256 rBurn) internal {
        _rOwned[deadAddress] += rBurn;
        emit Burn(tBurn, _tTotal);
    }

    function _addLiquidity(uint256 _tLiq) internal {
        uint256 currentRate = _getRate();
        uint256 _rLiq = _tLiq.mul(currentRate);
        _rOwned[uniswapV2Pair] += _rLiq;
        _tOwned[uniswapV2Pair] += _tLiq;
        emit Liquidity(_tLiq);
    }

    function swap(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance

        uint forDev = contractTokenBalance.mul(_devFee).div(_devFee + _liqFee);
        uint256 forLiq = contractTokenBalance.sub(forDev);
        // 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;

        if (forDev > 0) {
            swapTokensForEth(forDev);
            uint256 ethForDevs = address(this).balance.sub(initialBalance);
            uint256 ethForDev1 = ethForDevs.div(2);
            uint256 ethForDev2 = ethForDevs.sub(ethForDev1);
            (bool sent1, ) = payable(dev1).call{value: ethForDev1}("");
            (bool sent2, ) = payable(dev2).call{value: ethForDev2}("");
            require(sent1);
            require(sent2);
        }

        // add liquidity to uniswap
        if (forLiq > 0) {
            _addLiquidity(forLiq);
        }
        // emit Swap(half, newBalance, otherHalf);
    }

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

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

        // make the swap
        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
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            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 (
            _isExcludedFromRewards[sender] && !_isExcludedFromRewards[recipient]
        ) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (
            !_isExcludedFromRewards[sender] && _isExcludedFromRewards[recipient]
        ) {
            _transferToExcluded(sender, recipient, amount);
        } else if (
            !_isExcludedFromRewards[sender] &&
            !_isExcludedFromRewards[recipient]
        ) {
            _transferStandard(sender, recipient, amount);
        } else if (
            _isExcludedFromRewards[sender] && _isExcludedFromRewards[recipient]
        ) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if (!takeFee) restoreAllFee();
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (TValues memory tValues, RValues memory rValues) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rValues.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rValues.rTransferAmount);
        _takeLiquidityAndDev(tValues.tLiq, tValues.tDev);
        _burn(tValues.tBurn, rValues.rBurn);
        _reflectFee(rValues.rReflection, tValues.tReflection);
        emit Transfer(sender, recipient, tValues.tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (TValues memory tValues, RValues memory rValues) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rValues.rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tValues.tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rValues.rTransferAmount);
        _takeLiquidityAndDev(tValues.tLiq, tValues.tDev);
        _burn(tValues.tBurn, rValues.rBurn);
        _reflectFee(rValues.rReflection, tValues.tReflection);
        emit Transfer(sender, recipient, tValues.tTransferAmount);
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (TValues memory tValues, RValues memory rValues) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rValues.rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rValues.rTransferAmount);
        _takeLiquidityAndDev(tValues.tLiq, tValues.tDev);
        _burn(tValues.tBurn, rValues.rBurn);
        _reflectFee(rValues.rReflection, tValues.tReflection);
        emit Transfer(sender, recipient, tValues.tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (TValues memory tValues, RValues memory rValues) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rValues.rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tValues.tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rValues.rTransferAmount);
        _takeLiquidityAndDev(tValues.tLiq, tValues.tDev);
        _burn(tValues.tBurn, rValues.rBurn);
        _reflectFee(rValues.rReflection, tValues.tReflection);
        emit Transfer(sender, recipient, tValues.tTransferAmount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Liquidity","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":"forDev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"forLiq","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","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":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liqFee","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":"_reflectionFee","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":"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":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"burnFee","type":"uint256"}],"name":"setBurnFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev1","type":"address"}],"name":"setDev1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev2","type":"address"}],"name":"setDev2Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"setDevFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liqFee","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":"reflectionFee","type":"uint256"}],"name":"setReflectionFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSwapPercent","type":"uint256"}],"name":"setSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

60c060405269d3c21bcecceda100000060075569d3c21bcecceda100000060085560085460001962000032919062000eb8565b60001962000041919062000f1f565b6009556040518060400160405280600881526020017f5261204275726e73000000000000000000000000000000000000000000000000815250600b90805190602001906200009192919062000dcf565b506040518060400160405280600381526020017f5241420000000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000df92919062000dcf565b506012600d60006101000a81548160ff021916908360ff1602179055506001600e55600e54600f556002601055601054601155600260125560125460135560016014556014546015556001601660016101000a81548160ff0219169083151502179055506064600160085462000156919062000f5a565b62000162919062000fbb565b601755620186a0600a6008546200017a919062000f5a565b62000186919062000fbb565b60185573d07b5a6819afa155e74c28c72fe30db926be6152601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507390c824a56e87376dd394b51bc0fdaf10f1ba81ab601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200024057600080fd5b5062000261620002556200064760201b60201c565b6200064f60201b60201c565b60095460016000620002786200064760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200031b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034191906200105d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003cf91906200105d565b6040518363ffffffff1660e01b8152600401620003ee929190620010a0565b6020604051808303816000875af11580156200040e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043491906200105d565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050600160046000620004b16200071360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620005c760a0516200073c60201b60201c565b620005d76200064760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600854604051620006389190620010de565b60405180910390a35062001368565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200074c6200097760201b60201c565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615620007dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007d3906200115c565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115620008b95762000875600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000a0860201b60201c565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620009876200064760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620009ad6200071360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000a06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009fd90620011ce565b60405180910390fd5b565b600060095482111562000a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a499062001266565b60405180910390fd5b600062000a6462000a8860201b60201c565b905062000a80818462000ac260201b62001b131790919060201c565b915050919050565b600080600062000a9d62000ada60201b60201c565b9150915062000abb818362000ac260201b62001b131790919060201c565b9250505090565b6000818362000ad2919062000fbb565b905092915050565b600080600060095490506000600854905060005b60068054905081101562000d715782600160006006848154811062000b185762000b1762001288565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118062000c0a575081600260006006848154811062000ba25762000ba162001288565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1562000c23576009546008549450945050505062000db3565b62000cbd600160006006848154811062000c425762000c4162001288565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548462000db760201b62001b291790919060201c565b925062000d59600260006006848154811062000cde5762000cdd62001288565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548362000db760201b62001b291790919060201c565b9150808062000d6890620012b7565b91505062000aee565b5062000d9060085460095462000ac260201b62001b131790919060201c565b82101562000daa5760095460085493509350505062000db3565b81819350935050505b9091565b6000818362000dc7919062000f1f565b905092915050565b82805462000ddd9062001333565b90600052602060002090601f01602090048101928262000e01576000855562000e4d565b82601f1062000e1c57805160ff191683800117855562000e4d565b8280016001018555821562000e4d579182015b8281111562000e4c57825182559160200191906001019062000e2f565b5b50905062000e5c919062000e60565b5090565b5b8082111562000e7b57600081600090555060010162000e61565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000ec58262000e7f565b915062000ed28362000e7f565b92508262000ee55762000ee462000e89565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f2c8262000e7f565b915062000f398362000e7f565b92508282101562000f4f5762000f4e62000ef0565b5b828203905092915050565b600062000f678262000e7f565b915062000f748362000e7f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000fb05762000faf62000ef0565b5b828202905092915050565b600062000fc88262000e7f565b915062000fd58362000e7f565b92508262000fe85762000fe762000e89565b5b828204905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620010258262000ff8565b9050919050565b620010378162001018565b81146200104357600080fd5b50565b60008151905062001057816200102c565b92915050565b60006020828403121562001076576200107562000ff3565b5b6000620010868482850162001046565b91505092915050565b6200109a8162001018565b82525050565b6000604082019050620010b760008301856200108f565b620010c660208301846200108f565b9392505050565b620010d88162000e7f565b82525050565b6000602082019050620010f56000830184620010cd565b92915050565b600082825260208201905092915050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b600062001144601b83620010fb565b915062001151826200110c565b602082019050919050565b60006020820190508181036000830152620011778162001135565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011b6602083620010fb565b9150620011c3826200117e565b602082019050919050565b60006020820190508181036000830152620011e981620011a7565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b60006200124e602a83620010fb565b91506200125b82620011f0565b604082019050919050565b6000602082019050818103600083015262001281816200123f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620012c48262000e7f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620012f957620012f862000ef0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200134c57607f821691505b60208210810362001362576200136162001304565b5b50919050565b60805160a051614e39620013b86000396000818161128a01528181611fb901528181612ec30152612f39015260008181610abf01528181612cfb01528181612ddc0152612e030152614e396000f3fe6080604052600436106102555760003560e01c80636ddd171311610139578063aa45026b116100b6578063dd62ed3e1161007a578063dd62ed3e146108f7578063ded70f5114610934578063e01af92c1461095d578063ea2f0b3714610986578063f2fde38b146109af578063f6372cab146109d85761025c565b8063aa45026b14610824578063ab6e7b4a1461084f578063c0b0fda21461087a578063cea26958146108a5578063d543dbeb146108ce5761025c565b80638da5cb5b116100fd5780638da5cb5b1461072b5780638ee88c531461075657806395d89b411461077f578063a457c2d7146107aa578063a9059cbb146107e75761025c565b80636ddd17131461064457806370a082311461066f578063715018a6146106ac5780637d1db4a5146106c357806388f82020146106ee5761025c565b80633206b4aa116101d2578063437823ec11610196578063437823ec146105245780634549b0391461054d57806349bd5a5e1461058a57806352390c02146105b55780635342acb4146105de5780635739911e1461061b5761025c565b80633206b4aa146104415780633685d4191461046c578063379e29191461049557806339509351146104be5780633bd5d173146104fb5761025c565b80631f7ede2b116102195780631f7ede2b1461034a57806323b872dd146103735780632d838119146103b05780632e142c56146103ed578063313ce567146104165761025c565b806306fdde0314610261578063095ea7b31461028c57806313114a9d146102c95780631694505e146102f457806318160ddd1461031f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a03565b6040516102839190613ee8565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613fa3565b610a95565b6040516102c09190613ffe565b60405180910390f35b3480156102d557600080fd5b506102de610ab3565b6040516102eb9190614028565b60405180910390f35b34801561030057600080fd5b50610309610abd565b60405161031691906140a2565b60405180910390f35b34801561032b57600080fd5b50610334610ae1565b6040516103419190614028565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c91906140bd565b610aeb565b005b34801561037f57600080fd5b5061039a600480360381019061039591906140ea565b610afd565b6040516103a79190613ffe565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906140bd565b610bd6565b6040516103e49190614028565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906140bd565b610c44565b005b34801561042257600080fd5b5061042b610c7f565b6040516104389190614159565b60405180910390f35b34801561044d57600080fd5b50610456610c96565b6040516104639190614028565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190614174565b610c9c565b005b3480156104a157600080fd5b506104bc60048036038101906104b791906140bd565b610f5d565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190613fa3565b610f6f565b6040516104f29190613ffe565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906140bd565b611022565b005b34801561053057600080fd5b5061054b60048036038101906105469190614174565b6111a1565b005b34801561055957600080fd5b50610574600480360381019061056f91906141cd565b611204565b6040516105819190614028565b60405180910390f35b34801561059657600080fd5b5061059f611288565b6040516105ac919061421c565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d79190614174565b6112ac565b005b3480156105ea57600080fd5b5061060560048036038101906106009190614174565b6114d3565b6040516106129190613ffe565b60405180910390f35b34801561062757600080fd5b50610642600480360381019061063d9190614174565b611529565b005b34801561065057600080fd5b50610659611575565b6040516106669190613ffe565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190614174565b611588565b6040516106a39190614028565b60405180910390f35b3480156106b857600080fd5b506106c1611673565b005b3480156106cf57600080fd5b506106d8611687565b6040516106e59190614028565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190614174565b61168d565b6040516107229190613ffe565b60405180910390f35b34801561073757600080fd5b506107406116e3565b60405161074d919061421c565b60405180910390f35b34801561076257600080fd5b5061077d600480360381019061077891906140bd565b61170c565b005b34801561078b57600080fd5b5061079461171e565b6040516107a19190613ee8565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190613fa3565b6117b0565b6040516107de9190613ffe565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190613fa3565b61187d565b60405161081b9190613ffe565b60405180910390f35b34801561083057600080fd5b5061083961189b565b6040516108469190614028565b60405180910390f35b34801561085b57600080fd5b506108646118a1565b6040516108719190614028565b60405180910390f35b34801561088657600080fd5b5061088f6118a7565b60405161089c9190614028565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c791906140bd565b6118ad565b005b3480156108da57600080fd5b506108f560048036038101906108f091906140bd565b6118bf565b005b34801561090357600080fd5b5061091e60048036038101906109199190614237565b6118f8565b60405161092b9190614028565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190614174565b61197f565b005b34801561096957600080fd5b50610984600480360381019061097f9190614277565b6119cb565b005b34801561099257600080fd5b506109ad60048036038101906109a89190614174565b611a27565b005b3480156109bb57600080fd5b506109d660048036038101906109d19190614174565b611a8a565b005b3480156109e457600080fd5b506109ed611b0d565b6040516109fa9190614028565b60405180910390f35b6060600b8054610a12906142d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3e906142d3565b8015610a8b5780601f10610a6057610100808354040283529160200191610a8b565b820191906000526020600020905b815481529060010190602001808311610a6e57829003601f168201915b5050505050905090565b6000610aa9610aa2611b3f565b8484611b47565b6001905092915050565b6000600a54905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600854905090565b610af3611d10565b80600e8190555050565b6000610b0a848484611d8e565b610bcb84610b16611b3f565b610bc685604051806060016040528060288152602001614db760289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b7c611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f99092919063ffffffff16565b611b47565b600190509392505050565b6000600954821115610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490614376565b60405180910390fd5b6000610c2761214e565b9050610c3c8184611b1390919063ffffffff16565b915050919050565b610c4c611d10565b610c76620186a0610c688360085461217990919063ffffffff16565b611b1390919063ffffffff16565b60188190555050565b6000600d60009054906101000a900460ff16905090565b600e5481565b610ca4611d10565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906143e2565b60405180910390fd5b60005b600680549050811015610f59578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610d6b57610d6a614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f465760066001600680549050610dc59190614460565b81548110610dd657610dd5614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610e1557610e14614402565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006805480610f0c57610f0b614494565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610f59565b8080610f51906144c3565b915050610d33565b5050565b610f65611d10565b8060128190555050565b6000611018610f7c611b3f565b846110138560036000610f8d611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b611b47565b6001905092915050565b600061102c611b3f565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061457d565b60405180910390fd5b60006110c6836121a5565b91505061111f8160000151600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061117b8160000151600954611b2990919063ffffffff16565b60098190555061119683600a5461218f90919063ffffffff16565b600a81905550505050565b6111a9611d10565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060085483111561124b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611242906145e9565b60405180910390fd5b8161126b57600061125b846121a5565b9150508060000151915050611282565b6000611276846121a5565b91505080602001519150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6112b4611d10565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611341576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611338906143e2565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611415576113d1600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bd6565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611531611d10565b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601660019054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561162357600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061166e565b61166b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bd6565b90505b919050565b61167b611d10565b61168560006121d9565b565b60175481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611714611d10565b8060148190555050565b6060600c805461172d906142d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611759906142d3565b80156117a65780601f1061177b576101008083540402835291602001916117a6565b820191906000526020600020905b81548152906001019060200180831161178957829003601f168201915b5050505050905090565b60006118736117bd611b3f565b8461186e85604051806060016040528060258152602001614ddf60259139600360006117e7611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f99092919063ffffffff16565b611b47565b6001905092915050565b600061189161188a611b3f565b8484611d8e565b6001905092915050565b60125481565b60075481565b60105481565b6118b5611d10565b8060108190555050565b6118c7611d10565b6118ef60646118e18360085461217990919063ffffffff16565b611b1390919063ffffffff16565b60178190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611987611d10565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119d3611d10565b80601660016101000a81548160ff0219169083151502179055507f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a1281604051611a1c9190613ffe565b60405180910390a150565b611a2f611d10565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611a92611d10565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af89061467b565b60405180910390fd5b611b0a816121d9565b50565b60145481565b60008183611b2191906146ca565b905092915050565b60008183611b379190614460565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061476d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1c906147ff565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d039190614028565b60405180910390a3505050565b611d18611b3f565b73ffffffffffffffffffffffffffffffffffffffff16611d366116e3565b73ffffffffffffffffffffffffffffffffffffffff1614611d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d839061486b565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df4906148fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e639061498f565b60405180910390fd5b60008111611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614a21565b60405180910390fd5b611eb76116e3565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611f255750611ef56116e3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611f7057601754811115611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690614ab3565b60405180910390fd5b5b6000611f7b30611588565b90506017548110611f8c5760175490505b60006018548210159050808015611fb05750601660009054906101000a900460ff16155b801561200857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156120205750601660019054906101000a900460ff165b156120345760185491506120338261229d565b5b600060019050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120db5750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156120e557600090505b6120f1868686846124d0565b505050505050565b6000838311158290612141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121389190613ee8565b60405180910390fd5b5082840390509392505050565b600080600061215b6127e1565b915091506121728183611b1390919063ffffffff16565b9250505090565b600081836121879190614ad3565b905092915050565b6000818361219d9190614b2d565b905092915050565b6121ad613dea565b6121b5613e19565b6121be83612a94565b91506121d283836121cd61214e565b612b4b565b9050915091565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601660006101000a81548160ff02191690831515021790555060006122f06014546012546122cd9190614b2d565b6122e26012548561217990919063ffffffff16565b611b1390919063ffffffff16565b905060006123078284611b2990919063ffffffff16565b90506000479050600083111561249c5761232083612c5c565b60006123358247611b2990919063ffffffff16565b9050600061234d600283611b1390919063ffffffff16565b905060006123648284611b2990919063ffffffff16565b90506000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516123ae90614bb4565b60006040518083038185875af1925050503d80600081146123eb576040519150601f19603f3d011682016040523d82523d6000602084013e6123f0565b606091505b505090506000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161243c90614bb4565b60006040518083038185875af1925050503d8060008114612479576040519150601f19603f3d011682016040523d82523d6000602084013e61247e565b606091505b505090508161248c57600080fd5b8061249657600080fd5b50505050505b60008211156124af576124ae82612e99565b5b5050506000601660006101000a81548160ff02191690831515021790555050565b806124de576124dd612fe4565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125815750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561259657612591848484613051565b6127cd565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156126395750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561264e576126498484846132ce565b6127cc565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156126f25750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156127075761270284848461354f565b6127cb565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156127a95750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156127be576127b9848484613737565b6127ca565b6127c984848461354f565b5b5b5b5b806127db576127da613a4d565b5b50505050565b600080600060095490506000600854905060005b600680549050811015612a575782600160006006848154811061281b5761281a614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061290957508160026000600684815481106128a1576128a0614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156129205760095460085494509450505050612a90565b6129b0600160006006848154811061293b5761293a614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611b2990919063ffffffff16565b9250612a4260026000600684815481106129cd576129cc614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611b2990919063ffffffff16565b91508080612a4f906144c3565b9150506127f5565b50612a6f600854600954611b1390919063ffffffff16565b821015612a8757600954600854935093505050612a90565b81819350935050505b9091565b612a9c613dea565b612aa582613a73565b816020018181525050612ab782613aa4565b816040018181525050612ac982613ad5565b816060018181525050612adb82613b06565b816080018181525050612b3d8160800151612b2f8360600151612b218560400151612b13876020015189611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b816000018181525050919050565b612b53613e19565b612b66828561217990919063ffffffff16565b816000018181525050612b8682846020015161217990919063ffffffff16565b816040018181525050612ba682846040015161217990919063ffffffff16565b816060018181525050612bc682846060015161217990919063ffffffff16565b816080018181525050612be682846080015161217990919063ffffffff16565b8160a0018181525050612c4c8160a00151612c3e8360800151612c308560600151612c2287604001518860000151611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b8160200181815250509392505050565b6000600267ffffffffffffffff811115612c7957612c78614bc9565b5b604051908082528060200260200182016040528015612ca75781602001602082028036833780820191505090505b5090503081600081518110612cbf57612cbe614402565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d889190614c0d565b81600181518110612d9c57612d9b614402565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612e01307f000000000000000000000000000000000000000000000000000000000000000084611b47565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612e63959493929190614d33565b600060405180830381600087803b158015612e7d57600080fd5b505af1158015612e91573d6000803e3d6000fd5b505050505050565b6000612ea361214e565b90506000612eba828461217990919063ffffffff16565b905080600160007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f2b9190614b2d565b9250508190555082600260007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa19190614b2d565b925050819055507f198b2eae668135c317b102883694377f7de3e5be0258940ecf9578c235df4bb983604051612fd79190614028565b60405180910390a1505050565b6000600e54148015612ff857506000601254145b801561300657506000601054145b61304f57600e54600f81905550601054601181905550601254601381905550601454601581905550600060128190555060006010819055506000600e8190555060006014819055505b565b60008061305d836121a5565b915091506130b383600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061314c8160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131e58160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061323a82608001518360400151613b37565b61324c82606001518260800151613d19565b61325e81604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84600001516040516132bf9190614028565b60405180910390a35050505050565b6000806132da836121a5565b915091506133348160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133cd8260000151600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134668160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134bb82608001518360400151613b37565b6134cd82606001518260800151613d19565b6134df81604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84600001516040516135409190614028565b60405180910390a35050505050565b60008061355b836121a5565b915091506135b58160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061364e8160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136a382608001518360400151613b37565b6136b582606001518260800151613d19565b6136c781604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84600001516040516137289190614028565b60405180910390a35050505050565b600080613743836121a5565b9150915061379983600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138328160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138cb8260000151600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139648160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139b982608001518360400151613b37565b6139cb82606001518260800151613d19565b6139dd81604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460000151604051613a3e9190614028565b60405180910390a35050505050565b601354601281905550601154601081905550600f54600e81905550601554601481905550565b6000613a9d6064613a8f600e548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613ace6064613ac06012548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613aff6064613af16010548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613b306064613b226014548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613b4161214e565b90506000613b58828561217990919063ffffffff16565b90506000613b6f838561217990919063ffffffff16565b9050613bd581613bc784600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b61218f90919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613d1257613cce84613cc087600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b61218f90919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050505050565b806001600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d6a9190614b2d565b925050819055507f410c5c259085cde81fedf70c1aa308ec839373c26e9b7ada6560a2aca0254eb682600854604051613da4929190614d8d565b60405180910390a15050565b613dc582600954611b2990919063ffffffff16565b600981905550613de081600a5461218f90919063ffffffff16565b600a819055505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e89578082015181840152602081019050613e6e565b83811115613e98576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eba82613e4f565b613ec48185613e5a565b9350613ed4818560208601613e6b565b613edd81613e9e565b840191505092915050565b60006020820190508181036000830152613f028184613eaf565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f3a82613f0f565b9050919050565b613f4a81613f2f565b8114613f5557600080fd5b50565b600081359050613f6781613f41565b92915050565b6000819050919050565b613f8081613f6d565b8114613f8b57600080fd5b50565b600081359050613f9d81613f77565b92915050565b60008060408385031215613fba57613fb9613f0a565b5b6000613fc885828601613f58565b9250506020613fd985828601613f8e565b9150509250929050565b60008115159050919050565b613ff881613fe3565b82525050565b60006020820190506140136000830184613fef565b92915050565b61402281613f6d565b82525050565b600060208201905061403d6000830184614019565b92915050565b6000819050919050565b600061406861406361405e84613f0f565b614043565b613f0f565b9050919050565b600061407a8261404d565b9050919050565b600061408c8261406f565b9050919050565b61409c81614081565b82525050565b60006020820190506140b76000830184614093565b92915050565b6000602082840312156140d3576140d2613f0a565b5b60006140e184828501613f8e565b91505092915050565b60008060006060848603121561410357614102613f0a565b5b600061411186828701613f58565b935050602061412286828701613f58565b925050604061413386828701613f8e565b9150509250925092565b600060ff82169050919050565b6141538161413d565b82525050565b600060208201905061416e600083018461414a565b92915050565b60006020828403121561418a57614189613f0a565b5b600061419884828501613f58565b91505092915050565b6141aa81613fe3565b81146141b557600080fd5b50565b6000813590506141c7816141a1565b92915050565b600080604083850312156141e4576141e3613f0a565b5b60006141f285828601613f8e565b9250506020614203858286016141b8565b9150509250929050565b61421681613f2f565b82525050565b6000602082019050614231600083018461420d565b92915050565b6000806040838503121561424e5761424d613f0a565b5b600061425c85828601613f58565b925050602061426d85828601613f58565b9150509250929050565b60006020828403121561428d5761428c613f0a565b5b600061429b848285016141b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142eb57607f821691505b6020821081036142fe576142fd6142a4565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614360602a83613e5a565b915061436b82614304565b604082019050919050565b6000602082019050818103600083015261438f81614353565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b60006143cc601b83613e5a565b91506143d782614396565b602082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061446b82613f6d565b915061447683613f6d565b92508282101561448957614488614431565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006144ce82613f6d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614500576144ff614431565b5b600182019050919050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b6000614567602c83613e5a565b91506145728261450b565b604082019050919050565b600060208201905081810360008301526145968161455a565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b60006145d3601f83613e5a565b91506145de8261459d565b602082019050919050565b60006020820190508181036000830152614602816145c6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614665602683613e5a565b915061467082614609565b604082019050919050565b6000602082019050818103600083015261469481614658565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146d582613f6d565b91506146e083613f6d565b9250826146f0576146ef61469b565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614757602483613e5a565b9150614762826146fb565b604082019050919050565b600060208201905081810360008301526147868161474a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147e9602283613e5a565b91506147f48261478d565b604082019050919050565b60006020820190508181036000830152614818816147dc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614855602083613e5a565b91506148608261481f565b602082019050919050565b6000602082019050818103600083015261488481614848565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006148e7602583613e5a565b91506148f28261488b565b604082019050919050565b60006020820190508181036000830152614916816148da565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614979602383613e5a565b91506149848261491d565b604082019050919050565b600060208201905081810360008301526149a88161496c565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614a0b602983613e5a565b9150614a16826149af565b604082019050919050565b60006020820190508181036000830152614a3a816149fe565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000614a9d602883613e5a565b9150614aa882614a41565b604082019050919050565b60006020820190508181036000830152614acc81614a90565b9050919050565b6000614ade82613f6d565b9150614ae983613f6d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b2257614b21614431565b5b828202905092915050565b6000614b3882613f6d565b9150614b4383613f6d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b7857614b77614431565b5b828201905092915050565b600081905092915050565b50565b6000614b9e600083614b83565b9150614ba982614b8e565b600082019050919050565b6000614bbf82614b91565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614c0781613f41565b92915050565b600060208284031215614c2357614c22613f0a565b5b6000614c3184828501614bf8565b91505092915050565b6000819050919050565b6000614c5f614c5a614c5584614c3a565b614043565b613f6d565b9050919050565b614c6f81614c44565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614caa81613f2f565b82525050565b6000614cbc8383614ca1565b60208301905092915050565b6000602082019050919050565b6000614ce082614c75565b614cea8185614c80565b9350614cf583614c91565b8060005b83811015614d26578151614d0d8882614cb0565b9750614d1883614cc8565b925050600181019050614cf9565b5085935050505092915050565b600060a082019050614d486000830188614019565b614d556020830187614c66565b8181036040830152614d678186614cd5565b9050614d76606083018561420d565b614d836080830184614019565b9695505050505050565b6000604082019050614da26000830185614019565b614daf6020830184614019565b939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220502e1c88a89f8ef89dd1e936ae4435989cbdf862ba58bf44a2edb73178bce84e64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80636ddd171311610139578063aa45026b116100b6578063dd62ed3e1161007a578063dd62ed3e146108f7578063ded70f5114610934578063e01af92c1461095d578063ea2f0b3714610986578063f2fde38b146109af578063f6372cab146109d85761025c565b8063aa45026b14610824578063ab6e7b4a1461084f578063c0b0fda21461087a578063cea26958146108a5578063d543dbeb146108ce5761025c565b80638da5cb5b116100fd5780638da5cb5b1461072b5780638ee88c531461075657806395d89b411461077f578063a457c2d7146107aa578063a9059cbb146107e75761025c565b80636ddd17131461064457806370a082311461066f578063715018a6146106ac5780637d1db4a5146106c357806388f82020146106ee5761025c565b80633206b4aa116101d2578063437823ec11610196578063437823ec146105245780634549b0391461054d57806349bd5a5e1461058a57806352390c02146105b55780635342acb4146105de5780635739911e1461061b5761025c565b80633206b4aa146104415780633685d4191461046c578063379e29191461049557806339509351146104be5780633bd5d173146104fb5761025c565b80631f7ede2b116102195780631f7ede2b1461034a57806323b872dd146103735780632d838119146103b05780632e142c56146103ed578063313ce567146104165761025c565b806306fdde0314610261578063095ea7b31461028c57806313114a9d146102c95780631694505e146102f457806318160ddd1461031f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b50610276610a03565b6040516102839190613ee8565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613fa3565b610a95565b6040516102c09190613ffe565b60405180910390f35b3480156102d557600080fd5b506102de610ab3565b6040516102eb9190614028565b60405180910390f35b34801561030057600080fd5b50610309610abd565b60405161031691906140a2565b60405180910390f35b34801561032b57600080fd5b50610334610ae1565b6040516103419190614028565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c91906140bd565b610aeb565b005b34801561037f57600080fd5b5061039a600480360381019061039591906140ea565b610afd565b6040516103a79190613ffe565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906140bd565b610bd6565b6040516103e49190614028565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906140bd565b610c44565b005b34801561042257600080fd5b5061042b610c7f565b6040516104389190614159565b60405180910390f35b34801561044d57600080fd5b50610456610c96565b6040516104639190614028565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190614174565b610c9c565b005b3480156104a157600080fd5b506104bc60048036038101906104b791906140bd565b610f5d565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190613fa3565b610f6f565b6040516104f29190613ffe565b60405180910390f35b34801561050757600080fd5b50610522600480360381019061051d91906140bd565b611022565b005b34801561053057600080fd5b5061054b60048036038101906105469190614174565b6111a1565b005b34801561055957600080fd5b50610574600480360381019061056f91906141cd565b611204565b6040516105819190614028565b60405180910390f35b34801561059657600080fd5b5061059f611288565b6040516105ac919061421c565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d79190614174565b6112ac565b005b3480156105ea57600080fd5b5061060560048036038101906106009190614174565b6114d3565b6040516106129190613ffe565b60405180910390f35b34801561062757600080fd5b50610642600480360381019061063d9190614174565b611529565b005b34801561065057600080fd5b50610659611575565b6040516106669190613ffe565b60405180910390f35b34801561067b57600080fd5b5061069660048036038101906106919190614174565b611588565b6040516106a39190614028565b60405180910390f35b3480156106b857600080fd5b506106c1611673565b005b3480156106cf57600080fd5b506106d8611687565b6040516106e59190614028565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190614174565b61168d565b6040516107229190613ffe565b60405180910390f35b34801561073757600080fd5b506107406116e3565b60405161074d919061421c565b60405180910390f35b34801561076257600080fd5b5061077d600480360381019061077891906140bd565b61170c565b005b34801561078b57600080fd5b5061079461171e565b6040516107a19190613ee8565b60405180910390f35b3480156107b657600080fd5b506107d160048036038101906107cc9190613fa3565b6117b0565b6040516107de9190613ffe565b60405180910390f35b3480156107f357600080fd5b5061080e60048036038101906108099190613fa3565b61187d565b60405161081b9190613ffe565b60405180910390f35b34801561083057600080fd5b5061083961189b565b6040516108469190614028565b60405180910390f35b34801561085b57600080fd5b506108646118a1565b6040516108719190614028565b60405180910390f35b34801561088657600080fd5b5061088f6118a7565b60405161089c9190614028565b60405180910390f35b3480156108b157600080fd5b506108cc60048036038101906108c791906140bd565b6118ad565b005b3480156108da57600080fd5b506108f560048036038101906108f091906140bd565b6118bf565b005b34801561090357600080fd5b5061091e60048036038101906109199190614237565b6118f8565b60405161092b9190614028565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190614174565b61197f565b005b34801561096957600080fd5b50610984600480360381019061097f9190614277565b6119cb565b005b34801561099257600080fd5b506109ad60048036038101906109a89190614174565b611a27565b005b3480156109bb57600080fd5b506109d660048036038101906109d19190614174565b611a8a565b005b3480156109e457600080fd5b506109ed611b0d565b6040516109fa9190614028565b60405180910390f35b6060600b8054610a12906142d3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3e906142d3565b8015610a8b5780601f10610a6057610100808354040283529160200191610a8b565b820191906000526020600020905b815481529060010190602001808311610a6e57829003601f168201915b5050505050905090565b6000610aa9610aa2611b3f565b8484611b47565b6001905092915050565b6000600a54905090565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600854905090565b610af3611d10565b80600e8190555050565b6000610b0a848484611d8e565b610bcb84610b16611b3f565b610bc685604051806060016040528060288152602001614db760289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b7c611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f99092919063ffffffff16565b611b47565b600190509392505050565b6000600954821115610c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1490614376565b60405180910390fd5b6000610c2761214e565b9050610c3c8184611b1390919063ffffffff16565b915050919050565b610c4c611d10565b610c76620186a0610c688360085461217990919063ffffffff16565b611b1390919063ffffffff16565b60188190555050565b6000600d60009054906101000a900460ff16905090565b600e5481565b610ca4611d10565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906143e2565b60405180910390fd5b60005b600680549050811015610f59578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610d6b57610d6a614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f465760066001600680549050610dc59190614460565b81548110610dd657610dd5614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110610e1557610e14614402565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006805480610f0c57610f0b614494565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610f59565b8080610f51906144c3565b915050610d33565b5050565b610f65611d10565b8060128190555050565b6000611018610f7c611b3f565b846110138560036000610f8d611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b611b47565b6001905092915050565b600061102c611b3f565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061457d565b60405180910390fd5b60006110c6836121a5565b91505061111f8160000151600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061117b8160000151600954611b2990919063ffffffff16565b60098190555061119683600a5461218f90919063ffffffff16565b600a81905550505050565b6111a9611d10565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600060085483111561124b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611242906145e9565b60405180910390fd5b8161126b57600061125b846121a5565b9150508060000151915050611282565b6000611276846121a5565b91505080602001519150505b92915050565b7f0000000000000000000000007db49a4f1ff13bc855d4ec9b2c13d519290f1f3081565b6112b4611d10565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611341576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611338906143e2565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611415576113d1600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bd6565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611531611d10565b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601660019054906101000a900460ff1681565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561162357600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061166e565b61166b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bd6565b90505b919050565b61167b611d10565b61168560006121d9565b565b60175481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611714611d10565b8060148190555050565b6060600c805461172d906142d3565b80601f0160208091040260200160405190810160405280929190818152602001828054611759906142d3565b80156117a65780601f1061177b576101008083540402835291602001916117a6565b820191906000526020600020905b81548152906001019060200180831161178957829003601f168201915b5050505050905090565b60006118736117bd611b3f565b8461186e85604051806060016040528060258152602001614ddf60259139600360006117e7611b3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f99092919063ffffffff16565b611b47565b6001905092915050565b600061189161188a611b3f565b8484611d8e565b6001905092915050565b60125481565b60075481565b60105481565b6118b5611d10565b8060108190555050565b6118c7611d10565b6118ef60646118e18360085461217990919063ffffffff16565b611b1390919063ffffffff16565b60178190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611987611d10565b80601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119d3611d10565b80601660016101000a81548160ff0219169083151502179055507f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a1281604051611a1c9190613ffe565b60405180910390a150565b611a2f611d10565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611a92611d10565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af89061467b565b60405180910390fd5b611b0a816121d9565b50565b60145481565b60008183611b2191906146ca565b905092915050565b60008183611b379190614460565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad9061476d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1c906147ff565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d039190614028565b60405180910390a3505050565b611d18611b3f565b73ffffffffffffffffffffffffffffffffffffffff16611d366116e3565b73ffffffffffffffffffffffffffffffffffffffff1614611d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d839061486b565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df4906148fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e639061498f565b60405180910390fd5b60008111611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614a21565b60405180910390fd5b611eb76116e3565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611f255750611ef56116e3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611f7057601754811115611f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6690614ab3565b60405180910390fd5b5b6000611f7b30611588565b90506017548110611f8c5760175490505b60006018548210159050808015611fb05750601660009054906101000a900460ff16155b801561200857507f0000000000000000000000007db49a4f1ff13bc855d4ec9b2c13d519290f1f3073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156120205750601660019054906101000a900460ff165b156120345760185491506120338261229d565b5b600060019050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806120db5750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156120e557600090505b6120f1868686846124d0565b505050505050565b6000838311158290612141576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121389190613ee8565b60405180910390fd5b5082840390509392505050565b600080600061215b6127e1565b915091506121728183611b1390919063ffffffff16565b9250505090565b600081836121879190614ad3565b905092915050565b6000818361219d9190614b2d565b905092915050565b6121ad613dea565b6121b5613e19565b6121be83612a94565b91506121d283836121cd61214e565b612b4b565b9050915091565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001601660006101000a81548160ff02191690831515021790555060006122f06014546012546122cd9190614b2d565b6122e26012548561217990919063ffffffff16565b611b1390919063ffffffff16565b905060006123078284611b2990919063ffffffff16565b90506000479050600083111561249c5761232083612c5c565b60006123358247611b2990919063ffffffff16565b9050600061234d600283611b1390919063ffffffff16565b905060006123648284611b2990919063ffffffff16565b90506000601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516123ae90614bb4565b60006040518083038185875af1925050503d80600081146123eb576040519150601f19603f3d011682016040523d82523d6000602084013e6123f0565b606091505b505090506000601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161243c90614bb4565b60006040518083038185875af1925050503d8060008114612479576040519150601f19603f3d011682016040523d82523d6000602084013e61247e565b606091505b505090508161248c57600080fd5b8061249657600080fd5b50505050505b60008211156124af576124ae82612e99565b5b5050506000601660006101000a81548160ff02191690831515021790555050565b806124de576124dd612fe4565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156125815750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561259657612591848484613051565b6127cd565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156126395750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561264e576126498484846132ce565b6127cc565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156126f25750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156127075761270284848461354f565b6127cb565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156127a95750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156127be576127b9848484613737565b6127ca565b6127c984848461354f565b5b5b5b5b806127db576127da613a4d565b5b50505050565b600080600060095490506000600854905060005b600680549050811015612a575782600160006006848154811061281b5761281a614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061290957508160026000600684815481106128a1576128a0614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156129205760095460085494509450505050612a90565b6129b0600160006006848154811061293b5761293a614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484611b2990919063ffffffff16565b9250612a4260026000600684815481106129cd576129cc614402565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483611b2990919063ffffffff16565b91508080612a4f906144c3565b9150506127f5565b50612a6f600854600954611b1390919063ffffffff16565b821015612a8757600954600854935093505050612a90565b81819350935050505b9091565b612a9c613dea565b612aa582613a73565b816020018181525050612ab782613aa4565b816040018181525050612ac982613ad5565b816060018181525050612adb82613b06565b816080018181525050612b3d8160800151612b2f8360600151612b218560400151612b13876020015189611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b816000018181525050919050565b612b53613e19565b612b66828561217990919063ffffffff16565b816000018181525050612b8682846020015161217990919063ffffffff16565b816040018181525050612ba682846040015161217990919063ffffffff16565b816060018181525050612bc682846060015161217990919063ffffffff16565b816080018181525050612be682846080015161217990919063ffffffff16565b8160a0018181525050612c4c8160a00151612c3e8360800151612c308560600151612c2287604001518860000151611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b611b2990919063ffffffff16565b8160200181815250509392505050565b6000600267ffffffffffffffff811115612c7957612c78614bc9565b5b604051908082528060200260200182016040528015612ca75781602001602082028036833780820191505090505b5090503081600081518110612cbf57612cbe614402565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d889190614c0d565b81600181518110612d9c57612d9b614402565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612e01307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611b47565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612e63959493929190614d33565b600060405180830381600087803b158015612e7d57600080fd5b505af1158015612e91573d6000803e3d6000fd5b505050505050565b6000612ea361214e565b90506000612eba828461217990919063ffffffff16565b905080600160007f0000000000000000000000007db49a4f1ff13bc855d4ec9b2c13d519290f1f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f2b9190614b2d565b9250508190555082600260007f0000000000000000000000007db49a4f1ff13bc855d4ec9b2c13d519290f1f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa19190614b2d565b925050819055507f198b2eae668135c317b102883694377f7de3e5be0258940ecf9578c235df4bb983604051612fd79190614028565b60405180910390a1505050565b6000600e54148015612ff857506000601254145b801561300657506000601054145b61304f57600e54600f81905550601054601181905550601254601381905550601454601581905550600060128190555060006010819055506000600e8190555060006014819055505b565b60008061305d836121a5565b915091506130b383600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061314c8160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506131e58160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061323a82608001518360400151613b37565b61324c82606001518260800151613d19565b61325e81604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84600001516040516132bf9190614028565b60405180910390a35050505050565b6000806132da836121a5565b915091506133348160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133cd8260000151600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134668160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134bb82608001518360400151613b37565b6134cd82606001518260800151613d19565b6134df81604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84600001516040516135409190614028565b60405180910390a35050505050565b60008061355b836121a5565b915091506135b58160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061364e8160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136a382608001518360400151613b37565b6136b582606001518260800151613d19565b6136c781604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84600001516040516137289190614028565b60405180910390a35050505050565b600080613743836121a5565b9150915061379983600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138328160000151600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2990919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138cb8260000151600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139648160200151600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139b982608001518360400151613b37565b6139cb82606001518260800151613d19565b6139dd81604001518360200151613db0565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460000151604051613a3e9190614028565b60405180910390a35050505050565b601354601281905550601154601081905550600f54600e81905550601554601481905550565b6000613a9d6064613a8f600e548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613ace6064613ac06012548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613aff6064613af16010548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613b306064613b226014548561217990919063ffffffff16565b611b1390919063ffffffff16565b9050919050565b6000613b4161214e565b90506000613b58828561217990919063ffffffff16565b90506000613b6f838561217990919063ffffffff16565b9050613bd581613bc784600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b61218f90919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615613d1257613cce84613cc087600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461218f90919063ffffffff16565b61218f90919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5050505050565b806001600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d6a9190614b2d565b925050819055507f410c5c259085cde81fedf70c1aa308ec839373c26e9b7ada6560a2aca0254eb682600854604051613da4929190614d8d565b60405180910390a15050565b613dc582600954611b2990919063ffffffff16565b600981905550613de081600a5461218f90919063ffffffff16565b600a819055505050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e89578082015181840152602081019050613e6e565b83811115613e98576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eba82613e4f565b613ec48185613e5a565b9350613ed4818560208601613e6b565b613edd81613e9e565b840191505092915050565b60006020820190508181036000830152613f028184613eaf565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f3a82613f0f565b9050919050565b613f4a81613f2f565b8114613f5557600080fd5b50565b600081359050613f6781613f41565b92915050565b6000819050919050565b613f8081613f6d565b8114613f8b57600080fd5b50565b600081359050613f9d81613f77565b92915050565b60008060408385031215613fba57613fb9613f0a565b5b6000613fc885828601613f58565b9250506020613fd985828601613f8e565b9150509250929050565b60008115159050919050565b613ff881613fe3565b82525050565b60006020820190506140136000830184613fef565b92915050565b61402281613f6d565b82525050565b600060208201905061403d6000830184614019565b92915050565b6000819050919050565b600061406861406361405e84613f0f565b614043565b613f0f565b9050919050565b600061407a8261404d565b9050919050565b600061408c8261406f565b9050919050565b61409c81614081565b82525050565b60006020820190506140b76000830184614093565b92915050565b6000602082840312156140d3576140d2613f0a565b5b60006140e184828501613f8e565b91505092915050565b60008060006060848603121561410357614102613f0a565b5b600061411186828701613f58565b935050602061412286828701613f58565b925050604061413386828701613f8e565b9150509250925092565b600060ff82169050919050565b6141538161413d565b82525050565b600060208201905061416e600083018461414a565b92915050565b60006020828403121561418a57614189613f0a565b5b600061419884828501613f58565b91505092915050565b6141aa81613fe3565b81146141b557600080fd5b50565b6000813590506141c7816141a1565b92915050565b600080604083850312156141e4576141e3613f0a565b5b60006141f285828601613f8e565b9250506020614203858286016141b8565b9150509250929050565b61421681613f2f565b82525050565b6000602082019050614231600083018461420d565b92915050565b6000806040838503121561424e5761424d613f0a565b5b600061425c85828601613f58565b925050602061426d85828601613f58565b9150509250929050565b60006020828403121561428d5761428c613f0a565b5b600061429b848285016141b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142eb57607f821691505b6020821081036142fe576142fd6142a4565b5b50919050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260008201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b6000614360602a83613e5a565b915061436b82614304565b604082019050919050565b6000602082019050818103600083015261438f81614353565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b60006143cc601b83613e5a565b91506143d782614396565b602082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061446b82613f6d565b915061447683613f6d565b92508282101561448957614488614431565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006144ce82613f6d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614500576144ff614431565b5b600182019050919050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460008201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b6000614567602c83613e5a565b91506145728261450b565b604082019050919050565b600060208201905081810360008301526145968161455a565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c7900600082015250565b60006145d3601f83613e5a565b91506145de8261459d565b602082019050919050565b60006020820190508181036000830152614602816145c6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614665602683613e5a565b915061467082614609565b604082019050919050565b6000602082019050818103600083015261469481614658565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146d582613f6d565b91506146e083613f6d565b9250826146f0576146ef61469b565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614757602483613e5a565b9150614762826146fb565b604082019050919050565b600060208201905081810360008301526147868161474a565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147e9602283613e5a565b91506147f48261478d565b604082019050919050565b60006020820190508181036000830152614818816147dc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614855602083613e5a565b91506148608261481f565b602082019050919050565b6000602082019050818103600083015261488481614848565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006148e7602583613e5a565b91506148f28261488b565b604082019050919050565b60006020820190508181036000830152614916816148da565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614979602383613e5a565b91506149848261491d565b604082019050919050565b600060208201905081810360008301526149a88161496c565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000614a0b602983613e5a565b9150614a16826149af565b604082019050919050565b60006020820190508181036000830152614a3a816149fe565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b6000614a9d602883613e5a565b9150614aa882614a41565b604082019050919050565b60006020820190508181036000830152614acc81614a90565b9050919050565b6000614ade82613f6d565b9150614ae983613f6d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b2257614b21614431565b5b828202905092915050565b6000614b3882613f6d565b9150614b4383613f6d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b7857614b77614431565b5b828201905092915050565b600081905092915050565b50565b6000614b9e600083614b83565b9150614ba982614b8e565b600082019050919050565b6000614bbf82614b91565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050614c0781613f41565b92915050565b600060208284031215614c2357614c22613f0a565b5b6000614c3184828501614bf8565b91505092915050565b6000819050919050565b6000614c5f614c5a614c5584614c3a565b614043565b613f6d565b9050919050565b614c6f81614c44565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614caa81613f2f565b82525050565b6000614cbc8383614ca1565b60208301905092915050565b6000602082019050919050565b6000614ce082614c75565b614cea8185614c80565b9350614cf583614c91565b8060005b83811015614d26578151614d0d8882614cb0565b9750614d1883614cc8565b925050600181019050614cf9565b5085935050505092915050565b600060a082019050614d486000830188614019565b614d556020830187614c66565b8181036040830152614d678186614cd5565b9050614d76606083018561420d565b614d836080830184614019565b9695505050505050565b6000604082019050614da26000830185614019565b614daf6020830184614019565b939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220502e1c88a89f8ef89dd1e936ae4435989cbdf862ba58bf44a2edb73178bce84e64736f6c634300080d0033

Deployed Bytecode Sourcemap

35731:22580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38947:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39943:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41453:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36942:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39224:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44293:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40144:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42494:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44679:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39133:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36583:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43337:499;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44189:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40598:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41548:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43844:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42001:485;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37000:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42824:505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49420:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45119:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37065:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39327:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13054:103;;;;;;;;;;;;;:::i;:::-;;37104:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41314:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12406:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44425:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39038:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40906:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39544:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36776:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36224:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36690:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44081:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44535:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39751:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45022:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44873:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43963:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13312:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36859:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38947:83;38984:13;39017:5;39010:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38947:83;:::o;39943:193::-;40045:4;40067:39;40076:12;:10;:12::i;:::-;40090:7;40099:6;40067:8;:39::i;:::-;40124:4;40117:11;;39943:193;;;;:::o;41453:87::-;41495:7;41522:10;;41515:17;;41453:87;:::o;36942:51::-;;;:::o;39224:95::-;39277:7;39304;;39297:14;;39224:95;:::o;44293:124::-;12292:13;:11;:13::i;:::-;44396::::1;44379:14;:30;;;;44293:124:::0;:::o;40144:446::-;40276:4;40293:36;40303:6;40311:9;40322:6;40293:9;:36::i;:::-;40340:220;40363:6;40384:12;:10;:12::i;:::-;40411:138;40467:6;40411:138;;;;;;;;;;;;;;;;;:11;:19;40423:6;40411:19;;;;;;;;;;;;;;;:33;40431:12;:10;:12::i;:::-;40411:33;;;;;;;;;;;;;;;;:37;;:138;;;;;:::i;:::-;40340:8;:220::i;:::-;40578:4;40571:11;;40144:446;;;;;:::o;42494:322::-;42588:7;42646;;42635;:18;;42613:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;42734:19;42756:10;:8;:10::i;:::-;42734:32;;42784:24;42796:11;42784:7;:11;;:24;;;;:::i;:::-;42777:31;;;42494:322;;;:::o;44679:186::-;12292:13;:11;:13::i;:::-;44795:62:::1;44841:5;44795:27;44807:14;44795:7;;:11;;:27;;;;:::i;:::-;:31;;:62;;;;:::i;:::-;44757:35;:100;;;;44679:186:::0;:::o;39133:83::-;39174:5;39199:9;;;;;;;;;;;39192:16;;39133:83;:::o;36583:33::-;;;;:::o;43337:499::-;12292:13;:11;:13::i;:::-;43417:22:::1;:31;43440:7;43417:31;;;;;;;;;;;;;;;;;;;;;;;;;43409:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43496:9;43491:338;43515:9;:16;;;;43511:1;:20;43491:338;;;43573:7;43557:23;;:9;43567:1;43557:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:23;;::::0;43553:265:::1;;43616:9;43645:1;43626:9;:16;;;;:20;;;;:::i;:::-;43616:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43601:9;43611:1;43601:12;;;;;;;;:::i;:::-;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;43685:1;43666:7;:16;43674:7;43666:16;;;;;;;;;;;;;;;:20;;;;43739:5;43705:22;:31;43728:7;43705:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;43763:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;43797:5;;43553:265;43533:3;;;;;:::i;:::-;;;;43491:338;;;;43337:499:::0;:::o;44189:96::-;12292:13;:11;:13::i;:::-;44271:6:::1;44261:7;:16;;;;44189:96:::0;:::o;40598:300::-;40713:4;40735:133;40758:12;:10;:12::i;:::-;40785:7;40807:50;40846:10;40807:11;:25;40819:12;:10;:12::i;:::-;40807:25;;;;;;;;;;;;;;;:34;40833:7;40807:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;40735:8;:133::i;:::-;40886:4;40879:11;;40598:300;;;;:::o;41548:445::-;41600:14;41617:12;:10;:12::i;:::-;41600:29;;41663:22;:30;41686:6;41663:30;;;;;;;;;;;;;;;;;;;;;;;;;41662:31;41640:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;41779:22;41805:19;41816:7;41805:10;:19::i;:::-;41776:48;;;41853:36;41873:7;:15;;;41853:7;:15;41861:6;41853:15;;;;;;;;;;;;;;;;:19;;:36;;;;:::i;:::-;41835:7;:15;41843:6;41835:15;;;;;;;;;;;;;;;:54;;;;41910:28;41922:7;:15;;;41910:7;;:11;;:28;;;;:::i;:::-;41900:7;:38;;;;41962:23;41977:7;41962:10;;:14;;:23;;;;:::i;:::-;41949:10;:36;;;;41589:404;;41548:445;:::o;43844:111::-;12292:13;:11;:13::i;:::-;43943:4:::1;43913:18;:27;43932:7;43913:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;43844:111:::0;:::o;42001:485::-;42119:7;42163;;42152;:18;;42144:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;42222:17;42217:262;;42259:22;42285:19;42296:7;42285:10;:19::i;:::-;42256:48;;;42326:7;:15;;;42319:22;;;;;42217:262;42377:22;42403:19;42414:7;42403:10;:19::i;:::-;42374:48;;;42444:7;:23;;;42437:30;;;42001:485;;;;;:::o;37000:38::-;;;:::o;42824:505::-;12292:13;:11;:13::i;:::-;43033:22:::1;:31;43056:7;43033:31;;;;;;;;;;;;;;;;;;;;;;;;;43032:32;43010:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;43153:1;43134:7;:16;43142:7;43134:16;;;;;;;;;;;;;;;;:20;43130:109;;;43190:37;43210:7;:16;43218:7;43210:16;;;;;;;;;;;;;;;;43190:19;:37::i;:::-;43171:7;:16;43179:7;43171:16;;;;;;;;;;;;;;;:56;;;;43130:109;43283:4;43249:22;:31;43272:7;43249:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;43298:9;43313:7;43298:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42824:505:::0;:::o;49420:124::-;49485:4;49509:18;:27;49528:7;49509:27;;;;;;;;;;;;;;;;;;;;;;;;;49502:34;;49420:124;;;:::o;45119:89::-;12292:13;:11;:13::i;:::-;45195:5:::1;45188:4;;:12;;;;;;;;;;;;;;;;;;45119:89:::0;:::o;37065:30::-;;;;;;;;;;;;;:::o;39327:209::-;39393:7;39417:22;:31;39440:7;39417:31;;;;;;;;;;;;;;;;;;;;;;;;;39413:60;;;39457:7;:16;39465:7;39457:16;;;;;;;;;;;;;;;;39450:23;;;;39413:60;39491:37;39511:7;:16;39519:7;39511:16;;;;;;;;;;;;;;;;39491:19;:37::i;:::-;39484:44;;39327:209;;;;:::o;13054:103::-;12292:13;:11;:13::i;:::-;13119:30:::1;13146:1;13119:18;:30::i;:::-;13054:103::o:0;37104:49::-;;;;:::o;41314:131::-;41382:4;41406:22;:31;41429:7;41406:31;;;;;;;;;;;;;;;;;;;;;;;;;41399:38;;41314:131;;;:::o;12406:87::-;12452:7;12479:6;;;;;;;;;;;12472:13;;12406:87;:::o;44425:102::-;12292:13;:11;:13::i;:::-;44513:6:::1;44503:7;:16;;;;44425:102:::0;:::o;39038:87::-;39077:13;39110:7;39103:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39038:87;:::o;40906:400::-;41026:4;41048:228;41071:12;:10;:12::i;:::-;41098:7;41120:145;41177:15;41120:145;;;;;;;;;;;;;;;;;:11;:25;41132:12;:10;:12::i;:::-;41120:25;;;;;;;;;;;;;;;:34;41146:7;41120:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;41048:8;:228::i;:::-;41294:4;41287:11;;40906:400;;;;:::o;39544:199::-;39649:4;39671:42;39681:12;:10;:12::i;:::-;39695:9;39706:6;39671:9;:42::i;:::-;39731:4;39724:11;;39544:199;;;;:::o;36776:26::-;;;;:::o;36224:41::-;;;;:::o;36690:27::-;;;;:::o;44081:100::-;12292:13;:11;:13::i;:::-;44166:7:::1;44155:8;:18;;;;44081:100:::0;:::o;44535:136::-;12292:13;:11;:13::i;:::-;44627:36:::1;44657:5;44627:25;44639:12;44627:7;;:11;;:25;;;;:::i;:::-;:29;;:36;;;;:::i;:::-;44612:12;:51;;;;44535:136:::0;:::o;39751:184::-;39868:7;39900:11;:18;39912:5;39900:18;;;;;;;;;;;;;;;:27;39919:7;39900:27;;;;;;;;;;;;;;;;39893:34;;39751:184;;;;:::o;45022:89::-;12292:13;:11;:13::i;:::-;45098:5:::1;45091:4;;:12;;;;;;;;;;;;;;;;;;45022:89:::0;:::o;44873:141::-;12292:13;:11;:13::i;:::-;44954:8:::1;44940:11;;:22;;;;;;;;;;;;;;;;;;44978:28;44997:8;44978:28;;;;;;:::i;:::-;;;;;;;;44873:141:::0;:::o;43963:110::-;12292:13;:11;:13::i;:::-;44060:5:::1;44030:18;:27;44049:7;44030:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;43963:110:::0;:::o;13312:238::-;12292:13;:11;:13::i;:::-;13435:1:::1;13415:22;;:8;:22;;::::0;13393:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;13514:28;13533:8;13514:18;:28::i;:::-;13312:238:::0;:::o;36859:26::-;;;;:::o;7219:98::-;7277:7;7308:1;7304;:5;;;;:::i;:::-;7297:12;;7219:98;;;;:::o;6463:::-;6521:7;6552:1;6548;:5;;;;:::i;:::-;6541:12;;6463:98;;;;:::o;10930:::-;10983:7;11010:10;11003:17;;10930:98;:::o;49552:371::-;49696:1;49679:19;;:5;:19;;;49671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49777:1;49758:21;;:7;:21;;;49750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49861:6;49831:11;:18;49843:5;49831:18;;;;;;;;;;;;;;;:27;49850:7;49831:27;;;;;;;;;;;;;;;:36;;;;49899:7;49883:32;;49892:5;49883:32;;;49908:6;49883:32;;;;;;:::i;:::-;;;;;;;;49552:371;;;:::o;12571:132::-;12646:12;:10;:12::i;:::-;12635:23;;:7;:5;:7::i;:::-;:23;;;12627:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12571:132::o;49931:1824::-;50069:1;50053:18;;:4;:18;;;50045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50146:1;50132:16;;:2;:16;;;50124:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50216:1;50207:6;:10;50199:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50286:7;:5;:7::i;:::-;50278:15;;:4;:15;;;;:32;;;;;50303:7;:5;:7::i;:::-;50297:13;;:2;:13;;;;50278:32;50274:175;;;50361:12;;50351:6;:22;;50325:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;50274:175;50742:28;50773:24;50791:4;50773:9;:24::i;:::-;50742:55;;50838:12;;50814:20;:36;50810:104;;50890:12;;50867:35;;50810:104;50924:24;50988:35;;50951:20;:72;;50924:99;;51052:19;:43;;;;;51089:6;;;;;;;;;;;51088:7;51052:43;:81;;;;;51120:13;51112:21;;:4;:21;;;;51052:81;:109;;;;;51150:11;;;;;;;;;;;51052:109;51034:307;;;51211:35;;51188:58;;51303:26;51308:20;51303:4;:26::i;:::-;51034:307;51414:12;51429:4;51414:19;;51534:18;:24;51553:4;51534:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;51562:18;:22;51581:2;51562:22;;;;;;;;;;;;;;;;;;;;;;;;;51534:50;51530:98;;;51611:5;51601:15;;51530:98;51706:41;51721:4;51727:2;51731:6;51739:7;51706:14;:41::i;:::-;50034:1721;;;49931:1824;;;:::o;8361:240::-;8481:7;8539:1;8534;:6;;8542:12;8526:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8581:1;8577;:5;8570:12;;8361:240;;;;;:::o;46920:164::-;46962:7;46983:15;47000;47019:19;:17;:19::i;:::-;46982:56;;;;47056:20;47068:7;47056;:11;;:20;;;;:::i;:::-;47049:27;;;;46920:164;:::o;6820:98::-;6878:7;6909:1;6905;:5;;;;:::i;:::-;6898:12;;6820:98;;;;:::o;6082:::-;6140:7;6171:1;6167;:5;;;;:::i;:::-;6160:12;;6082:98;;;;:::o;45464:250::-;45550:22;;:::i;:::-;45574;;:::i;:::-;45624:20;45636:7;45624:11;:20::i;:::-;45614:30;;45665:41;45677:7;45686;45695:10;:8;:10::i;:::-;45665:11;:41::i;:::-;45655:51;;45464:250;;;:::o;13710:191::-;13784:16;13803:6;;;;;;;;;;;13784:25;;13829:8;13820:6;;:17;;;;;;;;;;;;;;;;;;13884:8;13853:40;;13874:8;13853:40;;;;;;;;;;;;13773:128;13710:191;:::o;52180:1216::-;38088:4;38079:6;;:13;;;;;;;;;;;;;;;;;;52296:11:::1;52310:56;52358:7;;52348;;:17;;;;:::i;:::-;52310:33;52335:7;;52310:20;:24;;:33;;;;:::i;:::-;:37;;:56;;;;:::i;:::-;52296:70;;52377:14;52394:32;52419:6;52394:20;:24;;:32;;;;:::i;:::-;52377:49;;52702:22;52727:21;52702:46;;52774:1;52765:6;:10;52761:463;;;52792:24;52809:6;52792:16;:24::i;:::-;52831:18;52852:41;52878:14;52852:21;:25;;:41;;;;:::i;:::-;52831:62;;52908:18;52929:17;52944:1;52929:10;:14;;:17;;;;:::i;:::-;52908:38;;52961:18;52982:26;52997:10;52982;:14;;:26;;;;:::i;:::-;52961:47;;53024:10;53048:4;;;;;;;;;;;53040:18;;53066:10;53040:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53023:58;;;53097:10;53121:4;;;;;;;;;;;53113:18;;53139:10;53113:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53096:58;;;53177:5;53169:14;;;::::0;::::1;;53206:5;53198:14;;;::::0;::::1;;52777:447;;;;;52761:463;53286:1;53277:6;:10;53273:64;;;53304:21;53318:6;53304:13;:21::i;:::-;53273:64;52244:1152;;;38124:5:::0;38115:6;;:14;;;;;;;;;;;;;;;;;;52180:1216;:::o;54595:1035::-;54751:7;54746:28;;54760:14;:12;:14::i;:::-;54746:28;54805:22;:30;54828:6;54805:30;;;;;;;;;;;;;;;;;;;;;;;;;:68;;;;;54840:22;:33;54863:9;54840:33;;;;;;;;;;;;;;;;;;;;;;;;;54839:34;54805:68;54787:794;;;54900:48;54922:6;54930:9;54941:6;54900:21;:48::i;:::-;54787:794;;;54985:22;:30;55008:6;54985:30;;;;;;;;;;;;;;;;;;;;;;;;;54984:31;:68;;;;;55019:22;:33;55042:9;55019:33;;;;;;;;;;;;;;;;;;;;;;;;;54984:68;54966:615;;;55079:46;55099:6;55107:9;55118:6;55079:19;:46::i;:::-;54966:615;;;55162:22;:30;55185:6;55162:30;;;;;;;;;;;;;;;;;;;;;;;;;55161:31;:82;;;;;55210:22;:33;55233:9;55210:33;;;;;;;;;;;;;;;;;;;;;;;;;55209:34;55161:82;55143:438;;;55270:44;55288:6;55296:9;55307:6;55270:17;:44::i;:::-;55143:438;;;55350:22;:30;55373:6;55350:30;;;;;;;;;;;;;;;;;;;;;;;;;:67;;;;;55384:22;:33;55407:9;55384:33;;;;;;;;;;;;;;;;;;;;;;;;;55350:67;55332:249;;;55444:48;55466:6;55474:9;55485:6;55444:21;:48::i;:::-;55332:249;;;55525:44;55543:6;55551:9;55562:6;55525:17;:44::i;:::-;55332:249;55143:438;54966:615;54787:794;55598:7;55593:29;;55607:15;:13;:15::i;:::-;55593:29;54595:1035;;;;:::o;47092:605::-;47143:7;47152;47172:15;47190:7;;47172:25;;47208:15;47226:7;;47208:25;;47249:9;47244:338;47268:9;:16;;;;47264:1;:20;47244:338;;;47352:7;47328;:21;47336:9;47346:1;47336:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47328:21;;;;;;;;;;;;;;;;:31;:83;;;;47404:7;47380;:21;47388:9;47398:1;47388:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47380:21;;;;;;;;;;;;;;;;:31;47328:83;47306:146;;;47435:7;;47444;;47427:25;;;;;;;;;47306:146;47477:34;47489:7;:21;47497:9;47507:1;47497:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47489:21;;;;;;;;;;;;;;;;47477:7;:11;;:34;;;;:::i;:::-;47467:44;;47536:34;47548:7;:21;47556:9;47566:1;47556:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47548:21;;;;;;;;;;;;;;;;47536:7;:11;;:34;;;;:::i;:::-;47526:44;;47286:3;;;;;:::i;:::-;;;;47244:338;;;;47606:20;47618:7;;47606;;:11;;:20;;;;:::i;:::-;47596:7;:30;47592:61;;;47636:7;;47645;;47628:25;;;;;;;;47592:61;47672:7;47681;47664:25;;;;;;47092:605;;;:::o;45722:520::-;45809:22;;:::i;:::-;45871:31;45894:7;45871:22;:31::i;:::-;45849:7;:19;;:53;;;;;45928:24;45944:7;45928:15;:24::i;:::-;45913:7;:12;;:39;;;;;45979:25;45996:7;45979:16;:25::i;:::-;45963:7;:13;;:41;;;;;46030:24;46046:7;46030:15;:24::i;:::-;46015:7;:12;;:39;;;;;46091:143;46221:7;:12;;;46091:111;46188:7;:13;;;46091:78;46156:7;:12;;;46091:46;46117:7;:19;;;46091:7;:25;;:46;;;;:::i;:::-;:64;;:78;;;;:::i;:::-;:96;;:111;;;;:::i;:::-;:129;;:143;;;;:::i;:::-;46065:7;:23;;:169;;;;;45722:520;;;:::o;46250:662::-;46389:22;;:::i;:::-;46442:24;46454:11;46442:7;:11;;:24;;;;:::i;:::-;46424:7;:15;;:42;;;;;46499:36;46523:11;46499:7;:19;;;:23;;:36;;;;:::i;:::-;46477:7;:19;;:58;;;;;46561:29;46578:11;46561:7;:12;;;:16;;:29;;;;:::i;:::-;46546:7;:12;;:44;;;;;46617:30;46635:11;46617:7;:13;;;:17;;:30;;;;:::i;:::-;46601:7;:13;;:46;;;;;46673:29;46690:11;46673:7;:12;;;:16;;:29;;;;:::i;:::-;46658:7;:12;;:44;;;;;46739:165;46891:7;:12;;;46739:133;46858:7;:13;;;46739:100;46826:7;:12;;;46739:68;46787:7;:19;;;46739:7;:29;;;:47;;:68;;;;:::i;:::-;:86;;:100;;;;:::i;:::-;:118;;:133;;;;:::i;:::-;:151;;:165;;;;:::i;:::-;46713:7;:23;;:191;;;;;46250:662;;;;;:::o;53404:589::-;53530:21;53568:1;53554:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53530:40;;53599:4;53581;53586:1;53581:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;53625:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53615:4;53620:1;53615:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;53660:62;53677:4;53692:15;53710:11;53660:8;:62::i;:::-;53761:15;:66;;;53842:11;53868:1;53912:4;53939;53959:15;53761:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53459:534;53404:589;:::o;51909:263::-;51967:19;51989:10;:8;:10::i;:::-;51967:32;;52010:13;52026:22;52036:11;52026:5;:9;;:22;;;;:::i;:::-;52010:38;;52085:5;52059:7;:22;52067:13;52059:22;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;52127:5;52101:7;:22;52109:13;52101:22;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;52148:16;52158:5;52148:16;;;;;;:::i;:::-;;;;;;;;51956:216;;51909:263;:::o;48822:378::-;48887:1;48869:14;;:19;:35;;;;;48903:1;48892:7;;:12;48869:35;:52;;;;;48920:1;48908:8;;:13;48869:52;48923:7;48865:65;48970:14;;48942:25;:42;;;;49014:8;;48995:16;:27;;;;49051:7;;49033:15;:25;;;;49087:7;;49069:15;:25;;;;49117:1;49107:7;:11;;;;49140:1;49129:8;:12;;;;49169:1;49152:14;:18;;;;49191:1;49181:7;:11;;;;48822:378;:::o;55638:652::-;55775:22;55799;55825:19;55836:7;55825:10;:19::i;:::-;55774:70;;;;55873:28;55893:7;55873;:15;55881:6;55873:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;55855:7;:15;55863:6;55855:15;;;;;;;;;;;;;;;:46;;;;55930:36;55950:7;:15;;;55930:7;:15;55938:6;55930:15;;;;;;;;;;;;;;;;:19;;:36;;;;:::i;:::-;55912:7;:15;55920:6;55912:15;;;;;;;;;;;;;;;:54;;;;55998:47;56021:7;:23;;;55998:7;:18;56006:9;55998:18;;;;;;;;;;;;;;;;:22;;:47;;;;:::i;:::-;55977:7;:18;55985:9;55977:18;;;;;;;;;;;;;;;:68;;;;56056:48;56077:7;:12;;;56091:7;:12;;;56056:20;:48::i;:::-;56115:35;56121:7;:13;;;56136:7;:13;;;56115:5;:35::i;:::-;56161:53;56173:7;:19;;;56194:7;:19;;;56161:11;:53::i;:::-;56247:9;56230:52;;56239:6;56230:52;;;56258:7;:23;;;56230:52;;;;;;:::i;:::-;;;;;;;;55763:527;;55638:652;;;:::o;56298:672::-;56433:22;56457;56483:19;56494:7;56483:10;:19::i;:::-;56432:70;;;;56531:36;56551:7;:15;;;56531:7;:15;56539:6;56531:15;;;;;;;;;;;;;;;;:19;;:36;;;;:::i;:::-;56513:7;:15;56521:6;56513:15;;;;;;;;;;;;;;;:54;;;;56599:47;56622:7;:23;;;56599:7;:18;56607:9;56599:18;;;;;;;;;;;;;;;;:22;;:47;;;;:::i;:::-;56578:7;:18;56586:9;56578:18;;;;;;;;;;;;;;;:68;;;;56678:47;56701:7;:23;;;56678:7;:18;56686:9;56678:18;;;;;;;;;;;;;;;;:22;;:47;;;;:::i;:::-;56657:7;:18;56665:9;56657:18;;;;;;;;;;;;;;;:68;;;;56736:48;56757:7;:12;;;56771:7;:12;;;56736:20;:48::i;:::-;56795:35;56801:7;:13;;;56816:7;:13;;;56795:5;:35::i;:::-;56841:53;56853:7;:19;;;56874:7;:19;;;56841:11;:53::i;:::-;56927:9;56910:52;;56919:6;56910:52;;;56938:7;:23;;;56910:52;;;;;;:::i;:::-;;;;;;;;56421:549;;56298:672;;;:::o;56978:591::-;57111:22;57135;57161:19;57172:7;57161:10;:19::i;:::-;57110:70;;;;57209:36;57229:7;:15;;;57209:7;:15;57217:6;57209:15;;;;;;;;;;;;;;;;:19;;:36;;;;:::i;:::-;57191:7;:15;57199:6;57191:15;;;;;;;;;;;;;;;:54;;;;57277:47;57300:7;:23;;;57277:7;:18;57285:9;57277:18;;;;;;;;;;;;;;;;:22;;:47;;;;:::i;:::-;57256:7;:18;57264:9;57256:18;;;;;;;;;;;;;;;:68;;;;57335:48;57356:7;:12;;;57370:7;:12;;;57335:20;:48::i;:::-;57394:35;57400:7;:13;;;57415:7;:13;;;57394:5;:35::i;:::-;57440:53;57452:7;:19;;;57473:7;:19;;;57440:11;:53::i;:::-;57526:9;57509:52;;57518:6;57509:52;;;57537:7;:23;;;57509:52;;;;;;:::i;:::-;;;;;;;;57099:470;;56978:591;;;:::o;57577:731::-;57714:22;57738;57764:19;57775:7;57764:10;:19::i;:::-;57713:70;;;;57812:28;57832:7;57812;:15;57820:6;57812:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;57794:7;:15;57802:6;57794:15;;;;;;;;;;;;;;;:46;;;;57869:36;57889:7;:15;;;57869:7;:15;57877:6;57869:15;;;;;;;;;;;;;;;;:19;;:36;;;;:::i;:::-;57851:7;:15;57859:6;57851:15;;;;;;;;;;;;;;;:54;;;;57937:47;57960:7;:23;;;57937:7;:18;57945:9;57937:18;;;;;;;;;;;;;;;;:22;;:47;;;;:::i;:::-;57916:7;:18;57924:9;57916:18;;;;;;;;;;;;;;;:68;;;;58016:47;58039:7;:23;;;58016:7;:18;58024:9;58016:18;;;;;;;;;;;;;;;;:22;;:47;;;;:::i;:::-;57995:7;:18;58003:9;57995:18;;;;;;;;;;;;;;;:68;;;;58074:48;58095:7;:12;;;58109:7;:12;;;58074:20;:48::i;:::-;58133:35;58139:7;:13;;;58154:7;:13;;;58133:5;:35::i;:::-;58179:53;58191:7;:19;;;58212:7;:19;;;58179:11;:53::i;:::-;58265:9;58248:52;;58257:6;58248:52;;;58276:7;:23;;;58248:52;;;;;;:::i;:::-;;;;;;;;57702:606;;57577:731;;;:::o;49208:204::-;49262:15;;49252:7;:25;;;;49299:16;;49288:8;:27;;;;49343:25;;49326:14;:42;;;;49389:15;;49379:7;:25;;;;49208:204::o;48222:176::-;48320:7;48352:38;48384:5;48352:27;48364:14;;48352:7;:11;;:27;;;;:::i;:::-;:31;;:38;;;;:::i;:::-;48345:45;;48222:176;;;:::o;48406:130::-;48470:7;48497:31;48522:5;48497:20;48509:7;;48497;:11;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;48490:38;;48406:130;;;:::o;48544:132::-;48609:7;48636:32;48662:5;48636:21;48648:8;;48636:7;:11;;:21;;;;:::i;:::-;:25;;:32;;;;:::i;:::-;48629:39;;48544:132;;;:::o;48684:130::-;48748:7;48775:31;48800:5;48775:20;48787:7;;48775;:11;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;48768:38;;48684:130;;;:::o;47705:509::-;47788:19;47810:10;:8;:10::i;:::-;47788:32;;47831:18;47852:27;47867:11;47852:10;:14;;:27;;;;:::i;:::-;47831:48;;47890:12;47905:21;47914:11;47905:4;:8;;:21;;;;:::i;:::-;47890:36;;47962:72;48019:4;47962:38;47989:10;47962:7;:22;47978:4;47962:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;:42;;:72;;;;:::i;:::-;47937:7;:22;47953:4;47937:22;;;;;;;;;;;;;;;:97;;;;48049:22;:37;48080:4;48049:37;;;;;;;;;;;;;;;;;;;;;;;;;48045:161;;;48126:80;48187:4;48126:38;48153:10;48126:7;:22;48142:4;48126:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;:42;;:80;;;;:::i;:::-;48101:7;:22;48117:4;48101:22;;;;;;;;;;;;;;;:105;;;;48045:161;47777:437;;;47705:509;;:::o;51763:138::-;51852:5;51828:7;:20;36453:6;51828:20;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;51873:20;51878:5;51885:7;;51873:20;;;;;;;:::i;:::-;;;;;;;;51763:138;;:::o;45309:147::-;45387:17;45399:4;45387:7;;:11;;:17;;;;:::i;:::-;45377:7;:27;;;;45428:20;45443:4;45428:10;;:14;;:20;;;;:::i;:::-;45415:10;:33;;;;45309:147;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:60::-;3874:3;3895:5;3888:12;;3846:60;;;:::o;3912:142::-;3962:9;3995:53;4013:34;4022:24;4040:5;4022:24;:::i;:::-;4013:34;:::i;:::-;3995:53;:::i;:::-;3982:66;;3912:142;;;:::o;4060:126::-;4110:9;4143:37;4174:5;4143:37;:::i;:::-;4130:50;;4060:126;;;:::o;4192:153::-;4269:9;4302:37;4333:5;4302:37;:::i;:::-;4289:50;;4192:153;;;:::o;4351:185::-;4465:64;4523:5;4465:64;:::i;:::-;4460:3;4453:77;4351:185;;:::o;4542:276::-;4662:4;4700:2;4689:9;4685:18;4677:26;;4713:98;4808:1;4797:9;4793:17;4784:6;4713:98;:::i;:::-;4542:276;;;;:::o;4824:329::-;4883:6;4932:2;4920:9;4911:7;4907:23;4903:32;4900:119;;;4938:79;;:::i;:::-;4900:119;5058:1;5083:53;5128:7;5119:6;5108:9;5104:22;5083:53;:::i;:::-;5073:63;;5029:117;4824:329;;;;:::o;5159:619::-;5236:6;5244;5252;5301:2;5289:9;5280:7;5276:23;5272:32;5269:119;;;5307:79;;:::i;:::-;5269:119;5427:1;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5398:117;5554:2;5580:53;5625:7;5616:6;5605:9;5601:22;5580:53;:::i;:::-;5570:63;;5525:118;5682:2;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5653:118;5159:619;;;;;:::o;5784:86::-;5819:7;5859:4;5852:5;5848:16;5837:27;;5784:86;;;:::o;5876:112::-;5959:22;5975:5;5959:22;:::i;:::-;5954:3;5947:35;5876:112;;:::o;5994:214::-;6083:4;6121:2;6110:9;6106:18;6098:26;;6134:67;6198:1;6187:9;6183:17;6174:6;6134:67;:::i;:::-;5994:214;;;;:::o;6214:329::-;6273:6;6322:2;6310:9;6301:7;6297:23;6293:32;6290:119;;;6328:79;;:::i;:::-;6290:119;6448:1;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;:::i;:::-;6463:63;;6419:117;6214:329;;;;:::o;6549:116::-;6619:21;6634:5;6619:21;:::i;:::-;6612:5;6609:32;6599:60;;6655:1;6652;6645:12;6599:60;6549:116;:::o;6671:133::-;6714:5;6752:6;6739:20;6730:29;;6768:30;6792:5;6768:30;:::i;:::-;6671:133;;;;:::o;6810:468::-;6875:6;6883;6932:2;6920:9;6911:7;6907:23;6903:32;6900:119;;;6938:79;;:::i;:::-;6900:119;7058:1;7083:53;7128:7;7119:6;7108:9;7104:22;7083:53;:::i;:::-;7073:63;;7029:117;7185:2;7211:50;7253:7;7244:6;7233:9;7229:22;7211:50;:::i;:::-;7201:60;;7156:115;6810:468;;;;;:::o;7284:118::-;7371:24;7389:5;7371:24;:::i;:::-;7366:3;7359:37;7284:118;;:::o;7408:222::-;7501:4;7539:2;7528:9;7524:18;7516:26;;7552:71;7620:1;7609:9;7605:17;7596:6;7552:71;:::i;:::-;7408:222;;;;:::o;7636:474::-;7704:6;7712;7761:2;7749:9;7740:7;7736:23;7732:32;7729:119;;;7767:79;;:::i;:::-;7729:119;7887:1;7912:53;7957:7;7948:6;7937:9;7933:22;7912:53;:::i;:::-;7902:63;;7858:117;8014:2;8040:53;8085:7;8076:6;8065:9;8061:22;8040:53;:::i;:::-;8030:63;;7985:118;7636:474;;;;;:::o;8116:323::-;8172:6;8221:2;8209:9;8200:7;8196:23;8192:32;8189:119;;;8227:79;;:::i;:::-;8189:119;8347:1;8372:50;8414:7;8405:6;8394:9;8390:22;8372:50;:::i;:::-;8362:60;;8318:114;8116:323;;;;:::o;8445:180::-;8493:77;8490:1;8483:88;8590:4;8587:1;8580:15;8614:4;8611:1;8604:15;8631:320;8675:6;8712:1;8706:4;8702:12;8692:22;;8759:1;8753:4;8749:12;8780:18;8770:81;;8836:4;8828:6;8824:17;8814:27;;8770:81;8898:2;8890:6;8887:14;8867:18;8864:38;8861:84;;8917:18;;:::i;:::-;8861:84;8682:269;8631:320;;;:::o;8957:229::-;9097:34;9093:1;9085:6;9081:14;9074:58;9166:12;9161:2;9153:6;9149:15;9142:37;8957:229;:::o;9192:366::-;9334:3;9355:67;9419:2;9414:3;9355:67;:::i;:::-;9348:74;;9431:93;9520:3;9431:93;:::i;:::-;9549:2;9544:3;9540:12;9533:19;;9192:366;;;:::o;9564:419::-;9730:4;9768:2;9757:9;9753:18;9745:26;;9817:9;9811:4;9807:20;9803:1;9792:9;9788:17;9781:47;9845:131;9971:4;9845:131;:::i;:::-;9837:139;;9564:419;;;:::o;9989:177::-;10129:29;10125:1;10117:6;10113:14;10106:53;9989:177;:::o;10172:366::-;10314:3;10335:67;10399:2;10394:3;10335:67;:::i;:::-;10328:74;;10411:93;10500:3;10411:93;:::i;:::-;10529:2;10524:3;10520:12;10513:19;;10172:366;;;:::o;10544:419::-;10710:4;10748:2;10737:9;10733:18;10725:26;;10797:9;10791:4;10787:20;10783:1;10772:9;10768:17;10761:47;10825:131;10951:4;10825:131;:::i;:::-;10817:139;;10544:419;;;:::o;10969:180::-;11017:77;11014:1;11007:88;11114:4;11111:1;11104:15;11138:4;11135:1;11128:15;11155:180;11203:77;11200:1;11193:88;11300:4;11297:1;11290:15;11324:4;11321:1;11314:15;11341:191;11381:4;11401:20;11419:1;11401:20;:::i;:::-;11396:25;;11435:20;11453:1;11435:20;:::i;:::-;11430:25;;11474:1;11471;11468:8;11465:34;;;11479:18;;:::i;:::-;11465:34;11524:1;11521;11517:9;11509:17;;11341:191;;;;:::o;11538:180::-;11586:77;11583:1;11576:88;11683:4;11680:1;11673:15;11707:4;11704:1;11697:15;11724:233;11763:3;11786:24;11804:5;11786:24;:::i;:::-;11777:33;;11832:66;11825:5;11822:77;11819:103;;11902:18;;:::i;:::-;11819:103;11949:1;11942:5;11938:13;11931:20;;11724:233;;;:::o;11963:231::-;12103:34;12099:1;12091:6;12087:14;12080:58;12172:14;12167:2;12159:6;12155:15;12148:39;11963:231;:::o;12200:366::-;12342:3;12363:67;12427:2;12422:3;12363:67;:::i;:::-;12356:74;;12439:93;12528:3;12439:93;:::i;:::-;12557:2;12552:3;12548:12;12541:19;;12200:366;;;:::o;12572:419::-;12738:4;12776:2;12765:9;12761:18;12753:26;;12825:9;12819:4;12815:20;12811:1;12800:9;12796:17;12789:47;12853:131;12979:4;12853:131;:::i;:::-;12845:139;;12572:419;;;:::o;12997:181::-;13137:33;13133:1;13125:6;13121:14;13114:57;12997:181;:::o;13184:366::-;13326:3;13347:67;13411:2;13406:3;13347:67;:::i;:::-;13340:74;;13423:93;13512:3;13423:93;:::i;:::-;13541:2;13536:3;13532:12;13525:19;;13184:366;;;:::o;13556:419::-;13722:4;13760:2;13749:9;13745:18;13737:26;;13809:9;13803:4;13799:20;13795:1;13784:9;13780:17;13773:47;13837:131;13963:4;13837:131;:::i;:::-;13829:139;;13556:419;;;:::o;13981:225::-;14121:34;14117:1;14109:6;14105:14;14098:58;14190:8;14185:2;14177:6;14173:15;14166:33;13981:225;:::o;14212:366::-;14354:3;14375:67;14439:2;14434:3;14375:67;:::i;:::-;14368:74;;14451:93;14540:3;14451:93;:::i;:::-;14569:2;14564:3;14560:12;14553:19;;14212:366;;;:::o;14584:419::-;14750:4;14788:2;14777:9;14773:18;14765:26;;14837:9;14831:4;14827:20;14823:1;14812:9;14808:17;14801:47;14865:131;14991:4;14865:131;:::i;:::-;14857:139;;14584:419;;;:::o;15009:180::-;15057:77;15054:1;15047:88;15154:4;15151:1;15144:15;15178:4;15175:1;15168:15;15195:185;15235:1;15252:20;15270:1;15252:20;:::i;:::-;15247:25;;15286:20;15304:1;15286:20;:::i;:::-;15281:25;;15325:1;15315:35;;15330:18;;:::i;:::-;15315:35;15372:1;15369;15365:9;15360:14;;15195:185;;;;:::o;15386:223::-;15526:34;15522:1;15514:6;15510:14;15503:58;15595:6;15590:2;15582:6;15578:15;15571:31;15386:223;:::o;15615:366::-;15757:3;15778:67;15842:2;15837:3;15778:67;:::i;:::-;15771:74;;15854:93;15943:3;15854:93;:::i;:::-;15972:2;15967:3;15963:12;15956:19;;15615:366;;;:::o;15987:419::-;16153:4;16191:2;16180:9;16176:18;16168:26;;16240:9;16234:4;16230:20;16226:1;16215:9;16211:17;16204:47;16268:131;16394:4;16268:131;:::i;:::-;16260:139;;15987:419;;;:::o;16412:221::-;16552:34;16548:1;16540:6;16536:14;16529:58;16621:4;16616:2;16608:6;16604:15;16597:29;16412:221;:::o;16639:366::-;16781:3;16802:67;16866:2;16861:3;16802:67;:::i;:::-;16795:74;;16878:93;16967:3;16878:93;:::i;:::-;16996:2;16991:3;16987:12;16980:19;;16639:366;;;:::o;17011:419::-;17177:4;17215:2;17204:9;17200:18;17192:26;;17264:9;17258:4;17254:20;17250:1;17239:9;17235:17;17228:47;17292:131;17418:4;17292:131;:::i;:::-;17284:139;;17011:419;;;:::o;17436:182::-;17576:34;17572:1;17564:6;17560:14;17553:58;17436:182;:::o;17624:366::-;17766:3;17787:67;17851:2;17846:3;17787:67;:::i;:::-;17780:74;;17863:93;17952:3;17863:93;:::i;:::-;17981:2;17976:3;17972:12;17965:19;;17624:366;;;:::o;17996:419::-;18162:4;18200:2;18189:9;18185:18;18177:26;;18249:9;18243:4;18239:20;18235:1;18224:9;18220:17;18213:47;18277:131;18403:4;18277:131;:::i;:::-;18269:139;;17996:419;;;:::o;18421:224::-;18561:34;18557:1;18549:6;18545:14;18538:58;18630:7;18625:2;18617:6;18613:15;18606:32;18421:224;:::o;18651:366::-;18793:3;18814:67;18878:2;18873:3;18814:67;:::i;:::-;18807:74;;18890:93;18979:3;18890:93;:::i;:::-;19008:2;19003:3;18999:12;18992:19;;18651:366;;;:::o;19023:419::-;19189:4;19227:2;19216:9;19212:18;19204:26;;19276:9;19270:4;19266:20;19262:1;19251:9;19247:17;19240:47;19304:131;19430:4;19304:131;:::i;:::-;19296:139;;19023:419;;;:::o;19448:222::-;19588:34;19584:1;19576:6;19572:14;19565:58;19657:5;19652:2;19644:6;19640:15;19633:30;19448:222;:::o;19676:366::-;19818:3;19839:67;19903:2;19898:3;19839:67;:::i;:::-;19832:74;;19915:93;20004:3;19915:93;:::i;:::-;20033:2;20028:3;20024:12;20017:19;;19676:366;;;:::o;20048:419::-;20214:4;20252:2;20241:9;20237:18;20229:26;;20301:9;20295:4;20291:20;20287:1;20276:9;20272:17;20265:47;20329:131;20455:4;20329:131;:::i;:::-;20321:139;;20048:419;;;:::o;20473:228::-;20613:34;20609:1;20601:6;20597:14;20590:58;20682:11;20677:2;20669:6;20665:15;20658:36;20473:228;:::o;20707:366::-;20849:3;20870:67;20934:2;20929:3;20870:67;:::i;:::-;20863:74;;20946:93;21035:3;20946:93;:::i;:::-;21064:2;21059:3;21055:12;21048:19;;20707:366;;;:::o;21079:419::-;21245:4;21283:2;21272:9;21268:18;21260:26;;21332:9;21326:4;21322:20;21318:1;21307:9;21303:17;21296:47;21360:131;21486:4;21360:131;:::i;:::-;21352:139;;21079:419;;;:::o;21504:227::-;21644:34;21640:1;21632:6;21628:14;21621:58;21713:10;21708:2;21700:6;21696:15;21689:35;21504:227;:::o;21737:366::-;21879:3;21900:67;21964:2;21959:3;21900:67;:::i;:::-;21893:74;;21976:93;22065:3;21976:93;:::i;:::-;22094:2;22089:3;22085:12;22078:19;;21737:366;;;:::o;22109:419::-;22275:4;22313:2;22302:9;22298:18;22290:26;;22362:9;22356:4;22352:20;22348:1;22337:9;22333:17;22326:47;22390:131;22516:4;22390:131;:::i;:::-;22382:139;;22109:419;;;:::o;22534:348::-;22574:7;22597:20;22615:1;22597:20;:::i;:::-;22592:25;;22631:20;22649:1;22631:20;:::i;:::-;22626:25;;22819:1;22751:66;22747:74;22744:1;22741:81;22736:1;22729:9;22722:17;22718:105;22715:131;;;22826:18;;:::i;:::-;22715:131;22874:1;22871;22867:9;22856:20;;22534:348;;;;:::o;22888:305::-;22928:3;22947:20;22965:1;22947:20;:::i;:::-;22942:25;;22981:20;22999:1;22981:20;:::i;:::-;22976:25;;23135:1;23067:66;23063:74;23060:1;23057:81;23054:107;;;23141:18;;:::i;:::-;23054:107;23185:1;23182;23178:9;23171:16;;22888:305;;;;:::o;23199:147::-;23300:11;23337:3;23322:18;;23199:147;;;;:::o;23352:114::-;;:::o;23472:398::-;23631:3;23652:83;23733:1;23728:3;23652:83;:::i;:::-;23645:90;;23744:93;23833:3;23744:93;:::i;:::-;23862:1;23857:3;23853:11;23846:18;;23472:398;;;:::o;23876:379::-;24060:3;24082:147;24225:3;24082:147;:::i;:::-;24075:154;;24246:3;24239:10;;23876:379;;;:::o;24261:180::-;24309:77;24306:1;24299:88;24406:4;24403:1;24396:15;24430:4;24427:1;24420:15;24447:143;24504:5;24535:6;24529:13;24520:22;;24551:33;24578:5;24551:33;:::i;:::-;24447:143;;;;:::o;24596:351::-;24666:6;24715:2;24703:9;24694:7;24690:23;24686:32;24683:119;;;24721:79;;:::i;:::-;24683:119;24841:1;24866:64;24922:7;24913:6;24902:9;24898:22;24866:64;:::i;:::-;24856:74;;24812:128;24596:351;;;;:::o;24953:85::-;24998:7;25027:5;25016:16;;24953:85;;;:::o;25044:158::-;25102:9;25135:61;25153:42;25162:32;25188:5;25162:32;:::i;:::-;25153:42;:::i;:::-;25135:61;:::i;:::-;25122:74;;25044:158;;;:::o;25208:147::-;25303:45;25342:5;25303:45;:::i;:::-;25298:3;25291:58;25208:147;;:::o;25361:114::-;25428:6;25462:5;25456:12;25446:22;;25361:114;;;:::o;25481:184::-;25580:11;25614:6;25609:3;25602:19;25654:4;25649:3;25645:14;25630:29;;25481:184;;;;:::o;25671:132::-;25738:4;25761:3;25753:11;;25791:4;25786:3;25782:14;25774:22;;25671:132;;;:::o;25809:108::-;25886:24;25904:5;25886:24;:::i;:::-;25881:3;25874:37;25809:108;;:::o;25923:179::-;25992:10;26013:46;26055:3;26047:6;26013:46;:::i;:::-;26091:4;26086:3;26082:14;26068:28;;25923:179;;;;:::o;26108:113::-;26178:4;26210;26205:3;26201:14;26193:22;;26108:113;;;:::o;26257:732::-;26376:3;26405:54;26453:5;26405:54;:::i;:::-;26475:86;26554:6;26549:3;26475:86;:::i;:::-;26468:93;;26585:56;26635:5;26585:56;:::i;:::-;26664:7;26695:1;26680:284;26705:6;26702:1;26699:13;26680:284;;;26781:6;26775:13;26808:63;26867:3;26852:13;26808:63;:::i;:::-;26801:70;;26894:60;26947:6;26894:60;:::i;:::-;26884:70;;26740:224;26727:1;26724;26720:9;26715:14;;26680:284;;;26684:14;26980:3;26973:10;;26381:608;;;26257:732;;;;:::o;26995:831::-;27258:4;27296:3;27285:9;27281:19;27273:27;;27310:71;27378:1;27367:9;27363:17;27354:6;27310:71;:::i;:::-;27391:80;27467:2;27456:9;27452:18;27443:6;27391:80;:::i;:::-;27518:9;27512:4;27508:20;27503:2;27492:9;27488:18;27481:48;27546:108;27649:4;27640:6;27546:108;:::i;:::-;27538:116;;27664:72;27732:2;27721:9;27717:18;27708:6;27664:72;:::i;:::-;27746:73;27814:3;27803:9;27799:19;27790:6;27746:73;:::i;:::-;26995:831;;;;;;;;:::o;27832:332::-;27953:4;27991:2;27980:9;27976:18;27968:26;;28004:71;28072:1;28061:9;28057:17;28048:6;28004:71;:::i;:::-;28085:72;28153:2;28142:9;28138:18;28129:6;28085:72;:::i;:::-;27832:332;;;;;:::o

Swarm Source

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