ETH Price: $1,981.22 (-0.89%)
 

Overview

Max Total Supply

1,000,000,000 PUPPIES

Holders

80

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

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:
Puppies

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-05-28
*/

//SPDX-License-Identifier: MIT
// 
// 新生的牛市就像一隻小狗
// 小易碎易分心
//
// Bullish on $PUPPIES.
//
//
//
//

// File: @uniswap/v2-core/contracts/interfaces/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: @uniswap/v2-core/contracts/interfaces/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: @uniswap/v2-periphery/contracts/interfaces/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: @uniswap/v2-periphery/contracts/interfaces/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: @openzeppelin/contracts/utils/Context.sol


// 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/Ownable.sol


// 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/math/SafeMath.sol


// 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/token/ERC20/IERC20.sol


// 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/Address.sol


// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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/Puppies.sol


pragma solidity ^0.8.9;


contract Puppies is Context, 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 _isExcluded;
  address[] private _excluded;

  mapping(address => bool) private botWallets;
  bool botsCantTrade = false;

  bool public canTrade = false;

  uint256 private constant MAX = ~uint256(0);
  uint256 private _tTotal = 1_000_000_000 * 10 ** 9;
  uint256 private _rTotal = (MAX - (MAX % _tTotal));
  uint256 private _tFeeTotal;
  address payable private marketingWallet;
  address payable private devTaxWallet;

  string private _name = "Promising Uncapped Presale from a Professional Influencer with Excellent Salesmanship (PUPPIES)";
  string private _symbol = "PUPPIES";
  uint8 private _decimals = 9;

  uint256 private _taxFeeOnBuy = 300; // 3%
  uint256 private _taxFeeOnSell = 400; // 4%
  uint256 public _taxFee = _taxFeeOnBuy;
  uint256 private _previousTaxFee = _taxFee;
  uint256 private _previousTaxFeeOnBuy = _taxFeeOnBuy;
  uint256 private _previousTaxFeeOnSell = _taxFeeOnSell;

  uint256 private _devFeeOnBuy = 100; // 1%
  uint256 private _devFeeOnSell = 100; // 1%
  uint256 private _devFee = _devFeeOnBuy;
  uint256 private _previousDevFee = _devFee;
  uint256 private _previousDevFeeOnBuy = _devFeeOnBuy;
  uint256 private _previousDevFeeOnSell = _devFeeOnSell;

  uint256 private _liquidityFeeOnBuy = 100; //1%
  uint256 private _liquidityFeeOnSell = 200; //2%
  uint256 public _liquidityFee = _liquidityFeeOnBuy;
  uint256 private _previousLiquidityFee = _liquidityFee;
  uint256 private _previousLiquidityFeeOnBuy = _liquidityFeeOnBuy;
  uint256 private _previousLiquidityFeeOnSell = _liquidityFeeOnSell;

  IUniswapV2Router02 public immutable uniswapV2Router;
  address public immutable uniswapV2Pair;

  bool inSwapAndLiquify = false;
  bool public swapAndLiquifyEnabled = true;

  uint256 public _maxTxAmount = 30_000_000 * 10 ** 9; // 3%
  uint256 public _maxWalletSize = 30_000_000 * 10 ** 9; // 3%
  uint256 public _swapTokensAtAmount = 100000 * 10 ** 9; //0.01%

  event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
  event SwapAndLiquifyEnabledUpdated(bool enabled);
  event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);

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

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

    IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    marketingWallet = payable(0x7aaed1EC905cF7e558fDa64c8010aa8568a9984D);
    devTaxWallet = payable(0x92d8Da3b7dF826EFEf01a48b8D45e6Ba3F0287B9);

    uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

    uniswapV2Router = _uniswapV2Router;

    //exclude owner and this contract from fee
    _isExcludedFromFee[owner()] = true;
    _isExcludedFromFee[address(this)] = true;
    _isExcludedFromFee[devTaxWallet] = true;
    _isExcludedFromFee[marketingWallet] = true;

    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 (_isExcluded[account]) return _tOwned[account];
    return tokenFromReflection(_rOwned[account]);
  }

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

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

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

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

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

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

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

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

  function airdrop(address recipient, uint256 amount) external onlyOwner {
    _removeAllFee();
    _transfer(_msgSender(), recipient, amount * 10 ** 9);
    _restoreAllFee();
  }

  function airdropInternal(address recipient, uint256 amount) internal {
    _removeAllFee();
    _transfer(_msgSender(), recipient, amount);
    _restoreAllFee();
  }

  function airdropArray(address[] calldata newholders, uint256[] calldata amounts) external onlyOwner {
    uint256 iterator = 0;
    require(newholders.length == amounts.length, "must be the same length");
    while (iterator < newholders.length) {
      airdropInternal(newholders[iterator], amounts[iterator] * 10 ** 9);
      iterator += 1;
    }
  }

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

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

  function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
    require(rAmount <= _rTotal, "Amount must be less than total reflections");
    uint256 currentRate = _getRate();
    return rAmount.div(currentRate);
  }

  function excludeFromReward(address account) public onlyOwner {
    require(!_isExcluded[account], "Account is already excluded");
    if (_rOwned[account] > 0) {
      _tOwned[account] = tokenFromReflection(_rOwned[account]);
    }
    _isExcluded[account] = true;
    _excluded.push(account);
  }

  function includeInReward(address account) external onlyOwner {
    require(_isExcluded[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;
        _isExcluded[account] = false;
        _excluded.pop();
        break;
      }
    }
  }

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

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

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

  function setMarketingWallet(address walletAddress) public onlyOwner {
    marketingWallet = payable(walletAddress);
  }

  function updateBuyFees(uint256 taxFeeOnBuy, uint256 liquidityFeeOnBuy, uint256 devFeeOnBuy) external onlyOwner {
    _taxFeeOnBuy = taxFeeOnBuy;
    _liquidityFeeOnBuy = liquidityFeeOnBuy;
    _devFeeOnBuy = devFeeOnBuy;
    uint256 buyTotalFees = _taxFeeOnBuy + _liquidityFeeOnBuy + _devFeeOnBuy;
    require(buyTotalFees <= 700, "Must keep fees at 7% or less");
  }

  function updateSellFees(uint256 taxFeeOnSell, uint256 liquidityFeeOnSell, uint256 devFeeOnSell) external onlyOwner {
    _taxFeeOnSell = taxFeeOnSell;
    _liquidityFeeOnSell = liquidityFeeOnSell;
    _devFeeOnSell = devFeeOnSell;
    uint256 sellTotalFees = _taxFeeOnSell + _liquidityFeeOnSell + _devFeeOnSell;
    require(sellTotalFees <= 700, "Must keep fees at 7% or less");
  }

  function removeAllFee() external onlyOwner {
    _removeAllFee();
  }

  function _removeAllFee() private {
    if (_taxFee == 0 && _liquidityFee == 0) return;

    _previousTaxFee = _taxFee;
    _previousLiquidityFee = _liquidityFee;
    _previousDevFee = _devFee;

    _previousTaxFeeOnBuy = _taxFeeOnBuy;
    _previousLiquidityFeeOnBuy = _liquidityFeeOnBuy;
    _previousDevFeeOnBuy = _devFeeOnBuy;

    _previousTaxFeeOnSell = _taxFeeOnSell;
    _previousLiquidityFeeOnSell = _liquidityFeeOnSell;
    _previousDevFeeOnSell = _devFeeOnSell;

    _devFee = 0;
    _taxFee = 0;
    _liquidityFee = 0;

    _taxFeeOnBuy = 0;
    _liquidityFeeOnBuy = 0;
    _devFeeOnBuy = 0;

    _taxFeeOnSell = 0;
    _liquidityFeeOnSell = 0;
    _devFeeOnSell = 0;
  }

  function restoreAllFee() external onlyOwner {
    _restoreAllFee();
  }

  function _restoreAllFee() private {
    _taxFee = _previousTaxFee;
    _liquidityFee = _previousLiquidityFee;
    _devFee = _previousDevFee;

    _taxFeeOnBuy = _previousTaxFeeOnBuy;
    _liquidityFeeOnBuy = _previousLiquidityFeeOnBuy;
    _devFeeOnBuy = _previousDevFeeOnBuy;

    _taxFeeOnSell = _previousTaxFeeOnSell;
    _liquidityFeeOnSell = _previousLiquidityFeeOnSell;
    _devFeeOnSell = _previousDevFeeOnSell;
  }

  function setTxLimits(uint256 maxTxAmount, uint256 maxWalletSize, uint256 SwapThresholdAmount) external onlyOwner {
    require(maxTxAmount > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    require(maxWalletSize > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    require(SwapThresholdAmount > 100_000, "Swap Threshold Amount cannot be less than 100k");
    _swapTokensAtAmount = SwapThresholdAmount * 10 ** 9;
    _maxWalletSize = maxWalletSize * 10 ** 9;
    _maxTxAmount = maxTxAmount * 10 ** 9;
  }

  function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner {
    require(maxTxAmount > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    _maxTxAmount = maxTxAmount * 10 ** 9;
  }

  function setMaxWalletSize(uint256 maxWalletSize) public onlyOwner {
    require(maxWalletSize > 10_000_000, "Max Tx Amount cannot be less than 10 Million");
    _maxWalletSize = maxWalletSize * 10 ** 9;
  }

  function setSwapThresholdAmount(uint256 SwapThresholdAmount) external onlyOwner {
    require(SwapThresholdAmount > 100_000, "Swap Threshold Amount cannot be less than 100k");
    _swapTokensAtAmount = SwapThresholdAmount * 10 ** 9;
  }

  function claimTokens() public onlyOwner {
    marketingWallet.transfer(address(this).balance);
  }

  function claimOtherTokens(IERC20 tokenAddress, address walletaddress) external onlyOwner {
    tokenAddress.transfer(walletaddress, tokenAddress.balanceOf(address(this)));
  }

  function clearStuckBalance(address walletAddress) external onlyOwner {
    payable(walletAddress).transfer(address(this).balance);
  }

  function addBotWallet(address botwallet) external onlyOwner {
    botWallets[botwallet] = true;
  }

  function removeBotWallet(address botwallet) external onlyOwner {
    botWallets[botwallet] = false;
  }

  function getBotWalletStatus(address botwallet) public view returns (bool) {
    return botWallets[botwallet];
  }

  function allowtrading() external onlyOwner {
    canTrade = true;
  }

  function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
    swapAndLiquifyEnabled = _enabled;
    emit SwapAndLiquifyEnabledUpdated(_enabled);
  }

  function manualswap() external {
    require(_msgSender() == marketingWallet || _msgSender() == owner());
    uint256 contractBalance = balanceOf(address(this));
    swapTokensForEth(contractBalance);
  }

  function manualsend() external {
    require(_msgSender() == marketingWallet || _msgSender() == owner());
    uint256 contractETHBalance = address(this).balance;
    uint256 marketingBalance = contractETHBalance.mul(90).div(100);
    uint256 devBalance = contractETHBalance.mul(10).div(100);
    sendETHToFee(marketingBalance, devBalance);
  }

  function manualSwapAndLiquify() external {
    require(_msgSender() == marketingWallet || _msgSender() == owner());
    uint256 contractBalance = balanceOf(address(this));
    swapAndLiquify(contractBalance);
  }

  receive() external payable {}

  fallback() external payable {}

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

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

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

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

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

  function _getCurrentSupply() private view returns (uint256, uint256) {
    uint256 rSupply = _rTotal;
    uint256 tSupply = _tTotal;
    for (uint256 i = 0; i < _excluded.length; i++) {
      if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
      rSupply = rSupply.sub(_rOwned[_excluded[i]]);
      tSupply = tSupply.sub(_tOwned[_excluded[i]]);
    }
    if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
    return (rSupply, tSupply);
  }

  function _takeLiquidity(uint256 tLiquidity) private {
    uint256 currentRate = _getRate();
    uint256 rLiquidity = tLiquidity.mul(currentRate);
    _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
    if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
  }

  function calculateTaxFee(uint256 _amount) private view returns (uint256) {
    return _amount.mul(_taxFee).div(10 ** 4);
  }

  function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
    return _amount.mul(_liquidityFee).div(10 ** 4);
  }

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

    if (!canTrade) {
      require(from == owner(), "TOKEN: This account cannot send tokens until trading is enabled");
    }

    if (botWallets[from] || botWallets[to]) {
      require(botsCantTrade, "bots arent allowed to trade");
    }

    if (to != uniswapV2Pair) {
      require(balanceOf(to) + amount < _maxWalletSize, "TOKEN: Balance exceeds wallet size!");
    }

    uint256 contractTokenBalance = balanceOf(address(this));

    if (contractTokenBalance >= _maxTxAmount) {
      contractTokenBalance = _maxTxAmount;
    }

    bool overMinTokenBalance = contractTokenBalance >= _swapTokensAtAmount;
    if (overMinTokenBalance && !inSwapAndLiquify && from != uniswapV2Pair && swapAndLiquifyEnabled) {
      swapAndLiquify(contractTokenBalance);
    }

    bool takeFee = true;

    if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
      takeFee = false;
    } else {
      if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
        _liquidityFee = _liquidityFeeOnBuy;
        _taxFee = _taxFeeOnBuy + _devFeeOnBuy;
      }

      if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
        _liquidityFee = _liquidityFeeOnSell;
        _taxFee = _taxFeeOnSell + _devFeeOnSell;
      }
    }

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

  function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
    if (contractTokenBalance > _swapTokensAtAmount * 10) {
      contractTokenBalance = _swapTokensAtAmount * 10;
    }

    uint256 totalLiquidityFee = (_liquidityFeeOnBuy + _liquidityFeeOnSell).mul(10 ** 9);
    uint256 totalDevFee = (_devFeeOnBuy + _devFeeOnSell).mul(10 ** 9);
    uint256 totalMarketingFee = (_taxFeeOnBuy + _taxFeeOnSell).mul(10 ** 9);
    uint256 totalFee = totalMarketingFee + totalLiquidityFee + totalDevFee;

    uint256 amountForLiquidity = (contractTokenBalance.mul(totalLiquidityFee)).div(totalFee);
    uint256 halfForLiquidity = amountForLiquidity.div(2);
    uint256 halfToSwapToETH = amountForLiquidity.sub(halfForLiquidity);

    uint256 amountToSwapForETH = contractTokenBalance.sub(halfForLiquidity);

    uint256 initialBalance = address(this).balance;
    swapTokensForEth(amountToSwapForETH);

    uint256 newBalance = address(this).balance.sub(initialBalance);
    uint256 newTotalFee = totalFee - totalLiquidityFee.div(2);
    uint256 ethForLiquidity = ((newBalance * totalLiquidityFee) / 2).div(newTotalFee);

    if (halfForLiquidity > 0 && ethForLiquidity > 0) {
      addLiquidity(halfForLiquidity, ethForLiquidity);
      emit SwapAndLiquify(halfToSwapToETH, newBalance, halfForLiquidity);
    }

    uint256 ethForDev = (newBalance.mul(totalDevFee)).div(newTotalFee);
    uint256 ethForMarketing = newBalance - ethForLiquidity - ethForDev;

    if (ethForMarketing > 0 && ethForDev > 0) sendETHToFee(ethForMarketing, ethForDev);
  }

  function sendETHToFee(uint256 marketingBalance, uint256 devBalance) private {
    marketingWallet.transfer(marketingBalance);
    devTaxWallet.transfer(devBalance);
  }

  function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = uniswapV2Router.WETH();
    _approve(address(this), address(uniswapV2Router), tokenAmount);
    uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      tokenAmount,
      0,
      path,
      address(this),
      block.timestamp
    );
  }

  function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
    _approve(address(this), address(uniswapV2Router), tokenAmount);

    uniswapV2Router.addLiquidityETH{value: ethAmount}(address(this), tokenAmount, 0, 0, owner(), block.timestamp);
  }

  function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
    if (!takeFee) _removeAllFee();

    if (_isExcluded[sender] && !_isExcluded[recipient]) {
      _transferFromExcluded(sender, recipient, amount);
    } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
      _transferToExcluded(sender, recipient, amount);
    } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
      _transferStandard(sender, recipient, amount);
    } else if (_isExcluded[sender] && _isExcluded[recipient]) {
      _transferBothExcluded(sender, recipient, amount);
    } else {
      _transferStandard(sender, recipient, amount);
    }

    if (!takeFee) _restoreAllFee();
  }

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

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

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"botwallet","type":"address"}],"name":"addBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newholders","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowtrading","outputs":[],"stateMutability":"nonpayable","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":"canTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletaddress","type":"address"}],"name":"claimOtherTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","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":"botwallet","type":"address"}],"name":"getBotWalletStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"manualSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","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":"removeAllFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"botwallet","type":"address"}],"name":"removeBotWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restoreAllFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletSize","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SwapThresholdAmount","type":"uint256"}],"name":"setSwapThresholdAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletSize","type":"uint256"},{"internalType":"uint256","name":"SwapThresholdAmount","type":"uint256"}],"name":"setTxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"liquidityFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"devFeeOnBuy","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"liquidityFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"devFeeOnSell","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526008805461ffff19169055670de0b6b3a764000060098190556200002b9060001962000446565b620000399060001962000469565b600a556040518060800160405280605f8152602001620039db605f9139600e9062000065908262000536565b506040805180820190915260078152665055505049455360c81b6020820152600f9062000093908262000536565b506010805460ff1916600917905561012c60118190556101906012819055601382905560148290556015919091556016556064601781905560188190556019819055601a819055601b819055601c819055601d81905560c8601e819055601f82905560208290556021919091556022556023805461ffff1916610100179055666a94d74f4300006024819055602555655af3107a40006026553480156200013957600080fd5b506200014533620003f6565b600a543360009081526001602090815260409182902092909255600c80546001600160a01b0319908116737aaed1ec905cf7e558fda64c8010aa8568a9984d17909155600d80549091167392d8da3b7df826efef01a48b8d45e6ba3f0287b9179055805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d92839263c45a015592600480830193928290030181865afa158015620001f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021a919062000602565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000268573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028e919062000602565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000302919062000602565b6001600160a01b0390811660a05281166080526001600460006200032e6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526004909352818320805485166001908117909155600d54821684528284208054861682179055600c549091168352912080549092161790556200039f3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600954604051620003e791815260200190565b60405180910390a35062000634565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000826200046457634e487b7160e01b600052601260045260246000fd5b500690565b818103818111156200048b57634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004bc57607f821691505b602082108103620004dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200053157600081815260208120601f850160051c810160208610156200050c5750805b601f850160051c820191505b818110156200052d5782815560010162000518565b5050505b505050565b81516001600160401b0381111562000552576200055262000491565b6200056a81620005638454620004a7565b84620004e3565b602080601f831160018114620005a25760008415620005895750858301515b600019600386901b1c1916600185901b1785556200052d565b600085815260208120601f198616915b82811015620005d357888601518255948401946001909101908401620005b2565b5085821015620005f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200061557600080fd5b81516001600160a01b03811681146200062d57600080fd5b9392505050565b60805160a051613334620006a76000396000818161061401528181611ceb01528181611dcd01528181611e740152611f060152600081816103dc01528181611eb001528181611f420152818161244b015281816125040152818161254001528181612959015261298001526133346000f3fe6080604052600436106103275760003560e01c806360d48489116101ae578063a457c2d7116100eb578063dd62ed3e1161008f578063ea1644d51161006c578063ea1644d5146109b9578063ea2f0b37146109d9578063ec28438a146109f9578063f2fde38b14610a1957005b8063dd62ed3e1461093e578063e46b3b3f14610984578063e7e3e3a7146109a457005b8063c17b5b8c116100c8578063c17b5b8c146108c9578063c3c8cd80146108e9578063c49b9a80146108fe578063d4a3883f1461091e57005b8063a457c2d714610874578063a633423114610894578063a9059cbb146108a957005b80637d1db4a5116101525780638ba4cc3c1161012f5780638ba4cc3c1461080b5780638da5cb5b1461082b5780638f9a55c01461084957806395d89b411461085f57005b80637d1db4a51461079c5780638095d564146107b257806388f82020146107d257005b806370a082311161018b57806370a0823114610732578063715018a614610752578063733b864f14610767578063764d72bf1461077c57005b806360d48489146106ce5780636bc87c3a146107075780636fc3eaec1461071d57005b8063313ce5671161027c5780634549b039116102205780634a74bb02116101fd5780634a74bb021461063657806352390c02146106555780635342acb4146106755780635d098b38146106ae57005b80634549b039146105cd57806348c54b9d146105ed57806349bd5a5e1461060257005b80633ae7dc20116102595780633ae7dc20146105575780633b124fe7146105775780633bd5d1731461058d578063437823ec146105ad57005b8063313ce567146104f55780633685d41914610517578063395093511461053757005b806323b872dd116102e35780632d838119116102c05780632d8381191461048b5780632f05205c146104ab5780632fd689e3146104ca578063301370af146104e057005b806323b872dd1461042b57806329e04b4a1461044b5780632a3606311461046b57005b80630305caff1461033057806306fdde0314610350578063095ea7b31461037b57806313114a9d146103ab5780631694505e146103ca57806318160ddd1461041657005b3661032e57005b005b34801561033c57600080fd5b5061032e61034b366004612dd3565b610a39565b34801561035c57600080fd5b50610365610a62565b6040516103729190612df0565b60405180910390f35b34801561038757600080fd5b5061039b610396366004612e3e565b610af4565b6040519015158152602001610372565b3480156103b757600080fd5b50600b545b604051908152602001610372565b3480156103d657600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610372565b34801561042257600080fd5b506009546103bc565b34801561043757600080fd5b5061039b610446366004612e6a565b610b0b565b34801561045757600080fd5b5061032e610466366004612eab565b610b74565b34801561047757600080fd5b5061032e610486366004612dd3565b610bbb565b34801561049757600080fd5b506103bc6104a6366004612eab565b610be7565b3480156104b757600080fd5b5060085461039b90610100900460ff1681565b3480156104d657600080fd5b506103bc60265481565b3480156104ec57600080fd5b5061032e610c6b565b34801561050157600080fd5b5060105460405160ff9091168152602001610372565b34801561052357600080fd5b5061032e610532366004612dd3565b610c7d565b34801561054357600080fd5b5061039b610552366004612e3e565b610e11565b34801561056357600080fd5b5061032e610572366004612ec4565b610e47565b34801561058357600080fd5b506103bc60135481565b34801561059957600080fd5b5061032e6105a8366004612eab565b610f35565b3480156105b957600080fd5b5061032e6105c8366004612dd3565b61101f565b3480156105d957600080fd5b506103bc6105e8366004612f0b565b61104b565b3480156105f957600080fd5b5061032e6110d8565b34801561060e57600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561064257600080fd5b5060235461039b90610100900460ff1681565b34801561066157600080fd5b5061032e610670366004612dd3565b61111c565b34801561068157600080fd5b5061039b610690366004612dd3565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156106ba57600080fd5b5061032e6106c9366004612dd3565b61124d565b3480156106da57600080fd5b5061039b6106e9366004612dd3565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071357600080fd5b506103bc601f5481565b34801561072957600080fd5b5061032e611277565b34801561073e57600080fd5b506103bc61074d366004612dd3565b6112e5565b34801561075e57600080fd5b5061032e611344565b34801561077357600080fd5b5061032e611356565b34801561078857600080fd5b5061032e610797366004612dd3565b6113a1565b3480156107a857600080fd5b506103bc60245481565b3480156107be57600080fd5b5061032e6107cd366004612f30565b6113de565b3480156107de57600080fd5b5061039b6107ed366004612dd3565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561081757600080fd5b5061032e610826366004612e3e565b611466565b34801561083757600080fd5b506000546001600160a01b03166103fe565b34801561085557600080fd5b506103bc60255481565b34801561086b57600080fd5b50610365611496565b34801561088057600080fd5b5061039b61088f366004612e3e565b6114a5565b3480156108a057600080fd5b5061032e6114f4565b3480156108b557600080fd5b5061039b6108c4366004612e3e565b61150d565b3480156108d557600080fd5b5061032e6108e4366004612f30565b61151a565b3480156108f557600080fd5b5061032e61153e565b34801561090a57600080fd5b5061032e610919366004612f5c565b611589565b34801561092a57600080fd5b5061032e610939366004612fc5565b6115e5565b34801561094a57600080fd5b506103bc610959366004612ec4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561099057600080fd5b5061032e61099f366004612f30565b6116b6565b3480156109b057600080fd5b5061032e61175c565b3480156109c557600080fd5b5061032e6109d4366004612eab565b61176c565b3480156109e557600080fd5b5061032e6109f4366004612dd3565b6117aa565b348015610a0557600080fd5b5061032e610a14366004612eab565b6117d3565b348015610a2557600080fd5b5061032e610a34366004612dd3565b611811565b610a41611887565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6060600e8054610a7190613031565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9d90613031565b8015610aea5780601f10610abf57610100808354040283529160200191610aea565b820191906000526020600020905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b6000610b013384846118e1565b5060015b92915050565b6000610b18848484611a05565b610b6a8433610b65856040518060600160405280602881526020016132b2602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190611faa565b6118e1565b5060019392505050565b610b7c611887565b620186a08111610ba75760405162461bcd60e51b8152600401610b9e9061306b565b60405180910390fd5b610bb581633b9aca006130cf565b60265550565b610bc3611887565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600a54821115610c4e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b9e565b6000610c58611fd6565b9050610c648382611ff9565b9392505050565b610c73611887565b610c7b612005565b565b610c85611887565b6001600160a01b03811660009081526005602052604090205460ff16610ced5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b60005b600654811015610e0d57816001600160a01b031660068281548110610d1757610d176130e6565b6000918252602090912001546001600160a01b031603610dfb5760068054610d41906001906130fc565b81548110610d5157610d516130e6565b600091825260209091200154600680546001600160a01b039092169183908110610d7d57610d7d6130e6565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480610dd557610dd561310f565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610e0581613125565b915050610cf0565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610b01918590610b65908661207f565b610e4f611887565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec1919061313e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190613157565b505050565b3360008181526005602052604090205460ff1615610faa5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610b9e565b6000610fb58361208b565b505050506001600160a01b038416600090815260016020526040902054919250610fe1919050826120da565b6001600160a01b038316600090815260016020526040902055600a5461100790826120da565b600a55600b54611017908461207f565b600b55505050565b611027611887565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b600060095483111561109f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b9e565b816110be5760006110af8461208b565b50939550610b05945050505050565b60006110c98461208b565b50929550610b05945050505050565b6110e0611887565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611119573d6000803e3d6000fd5b50565b611124611887565b6001600160a01b03811660009081526005602052604090205460ff161561118d5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b6001600160a01b038116600090815260016020526040902054156111e7576001600160a01b0381166000908152600160205260409020546111cd90610be7565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b611255611887565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b0316336001600160a01b031614806112a357506000546001600160a01b031633145b6112ac57600080fd5b4760006112c560646112bf84605a6120e6565b90611ff9565b905060006112d960646112bf85600a6120e6565b9050610f3082826120f2565b6001600160a01b03811660009081526005602052604081205460ff161561132257506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610b0590610be7565b61134c611887565b610c7b6000612167565b600c546001600160a01b0316336001600160a01b0316148061138257506000546001600160a01b031633145b61138b57600080fd5b6000611396306112e5565b9050611119816121b7565b6113a9611887565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610e0d573d6000803e3d6000fd5b6113e6611887565b6011839055601d82905560178190556000816114028486613174565b61140c9190613174565b90506102bc8111156114605760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203725206f72206c657373000000006044820152606401610b9e565b50505050565b61146e611887565b611476612005565b61148e338361148984633b9aca006130cf565b611a05565b610e0d6123af565b6060600f8054610a7190613031565b6000610b013384610b65856040518060600160405280602581526020016132da602591393360009081526003602090815260408083206001600160a01b038d1684529091529020549190611faa565b6114fc611887565b6008805461ff001916610100179055565b6000610b01338484611a05565b611522611887565b6012839055601e82905560188190556000816114028486613174565b600c546001600160a01b0316336001600160a01b0316148061156a57506000546001600160a01b031633145b61157357600080fd5b600061157e306112e5565b9050611119816123e7565b611591611887565b602380548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115da90831515815260200190565b60405180910390a150565b6115ed611887565b600083821461163e5760405162461bcd60e51b815260206004820152601760248201527f6d757374206265207468652073616d65206c656e6774680000000000000000006044820152606401610b9e565b838110156116af5761169d85858381811061165b5761165b6130e6565b90506020020160208101906116709190612dd3565b848484818110611682576116826130e6565b90506020020135633b9aca0061169891906130cf565b6125be565b6116a8600182613174565b905061163e565b5050505050565b6116be611887565b6298968083116116e05760405162461bcd60e51b8152600401610b9e90613187565b6298968082116117025760405162461bcd60e51b8152600401610b9e90613187565b620186a081116117245760405162461bcd60e51b8152600401610b9e9061306b565b61173281633b9aca006130cf565b60265561174382633b9aca006130cf565b60255561175483633b9aca006130cf565b602455505050565b611764611887565b610c7b6123af565b611774611887565b6298968081116117965760405162461bcd60e51b8152600401610b9e90613187565b6117a481633b9aca006130cf565b60255550565b6117b2611887565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6117db611887565b6298968081116117fd5760405162461bcd60e51b8152600401610b9e90613187565b61180b81633b9aca006130cf565b60245550565b611819611887565b6001600160a01b03811661187e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9e565b61111981612167565b6000546001600160a01b03163314610c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b9e565b6001600160a01b0383166119435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9e565b6001600160a01b0382166119a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b9e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b9e565b6001600160a01b038216611acb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b9e565b60008111611b2d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b9e565b6000546001600160a01b03848116911614801590611b5957506000546001600160a01b03838116911614155b15611bc157602454811115611bc15760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b9e565b600854610100900460ff16611c53576000546001600160a01b03848116911614611c535760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c6564006064820152608401610b9e565b6001600160a01b03831660009081526007602052604090205460ff1680611c9257506001600160a01b03821660009081526007602052604090205460ff165b15611ce95760085460ff16611ce95760405162461bcd60e51b815260206004820152601b60248201527f626f7473206172656e7420616c6c6f77656420746f20747261646500000000006044820152606401610b9e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614611d925760255481611d2f846112e5565b611d399190613174565b10611d925760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b6064820152608401610b9e565b6000611d9d306112e5565b90506024548110611dad57506024545b60265481108015908190611dc4575060235460ff16155b8015611e0257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611e155750602354610100900460ff165b15611e2357611e23826121b7565b6001600160a01b03851660009081526004602052604090205460019060ff1680611e6557506001600160a01b03851660009081526004602052604090205460ff165b15611e7257506000611f96565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316148015611ee557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b15611f0457601d54601f55601754601154611f009190613174565b6013555b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316148015611f7757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b15611f9657601e54601f55601854601254611f929190613174565b6013555b611fa2868686846125d1565b505050505050565b60008184841115611fce5760405162461bcd60e51b8152600401610b9e9190612df0565b505050900390565b6000806000611fe361273f565b9092509050611ff28282611ff9565b9250505090565b6000610c6482846131d3565b6013541580156120155750601f54155b1561201c57565b60138054601455601f805460205560198054601a5560118054601555601d805460215560178054601b5560128054601655601e805460225560188054601c5560009687905597869055958590559284905590839055829055819055908190559055565b6000610c648284613174565b60008060008060008060008060006120a28a6128c1565b92509250925060008060006120c08d86866120bb611fd6565b612903565b919f909e50909c50959a5093985091965092945050505050565b6000610c6482846130fc565b6000610c6482846130cf565b600c546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561212c573d6000803e3d6000fd5b50600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610f30573d6000803e3d6000fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6023805460ff191660011790556026546121d290600a6130cf565b8111156121ea576026546121e790600a6130cf565b90505b600061220a633b9aca00601e54601d546122049190613174565b906120e6565b90506000612226633b9aca006018546017546122049190613174565b90506000612242633b9aca006012546011546122049190613174565b90506000826122518584613174565b61225b9190613174565b9050600061226d826112bf88886120e6565b9050600061227c826002611ff9565b9050600061228a83836120da565b9050600061229889846120da565b9050476122a4826123e7565b60006122b047836120da565b905060006122bf8b6002611ff9565b6122c990896130fc565b905060006122e78260026122dd8f876130cf565b6112bf91906131d3565b90506000871180156122f95750600081115b1561234a576123088782612953565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b600061235a836112bf868f6120e6565b905060008161236984876130fc565b61237391906130fc565b90506000811180156123855750600082115b156123945761239481836120f2565b50506023805460ff1916905550505050505050505050505050565b601454601355602054601f55601a54601955601554601155602154601d55601b54601755601654601255602254601e55601c54601855565b6023805460ff191660011790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612429576124296130e6565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb91906131f5565b816001815181106124de576124de6130e6565b60200260200101906001600160a01b031690816001600160a01b031681525050612529307f0000000000000000000000000000000000000000000000000000000000000000846118e1565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061257e908590600090869030904290600401613212565b600060405180830381600087803b15801561259857600080fd5b505af11580156125ac573d6000803e3d6000fd5b50506023805460ff1916905550505050565b6125c6612005565b61148e338383611a05565b806125de576125de612005565b6001600160a01b03841660009081526005602052604090205460ff16801561261f57506001600160a01b03831660009081526005602052604090205460ff16155b156126345761262f848484612a52565b612732565b6001600160a01b03841660009081526005602052604090205460ff1615801561267557506001600160a01b03831660009081526005602052604090205460ff165b156126855761262f848484612b78565b6001600160a01b03841660009081526005602052604090205460ff161580156126c757506001600160a01b03831660009081526005602052604090205460ff16155b156126d75761262f848484612c21565b6001600160a01b03841660009081526005602052604090205460ff16801561271757506001600160a01b03831660009081526005602052604090205460ff165b156127275761262f848484612c65565b612732848484612c21565b80611460576114606123af565b600a546009546000918291825b6006548110156128915782600160006006848154811061276e5761276e6130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127d957508160026000600684815481106127b2576127b26130e6565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156127ef57600a54600954945094505050509091565b6128356001600060068481548110612809576128096130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906120da565b925061287d6002600060068481548110612851576128516130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906120da565b91508061288981613125565b91505061274c565b50600954600a546128a191611ff9565b8210156128b857600a546009549350935050509091565b90939092509050565b6000806000806128d085612cd8565b905060006128dd86612cf5565b905060006128f5826128ef89866120da565b906120da565b979296509094509092505050565b600080808061291288866120e6565b9050600061292088876120e6565b9050600061292e88886120e6565b90506000612940826128ef86866120da565b939b939a50919850919650505050505050565b61297e307f0000000000000000000000000000000000000000000000000000000000000000846118e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806129c56000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612a2d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116af9190613283565b600080600080600080612a648761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612a9690886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612ac590876120da565b6001600160a01b03808b1660009081526001602052604080822093909355908a1681522054612af4908661207f565b6001600160a01b038916600090815260016020526040902055612b1681612d12565b612b208483612d9a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b6591815260200190565b60405180910390a3505050505050505050565b600080600080600080612b8a8761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612bbc90876120da565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054612bf2908461207f565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612af4908661207f565b600080600080600080612c338761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612ac590876120da565b600080600080600080612c778761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612ca990886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612bbc90876120da565b6000610b056127106112bf601354856120e690919063ffffffff16565b6000610b056127106112bf601f54856120e690919063ffffffff16565b6000612d1c611fd6565b90506000612d2a83836120e6565b30600090815260016020526040902054909150612d47908261207f565b3060009081526001602090815260408083209390935560059052205460ff1615610f305730600090815260026020526040902054612d85908461207f565b30600090815260026020526040902055505050565b600a54612da790836120da565b600a55600b54612db7908261207f565b600b555050565b6001600160a01b038116811461111957600080fd5b600060208284031215612de557600080fd5b8135610c6481612dbe565b600060208083528351808285015260005b81811015612e1d57858101830151858201604001528201612e01565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612e5157600080fd5b8235612e5c81612dbe565b946020939093013593505050565b600080600060608486031215612e7f57600080fd5b8335612e8a81612dbe565b92506020840135612e9a81612dbe565b929592945050506040919091013590565b600060208284031215612ebd57600080fd5b5035919050565b60008060408385031215612ed757600080fd5b8235612ee281612dbe565b91506020830135612ef281612dbe565b809150509250929050565b801515811461111957600080fd5b60008060408385031215612f1e57600080fd5b823591506020830135612ef281612efd565b600080600060608486031215612f4557600080fd5b505081359360208301359350604090920135919050565b600060208284031215612f6e57600080fd5b8135610c6481612efd565b60008083601f840112612f8b57600080fd5b50813567ffffffffffffffff811115612fa357600080fd5b6020830191508360208260051b8501011115612fbe57600080fd5b9250929050565b60008060008060408587031215612fdb57600080fd5b843567ffffffffffffffff80821115612ff357600080fd5b612fff88838901612f79565b9096509450602087013591508082111561301857600080fd5b5061302587828801612f79565b95989497509550505050565b600181811c9082168061304557607f821691505b60208210810361306557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f53776170205468726573686f6c6420416d6f756e742063616e6e6f742062652060408201526d6c657373207468616e203130306b60901b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b0557610b056130b9565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0557610b056130b9565b634e487b7160e01b600052603160045260246000fd5b600060018201613137576131376130b9565b5060010190565b60006020828403121561315057600080fd5b5051919050565b60006020828403121561316957600080fd5b8151610c6481612efd565b80820180821115610b0557610b056130b9565b6020808252602c908201527f4d617820547820416d6f756e742063616e6e6f74206265206c6573732074686160408201526b371018981026b4b63634b7b760a11b606082015260800190565b6000826131f057634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561320757600080fd5b8151610c6481612dbe565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132625784516001600160a01b03168352938301939183019160010161323d565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561329857600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220576c8c44235c37ef8e821661cc2fc1eb1b85db46daa3cfa98699f1f52388867264736f6c6343000812003350726f6d6973696e6720556e6361707065642050726573616c652066726f6d20612050726f66657373696f6e616c20496e666c75656e636572207769746820457863656c6c656e742053616c65736d616e7368697020285055505049455329

Deployed Bytecode

0x6080604052600436106103275760003560e01c806360d48489116101ae578063a457c2d7116100eb578063dd62ed3e1161008f578063ea1644d51161006c578063ea1644d5146109b9578063ea2f0b37146109d9578063ec28438a146109f9578063f2fde38b14610a1957005b8063dd62ed3e1461093e578063e46b3b3f14610984578063e7e3e3a7146109a457005b8063c17b5b8c116100c8578063c17b5b8c146108c9578063c3c8cd80146108e9578063c49b9a80146108fe578063d4a3883f1461091e57005b8063a457c2d714610874578063a633423114610894578063a9059cbb146108a957005b80637d1db4a5116101525780638ba4cc3c1161012f5780638ba4cc3c1461080b5780638da5cb5b1461082b5780638f9a55c01461084957806395d89b411461085f57005b80637d1db4a51461079c5780638095d564146107b257806388f82020146107d257005b806370a082311161018b57806370a0823114610732578063715018a614610752578063733b864f14610767578063764d72bf1461077c57005b806360d48489146106ce5780636bc87c3a146107075780636fc3eaec1461071d57005b8063313ce5671161027c5780634549b039116102205780634a74bb02116101fd5780634a74bb021461063657806352390c02146106555780635342acb4146106755780635d098b38146106ae57005b80634549b039146105cd57806348c54b9d146105ed57806349bd5a5e1461060257005b80633ae7dc20116102595780633ae7dc20146105575780633b124fe7146105775780633bd5d1731461058d578063437823ec146105ad57005b8063313ce567146104f55780633685d41914610517578063395093511461053757005b806323b872dd116102e35780632d838119116102c05780632d8381191461048b5780632f05205c146104ab5780632fd689e3146104ca578063301370af146104e057005b806323b872dd1461042b57806329e04b4a1461044b5780632a3606311461046b57005b80630305caff1461033057806306fdde0314610350578063095ea7b31461037b57806313114a9d146103ab5780631694505e146103ca57806318160ddd1461041657005b3661032e57005b005b34801561033c57600080fd5b5061032e61034b366004612dd3565b610a39565b34801561035c57600080fd5b50610365610a62565b6040516103729190612df0565b60405180910390f35b34801561038757600080fd5b5061039b610396366004612e3e565b610af4565b6040519015158152602001610372565b3480156103b757600080fd5b50600b545b604051908152602001610372565b3480156103d657600080fd5b506103fe7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610372565b34801561042257600080fd5b506009546103bc565b34801561043757600080fd5b5061039b610446366004612e6a565b610b0b565b34801561045757600080fd5b5061032e610466366004612eab565b610b74565b34801561047757600080fd5b5061032e610486366004612dd3565b610bbb565b34801561049757600080fd5b506103bc6104a6366004612eab565b610be7565b3480156104b757600080fd5b5060085461039b90610100900460ff1681565b3480156104d657600080fd5b506103bc60265481565b3480156104ec57600080fd5b5061032e610c6b565b34801561050157600080fd5b5060105460405160ff9091168152602001610372565b34801561052357600080fd5b5061032e610532366004612dd3565b610c7d565b34801561054357600080fd5b5061039b610552366004612e3e565b610e11565b34801561056357600080fd5b5061032e610572366004612ec4565b610e47565b34801561058357600080fd5b506103bc60135481565b34801561059957600080fd5b5061032e6105a8366004612eab565b610f35565b3480156105b957600080fd5b5061032e6105c8366004612dd3565b61101f565b3480156105d957600080fd5b506103bc6105e8366004612f0b565b61104b565b3480156105f957600080fd5b5061032e6110d8565b34801561060e57600080fd5b506103fe7f00000000000000000000000062a4bb6b1035f383dc24bdbc083075935567a93e81565b34801561064257600080fd5b5060235461039b90610100900460ff1681565b34801561066157600080fd5b5061032e610670366004612dd3565b61111c565b34801561068157600080fd5b5061039b610690366004612dd3565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156106ba57600080fd5b5061032e6106c9366004612dd3565b61124d565b3480156106da57600080fd5b5061039b6106e9366004612dd3565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561071357600080fd5b506103bc601f5481565b34801561072957600080fd5b5061032e611277565b34801561073e57600080fd5b506103bc61074d366004612dd3565b6112e5565b34801561075e57600080fd5b5061032e611344565b34801561077357600080fd5b5061032e611356565b34801561078857600080fd5b5061032e610797366004612dd3565b6113a1565b3480156107a857600080fd5b506103bc60245481565b3480156107be57600080fd5b5061032e6107cd366004612f30565b6113de565b3480156107de57600080fd5b5061039b6107ed366004612dd3565b6001600160a01b031660009081526005602052604090205460ff1690565b34801561081757600080fd5b5061032e610826366004612e3e565b611466565b34801561083757600080fd5b506000546001600160a01b03166103fe565b34801561085557600080fd5b506103bc60255481565b34801561086b57600080fd5b50610365611496565b34801561088057600080fd5b5061039b61088f366004612e3e565b6114a5565b3480156108a057600080fd5b5061032e6114f4565b3480156108b557600080fd5b5061039b6108c4366004612e3e565b61150d565b3480156108d557600080fd5b5061032e6108e4366004612f30565b61151a565b3480156108f557600080fd5b5061032e61153e565b34801561090a57600080fd5b5061032e610919366004612f5c565b611589565b34801561092a57600080fd5b5061032e610939366004612fc5565b6115e5565b34801561094a57600080fd5b506103bc610959366004612ec4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561099057600080fd5b5061032e61099f366004612f30565b6116b6565b3480156109b057600080fd5b5061032e61175c565b3480156109c557600080fd5b5061032e6109d4366004612eab565b61176c565b3480156109e557600080fd5b5061032e6109f4366004612dd3565b6117aa565b348015610a0557600080fd5b5061032e610a14366004612eab565b6117d3565b348015610a2557600080fd5b5061032e610a34366004612dd3565b611811565b610a41611887565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6060600e8054610a7190613031565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9d90613031565b8015610aea5780601f10610abf57610100808354040283529160200191610aea565b820191906000526020600020905b815481529060010190602001808311610acd57829003601f168201915b5050505050905090565b6000610b013384846118e1565b5060015b92915050565b6000610b18848484611a05565b610b6a8433610b65856040518060600160405280602881526020016132b2602891396001600160a01b038a1660009081526003602090815260408083203384529091529020549190611faa565b6118e1565b5060019392505050565b610b7c611887565b620186a08111610ba75760405162461bcd60e51b8152600401610b9e9061306b565b60405180910390fd5b610bb581633b9aca006130cf565b60265550565b610bc3611887565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000600a54821115610c4e5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b9e565b6000610c58611fd6565b9050610c648382611ff9565b9392505050565b610c73611887565b610c7b612005565b565b610c85611887565b6001600160a01b03811660009081526005602052604090205460ff16610ced5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b60005b600654811015610e0d57816001600160a01b031660068281548110610d1757610d176130e6565b6000918252602090912001546001600160a01b031603610dfb5760068054610d41906001906130fc565b81548110610d5157610d516130e6565b600091825260209091200154600680546001600160a01b039092169183908110610d7d57610d7d6130e6565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480610dd557610dd561310f565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610e0581613125565b915050610cf0565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610b01918590610b65908661207f565b610e4f611887565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec1919061313e565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f309190613157565b505050565b3360008181526005602052604090205460ff1615610faa5760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610b9e565b6000610fb58361208b565b505050506001600160a01b038416600090815260016020526040902054919250610fe1919050826120da565b6001600160a01b038316600090815260016020526040902055600a5461100790826120da565b600a55600b54611017908461207f565b600b55505050565b611027611887565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b600060095483111561109f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610b9e565b816110be5760006110af8461208b565b50939550610b05945050505050565b60006110c98461208b565b50929550610b05945050505050565b6110e0611887565b600c546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611119573d6000803e3d6000fd5b50565b611124611887565b6001600160a01b03811660009081526005602052604090205460ff161561118d5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610b9e565b6001600160a01b038116600090815260016020526040902054156111e7576001600160a01b0381166000908152600160205260409020546111cd90610be7565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319169091179055565b611255611887565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b0316336001600160a01b031614806112a357506000546001600160a01b031633145b6112ac57600080fd5b4760006112c560646112bf84605a6120e6565b90611ff9565b905060006112d960646112bf85600a6120e6565b9050610f3082826120f2565b6001600160a01b03811660009081526005602052604081205460ff161561132257506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610b0590610be7565b61134c611887565b610c7b6000612167565b600c546001600160a01b0316336001600160a01b0316148061138257506000546001600160a01b031633145b61138b57600080fd5b6000611396306112e5565b9050611119816121b7565b6113a9611887565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610e0d573d6000803e3d6000fd5b6113e6611887565b6011839055601d82905560178190556000816114028486613174565b61140c9190613174565b90506102bc8111156114605760405162461bcd60e51b815260206004820152601c60248201527f4d757374206b6565702066656573206174203725206f72206c657373000000006044820152606401610b9e565b50505050565b61146e611887565b611476612005565b61148e338361148984633b9aca006130cf565b611a05565b610e0d6123af565b6060600f8054610a7190613031565b6000610b013384610b65856040518060600160405280602581526020016132da602591393360009081526003602090815260408083206001600160a01b038d1684529091529020549190611faa565b6114fc611887565b6008805461ff001916610100179055565b6000610b01338484611a05565b611522611887565b6012839055601e82905560188190556000816114028486613174565b600c546001600160a01b0316336001600160a01b0316148061156a57506000546001600160a01b031633145b61157357600080fd5b600061157e306112e5565b9050611119816123e7565b611591611887565b602380548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159906115da90831515815260200190565b60405180910390a150565b6115ed611887565b600083821461163e5760405162461bcd60e51b815260206004820152601760248201527f6d757374206265207468652073616d65206c656e6774680000000000000000006044820152606401610b9e565b838110156116af5761169d85858381811061165b5761165b6130e6565b90506020020160208101906116709190612dd3565b848484818110611682576116826130e6565b90506020020135633b9aca0061169891906130cf565b6125be565b6116a8600182613174565b905061163e565b5050505050565b6116be611887565b6298968083116116e05760405162461bcd60e51b8152600401610b9e90613187565b6298968082116117025760405162461bcd60e51b8152600401610b9e90613187565b620186a081116117245760405162461bcd60e51b8152600401610b9e9061306b565b61173281633b9aca006130cf565b60265561174382633b9aca006130cf565b60255561175483633b9aca006130cf565b602455505050565b611764611887565b610c7b6123af565b611774611887565b6298968081116117965760405162461bcd60e51b8152600401610b9e90613187565b6117a481633b9aca006130cf565b60255550565b6117b2611887565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6117db611887565b6298968081116117fd5760405162461bcd60e51b8152600401610b9e90613187565b61180b81633b9aca006130cf565b60245550565b611819611887565b6001600160a01b03811661187e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9e565b61111981612167565b6000546001600160a01b03163314610c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b9e565b6001600160a01b0383166119435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9e565b6001600160a01b0382166119a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b9e565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a695760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b9e565b6001600160a01b038216611acb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610b9e565b60008111611b2d5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b9e565b6000546001600160a01b03848116911614801590611b5957506000546001600160a01b03838116911614155b15611bc157602454811115611bc15760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610b9e565b600854610100900460ff16611c53576000546001600160a01b03848116911614611c535760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c6564006064820152608401610b9e565b6001600160a01b03831660009081526007602052604090205460ff1680611c9257506001600160a01b03821660009081526007602052604090205460ff165b15611ce95760085460ff16611ce95760405162461bcd60e51b815260206004820152601b60248201527f626f7473206172656e7420616c6c6f77656420746f20747261646500000000006044820152606401610b9e565b7f00000000000000000000000062a4bb6b1035f383dc24bdbc083075935567a93e6001600160a01b0316826001600160a01b031614611d925760255481611d2f846112e5565b611d399190613174565b10611d925760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b6064820152608401610b9e565b6000611d9d306112e5565b90506024548110611dad57506024545b60265481108015908190611dc4575060235460ff16155b8015611e0257507f00000000000000000000000062a4bb6b1035f383dc24bdbc083075935567a93e6001600160a01b0316856001600160a01b031614155b8015611e155750602354610100900460ff165b15611e2357611e23826121b7565b6001600160a01b03851660009081526004602052604090205460019060ff1680611e6557506001600160a01b03851660009081526004602052604090205460ff165b15611e7257506000611f96565b7f00000000000000000000000062a4bb6b1035f383dc24bdbc083075935567a93e6001600160a01b0316866001600160a01b0316148015611ee557507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b031614155b15611f0457601d54601f55601754601154611f009190613174565b6013555b7f00000000000000000000000062a4bb6b1035f383dc24bdbc083075935567a93e6001600160a01b0316856001600160a01b0316148015611f7757507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316866001600160a01b031614155b15611f9657601e54601f55601854601254611f929190613174565b6013555b611fa2868686846125d1565b505050505050565b60008184841115611fce5760405162461bcd60e51b8152600401610b9e9190612df0565b505050900390565b6000806000611fe361273f565b9092509050611ff28282611ff9565b9250505090565b6000610c6482846131d3565b6013541580156120155750601f54155b1561201c57565b60138054601455601f805460205560198054601a5560118054601555601d805460215560178054601b5560128054601655601e805460225560188054601c5560009687905597869055958590559284905590839055829055819055908190559055565b6000610c648284613174565b60008060008060008060008060006120a28a6128c1565b92509250925060008060006120c08d86866120bb611fd6565b612903565b919f909e50909c50959a5093985091965092945050505050565b6000610c6482846130fc565b6000610c6482846130cf565b600c546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561212c573d6000803e3d6000fd5b50600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610f30573d6000803e3d6000fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6023805460ff191660011790556026546121d290600a6130cf565b8111156121ea576026546121e790600a6130cf565b90505b600061220a633b9aca00601e54601d546122049190613174565b906120e6565b90506000612226633b9aca006018546017546122049190613174565b90506000612242633b9aca006012546011546122049190613174565b90506000826122518584613174565b61225b9190613174565b9050600061226d826112bf88886120e6565b9050600061227c826002611ff9565b9050600061228a83836120da565b9050600061229889846120da565b9050476122a4826123e7565b60006122b047836120da565b905060006122bf8b6002611ff9565b6122c990896130fc565b905060006122e78260026122dd8f876130cf565b6112bf91906131d3565b90506000871180156122f95750600081115b1561234a576123088782612953565b60408051878152602081018590529081018890527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b600061235a836112bf868f6120e6565b905060008161236984876130fc565b61237391906130fc565b90506000811180156123855750600082115b156123945761239481836120f2565b50506023805460ff1916905550505050505050505050505050565b601454601355602054601f55601a54601955601554601155602154601d55601b54601755601654601255602254601e55601c54601855565b6023805460ff191660011790556040805160028082526060820183526000926020830190803683370190505090503081600081518110612429576124296130e6565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb91906131f5565b816001815181106124de576124de6130e6565b60200260200101906001600160a01b031690816001600160a01b031681525050612529307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118e1565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061257e908590600090869030904290600401613212565b600060405180830381600087803b15801561259857600080fd5b505af11580156125ac573d6000803e3d6000fd5b50506023805460ff1916905550505050565b6125c6612005565b61148e338383611a05565b806125de576125de612005565b6001600160a01b03841660009081526005602052604090205460ff16801561261f57506001600160a01b03831660009081526005602052604090205460ff16155b156126345761262f848484612a52565b612732565b6001600160a01b03841660009081526005602052604090205460ff1615801561267557506001600160a01b03831660009081526005602052604090205460ff165b156126855761262f848484612b78565b6001600160a01b03841660009081526005602052604090205460ff161580156126c757506001600160a01b03831660009081526005602052604090205460ff16155b156126d75761262f848484612c21565b6001600160a01b03841660009081526005602052604090205460ff16801561271757506001600160a01b03831660009081526005602052604090205460ff165b156127275761262f848484612c65565b612732848484612c21565b80611460576114606123af565b600a546009546000918291825b6006548110156128915782600160006006848154811061276e5761276e6130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127d957508160026000600684815481106127b2576127b26130e6565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156127ef57600a54600954945094505050509091565b6128356001600060068481548110612809576128096130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906120da565b925061287d6002600060068481548110612851576128516130e6565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906120da565b91508061288981613125565b91505061274c565b50600954600a546128a191611ff9565b8210156128b857600a546009549350935050509091565b90939092509050565b6000806000806128d085612cd8565b905060006128dd86612cf5565b905060006128f5826128ef89866120da565b906120da565b979296509094509092505050565b600080808061291288866120e6565b9050600061292088876120e6565b9050600061292e88886120e6565b90506000612940826128ef86866120da565b939b939a50919850919650505050505050565b61297e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118e1565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806129c56000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612a2d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906116af9190613283565b600080600080600080612a648761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612a9690886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612ac590876120da565b6001600160a01b03808b1660009081526001602052604080822093909355908a1681522054612af4908661207f565b6001600160a01b038916600090815260016020526040902055612b1681612d12565b612b208483612d9a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612b6591815260200190565b60405180910390a3505050505050505050565b600080600080600080612b8a8761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612bbc90876120da565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054612bf2908461207f565b6001600160a01b038916600090815260026020908152604080832093909355600190522054612af4908661207f565b600080600080600080612c338761208b565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150612ac590876120da565b600080600080600080612c778761208b565b6001600160a01b038f16600090815260026020526040902054959b50939950919750955093509150612ca990886120da565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054612bbc90876120da565b6000610b056127106112bf601354856120e690919063ffffffff16565b6000610b056127106112bf601f54856120e690919063ffffffff16565b6000612d1c611fd6565b90506000612d2a83836120e6565b30600090815260016020526040902054909150612d47908261207f565b3060009081526001602090815260408083209390935560059052205460ff1615610f305730600090815260026020526040902054612d85908461207f565b30600090815260026020526040902055505050565b600a54612da790836120da565b600a55600b54612db7908261207f565b600b555050565b6001600160a01b038116811461111957600080fd5b600060208284031215612de557600080fd5b8135610c6481612dbe565b600060208083528351808285015260005b81811015612e1d57858101830151858201604001528201612e01565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215612e5157600080fd5b8235612e5c81612dbe565b946020939093013593505050565b600080600060608486031215612e7f57600080fd5b8335612e8a81612dbe565b92506020840135612e9a81612dbe565b929592945050506040919091013590565b600060208284031215612ebd57600080fd5b5035919050565b60008060408385031215612ed757600080fd5b8235612ee281612dbe565b91506020830135612ef281612dbe565b809150509250929050565b801515811461111957600080fd5b60008060408385031215612f1e57600080fd5b823591506020830135612ef281612efd565b600080600060608486031215612f4557600080fd5b505081359360208301359350604090920135919050565b600060208284031215612f6e57600080fd5b8135610c6481612efd565b60008083601f840112612f8b57600080fd5b50813567ffffffffffffffff811115612fa357600080fd5b6020830191508360208260051b8501011115612fbe57600080fd5b9250929050565b60008060008060408587031215612fdb57600080fd5b843567ffffffffffffffff80821115612ff357600080fd5b612fff88838901612f79565b9096509450602087013591508082111561301857600080fd5b5061302587828801612f79565b95989497509550505050565b600181811c9082168061304557607f821691505b60208210810361306557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f53776170205468726573686f6c6420416d6f756e742063616e6e6f742062652060408201526d6c657373207468616e203130306b60901b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b0557610b056130b9565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0557610b056130b9565b634e487b7160e01b600052603160045260246000fd5b600060018201613137576131376130b9565b5060010190565b60006020828403121561315057600080fd5b5051919050565b60006020828403121561316957600080fd5b8151610c6481612efd565b80820180821115610b0557610b056130b9565b6020808252602c908201527f4d617820547820416d6f756e742063616e6e6f74206265206c6573732074686160408201526b371018981026b4b63634b7b760a11b606082015260800190565b6000826131f057634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561320757600080fd5b8151610c6481612dbe565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132625784516001600160a01b03168352938301939183019160010161323d565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561329857600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220576c8c44235c37ef8e821661cc2fc1eb1b85db46daa3cfa98699f1f52388867264736f6c63430008120033

Deployed Bytecode Sourcemap

31525:23834:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44310:105;;;;;;;;;;-1:-1:-1;44310:105:0;;;;;:::i;:::-;;:::i;34950:77::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35798:151;;;;;;;;;;-1:-1:-1;35798:151:0;;;;;:::i;:::-;;:::i;:::-;;;1440:14:1;;1433:22;1415:41;;1403:2;1388:18;35798:151:0;1275:187:1;36915:81:0;;;;;;;;;;-1:-1:-1;36980:10:0;;36915:81;;;1613:25:1;;;1601:2;1586:18;36915:81:0;1467:177:1;33478:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1839:32:1;;;1821:51;;1809:2;1794:18;33478:51:0;1649:229:1;35203:89:0;;;;;;;;;;-1:-1:-1;35279:7:0;;35203:89;;35955:327;;;;;;;;;;-1:-1:-1;35955:327:0;;;;;:::i;:::-;;:::i;43527:239::-;;;;;;;;;;-1:-1:-1;43527:239:0;;;;;:::i;:::-;;:::i;44203:101::-;;;;;;;;;;-1:-1:-1;44203:101:0;;;;;:::i;:::-;;:::i;38502:239::-;;;;;;;;;;-1:-1:-1;38502:239:0;;;;;:::i;:::-;;:::i;32028:28::-;;;;;;;;;;-1:-1:-1;32028:28:0;;;;;;;;;;;33784:53;;;;;;;;;;;;;;;;41250:71;;;;;;;;;;;;;:::i;35120:77::-;;;;;;;;;;-1:-1:-1;35182:9:0;;35120:77;;35182:9;;;;2671:36:1;;2659:2;2644:18;35120:77:0;2529:184:1;39057:411:0;;;;;;;;;;-1:-1:-1;39057:411:0;;;;;:::i;:::-;;:::i;36288:208::-;;;;;;;;;;-1:-1:-1;36288:208:0;;;;;:::i;:::-;;:::i;43878:177::-;;;;;;;;;;-1:-1:-1;43878:177:0;;;;;:::i;:::-;;:::i;32625:37::-;;;;;;;;;;;;;;;;37729:356;;;;;;;;;;-1:-1:-1;37729:356:0;;;;;:::i;:::-;;:::i;40129:105::-;;;;;;;;;;-1:-1:-1;40129:105:0;;;;;:::i;:::-;;:::i;38091:405::-;;;;;;;;;;-1:-1:-1;38091:405:0;;;;;:::i;:::-;;:::i;43772:100::-;;;;;;;;;;;;;:::i;33534:38::-;;;;;;;;;;;;;;;33613:40;;;;;;;;;;-1:-1:-1;33613:40:0;;;;;;;;;;;38747:304;;;;;;;;;;-1:-1:-1;38747:304:0;;;;;:::i;:::-;;:::i;48242:118::-;;;;;;;;;;-1:-1:-1;48242:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;48327:27:0;48307:4;48327:27;;;:18;:27;;;;;;;;;48242:118;40350:121;;;;;;;;;;-1:-1:-1;40350:121:0;;;;;:::i;:::-;;:::i;44421:115::-;;;;;;;;;;-1:-1:-1;44421:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;44509:21:0;44489:4;44509:21;;;:10;:21;;;;;;;;;44421:115;33226:49;;;;;;;;;;;;;;;;45000:349;;;;;;;;;;;;;:::i;35298:188::-;;;;;;;;;;-1:-1:-1;35298:188:0;;;;;:::i;:::-;;:::i;11295:103::-;;;;;;;;;;;;;:::i;45355:216::-;;;;;;;;;;;;;:::i;44061:136::-;;;;;;;;;;-1:-1:-1;44061:136:0;;;;;:::i;:::-;;:::i;33660:50::-;;;;;;;;;;;;;;;;40477:373;;;;;;;;;;-1:-1:-1;40477:373:0;;;;;:::i;:::-;;:::i;36795:114::-;;;;;;;;;;-1:-1:-1;36795:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;36883:20:0;36863:4;36883:20;;;:11;:20;;;;;;;;;36795:114;37002:181;;;;;;;;;;-1:-1:-1;37002:181:0;;;;;:::i;:::-;;:::i;10647:87::-;;;;;;;;;;-1:-1:-1;10693:7:0;10720:6;-1:-1:-1;;;;;10720:6:0;10647:87;;33721:52;;;;;;;;;;;;;;;;35033:81;;;;;;;;;;;;;:::i;36502:287::-;;;;;;;;;;-1:-1:-1;36502:287:0;;;;;:::i;:::-;;:::i;44542:71::-;;;;;;;;;;;;;:::i;35492:157::-;;;;;;;;;;-1:-1:-1;35492:157:0;;;;;:::i;:::-;;:::i;40856:388::-;;;;;;;;;;-1:-1:-1;40856:388:0;;;;;:::i;:::-;;:::i;44786:208::-;;;;;;;;;;;;;:::i;44619:161::-;;;;;;;;;;-1:-1:-1;44619:161:0;;;;;:::i;:::-;;:::i;37364:359::-;;;;;;;;;;-1:-1:-1;37364:359:0;;;;;:::i;:::-;;:::i;35655:137::-;;;;;;;;;;-1:-1:-1;35655:137:0;;;;;:::i;:::-;-1:-1:-1;;;;;35759:18:0;;;35736:7;35759:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35655:137;42559:540;;;;;;;;;;-1:-1:-1;42559:540:0;;;;;:::i;:::-;;:::i;42040:73::-;;;;;;;;;;;;;:::i;43312:209::-;;;;;;;;;;-1:-1:-1;43312:209:0;;;;;:::i;:::-;;:::i;40240:104::-;;;;;;;;;;-1:-1:-1;40240:104:0;;;;;:::i;:::-;;:::i;43105:201::-;;;;;;;;;;-1:-1:-1;43105:201:0;;;;;:::i;:::-;;:::i;11553:::-;;;;;;;;;;-1:-1:-1;11553:201:0;;;;;:::i;:::-;;:::i;44310:105::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;44380:21:0::1;44404:5;44380:21:::0;;;:10:::1;:21;::::0;;;;:29;;-1:-1:-1;;44380:29:0::1;::::0;;44310:105::o;34950:77::-;34987:13;35016:5;35009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34950:77;:::o;35798:151::-;35873:4;35886:39;9278:10;35909:7;35918:6;35886:8;:39::i;:::-;-1:-1:-1;35939:4:0;35798:151;;;;;:::o;35955:327::-;36053:4;36066:36;36076:6;36084:9;36095:6;36066:9;:36::i;:::-;36109:149;36126:6;9278:10;36162:89;36200:6;36162:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36162:19:0;;;;;;:11;:19;;;;;;;;9278:10;36162:33;;;;;;;;;;:37;:89::i;:::-;36109:8;:149::i;:::-;-1:-1:-1;36272:4:0;35955:327;;;;;:::o;43527:239::-;10533:13;:11;:13::i;:::-;43644:7:::1;43622:19;:29;43614:88;;;;-1:-1:-1::0;;;43614:88:0::1;;;;;;;:::i;:::-;;;;;;;;;43731:29;:19:::0;43753:7:::1;43731:29;:::i;:::-;43709:19;:51:::0;-1:-1:-1;43527:239:0:o;44203:101::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;44270:21:0::1;;::::0;;;:10:::1;:21;::::0;;;;:28;;-1:-1:-1;;44270:28:0::1;44294:4;44270:28;::::0;;44203:101::o;38502:239::-;38569:7;38604;;38593;:18;;38585:73;;;;-1:-1:-1;;;38585:73:0;;7188:2:1;38585:73:0;;;7170:21:1;7227:2;7207:18;;;7200:30;7266:34;7246:18;;;7239:62;-1:-1:-1;;;7317:18:1;;;7310:40;7367:19;;38585:73:0;6986:406:1;38585:73:0;38665:19;38687:10;:8;:10::i;:::-;38665:32;-1:-1:-1;38711:24:0;:7;38665:32;38711:11;:24::i;:::-;38704:31;38502:239;-1:-1:-1;;;38502:239:0:o;41250:71::-;10533:13;:11;:13::i;:::-;41300:15:::1;:13;:15::i;:::-;41250:71::o:0;39057:411::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;39133:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;39125:60;;;::::0;-1:-1:-1;;;39125:60:0;;7599:2:1;39125:60:0::1;::::0;::::1;7581:21:1::0;7638:2;7618:18;;;7611:30;7677:29;7657:18;;;7650:57;7724:18;;39125:60:0::1;7397:351:1::0;39125:60:0::1;39197:9;39192:271;39216:9;:16:::0;39212:20;::::1;39192:271;;;39268:7;-1:-1:-1::0;;;;;39252:23:0::1;:9;39262:1;39252:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;39252:12:0::1;:23:::0;39248:208:::1;;39303:9;39313:16:::0;;:20:::1;::::0;39332:1:::1;::::0;39313:20:::1;:::i;:::-;39303:31;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;39288:9:::1;:12:::0;;-1:-1:-1;;;;;39303:31:0;;::::1;::::0;39298:1;;39288:12;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;39288:46:0::1;-1:-1:-1::0;;;;;39288:46:0;;::::1;;::::0;;39345:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;39376:11:::1;:20:::0;;;;:28;;-1:-1:-1;;39376:28:0::1;::::0;;39415:9:::1;:15:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;39415:15:0;;;;;-1:-1:-1;;;;;;39415:15:0::1;::::0;;;;;39192:271:::1;39057:411:::0;:::o;39248:208::-:1;39234:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39192:271;;;;39057:411:::0;:::o;36288:208::-;9278:10;36376:4;36421:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36421:34:0;;;;;;;;;;36376:4;;36389:83;;36412:7;;36421:50;;36460:10;36421:38;:50::i;43878:177::-;10533:13;:11;:13::i;:::-;44011:37:::1;::::0;-1:-1:-1;;;44011:37:0;;44042:4:::1;44011:37;::::0;::::1;1821:51:1::0;-1:-1:-1;;;;;43974:21:0;::::1;::::0;::::1;::::0;43996:13;;43974:21;;44011:22:::1;::::0;1794:18:1;;44011:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43974:75;::::0;-1:-1:-1;;;;;;43974:75:0::1;::::0;;;;;;-1:-1:-1;;;;;8671:32:1;;;43974:75:0::1;::::0;::::1;8653:51:1::0;8720:18;;;8713:34;8626:18;;43974:75:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43878:177:::0;;:::o;37729:356::-;9278:10;37777:14;37822:19;;;:11;:19;;;;;;;;37821:20;37813:77;;;;-1:-1:-1;;;37813:77:0;;9210:2:1;37813:77:0;;;9192:21:1;9249:2;9229:18;;;9222:30;9288:34;9268:18;;;9261:62;-1:-1:-1;;;9339:18:1;;;9332:42;9391:19;;37813:77:0;9008:408:1;37813:77:0;37898:15;37927:19;37938:7;37927:10;:19::i;:::-;-1:-1:-1;;;;;;;;;37971:15:0;;;;;;:7;:15;;;;;;37897:49;;-1:-1:-1;37971:28:0;;:15;-1:-1:-1;37897:49:0;37971:19;:28::i;:::-;-1:-1:-1;;;;;37953:15:0;;;;;;:7;:15;;;;;:46;38016:7;;:20;;38028:7;38016:11;:20::i;:::-;38006:7;:30;38056:10;;:23;;38071:7;38056:14;:23::i;:::-;38043:10;:36;-1:-1:-1;;;37729:356:0:o;40129:105::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;40194:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;40194:34:0::1;40224:4;40194:34;::::0;;40129:105::o;38091:405::-;38182:7;38217;;38206;:18;;38198:62;;;;-1:-1:-1;;;38198:62:0;;9623:2:1;38198:62:0;;;9605:21:1;9662:2;9642:18;;;9635:30;9701:33;9681:18;;;9674:61;9752:18;;38198:62:0;9421:355:1;38198:62:0;38272:17;38267:224;;38301:15;38330:19;38341:7;38330:10;:19::i;:::-;-1:-1:-1;38300:49:0;;-1:-1:-1;38358:14:0;;-1:-1:-1;;;;;38358:14:0;38267:224;38398:23;38433:19;38444:7;38433:10;:19::i;:::-;-1:-1:-1;38395:57:0;;-1:-1:-1;38461:22:0;;-1:-1:-1;;;;;38461:22:0;43772:100;10533:13;:11;:13::i;:::-;43819:15:::1;::::0;:47:::1;::::0;-1:-1:-1;;;;;43819:15:0;;::::1;::::0;43844:21:::1;43819:47:::0;::::1;;;::::0;:15:::1;:47:::0;:15;:47;43844:21;43819:15;:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;43772:100::o:0;38747:304::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;38824:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;38823:21;38815:61;;;::::0;-1:-1:-1;;;38815:61:0;;7599:2:1;38815:61:0::1;::::0;::::1;7581:21:1::0;7638:2;7618:18;;;7611:30;7677:29;7657:18;;;7650:57;7724:18;;38815:61:0::1;7397:351:1::0;38815:61:0::1;-1:-1:-1::0;;;;;38887:16:0;::::1;38906:1;38887:16:::0;;;:7:::1;:16;::::0;;;;;:20;38883:99:::1;;-1:-1:-1::0;;;;;38957:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;38937:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;38918:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;38883:99:::1;-1:-1:-1::0;;;;;38988:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;38988:27:0::1;39011:4;38988:27:::0;;::::1;::::0;;;39022:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;39022:23:0::1;::::0;;::::1;::::0;;38747:304::o;40350:121::-;10533:13;:11;:13::i;:::-;40425:15:::1;:40:::0;;-1:-1:-1;;;;;;40425:40:0::1;-1:-1:-1::0;;;;;40425:40:0;;;::::1;::::0;;;::::1;::::0;;40350:121::o;45000:349::-;45062:15;;-1:-1:-1;;;;;45062:15:0;9278:10;-1:-1:-1;;;;;45046:31:0;;:58;;;-1:-1:-1;10693:7:0;10720:6;-1:-1:-1;;;;;10720:6:0;9278:10;45081:23;45046:58;45038:67;;;;;;45141:21;45112:26;45196:35;45227:3;45196:26;45141:21;45219:2;45196:22;:26::i;:::-;:30;;:35::i;:::-;45169:62;-1:-1:-1;45238:18:0;45259:35;45290:3;45259:26;:18;45282:2;45259:22;:26::i;:35::-;45238:56;;45301:42;45314:16;45332:10;45301:12;:42::i;35298:188::-;-1:-1:-1;;;;;35384:20:0;;35364:7;35384:20;;;:11;:20;;;;;;;;35380:49;;;-1:-1:-1;;;;;;35413:16:0;;;;;:7;:16;;;;;;;35298:188::o;35380:49::-;-1:-1:-1;;;;;35463:16:0;;;;;;:7;:16;;;;;;35443:37;;:19;:37::i;11295:103::-;10533:13;:11;:13::i;:::-;11360:30:::1;11387:1;11360:18;:30::i;45355:216::-:0;45427:15;;-1:-1:-1;;;;;45427:15:0;9278:10;-1:-1:-1;;;;;45411:31:0;;:58;;;-1:-1:-1;10693:7:0;10720:6;-1:-1:-1;;;;;10720:6:0;9278:10;45446:23;45411:58;45403:67;;;;;;45477:23;45503:24;45521:4;45503:9;:24::i;:::-;45477:50;;45534:31;45549:15;45534:14;:31::i;44061:136::-;10533:13;:11;:13::i;:::-;44137:54:::1;::::0;-1:-1:-1;;;;;44137:31:0;::::1;::::0;44169:21:::1;44137:54:::0;::::1;;;::::0;::::1;::::0;;;44169:21;44137:31;:54;::::1;;;;;;;;;;;;;::::0;::::1;;;;40477:373:::0;10533:13;:11;:13::i;:::-;40595:12:::1;:26:::0;;;40628:18:::1;:38:::0;;;40673:12:::1;:26:::0;;;-1:-1:-1;40688:11:0;40729:33:::1;40649:17:::0;40610:11;40729:33:::1;:::i;:::-;:48;;;;:::i;:::-;40706:71;;40808:3;40792:12;:19;;40784:60;;;::::0;-1:-1:-1;;;40784:60:0;;10113:2:1;40784:60:0::1;::::0;::::1;10095:21:1::0;10152:2;10132:18;;;10125:30;10191;10171:18;;;10164:58;10239:18;;40784:60:0::1;9911:352:1::0;40784:60:0::1;40588:262;40477:373:::0;;;:::o;37002:181::-;10533:13;:11;:13::i;:::-;37080:15:::1;:13;:15::i;:::-;37102:52;9278:10:::0;37126:9;37137:16:::1;:6:::0;37146:7:::1;37137:16;:::i;:::-;37102:9;:52::i;:::-;37161:16;:14;:16::i;35033:81::-:0;35072:13;35101:7;35094:14;;;;;:::i;36502:287::-;36595:4;36608:157;9278:10;36646:7;36662:96;36701:15;36662:96;;;;;;;;;;;;;;;;;9278:10;36662:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;36662:34:0;;;;;;;;;;;;:38;:96::i;44542:71::-;10533:13;:11;:13::i;:::-;44592:8:::1;:15:::0;;-1:-1:-1;;44592:15:0::1;;;::::0;;44542:71::o;35492:157::-;35570:4;35583:42;9278:10;35607:9;35618:6;35583:9;:42::i;40856:388::-;10533:13;:11;:13::i;:::-;40978::::1;:28:::0;;;41013:19:::1;:40:::0;;;41060:13:::1;:28:::0;;;-1:-1:-1;41076:12:0;41119:35:::1;41035:18:::0;40994:12;41119:35:::1;:::i;44786:208::-:0;44848:15;;-1:-1:-1;;;;;44848:15:0;9278:10;-1:-1:-1;;;;;44832:31:0;;:58;;;-1:-1:-1;10693:7:0;10720:6;-1:-1:-1;;;;;10720:6:0;9278:10;44867:23;44832:58;44824:67;;;;;;44898:23;44924:24;44942:4;44924:9;:24::i;:::-;44898:50;;44955:33;44972:15;44955:16;:33::i;44619:161::-;10533:13;:11;:13::i;:::-;44692:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;44692:32:0;;::::1;;::::0;;44736:38:::1;::::0;::::1;::::0;::::1;::::0;44716:8;1440:14:1;1433:22;1415:41;;1403:2;1388:18;;1275:187;44736:38:0::1;;;;;;;;44619:161:::0;:::o;37364:359::-;10533:13;:11;:13::i;:::-;37471:16:::1;37506:35:::0;;::::1;37498:71;;;::::0;-1:-1:-1;;;37498:71:0;;10470:2:1;37498:71:0::1;::::0;::::1;10452:21:1::0;10509:2;10489:18;;;10482:30;10548:25;10528:18;;;10521:53;10591:18;;37498:71:0::1;10268:347:1::0;37498:71:0::1;37583:28:::0;;::::1;37576:142;;;37622:66;37638:10;;37649:8;37638:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;37660:7;;37668:8;37660:17;;;;;;;:::i;:::-;;;;;;;37680:7;37660:27;;;;:::i;:::-;37622:15;:66::i;:::-;37697:13;37709:1;37697:13:::0;::::1;:::i;:::-;;;37576:142;;;37464:259;37364:359:::0;;;;:::o;42559:540::-;10533:13;:11;:13::i;:::-;42701:10:::1;42687:11;:24;42679:81;;;;-1:-1:-1::0;;;42679:81:0::1;;;;;;;:::i;:::-;42791:10;42775:13;:26;42767:83;;;;-1:-1:-1::0;;;42767:83:0::1;;;;;;;:::i;:::-;42887:7;42865:19;:29;42857:88;;;;-1:-1:-1::0;;;42857:88:0::1;;;;;;;:::i;:::-;42974:29;:19:::0;42996:7:::1;42974:29;:::i;:::-;42952:19;:51:::0;43027:23:::1;:13:::0;43043:7:::1;43027:23;:::i;:::-;43010:14;:40:::0;43072:21:::1;:11:::0;43086:7:::1;43072:21;:::i;:::-;43057:12;:36:::0;-1:-1:-1;;;42559:540:0:o;42040:73::-;10533:13;:11;:13::i;:::-;42091:16:::1;:14;:16::i;43312:209::-:0;10533:13;:11;:13::i;:::-;43409:10:::1;43393:13;:26;43385:83;;;;-1:-1:-1::0;;;43385:83:0::1;;;;;;;:::i;:::-;43492:23;:13:::0;43508:7:::1;43492:23;:::i;:::-;43475:14;:40:::0;-1:-1:-1;43312:209:0:o;40240:104::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;40303:27:0::1;40333:5;40303:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;40303:35:0::1;::::0;;40240:104::o;43105:201::-;10533:13;:11;:13::i;:::-;43198:10:::1;43184:11;:24;43176:81;;;;-1:-1:-1::0;;;43176:81:0::1;;;;;;;:::i;:::-;43279:21;:11:::0;43293:7:::1;43279:21;:::i;:::-;43264:12;:36:::0;-1:-1:-1;43105:201:0:o;11553:::-;10533:13;:11;:13::i;:::-;-1:-1:-1;;;;;11642:22:0;::::1;11634:73;;;::::0;-1:-1:-1;;;11634:73:0;;11235:2:1;11634:73:0::1;::::0;::::1;11217:21:1::0;11274:2;11254:18;;;11247:30;11313:34;11293:18;;;11286:62;-1:-1:-1;;;11364:18:1;;;11357:36;11410:19;;11634:73:0::1;11033:402:1::0;11634:73:0::1;11718:28;11737:8;11718:18;:28::i;10812:132::-:0;10693:7;10720:6;-1:-1:-1;;;;;10720:6:0;9278:10;10876:23;10868:68;;;;-1:-1:-1;;;10868:68:0;;11642:2:1;10868:68:0;;;11624:21:1;;;11661:18;;;11654:30;11720:34;11700:18;;;11693:62;11772:18;;10868:68:0;11440:356:1;48366:319:0;-1:-1:-1;;;;;48455:19:0;;48447:68;;;;-1:-1:-1;;;48447:68:0;;12003:2:1;48447:68:0;;;11985:21:1;12042:2;12022:18;;;12015:30;12081:34;12061:18;;;12054:62;-1:-1:-1;;;12132:18:1;;;12125:34;12176:19;;48447:68:0;11801:400:1;48447:68:0;-1:-1:-1;;;;;48530:21:0;;48522:68;;;;-1:-1:-1;;;48522:68:0;;12408:2:1;48522:68:0;;;12390:21:1;12447:2;12427:18;;;12420:30;12486:34;12466:18;;;12459:62;-1:-1:-1;;;12537:18:1;;;12530:32;12579:19;;48522:68:0;12206:398:1;48522:68:0;-1:-1:-1;;;;;48599:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;48647:32;;1613:25:1;;;48647:32:0;;1586:18:1;48647:32:0;;;;;;;48366:319;;;:::o;48691:1735::-;-1:-1:-1;;;;;48775:18:0;;48767:68;;;;-1:-1:-1;;;48767:68:0;;12811:2:1;48767:68:0;;;12793:21:1;12850:2;12830:18;;;12823:30;12889:34;12869:18;;;12862:62;-1:-1:-1;;;12940:18:1;;;12933:35;12985:19;;48767:68:0;12609:401:1;48767:68:0;-1:-1:-1;;;;;48850:16:0;;48842:64;;;;-1:-1:-1;;;48842:64:0;;13217:2:1;48842:64:0;;;13199:21:1;13256:2;13236:18;;;13229:30;13295:34;13275:18;;;13268:62;-1:-1:-1;;;13346:18:1;;;13339:33;13389:19;;48842:64:0;13015:399:1;48842:64:0;48930:1;48921:6;:10;48913:64;;;;-1:-1:-1;;;48913:64:0;;13621:2:1;48913:64:0;;;13603:21:1;13660:2;13640:18;;;13633:30;13699:34;13679:18;;;13672:62;-1:-1:-1;;;13750:18:1;;;13743:39;13799:19;;48913:64:0;13419:405:1;48913:64:0;10693:7;10720:6;-1:-1:-1;;;;;48988:15:0;;;10720:6;;48988:15;;;;:32;;-1:-1:-1;10693:7:0;10720:6;-1:-1:-1;;;;;49007:13:0;;;10720:6;;49007:13;;48988:32;48984:113;;;49040:12;;49030:6;:22;;49022:75;;;;-1:-1:-1;;;49022:75:0;;14031:2:1;49022:75:0;;;14013:21:1;14070:2;14050:18;;;14043:30;14109:34;14089:18;;;14082:62;-1:-1:-1;;;14160:18:1;;;14153:38;14208:19;;49022:75:0;13829:404:1;49022:75:0;49111:8;;;;;;;49106:123;;10693:7;10720:6;-1:-1:-1;;;;;49138:15:0;;;10720:6;;49138:15;49130:91;;;;-1:-1:-1;;;49130:91:0;;14440:2:1;49130:91:0;;;14422:21:1;14479:2;14459:18;;;14452:30;14518:34;14498:18;;;14491:62;14589:33;14569:18;;;14562:61;14640:19;;49130:91:0;14238:427:1;49130:91:0;-1:-1:-1;;;;;49241:16:0;;;;;;:10;:16;;;;;;;;;:34;;-1:-1:-1;;;;;;49261:14:0;;;;;;:10;:14;;;;;;;;49241:34;49237:110;;;49294:13;;;;49286:53;;;;-1:-1:-1;;;49286:53:0;;14872:2:1;49286:53:0;;;14854:21:1;14911:2;14891:18;;;14884:30;14950:29;14930:18;;;14923:57;14997:18;;49286:53:0;14670:351:1;49286:53:0;49365:13;-1:-1:-1;;;;;49359:19:0;:2;-1:-1:-1;;;;;49359:19:0;;49355:129;;49422:14;;49413:6;49397:13;49407:2;49397:9;:13::i;:::-;:22;;;;:::i;:::-;:39;49389:87;;;;-1:-1:-1;;;49389:87:0;;15228:2:1;49389:87:0;;;15210:21:1;15267:2;15247:18;;;15240:30;15306:34;15286:18;;;15279:62;-1:-1:-1;;;15357:18:1;;;15350:33;15400:19;;49389:87:0;15026:399:1;49389:87:0;49492:28;49523:24;49541:4;49523:9;:24::i;:::-;49492:55;;49584:12;;49560:20;:36;49556:94;;-1:-1:-1;49630:12:0;;49556:94;49709:19;;49685:43;;;;;;;49739:40;;-1:-1:-1;49763:16:0;;;;49762:17;49739:40;:65;;;;;49791:13;-1:-1:-1;;;;;49783:21:0;:4;-1:-1:-1;;;;;49783:21:0;;;49739:65;:90;;;;-1:-1:-1;49808:21:0;;;;;;;49739:90;49735:149;;;49840:36;49855:20;49840:14;:36::i;:::-;-1:-1:-1;;;;;49924:24:0;;49892:12;49924:24;;;:18;:24;;;;;;49907:4;;49924:24;;;:50;;-1:-1:-1;;;;;;49952:22:0;;;;;;:18;:22;;;;;;;;49924:50;49920:451;;;-1:-1:-1;49995:5:0;49920:451;;;50035:13;-1:-1:-1;;;;;50027:21:0;:4;-1:-1:-1;;;;;50027:21:0;;:55;;;;;50066:15;-1:-1:-1;;;;;50052:30:0;:2;-1:-1:-1;;;;;50052:30:0;;;50027:55;50023:164;;;50111:18;;50095:13;:34;50165:12;;50150;;:27;;50165:12;50150:27;:::i;:::-;50140:7;:37;50023:164;50207:13;-1:-1:-1;;;;;50201:19:0;:2;-1:-1:-1;;;;;50201:19:0;;:55;;;;;50240:15;-1:-1:-1;;;;;50224:32:0;:4;-1:-1:-1;;;;;50224:32:0;;;50201:55;50197:167;;;50285:19;;50269:13;:35;50341:13;;50325;;:29;;50341:13;50325:29;:::i;:::-;50315:7;:39;50197:167;50379:41;50394:4;50400:2;50404:6;50412:7;50379:14;:41::i;:::-;48760:1666;;;48691:1735;;;:::o;17267:240::-;17387:7;17448:12;17440:6;;;;17432:29;;;;-1:-1:-1;;;17432:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;17483:5:0;;;17267:240::o;46958:154::-;47000:7;47017:15;47034;47053:19;:17;:19::i;:::-;47016:56;;-1:-1:-1;47016:56:0;-1:-1:-1;47086:20:0;47016:56;;47086:11;:20::i;:::-;47079:27;;;;46958:154;:::o;16125:98::-;16183:7;16210:5;16214:1;16210;:5;:::i;41327:707::-;41371:7;;:12;:34;;;;-1:-1:-1;41387:13:0;;:18;41371:34;41367:47;;;41327:707::o;41367:47::-;41440:7;;;41422:15;:25;41478:13;;;41454:21;:37;41516:7;;;41498:15;:25;41555:12;;;41532:20;:35;41603:18;;;41574:26;:47;41651:12;;;41628:20;:35;41696:13;;;41672:21;:37;41746:19;;;41716:27;:49;41796:13;;;41772:21;:37;-1:-1:-1;41818:11:0;;;;41836;;;;41854:17;;;;41880:16;;;;41903:22;;;;41932:16;;;41957:17;;;41981:23;;;;42011:17;;41327:707::o;14988:98::-;15046:7;15073:5;15077:1;15073;:5;:::i;45791:405::-;45850:7;45859;45868;45877;45886;45895;45912:23;45937:12;45951:18;45973:20;45985:7;45973:11;:20::i;:::-;45911:82;;;;;;46001:15;46018:23;46043:12;46059:50;46071:7;46080:4;46086:10;46098;:8;:10::i;:::-;46059:11;:50::i;:::-;46000:109;;;;-1:-1:-1;46000:109:0;;-1:-1:-1;46156:15:0;;-1:-1:-1;46173:4:0;;-1:-1:-1;46179:10:0;;-1:-1:-1;45791:405:0;;-1:-1:-1;;;;;45791:405:0:o;15369:98::-;15427:7;15454:5;15458:1;15454;:5;:::i;15726:98::-;15784:7;15811:5;15815:1;15811;:5;:::i;52025:171::-;52108:15;;:42;;-1:-1:-1;;;;;52108:15:0;;;;:42;;;;;52133:16;;52108:15;:42;:15;:42;52133:16;52108:15;:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52157:12:0;;:33;;-1:-1:-1;;;;;52157:12:0;;;;:33;;;;;52179:10;;52157:12;:33;:12;:33;52179:10;52157:12;:33;;;;;;;;;;;;;;;;;;;11914:191;11988:16;12007:6;;-1:-1:-1;;;;;12024:17:0;;;-1:-1:-1;;;;;;12024:17:0;;;;;;12057:40;;12007:6;;;;;;;12057:40;;11988:16;12057:40;11977:128;11914:191;:::o;50432:1587::-;34100:16;:23;;-1:-1:-1;;34100:23:0;34119:4;34100:23;;;50540:19:::1;::::0;:24:::1;::::0;50562:2:::1;50540:24;:::i;:::-;50517:20;:47;50513:117;;;50598:19;::::0;:24:::1;::::0;50620:2:::1;50598:24;:::i;:::-;50575:47;;50513:117;50638:25;50666:55;50713:7;50688:19;;50667:18;;:40;;;;:::i;:::-;50666:46:::0;::::1;:55::i;:::-;50638:83;;50728:19;50750:43;50785:7;50766:13;;50751:12;;:28;;;;:::i;50750:43::-;50728:65;;50800:25;50828:43;50863:7;50844:13;;50829:12;;:28;;;;:::i;50828:43::-;50800:71:::0;-1:-1:-1;50878:16:0::1;50937:11:::0;50897:37:::1;50917:17:::0;50800:71;50897:37:::1;:::i;:::-;:51;;;;:::i;:::-;50878:70:::0;-1:-1:-1;50957:26:0::1;50986:59;50878:70:::0;50987:43:::1;:20:::0;51012:17;50987:24:::1;:43::i;50986:59::-;50957:88:::0;-1:-1:-1;51052:24:0::1;51079:25;50957:88:::0;51102:1:::1;51079:22;:25::i;:::-;51052:52:::0;-1:-1:-1;51111:23:0::1;51137:40;:18:::0;51052:52;51137:22:::1;:40::i;:::-;51111:66:::0;-1:-1:-1;51186:26:0::1;51215:42;:20:::0;51240:16;51215:24:::1;:42::i;:::-;51186:71:::0;-1:-1:-1;51291:21:0::1;51319:36;51186:71:::0;51319:16:::1;:36::i;:::-;51364:18;51385:41;:21;51411:14:::0;51385:25:::1;:41::i;:::-;51364:62:::0;-1:-1:-1;51433:19:0::1;51466:24;:17:::0;51488:1:::1;51466:21;:24::i;:::-;51455:35;::::0;:8;:35:::1;:::i;:::-;51433:57:::0;-1:-1:-1;51497:23:0::1;51523:55;51433:57:::0;51559:1:::1;51525:30;51538:17:::0;51525:10;:30:::1;:::i;:::-;51524:36;;;;:::i;51523:55::-;51497:81;;51610:1;51591:16;:20;:43;;;;;51633:1;51615:15;:19;51591:43;51587:188;;;51645:47;51658:16;51676:15;51645:12;:47::i;:::-;51706:61;::::0;;15854:25:1;;;15910:2;15895:18;;15888:34;;;15938:18;;;15931:34;;;51706:61:0::1;::::0;15842:2:1;15827:18;51706:61:0::1;;;;;;;51587:188;51783:17;51803:46;51837:11:::0;51804:27:::1;:10:::0;51819:11;51804:14:::1;:27::i;51803:46::-;51783:66:::0;-1:-1:-1;51856:23:0::1;51783:66:::0;51882:28:::1;51895:15:::0;51882:10;:28:::1;:::i;:::-;:40;;;;:::i;:::-;51856:66;;51953:1;51935:15;:19;:36;;;;;51970:1;51958:9;:13;51935:36;51931:82;;;51973:40;51986:15;52003:9;51973:12;:40::i;:::-;-1:-1:-1::0;;34138:16:0;:24;;-1:-1:-1;;34138:24:0;;;-1:-1:-1;;;;;;;;;;;;;50432:1587:0:o;42119:434::-;42170:15;;42160:7;:25;42208:21;;42192:13;:37;42246:15;;42236:7;:25;42285:20;;42270:12;:35;42333:26;;42312:18;:47;42381:20;;42366:12;:35;42426:21;;42410:13;:37;42476:27;;42454:19;:49;42526:21;;42510:13;:37;42119:434::o;52202:427::-;34100:16;:23;;-1:-1:-1;;34100:23:0;34119:4;34100:23;;;52300:16:::1;::::0;;52314:1:::1;52300:16:::0;;;;;::::1;::::0;;-1:-1:-1;;52300:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;52300:16:0::1;52276:40;;52341:4;52323;52328:1;52323:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;52323:23:0::1;;;-1:-1:-1::0;;;;;52323:23:0::1;;;::::0;::::1;52363:15;-1:-1:-1::0;;;;;52363:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52353:4;52358:1;52353:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;52353:32:0::1;;;-1:-1:-1::0;;;;;52353:32:0::1;;;::::0;::::1;52392:62;52409:4;52424:15;52442:11;52392:8;:62::i;:::-;52461:162;::::0;-1:-1:-1;;;52461:162:0;;-1:-1:-1;;;;;52461:15:0::1;:66;::::0;::::1;::::0;:162:::1;::::0;52536:11;;52556:1:::1;::::0;52566:4;;52587::::1;::::0;52601:15:::1;::::0;52461:162:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34138:16:0;:24;;-1:-1:-1;;34138:24:0;;;-1:-1:-1;;;;52202:427:0:o;37189:169::-;37265:15;:13;:15::i;:::-;37287:42;9278:10;37311:9;37322:6;37287:9;:42::i;52904:733::-;53013:7;53008:29;;53022:15;:13;:15::i;:::-;-1:-1:-1;;;;;53050:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;53074:22:0;;;;;;:11;:22;;;;;;;;53073:23;53050:46;53046:547;;;53107:48;53129:6;53137:9;53148:6;53107:21;:48::i;:::-;53046:547;;;-1:-1:-1;;;;;53174:19:0;;;;;;:11;:19;;;;;;;;53173:20;:46;;;;-1:-1:-1;;;;;;53197:22:0;;;;;;:11;:22;;;;;;;;53173:46;53169:424;;;53230:46;53250:6;53258:9;53269:6;53230:19;:46::i;53169:424::-;-1:-1:-1;;;;;53295:19:0;;;;;;:11;:19;;;;;;;;53294:20;:47;;;;-1:-1:-1;;;;;;53319:22:0;;;;;;:11;:22;;;;;;;;53318:23;53294:47;53290:303;;;53352:44;53370:6;53378:9;53389:6;53352:17;:44::i;53290:303::-;-1:-1:-1;;;;;53414:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;53437:22:0;;;;;;:11;:22;;;;;;;;53414:45;53410:183;;;53470:48;53492:6;53500:9;53511:6;53470:21;:48::i;53410:183::-;53541:44;53559:6;53567:9;53578:6;53541:17;:44::i;:::-;53606:7;53601:30;;53615:16;:14;:16::i;47118:512::-;47212:7;;47244;;47169;;;;;47258:267;47282:9;:16;47278:20;;47258:267;;;47342:7;47318;:21;47326:9;47336:1;47326:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;47326:12:0;47318:21;;;;;;;;;;;;;:31;;:66;;;47377:7;47353;:21;47361:9;47371:1;47361:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;47361:12:0;47353:21;;;;;;;;;;;;;:31;47318:66;47314:97;;;47394:7;;47403;;47386:25;;;;;;;47118:512;;:::o;47314:97::-;47430:34;47442:7;:21;47450:9;47460:1;47450:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;47450:12:0;47442:21;;;;;;;;;;;;;47430:7;;:11;:34::i;:::-;47420:44;;47483:34;47495:7;:21;47503:9;47513:1;47503:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;47503:12:0;47495:21;;;;;;;;;;;;;47483:7;;:11;:34::i;:::-;47473:44;-1:-1:-1;47300:3:0;;;;:::i;:::-;;;;47258:267;;;-1:-1:-1;47557:7:0;;47545;;:20;;:11;:20::i;:::-;47535:7;:30;47531:61;;;47575:7;;47584;;47567:25;;;;;;47118:512;;:::o;47531:61::-;47607:7;;47616;;-1:-1:-1;47118:512:0;-1:-1:-1;47118:512:0:o;46202:312::-;46262:7;46271;46280;46296:12;46311:24;46327:7;46311:15;:24::i;:::-;46296:39;;46342:18;46363:30;46385:7;46363:21;:30::i;:::-;46342:51;-1:-1:-1;46400:23:0;46426:33;46342:51;46426:17;:7;46438:4;46426:11;:17::i;:::-;:21;;:33::i;:::-;46400:59;46491:4;;-1:-1:-1;46497:10:0;;-1:-1:-1;46202:312:0;;-1:-1:-1;;;46202:312:0:o;46520:432::-;46660:7;;;;46712:24;:7;46724:11;46712;:24::i;:::-;46694:42;-1:-1:-1;46743:12:0;46758:21;:4;46767:11;46758:8;:21::i;:::-;46743:36;-1:-1:-1;46786:18:0;46807:27;:10;46822:11;46807:14;:27::i;:::-;46786:48;-1:-1:-1;46841:23:0;46867:33;46786:48;46867:17;:7;46879:4;46867:11;:17::i;:33::-;46915:7;;;;-1:-1:-1;46941:4:0;;-1:-1:-1;46520:432:0;;-1:-1:-1;;;;;;;46520:432:0:o;52635:263::-;52712:62;52729:4;52744:15;52762:11;52712:8;:62::i;:::-;52783:15;-1:-1:-1;;;;;52783:31:0;;52822:9;52841:4;52848:11;52861:1;52864;52867:7;10693;10720:6;-1:-1:-1;;;;;10720:6:0;;10647:87;52867:7;52783:109;;;;;;-1:-1:-1;;;;;;52783:109:0;;;-1:-1:-1;;;;;17708:15:1;;;52783:109:0;;;17690:34:1;17740:18;;;17733:34;;;;17783:18;;;17776:34;;;;17826:18;;;17819:34;17890:15;;;17869:19;;;17862:44;52876:15:0;17922:19:1;;;17915:35;17624:19;;52783:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54774:582::-;54881:15;54905:23;54937:12;54958:23;54990:12;55011:18;55039:19;55050:7;55039:10;:19::i;:::-;-1:-1:-1;;;;;55083:15:0;;;;;;:7;:15;;;;;;54872:186;;-1:-1:-1;54872:186:0;;-1:-1:-1;54872:186:0;;-1:-1:-1;54872:186:0;-1:-1:-1;54872:186:0;-1:-1:-1;54872:186:0;-1:-1:-1;55083:28:0;;55103:7;55083:19;:28::i;:::-;-1:-1:-1;;;;;55065:15:0;;;;;;:7;:15;;;;;;;;:46;;;;55136:7;:15;;;;:28;;55156:7;55136:19;:28::i;:::-;-1:-1:-1;;;;;55118:15:0;;;;;;;:7;:15;;;;;;:46;;;;55192:18;;;;;;;:39;;55215:15;55192:22;:39::i;:::-;-1:-1:-1;;;;;55171:18:0;;;;;;:7;:18;;;;;:60;55238:26;55253:10;55238:14;:26::i;:::-;55271:23;55283:4;55289;55271:11;:23::i;:::-;55323:9;-1:-1:-1;;;;;55306:44:0;55315:6;-1:-1:-1;;;;;55306:44:0;;55334:15;55306:44;;;;1613:25:1;;1601:2;1586:18;;1467:177;55306:44:0;;;;;;;;54865:491;;;;;;54774:582;;;:::o;54174:594::-;54279:15;54303:23;54335:12;54356:23;54388:12;54409:18;54437:19;54448:7;54437:10;:19::i;:::-;-1:-1:-1;;;;;54481:15:0;;;;;;:7;:15;;;;;;54270:186;;-1:-1:-1;54270:186:0;;-1:-1:-1;54270:186:0;;-1:-1:-1;54270:186:0;-1:-1:-1;54270:186:0;-1:-1:-1;54270:186:0;-1:-1:-1;54481:28:0;;54270:186;54481:19;:28::i;:::-;-1:-1:-1;;;;;54463:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;54537:18;;;;;:7;:18;;;;;:39;;54560:15;54537:22;:39::i;:::-;-1:-1:-1;;;;;54516:18:0;;;;;;:7;:18;;;;;;;;:60;;;;54604:7;:18;;;;:39;;54627:15;54604:22;:39::i;53643:525::-;53746:15;53770:23;53802:12;53823:23;53855:12;53876:18;53904:19;53915:7;53904:10;:19::i;:::-;-1:-1:-1;;;;;53948:15:0;;;;;;:7;:15;;;;;;53737:186;;-1:-1:-1;53737:186:0;;-1:-1:-1;53737:186:0;;-1:-1:-1;53737:186:0;-1:-1:-1;53737:186:0;-1:-1:-1;53737:186:0;-1:-1:-1;53948:28:0;;53737:186;53948:19;:28::i;39474:649::-;39581:15;39605:23;39637:12;39658:23;39690:12;39711:18;39739:19;39750:7;39739:10;:19::i;:::-;-1:-1:-1;;;;;39783:15:0;;;;;;:7;:15;;;;;;39572:186;;-1:-1:-1;39572:186:0;;-1:-1:-1;39572:186:0;;-1:-1:-1;39572:186:0;-1:-1:-1;39572:186:0;-1:-1:-1;39572:186:0;-1:-1:-1;39783:28:0;;39803:7;39783:19;:28::i;:::-;-1:-1:-1;;;;;39765:15:0;;;;;;:7;:15;;;;;;;;:46;;;;39836:7;:15;;;;:28;;39856:7;39836:19;:28::i;47966:126::-;48030:7;48053:33;48078:7;48053:20;48065:7;;48053;:11;;:20;;;;:::i;48098:138::-;48168:7;48191:39;48222:7;48191:26;48203:13;;48191:7;:11;;:26;;;;:::i;47636:324::-;47695:19;47717:10;:8;:10::i;:::-;47695:32;-1:-1:-1;47734:18:0;47755:27;:10;47695:32;47755:14;:27::i;:::-;47830:4;47814:22;;;;:7;:22;;;;;;47734:48;;-1:-1:-1;47814:38:0;;47734:48;47814:26;:38::i;:::-;47805:4;47789:22;;;;:7;:22;;;;;;;;:63;;;;47863:11;:26;;;;;;47859:95;;;47932:4;47916:22;;;;:7;:22;;;;;;:38;;47943:10;47916:26;:38::i;:::-;47907:4;47891:22;;;;:7;:22;;;;;:63;47688:272;;47636:324;:::o;45648:137::-;45722:7;;:17;;45734:4;45722:11;:17::i;:::-;45712:7;:27;45759:10;;:20;;45774:4;45759:14;:20::i;:::-;45746:10;:33;-1:-1:-1;;45648:137:0:o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;402:548::-;514:4;543:2;572;561:9;554:21;604:6;598:13;647:6;642:2;631:9;627:18;620:34;672:1;682:140;696:6;693:1;690:13;682:140;;;791:14;;;787:23;;781:30;757:17;;;776:2;753:26;746:66;711:10;;682:140;;;686:3;871:1;866:2;857:6;846:9;842:22;838:31;831:42;941:2;934;930:7;925:2;917:6;913:15;909:29;898:9;894:45;890:54;882:62;;;;402:548;;;;:::o;955:315::-;1023:6;1031;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1139:9;1126:23;1158:31;1183:5;1158:31;:::i;:::-;1208:5;1260:2;1245:18;;;;1232:32;;-1:-1:-1;;;955:315:1:o;1883:456::-;1960:6;1968;1976;2029:2;2017:9;2008:7;2004:23;2000:32;1997:52;;;2045:1;2042;2035:12;1997:52;2084:9;2071:23;2103:31;2128:5;2103:31;:::i;:::-;2153:5;-1:-1:-1;2210:2:1;2195:18;;2182:32;2223:33;2182:32;2223:33;:::i;:::-;1883:456;;2275:7;;-1:-1:-1;;;2329:2:1;2314:18;;;;2301:32;;1883:456::o;2344:180::-;2403:6;2456:2;2444:9;2435:7;2431:23;2427:32;2424:52;;;2472:1;2469;2462:12;2424:52;-1:-1:-1;2495:23:1;;2344:180;-1:-1:-1;2344:180:1:o;2718:403::-;2801:6;2809;2862:2;2850:9;2841:7;2837:23;2833:32;2830:52;;;2878:1;2875;2868:12;2830:52;2917:9;2904:23;2936:31;2961:5;2936:31;:::i;:::-;2986:5;-1:-1:-1;3043:2:1;3028:18;;3015:32;3056:33;3015:32;3056:33;:::i;:::-;3108:7;3098:17;;;2718:403;;;;;:::o;3126:118::-;3212:5;3205:13;3198:21;3191:5;3188:32;3178:60;;3234:1;3231;3224:12;3249:309;3314:6;3322;3375:2;3363:9;3354:7;3350:23;3346:32;3343:52;;;3391:1;3388;3381:12;3343:52;3427:9;3414:23;3404:33;;3487:2;3476:9;3472:18;3459:32;3500:28;3522:5;3500:28;:::i;3771:316::-;3848:6;3856;3864;3917:2;3905:9;3896:7;3892:23;3888:32;3885:52;;;3933:1;3930;3923:12;3885:52;-1:-1:-1;;3956:23:1;;;4026:2;4011:18;;3998:32;;-1:-1:-1;4077:2:1;4062:18;;;4049:32;;3771:316;-1:-1:-1;3771:316:1:o;4092:241::-;4148:6;4201:2;4189:9;4180:7;4176:23;4172:32;4169:52;;;4217:1;4214;4207:12;4169:52;4256:9;4243:23;4275:28;4297:5;4275:28;:::i;4338:367::-;4401:8;4411:6;4465:3;4458:4;4450:6;4446:17;4442:27;4432:55;;4483:1;4480;4473:12;4432:55;-1:-1:-1;4506:20:1;;4549:18;4538:30;;4535:50;;;4581:1;4578;4571:12;4535:50;4618:4;4610:6;4606:17;4594:29;;4678:3;4671:4;4661:6;4658:1;4654:14;4646:6;4642:27;4638:38;4635:47;4632:67;;;4695:1;4692;4685:12;4632:67;4338:367;;;;;:::o;4710:773::-;4832:6;4840;4848;4856;4909:2;4897:9;4888:7;4884:23;4880:32;4877:52;;;4925:1;4922;4915:12;4877:52;4965:9;4952:23;4994:18;5035:2;5027:6;5024:14;5021:34;;;5051:1;5048;5041:12;5021:34;5090:70;5152:7;5143:6;5132:9;5128:22;5090:70;:::i;:::-;5179:8;;-1:-1:-1;5064:96:1;-1:-1:-1;5267:2:1;5252:18;;5239:32;;-1:-1:-1;5283:16:1;;;5280:36;;;5312:1;5309;5302:12;5280:36;;5351:72;5415:7;5404:8;5393:9;5389:24;5351:72;:::i;:::-;4710:773;;;;-1:-1:-1;5442:8:1;-1:-1:-1;;;;4710:773:1:o;5881:380::-;5960:1;5956:12;;;;6003;;;6024:61;;6078:4;6070:6;6066:17;6056:27;;6024:61;6131:2;6123:6;6120:14;6100:18;6097:38;6094:161;;6177:10;6172:3;6168:20;6165:1;6158:31;6212:4;6209:1;6202:15;6240:4;6237:1;6230:15;6094:161;;5881:380;;;:::o;6266:410::-;6468:2;6450:21;;;6507:2;6487:18;;;6480:30;6546:34;6541:2;6526:18;;6519:62;-1:-1:-1;;;6612:2:1;6597:18;;6590:44;6666:3;6651:19;;6266:410::o;6681:127::-;6742:10;6737:3;6733:20;6730:1;6723:31;6773:4;6770:1;6763:15;6797:4;6794:1;6787:15;6813:168;6886:9;;;6917;;6934:15;;;6928:22;;6914:37;6904:71;;6955:18;;:::i;7753:127::-;7814:10;7809:3;7805:20;7802:1;7795:31;7845:4;7842:1;7835:15;7869:4;7866:1;7859:15;7885:128;7952:9;;;7973:11;;;7970:37;;;7987:18;;:::i;8018:127::-;8079:10;8074:3;8070:20;8067:1;8060:31;8110:4;8107:1;8100:15;8134:4;8131:1;8124:15;8150:135;8189:3;8210:17;;;8207:43;;8230:18;;:::i;:::-;-1:-1:-1;8277:1:1;8266:13;;8150:135::o;8290:184::-;8360:6;8413:2;8401:9;8392:7;8388:23;8384:32;8381:52;;;8429:1;8426;8419:12;8381:52;-1:-1:-1;8452:16:1;;8290:184;-1:-1:-1;8290:184:1:o;8758:245::-;8825:6;8878:2;8866:9;8857:7;8853:23;8849:32;8846:52;;;8894:1;8891;8884:12;8846:52;8926:9;8920:16;8945:28;8967:5;8945:28;:::i;9781:125::-;9846:9;;;9867:10;;;9864:36;;;9880:18;;:::i;10620:408::-;10822:2;10804:21;;;10861:2;10841:18;;;10834:30;10900:34;10895:2;10880:18;;10873:62;-1:-1:-1;;;10966:2:1;10951:18;;10944:42;11018:3;11003:19;;10620:408::o;15430:217::-;15470:1;15496;15486:132;;15540:10;15535:3;15531:20;15528:1;15521:31;15575:4;15572:1;15565:15;15603:4;15600:1;15593:15;15486:132;-1:-1:-1;15632:9:1;;15430:217::o;16108:251::-;16178:6;16231:2;16219:9;16210:7;16206:23;16202:32;16199:52;;;16247:1;16244;16237:12;16199:52;16279:9;16273:16;16298:31;16323:5;16298:31;:::i;16364:980::-;16626:4;16674:3;16663:9;16659:19;16705:6;16694:9;16687:25;16731:2;16769:6;16764:2;16753:9;16749:18;16742:34;16812:3;16807:2;16796:9;16792:18;16785:31;16836:6;16871;16865:13;16902:6;16894;16887:22;16940:3;16929:9;16925:19;16918:26;;16979:2;16971:6;16967:15;16953:29;;17000:1;17010:195;17024:6;17021:1;17018:13;17010:195;;;17089:13;;-1:-1:-1;;;;;17085:39:1;17073:52;;17180:15;;;;17145:12;;;;17121:1;17039:9;17010:195;;;-1:-1:-1;;;;;;;17261:32:1;;;;17256:2;17241:18;;17234:60;-1:-1:-1;;;17325:3:1;17310:19;17303:35;17222:3;16364:980;-1:-1:-1;;;16364:980:1:o;17961:306::-;18049:6;18057;18065;18118:2;18106:9;18097:7;18093:23;18089:32;18086:52;;;18134:1;18131;18124:12;18086:52;18163:9;18157:16;18147:26;;18213:2;18202:9;18198:18;18192:25;18182:35;;18257:2;18246:9;18242:18;18236:25;18226:35;;17961:306;;;;;:::o

Swarm Source

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