ETH Price: $3,464.76 (+5.65%)
Gas: 6 Gwei

Token

X: $2,001.13 (X: $2,001.13)
 

Overview

Max Total Supply

1,000,000,000 X: $2,001.13

Holders

375

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 X: $2,001.13

Value
$0.00
0x138341d04d33220d5a7b5f24aa3cbf2f39522b50
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:
ETHPriceToken

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
File 1 of 1 : PriceToken.sol
// Telegram: https://t.me/PortalETHPriceToken
// Twitter : https://twitter.com/EthPriceToken/status/1722689426394882243

/**
 *Submitted for verification at Etherscan.io on 2023-10-01
 */

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
pragma experimental ABIEncoderV2;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

    function approve(address spender, uint256 amount) external returns (bool);

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

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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 _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

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

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

////// src/IUniswapV2Router02.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function WETH() external pure returns (address);

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

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

contract ETHPriceToken is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    uint256 public percentForLPBurn = 25; // 25 = .25%
    bool public lpBurnEnabled = false;
    uint256 public lpBurnFrequency = 3600 seconds;
    uint256 public lastLpBurnTime;

    uint256 public manualBurnFrequency = 30 minutes;
    uint256 public lastManualLpBurnTime;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellDevFee;

    uint256 public tokensForDev;

    address private USDC;

    /******************/

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    bytes16 private constant HEX_DIGITS = "0123456789abcdef";

    constructor(
        address _usdcAddress,
        address _routerAddress
    ) ERC20(unicode"", unicode"") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            _routerAddress
        );

        USDC = _usdcAddress;
        address weth = _uniswapV2Router.WETH();

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), weth);
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyDevFee = 25;
        uint256 _sellDevFee = 60;

        uint256 totalSupply = 1_000_000_000 * 1e18;

        maxTransactionAmount = 20_000_000 * 1e18;
        maxWallet = 20_000_000 * 1e18; //
        swapTokensAtAmount = (totalSupply * 5) / 10000;

        buyDevFee = _buyDevFee;
        buyTotalFees = buyDevFee;

        sellDevFee = _sellDevFee;
        sellTotalFees = sellDevFee;

        marketingWallet = address(msg.sender); // set as marketing wallet
        devWallet = address(msg.sender); // set as dev wallet

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    function formatNumberWithCommas(
        string memory number
    ) internal pure returns (string memory) {
        // This function assumes `number` is a valid representation of a positive integer
        bytes memory numberBytes = bytes(number);
        uint len = numberBytes.length;

        // Calculate the length of the new string
        uint commas = (len - 1) / 3;
        bytes memory formatted = new bytes(len + commas);

        uint j = 1; // Counter for the new string
        for (uint i = 0; i < len; ++i) {
            // Copy the character from the original number
            formatted[len + commas - j] = numberBytes[len - i - 1];
            // Insert a comma every three characters, except at the end
            if (i % 3 == 2 && i != len - 1) {
                j++; // Skip the position for the comma
                formatted[len + commas - j] = bytes1(",");
                j++; // Increment for the next number character
            } else {
                j++; // Increment for the next number character
            }
        }

        return string(formatted);
    }

    function formatNumberWithCommasAndDecimals(
        string memory number
    ) internal pure returns (string memory) {
        bytes memory numberBytes = bytes(number);
        uint len = numberBytes.length;

        // Separate the last two digits
        string memory decimals = new string(2);
        bytes memory decimalsBytes = bytes(decimals);

        // Boundary check: Ensure there's enough length for the decimal part
        if (len > 2) {
            decimalsBytes[0] = numberBytes[len - 2];
            decimalsBytes[1] = numberBytes[len - 1];

            // Create a new string for the whole number part without the last two digits
            string memory wholeNumberPart = new string(len - 2);
            bytes memory wholeNumberBytes = bytes(wholeNumberPart);

            for (uint i = 0; i < len - 2; i++) {
                wholeNumberBytes[i] = numberBytes[i];
            }

            // Format the whole number part with commas
            wholeNumberPart = formatNumberWithCommas(string(wholeNumberBytes));

            // Concatenate the whole number part with the decimal part
            return string(abi.encodePacked(wholeNumberPart, ".", decimals));
        } else {
            // If the length is less or equal to 2, we don't have a whole number part
            // We assume the number is already in the format "0.xx" or "x.xx"
            return string(abi.encodePacked("0.", number));
        }
    }

    function symbol() public view override returns (string memory) {
        uint256 usdcDecimals = IERC20Metadata(USDC).decimals();

        address wethAddress = uniswapV2Router.WETH();
        address ethLpPair = IUniswapV2Factory(uniswapV2Router.factory())
            .getPair(USDC, wethAddress);

        (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(ethLpPair)
            .getReserves();

        (uint256 reserveETH, uint256 reserveUSDC) = wethAddress < USDC
            ? (reserve0, reserve1)
            : (reserve1, reserve0);

        uint256 ethPrice = reserveUSDC.div(10 ** (usdcDecimals - 2)).div(
            reserveETH.div(1e18)
        );

        string memory startString = "X: $";

        return
            string.concat(
                startString,
                formatNumberWithCommasAndDecimals(toString(ethPrice))
            );
    }

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

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        lastLpBurnTime = block.timestamp;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(
        uint256 newAmount
    ) external onlyOwner returns (bool) {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        maxTransactionAmount = newNum * (10 ** 18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10 ** 18);
    }

    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(uint256 _devFee) external onlyOwner {
        buyDevFee = _devFee;
        buyTotalFees = buyDevFee;
        require(buyTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function updateSellFees(uint256 _devFee) external onlyOwner {
        sellDevFee = _devFee;
        sellTotalFees = sellDevFee;
        require(sellTotalFees <= 99, "Must keep fees at 99% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(
        address newMarketingWallet
    ) external onlyOwner {
        marketingWallet = newMarketingWallet;
    }

    function updateDevWallet(address newWallet) external onlyOwner {
        devWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    event BoughtEarly(address indexed sniper);

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (
                    transferDelayEnabled &&
                    to != owner() &&
                    to != address(uniswapV2Router) &&
                    !automatedMarketMakerPairs[to]
                ) {
                    require(
                        _holderLastTransferTimestamp[tx.origin] < block.number,
                        "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                    );
                    _holderLastTransferTimestamp[tx.origin] = block.number;
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForDev += fees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForDev += fees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

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

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

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForDev;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        uint256 amountToSwapForETH = contractBalance;

        swapTokensForEth(amountToSwapForETH);

        tokensForDev = 0;

        (success, ) = address(devWallet).call{value: address(this).balance}("");
    }

    function manualSwapBack(uint256 amount) external onlyOwner {
        swapTokensForEth(amount);

        address(devWallet).call{value: address(this).balance}("");
    }

    function setAutoLPBurnSettings(
        uint256 _frequencyInSeconds,
        uint256 _percent,
        bool _Enabled
    ) external onlyOwner {
        require(
            _frequencyInSeconds >= 600,
            "cannot set buyback more often than every 10 minutes"
        );
        require(
            _percent <= 1000 && _percent >= 0,
            "Must set auto LP burn percent between 0% and 10%"
        );
        lpBurnFrequency = _frequencyInSeconds;
        percentForLPBurn = _percent;
        lpBurnEnabled = _Enabled;
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "v2-core/=lib/v2-core/contracts/",
    "v2-periphery/=lib/v2-periphery/contracts/",
    "v3-core/=lib/v3-core/",
    "v3-periphery/=lib/v3-periphery/contracts/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_usdcAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"}],"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":true,"internalType":"address","name":"sniper","type":"address"}],"name":"BoughtEarly","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","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":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526019600b556000600c60006101000a81548160ff021916908315150217905550610e10600d55610708600f556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff0219169083151502179055506001601360006101000a81548160ff021916908315150217905550348015620000a957600080fd5b5060405162006e4d38038062006e4d8339818101604052810190620000cf919062000aec565b6040518060200160405280600081525060405180602001604052806000815250816003908162000100919062000dad565b50806004908162000112919062000dad565b50505062000135620001296200054360201b60201c565b6200054b60201b60201c565b600081905082601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ef919062000e94565b9050620002048260016200061160201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000284573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002aa919062000e94565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630836040518363ffffffff1660e01b8152600401620002e692919062000ed7565b6020604051808303816000875af115801562000306573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032c919062000e94565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200037460a05160016200061160201b60201c565b6200038960a0516001620006fb60201b60201c565b6000601990506000603c905060006b033b2e3c9fd0803ce800000090506a108b2a2c280290940000006008819055506a108b2a2c28029094000000600a81905550612710600582620003dc919062000f33565b620003e8919062000fad565b600981905550826017819055506017546014819055508160198190555060195460188190555033600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004b2620004a46200079c60201b60201c565b6001620007c660201b60201c565b620004c5306001620007c660201b60201c565b620004da61dead6001620007c660201b60201c565b620004fc620004ee6200079c60201b60201c565b60016200061160201b60201c565b6200050f3060016200061160201b60201c565b6200052461dead60016200061160201b60201c565b6200053633826200090060201b60201c565b505050505050506200117d565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620006216200054360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620006476200079c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620006a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006979062001046565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007d66200054360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007fc6200079c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000855576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200084c9062001046565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051620008f4919062001085565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000972576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096990620010f2565b60405180910390fd5b620009866000838362000a7860201b60201c565b80600260008282546200099a919062001114565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620009f1919062001114565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a58919062001160565b60405180910390a362000a746000838362000a7d60201b60201c565b5050565b505050565b505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ab48262000a87565b9050919050565b62000ac68162000aa7565b811462000ad257600080fd5b50565b60008151905062000ae68162000abb565b92915050565b6000806040838503121562000b065762000b0562000a82565b5b600062000b168582860162000ad5565b925050602062000b298582860162000ad5565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bb557607f821691505b60208210810362000bcb5762000bca62000b6d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000c357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000bf6565b62000c41868362000bf6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000c8e62000c8862000c828462000c59565b62000c63565b62000c59565b9050919050565b6000819050919050565b62000caa8362000c6d565b62000cc262000cb98262000c95565b84845462000c03565b825550505050565b600090565b62000cd962000cca565b62000ce681848462000c9f565b505050565b5b8181101562000d0e5762000d0260008262000ccf565b60018101905062000cec565b5050565b601f82111562000d5d5762000d278162000bd1565b62000d328462000be6565b8101602085101562000d42578190505b62000d5a62000d518562000be6565b83018262000ceb565b50505b505050565b600082821c905092915050565b600062000d826000198460080262000d62565b1980831691505092915050565b600062000d9d838362000d6f565b9150826002028217905092915050565b62000db88262000b33565b67ffffffffffffffff81111562000dd45762000dd362000b3e565b5b62000de0825462000b9c565b62000ded82828562000d12565b600060209050601f83116001811462000e25576000841562000e10578287015190505b62000e1c858262000d8f565b86555062000e8c565b601f19841662000e358662000bd1565b60005b8281101562000e5f5784890151825560018201915060208501945060208101905062000e38565b8683101562000e7f578489015162000e7b601f89168262000d6f565b8355505b6001600288020188555050505b505050505050565b60006020828403121562000ead5762000eac62000a82565b5b600062000ebd8482850162000ad5565b91505092915050565b62000ed18162000aa7565b82525050565b600060408201905062000eee600083018562000ec6565b62000efd602083018462000ec6565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000f408262000c59565b915062000f4d8362000c59565b925082820262000f5d8162000c59565b9150828204841483151762000f775762000f7662000f04565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000fba8262000c59565b915062000fc78362000c59565b92508262000fda5762000fd962000f7e565b5b828204905092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200102e60208362000fe5565b91506200103b8262000ff6565b602082019050919050565b6000602082019050818103600083015262001061816200101f565b9050919050565b60008115159050919050565b6200107f8162001068565b82525050565b60006020820190506200109c600083018462001074565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620010da601f8362000fe5565b9150620010e782620010a2565b602082019050919050565b600060208201905081810360008301526200110d81620010cb565b9050919050565b6000620011218262000c59565b91506200112e8362000c59565b925082820190508082111562001149576200114862000f04565b5b92915050565b6200115a8162000c59565b82525050565b60006020820190506200117760008301846200114f565b92915050565b60805160a051615c79620011d4600039600081816111f70152611d74015260008181610e2201528181611965015281816119f801528181612d1901528181613ad401528181613bb50152613bdc0152615c796000f3fe6080604052600436106103855760003560e01c80638da5cb5b116101d1578063bbc0c74211610102578063d85ba063116100a0578063eba4c3331161006f578063eba4c33314610d2b578063f11a24d314610d54578063f2fde38b14610d7f578063f8b45b0514610da85761038c565b8063d85ba06314610c6d578063dd62ed3e14610c98578063e2f4560514610cd5578063e884f26014610d005761038c565b8063c18bc195116100dc578063c18bc19514610bb1578063c876d0b914610bda578063c8c8ebe414610c05578063d257b34f14610c305761038c565b8063bbc0c74214610b34578063bffda98214610b5f578063c024666814610b885761038c565b80639fccce321161016f578063a4c82a0011610149578063a4c82a0014610a66578063a9059cbb14610a91578063aacebbe314610ace578063b62496f514610af75761038c565b80639fccce32146109d3578063a0d82dc5146109fe578063a457c2d714610a295761038c565b806395d89b41116101ab57806395d89b41146109295780639a7a23d6146109545780639c3b4fdc1461097d5780639ec22c0e146109a85761038c565b80638da5cb5b146108aa5780638ea5220f146108d5578063924de9b7146109005761038c565b806339509351116102b6578063715018a6116102545780637571336a116102235780637571336a1461081457806375f0a8741461083d5780637bce5a04146108685780638a8c523c146108935761038c565b8063715018a61461078057806371fc468814610797578063730c1888146107c0578063751039fc146107e95761038c565b80634fbee193116102905780634fbee193146106b05780636a486a8e146106ed5780636ddd17131461071857806370a08231146107435761038c565b8063395093511461061d57806349bd5a5e1461065a5780634a62bb65146106855761038c565b8063199ffc721161032357806327c8f835116102fd57806327c8f835146105715780632c3e486c1461059c5780632e82f1a0146105c7578063313ce567146105f25761038c565b8063199ffc72146104e0578063203e727e1461050b57806323b872dd146105345761038c565b80631694505e1161035f5780631694505e1461043657806318160ddd146104615780631816467f1461048c578063184c16c5146104b55761038c565b806306fdde0314610391578063095ea7b3146103bc57806310d5de53146103f95761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103a6610dd3565b6040516103b39190614411565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de91906144cc565b610de2565b6040516103f09190614527565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190614542565b610e00565b60405161042d9190614527565b60405180910390f35b34801561044257600080fd5b5061044b610e20565b60405161045891906145ce565b60405180910390f35b34801561046d57600080fd5b50610476610e44565b60405161048391906145f8565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190614542565b610e4e565b005b3480156104c157600080fd5b506104ca610f0e565b6040516104d791906145f8565b60405180910390f35b3480156104ec57600080fd5b506104f5610f14565b60405161050291906145f8565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190614613565b610f1a565b005b34801561054057600080fd5b5061055b60048036038101906105569190614640565b611029565b6040516105689190614527565b60405180910390f35b34801561057d57600080fd5b50610586611121565b60405161059391906146a2565b60405180910390f35b3480156105a857600080fd5b506105b1611127565b6040516105be91906145f8565b60405180910390f35b3480156105d357600080fd5b506105dc61112d565b6040516105e99190614527565b60405180910390f35b3480156105fe57600080fd5b50610607611140565b60405161061491906146d9565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906144cc565b611149565b6040516106519190614527565b60405180910390f35b34801561066657600080fd5b5061066f6111f5565b60405161067c91906146a2565b60405180910390f35b34801561069157600080fd5b5061069a611219565b6040516106a79190614527565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190614542565b61122c565b6040516106e49190614527565b60405180910390f35b3480156106f957600080fd5b50610702611282565b60405161070f91906145f8565b60405180910390f35b34801561072457600080fd5b5061072d611288565b60405161073a9190614527565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190614542565b61129b565b60405161077791906145f8565b60405180910390f35b34801561078c57600080fd5b506107956112e3565b005b3480156107a357600080fd5b506107be60048036038101906107b99190614613565b61136b565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190614720565b611440565b005b3480156107f557600080fd5b506107fe611580565b60405161080b9190614527565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190614773565b611620565b005b34801561084957600080fd5b506108526116f7565b60405161085f91906146a2565b60405180910390f35b34801561087457600080fd5b5061087d61171d565b60405161088a91906145f8565b60405180910390f35b34801561089f57600080fd5b506108a8611723565b005b3480156108b657600080fd5b506108bf6117de565b6040516108cc91906146a2565b60405180910390f35b3480156108e157600080fd5b506108ea611808565b6040516108f791906146a2565b60405180910390f35b34801561090c57600080fd5b50610927600480360381019061092291906147b3565b61182e565b005b34801561093557600080fd5b5061093e6118c7565b60405161094b9190614411565b60405180910390f35b34801561096057600080fd5b5061097b60048036038101906109769190614773565b611cf6565b005b34801561098957600080fd5b50610992611e0e565b60405161099f91906145f8565b60405180910390f35b3480156109b457600080fd5b506109bd611e14565b6040516109ca91906145f8565b60405180910390f35b3480156109df57600080fd5b506109e8611e1a565b6040516109f591906145f8565b60405180910390f35b348015610a0a57600080fd5b50610a13611e20565b604051610a2091906145f8565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b91906144cc565b611e26565b604051610a5d9190614527565b60405180910390f35b348015610a7257600080fd5b50610a7b611f11565b604051610a8891906145f8565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab391906144cc565b611f17565b604051610ac59190614527565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af09190614542565b611f35565b005b348015610b0357600080fd5b50610b1e6004803603810190610b199190614542565b611ff5565b604051610b2b9190614527565b60405180910390f35b348015610b4057600080fd5b50610b49612015565b604051610b569190614527565b60405180910390f35b348015610b6b57600080fd5b50610b866004803603810190610b819190614613565b612028565b005b348015610b9457600080fd5b50610baf6004803603810190610baa9190614773565b61213b565b005b348015610bbd57600080fd5b50610bd86004803603810190610bd39190614613565b612260565b005b348015610be657600080fd5b50610bef61236f565b604051610bfc9190614527565b60405180910390f35b348015610c1157600080fd5b50610c1a612382565b604051610c2791906145f8565b60405180910390f35b348015610c3c57600080fd5b50610c576004803603810190610c529190614613565b612388565b604051610c649190614527565b60405180910390f35b348015610c7957600080fd5b50610c826124dd565b604051610c8f91906145f8565b60405180910390f35b348015610ca457600080fd5b50610cbf6004803603810190610cba91906147e0565b6124e3565b604051610ccc91906145f8565b60405180910390f35b348015610ce157600080fd5b50610cea61256a565b604051610cf791906145f8565b60405180910390f35b348015610d0c57600080fd5b50610d15612570565b604051610d229190614527565b60405180910390f35b348015610d3757600080fd5b50610d526004803603810190610d4d9190614613565b612610565b005b348015610d6057600080fd5b50610d696126e5565b604051610d7691906145f8565b60405180910390f35b348015610d8b57600080fd5b50610da66004803603810190610da19190614542565b6126eb565b005b348015610db457600080fd5b50610dbd6127e2565b604051610dca91906145f8565b60405180910390f35b6060610ddd6118c7565b905090565b6000610df6610def6127e8565b84846127f0565b6001905092915050565b601d6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b610e566127e8565b73ffffffffffffffffffffffffffffffffffffffff16610e746117de565b73ffffffffffffffffffffffffffffffffffffffff1614610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec19061486c565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600b5481565b610f226127e8565b73ffffffffffffffffffffffffffffffffffffffff16610f406117de565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d9061486c565b60405180910390fd5b670de0b6b3a76400006103e86001610fac610e44565b610fb691906148bb565b610fc0919061492c565b610fca919061492c565b81101561100c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611003906149cf565b60405180910390fd5b670de0b6b3a76400008161102091906148bb565b60088190555050565b60006110368484846129b9565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110816127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890614a61565b60405180910390fd5b6111158561110d6127e8565b8584036127f0565b60019150509392505050565b61dead81565b600d5481565b600c60009054906101000a900460ff1681565b60006012905090565b60006111eb6111566127e8565b8484600160006111646127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111e69190614a81565b6127f0565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601160009054906101000a900460ff1681565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b601160029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112eb6127e8565b73ffffffffffffffffffffffffffffffffffffffff166113096117de565b73ffffffffffffffffffffffffffffffffffffffff161461135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113569061486c565b60405180910390fd5b6113696000613550565b565b6113736127e8565b73ffffffffffffffffffffffffffffffffffffffff166113916117de565b73ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de9061486c565b60405180910390fd5b806017819055506017546014819055506063601454111561143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143490614b01565b60405180910390fd5b50565b6114486127e8565b73ffffffffffffffffffffffffffffffffffffffff166114666117de565b73ffffffffffffffffffffffffffffffffffffffff16146114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061486c565b60405180910390fd5b610258831015611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614b93565b60405180910390fd5b6103e88211158015611514575060008210155b611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a90614c25565b60405180910390fd5b82600d8190555081600b8190555080600c60006101000a81548160ff021916908315150217905550505050565b600061158a6127e8565b73ffffffffffffffffffffffffffffffffffffffff166115a86117de565b73ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f59061486c565b60405180910390fd5b6000601160006101000a81548160ff0219169083151502179055506001905090565b6116286127e8565b73ffffffffffffffffffffffffffffffffffffffff166116466117de565b73ffffffffffffffffffffffffffffffffffffffff161461169c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116939061486c565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b61172b6127e8565b73ffffffffffffffffffffffffffffffffffffffff166117496117de565b73ffffffffffffffffffffffffffffffffffffffff161461179f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117969061486c565b60405180910390fd5b6001601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff02191690831515021790555042600e81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118366127e8565b73ffffffffffffffffffffffffffffffffffffffff166118546117de565b73ffffffffffffffffffffffffffffffffffffffff16146118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a19061486c565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b60606000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195c9190614c71565b60ff16905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190614cb3565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a859190614cb3565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611ae1929190614ce0565b602060405180830381865afa158015611afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b229190614cb3565b90506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190614d8b565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610611c1a578284611c1d565b83835b915091506000611c7a611c41670de0b6b3a76400008561361690919063ffffffff16565b611c6c60028b611c519190614dde565b600a611c5d9190614f45565b8561361690919063ffffffff16565b61361690919063ffffffff16565b905060006040518060400160405280600481526020017f583a202400000000000000000000000000000000000000000000000000000000815250905080611cc8611cc38461362c565b6136fa565b604051602001611cd9929190614fcc565b604051602081830303815290604052995050505050505050505090565b611cfe6127e8565b73ffffffffffffffffffffffffffffffffffffffff16611d1c6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061486c565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790615062565b60405180910390fd5b611e0a8282613994565b5050565b60175481565b60105481565b601a5481565b60195481565b60008060016000611e356127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee9906150f4565b60405180910390fd5b611f06611efd6127e8565b858584036127f0565b600191505092915050565b600e5481565b6000611f2b611f246127e8565b84846129b9565b6001905092915050565b611f3d6127e8565b73ffffffffffffffffffffffffffffffffffffffff16611f5b6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa89061486c565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601e6020528060005260406000206000915054906101000a900460ff1681565b601160019054906101000a900460ff1681565b6120306127e8565b73ffffffffffffffffffffffffffffffffffffffff1661204e6117de565b73ffffffffffffffffffffffffffffffffffffffff16146120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b9061486c565b60405180910390fd5b6120ad81613a35565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516120f390615145565b60006040518083038185875af1925050503d8060008114612130576040519150601f19603f3d011682016040523d82523d6000602084013e612135565b606091505b50505050565b6121436127e8565b73ffffffffffffffffffffffffffffffffffffffff166121616117de565b73ffffffffffffffffffffffffffffffffffffffff16146121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061486c565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516122549190614527565b60405180910390a25050565b6122686127e8565b73ffffffffffffffffffffffffffffffffffffffff166122866117de565b73ffffffffffffffffffffffffffffffffffffffff16146122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d39061486c565b60405180910390fd5b670de0b6b3a76400006103e860056122f2610e44565b6122fc91906148bb565b612306919061492c565b612310919061492c565b811015612352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612349906151cc565b60405180910390fd5b670de0b6b3a76400008161236691906148bb565b600a8190555050565b601360009054906101000a900460ff1681565b60085481565b60006123926127e8565b73ffffffffffffffffffffffffffffffffffffffff166123b06117de565b73ffffffffffffffffffffffffffffffffffffffff1614612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd9061486c565b60405180910390fd5b620186a06001612414610e44565b61241e91906148bb565b612428919061492c565b82101561246a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619061525e565b60405180910390fd5b6103e86005612477610e44565b61248191906148bb565b61248b919061492c565b8211156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c4906152f0565b60405180910390fd5b8160098190555060019050919050565b60145481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600061257a6127e8565b73ffffffffffffffffffffffffffffffffffffffff166125986117de565b73ffffffffffffffffffffffffffffffffffffffff16146125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e59061486c565b60405180910390fd5b6000601360006101000a81548160ff0219169083151502179055506001905090565b6126186127e8565b73ffffffffffffffffffffffffffffffffffffffff166126366117de565b73ffffffffffffffffffffffffffffffffffffffff161461268c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126839061486c565b60405180910390fd5b80601981905550601954601881905550606360185411156126e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d990614b01565b60405180910390fd5b50565b60165481565b6126f36127e8565b73ffffffffffffffffffffffffffffffffffffffff166127116117de565b73ffffffffffffffffffffffffffffffffffffffff1614612767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275e9061486c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cd90615382565b60405180910390fd5b6127df81613550565b50565b600a5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361285f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285690615414565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c5906154a6565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516129ac91906145f8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f90615538565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e906155ca565b60405180910390fd5b60008103612ab057612aab83836000613c72565b61354b565b601160009054906101000a900460ff161561317357612acd6117de565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b3b5750612b0b6117de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612b745750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612bae575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612bc75750600560149054906101000a900460ff16155b1561317257601160019054906101000a900460ff16612cc157601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612c815750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790615636565b60405180910390fd5b5b601360009054906101000a900460ff168015612d105750612ce06117de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d6857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612dbe5750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e895743601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3b906156ee565b60405180910390fd5b43601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612f2c5750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612fd357600854811115612f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6d90615780565b60405180910390fd5b600a54612f828361129b565b82612f8d9190614a81565b1115612fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc5906157ec565b60405180910390fd5b613171565b601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130765750601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130c5576008548111156130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b79061587e565b60405180910390fd5b613170565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661316f57600a546131228361129b565b8261312d9190614a81565b111561316e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613165906157ec565b60405180910390fd5b5b5b5b5b5b600061317e3061129b565b9050600060095482101590508080156131a35750601160029054906101000a900460ff165b80156131bc5750600560149054906101000a900460ff16155b80156132125750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156132685750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156132be5750601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613302576001600560146101000a81548160ff0219169083151502179055506132e6613ef1565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806133b85750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156133c257600090505b6000811561353b57601e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561342557506000601854115b1561347257613452606461344460185488613ff590919063ffffffff16565b61361690919063ffffffff16565b905080601a60008282546134669190614a81565b92505081905550613517565b601e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134cd57506000601454115b15613516576134fa60646134ec60145488613ff590919063ffffffff16565b61361690919063ffffffff16565b905080601a600082825461350e9190614a81565b925050819055505b5b600081111561352c5761352b873083613c72565b5b80856135389190614dde565b94505b613546878787613c72565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183613624919061492c565b905092915050565b60606000600161363b8461400b565b01905060008167ffffffffffffffff81111561365a5761365961589e565b5b6040519080825280601f01601f19166020018201604052801561368c5781602001600182028036833780820191505090505b509050600082602001820190505b6001156136ef578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816136e3576136e26148fd565b5b0494506000850361369a575b819350505050919050565b606060008290506000815190506000600267ffffffffffffffff8111156137245761372361589e565b5b6040519080825280601f01601f1916602001820160405280156137565781602001600182028036833780820191505090505b5090506000819050600283111561396857836002846137759190614dde565b81518110613786576137856158cd565b5b602001015160f81c60f81b816000815181106137a5576137a46158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350836001846137e29190614dde565b815181106137f3576137f26158cd565b5b602001015160f81c60f81b81600181518110613812576138116158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006002846138509190614dde565b67ffffffffffffffff8111156138695761386861589e565b5b6040519080825280601f01601f19166020018201604052801561389b5781602001600182028036833780820191505090505b509050600081905060005b6002866138b39190614dde565b81101561392d578681815181106138cd576138cc6158cd565b5b602001015160f81c60f81b8282815181106138eb576138ea6158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613925906158fc565b9150506138a6565b506139378161415e565b9150818460405160200161394c929190615990565b604051602081830303815290604052965050505050505061398f565b856040516020016139799190615a0b565b6040516020818303038152906040529450505050505b919050565b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600267ffffffffffffffff811115613a5257613a5161589e565b5b604051908082528060200260200182016040528015613a805781602001602082028036833780820191505090505b5090503081600081518110613a9857613a976158cd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b619190614cb3565b81600181518110613b7557613b746158cd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613bda307f0000000000000000000000000000000000000000000000000000000000000000846127f0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613c3c959493929190615b26565b600060405180830381600087803b158015613c5657600080fd5b505af1158015613c6a573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd890615538565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d47906155ca565b60405180910390fd5b613d5b838383614377565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd890615bf2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e749190614a81565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613ed891906145f8565b60405180910390a3613eeb84848461437c565b50505050565b6000613efc3061129b565b90506000601a549050600080831480613f155750600082145b15613f2257505050613ff3565b6014600954613f3191906148bb565b831115613f4a576014600954613f4791906148bb565b92505b6000839050613f5881613a35565b6000601a81905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051613fa690615145565b60006040518083038185875af1925050503d8060008114613fe3576040519150601f19603f3d011682016040523d82523d6000602084013e613fe8565b606091505b505080925050505050505b565b6000818361400391906148bb565b905092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614069577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161405f5761405e6148fd565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106140a6576d04ee2d6d415b85acef8100000000838161409c5761409b6148fd565b5b0492506020810190505b662386f26fc1000083106140d557662386f26fc1000083816140cb576140ca6148fd565b5b0492506010810190505b6305f5e10083106140fe576305f5e10083816140f4576140f36148fd565b5b0492506008810190505b6127108310614123576127108381614119576141186148fd565b5b0492506004810190505b60648310614146576064838161413c5761413b6148fd565b5b0492506002810190505b600a8310614155576001810190505b80915050919050565b606060008290506000815190506000600360018361417c9190614dde565b614186919061492c565b9050600081836141969190614a81565b67ffffffffffffffff8111156141af576141ae61589e565b5b6040519080825280601f01601f1916602001820160405280156141e15781602001600182028036833780820191505090505b50905060006001905060005b848110156143695785600182876142049190614dde565b61420e9190614dde565b8151811061421f5761421e6158cd565b5b602001015160f81c60f81b838386886142389190614a81565b6142429190614dde565b81518110614253576142526158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060026003826142919190615c12565b1480156142aa57506001856142a69190614dde565b8114155b156143495781806142ba906158fc565b9250507f2c00000000000000000000000000000000000000000000000000000000000000838386886142ec9190614a81565b6142f69190614dde565b81518110614307576143066158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180614341906158fc565b925050614358565b8180614354906158fc565b9250505b80614362906158fc565b90506141ed565b508195505050505050919050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143bb5780820151818401526020810190506143a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006143e382614381565b6143ed818561438c565b93506143fd81856020860161439d565b614406816143c7565b840191505092915050565b6000602082019050818103600083015261442b81846143d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061446382614438565b9050919050565b61447381614458565b811461447e57600080fd5b50565b6000813590506144908161446a565b92915050565b6000819050919050565b6144a981614496565b81146144b457600080fd5b50565b6000813590506144c6816144a0565b92915050565b600080604083850312156144e3576144e2614433565b5b60006144f185828601614481565b9250506020614502858286016144b7565b9150509250929050565b60008115159050919050565b6145218161450c565b82525050565b600060208201905061453c6000830184614518565b92915050565b60006020828403121561455857614557614433565b5b600061456684828501614481565b91505092915050565b6000819050919050565b600061459461458f61458a84614438565b61456f565b614438565b9050919050565b60006145a682614579565b9050919050565b60006145b88261459b565b9050919050565b6145c8816145ad565b82525050565b60006020820190506145e360008301846145bf565b92915050565b6145f281614496565b82525050565b600060208201905061460d60008301846145e9565b92915050565b60006020828403121561462957614628614433565b5b6000614637848285016144b7565b91505092915050565b60008060006060848603121561465957614658614433565b5b600061466786828701614481565b935050602061467886828701614481565b9250506040614689868287016144b7565b9150509250925092565b61469c81614458565b82525050565b60006020820190506146b76000830184614693565b92915050565b600060ff82169050919050565b6146d3816146bd565b82525050565b60006020820190506146ee60008301846146ca565b92915050565b6146fd8161450c565b811461470857600080fd5b50565b60008135905061471a816146f4565b92915050565b60008060006060848603121561473957614738614433565b5b6000614747868287016144b7565b9350506020614758868287016144b7565b92505060406147698682870161470b565b9150509250925092565b6000806040838503121561478a57614789614433565b5b600061479885828601614481565b92505060206147a98582860161470b565b9150509250929050565b6000602082840312156147c9576147c8614433565b5b60006147d78482850161470b565b91505092915050565b600080604083850312156147f7576147f6614433565b5b600061480585828601614481565b925050602061481685828601614481565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061485660208361438c565b915061486182614820565b602082019050919050565b6000602082019050818103600083015261488581614849565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148c682614496565b91506148d183614496565b92508282026148df81614496565b915082820484148315176148f6576148f561488c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061493782614496565b915061494283614496565b925082614952576149516148fd565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b60006149b9602f8361438c565b91506149c48261495d565b604082019050919050565b600060208201905081810360008301526149e8816149ac565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614a4b60288361438c565b9150614a56826149ef565b604082019050919050565b60006020820190508181036000830152614a7a81614a3e565b9050919050565b6000614a8c82614496565b9150614a9783614496565b9250828201905080821115614aaf57614aae61488c565b5b92915050565b7f4d757374206b656570206665657320617420393925206f72206c657373000000600082015250565b6000614aeb601d8361438c565b9150614af682614ab5565b602082019050919050565b60006020820190508181036000830152614b1a81614ade565b9050919050565b7f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e20746860008201527f616e206576657279203130206d696e7574657300000000000000000000000000602082015250565b6000614b7d60338361438c565b9150614b8882614b21565b604082019050919050565b60006020820190508181036000830152614bac81614b70565b9050919050565b7f4d75737420736574206175746f204c50206275726e2070657263656e7420626560008201527f747765656e20302520616e642031302500000000000000000000000000000000602082015250565b6000614c0f60308361438c565b9150614c1a82614bb3565b604082019050919050565b60006020820190508181036000830152614c3e81614c02565b9050919050565b614c4e816146bd565b8114614c5957600080fd5b50565b600081519050614c6b81614c45565b92915050565b600060208284031215614c8757614c86614433565b5b6000614c9584828501614c5c565b91505092915050565b600081519050614cad8161446a565b92915050565b600060208284031215614cc957614cc8614433565b5b6000614cd784828501614c9e565b91505092915050565b6000604082019050614cf56000830185614693565b614d026020830184614693565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b614d2c81614d09565b8114614d3757600080fd5b50565b600081519050614d4981614d23565b92915050565b600063ffffffff82169050919050565b614d6881614d4f565b8114614d7357600080fd5b50565b600081519050614d8581614d5f565b92915050565b600080600060608486031215614da457614da3614433565b5b6000614db286828701614d3a565b9350506020614dc386828701614d3a565b9250506040614dd486828701614d76565b9150509250925092565b6000614de982614496565b9150614df483614496565b9250828203905081811115614e0c57614e0b61488c565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115614e6957808604811115614e4557614e4461488c565b5b6001851615614e545780820291505b8081029050614e6285614e12565b9450614e29565b94509492505050565b600082614e825760019050614f3e565b81614e905760009050614f3e565b8160018114614ea65760028114614eb057614edf565b6001915050614f3e565b60ff841115614ec257614ec161488c565b5b8360020a915084821115614ed957614ed861488c565b5b50614f3e565b5060208310610133831016604e8410600b8410161715614f145782820a905083811115614f0f57614f0e61488c565b5b614f3e565b614f218484846001614e1f565b92509050818404811115614f3857614f3761488c565b5b81810290505b9392505050565b6000614f5082614496565b9150614f5b83614496565b9250614f887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614e72565b905092915050565b600081905092915050565b6000614fa682614381565b614fb08185614f90565b9350614fc081856020860161439d565b80840191505092915050565b6000614fd88285614f9b565b9150614fe48284614f9b565b91508190509392505050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b600061504c60398361438c565b915061505782614ff0565b604082019050919050565b6000602082019050818103600083015261507b8161503f565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006150de60258361438c565b91506150e982615082565b604082019050919050565b6000602082019050818103600083015261510d816150d1565b9050919050565b600081905092915050565b50565b600061512f600083615114565b915061513a8261511f565b600082019050919050565b600061515082615122565b9150819050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b60006151b660248361438c565b91506151c18261515a565b604082019050919050565b600060208201905081810360008301526151e5816151a9565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061524860358361438c565b9150615253826151ec565b604082019050919050565b600060208201905081810360008301526152778161523b565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b60006152da60348361438c565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061536c60268361438c565b915061537782615310565b604082019050919050565b6000602082019050818103600083015261539b8161535f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153fe60248361438c565b9150615409826153a2565b604082019050919050565b6000602082019050818103600083015261542d816153f1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061549060228361438c565b915061549b82615434565b604082019050919050565b600060208201905081810360008301526154bf81615483565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061552260258361438c565b915061552d826154c6565b604082019050919050565b6000602082019050818103600083015261555181615515565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006155b460238361438c565b91506155bf82615558565b604082019050919050565b600060208201905081810360008301526155e3816155a7565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b600061562060168361438c565b915061562b826155ea565b602082019050919050565b6000602082019050818103600083015261564f81615613565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006156d860498361438c565b91506156e382615656565b606082019050919050565b60006020820190508181036000830152615707816156cb565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061576a60358361438c565b91506157758261570e565b604082019050919050565b600060208201905081810360008301526157998161575d565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b60006157d660138361438c565b91506157e1826157a0565b602082019050919050565b60006020820190508181036000830152615805816157c9565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b600061586860368361438c565b91506158738261580c565b604082019050919050565b600060208201905081810360008301526158978161585b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061590782614496565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159395761593861488c565b5b600182019050919050565b7f2e00000000000000000000000000000000000000000000000000000000000000600082015250565b600061597a600183614f90565b915061598582615944565b600182019050919050565b600061599c8285614f9b565b91506159a78261596d565b91506159b38284614f9b565b91508190509392505050565b7f302e000000000000000000000000000000000000000000000000000000000000600082015250565b60006159f5600283614f90565b9150615a00826159bf565b600282019050919050565b6000615a16826159e8565b9150615a228284614f9b565b915081905092915050565b6000819050919050565b6000615a52615a4d615a4884615a2d565b61456f565b614496565b9050919050565b615a6281615a37565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615a9d81614458565b82525050565b6000615aaf8383615a94565b60208301905092915050565b6000602082019050919050565b6000615ad382615a68565b615add8185615a73565b9350615ae883615a84565b8060005b83811015615b19578151615b008882615aa3565b9750615b0b83615abb565b925050600181019050615aec565b5085935050505092915050565b600060a082019050615b3b60008301886145e9565b615b486020830187615a59565b8181036040830152615b5a8186615ac8565b9050615b696060830185614693565b615b7660808301846145e9565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615bdc60268361438c565b9150615be782615b80565b604082019050919050565b60006020820190508181036000830152615c0b81615bcf565b9050919050565b6000615c1d82614496565b9150615c2883614496565b925082615c3857615c376148fd565b5b82820690509291505056fea2646970667358221220c8a584e78f781b17151164155bf079710cecc60eedf26670676780ee02756d6264736f6c63430008150033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x6080604052600436106103855760003560e01c80638da5cb5b116101d1578063bbc0c74211610102578063d85ba063116100a0578063eba4c3331161006f578063eba4c33314610d2b578063f11a24d314610d54578063f2fde38b14610d7f578063f8b45b0514610da85761038c565b8063d85ba06314610c6d578063dd62ed3e14610c98578063e2f4560514610cd5578063e884f26014610d005761038c565b8063c18bc195116100dc578063c18bc19514610bb1578063c876d0b914610bda578063c8c8ebe414610c05578063d257b34f14610c305761038c565b8063bbc0c74214610b34578063bffda98214610b5f578063c024666814610b885761038c565b80639fccce321161016f578063a4c82a0011610149578063a4c82a0014610a66578063a9059cbb14610a91578063aacebbe314610ace578063b62496f514610af75761038c565b80639fccce32146109d3578063a0d82dc5146109fe578063a457c2d714610a295761038c565b806395d89b41116101ab57806395d89b41146109295780639a7a23d6146109545780639c3b4fdc1461097d5780639ec22c0e146109a85761038c565b80638da5cb5b146108aa5780638ea5220f146108d5578063924de9b7146109005761038c565b806339509351116102b6578063715018a6116102545780637571336a116102235780637571336a1461081457806375f0a8741461083d5780637bce5a04146108685780638a8c523c146108935761038c565b8063715018a61461078057806371fc468814610797578063730c1888146107c0578063751039fc146107e95761038c565b80634fbee193116102905780634fbee193146106b05780636a486a8e146106ed5780636ddd17131461071857806370a08231146107435761038c565b8063395093511461061d57806349bd5a5e1461065a5780634a62bb65146106855761038c565b8063199ffc721161032357806327c8f835116102fd57806327c8f835146105715780632c3e486c1461059c5780632e82f1a0146105c7578063313ce567146105f25761038c565b8063199ffc72146104e0578063203e727e1461050b57806323b872dd146105345761038c565b80631694505e1161035f5780631694505e1461043657806318160ddd146104615780631816467f1461048c578063184c16c5146104b55761038c565b806306fdde0314610391578063095ea7b3146103bc57806310d5de53146103f95761038c565b3661038c57005b600080fd5b34801561039d57600080fd5b506103a6610dd3565b6040516103b39190614411565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de91906144cc565b610de2565b6040516103f09190614527565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190614542565b610e00565b60405161042d9190614527565b60405180910390f35b34801561044257600080fd5b5061044b610e20565b60405161045891906145ce565b60405180910390f35b34801561046d57600080fd5b50610476610e44565b60405161048391906145f8565b60405180910390f35b34801561049857600080fd5b506104b360048036038101906104ae9190614542565b610e4e565b005b3480156104c157600080fd5b506104ca610f0e565b6040516104d791906145f8565b60405180910390f35b3480156104ec57600080fd5b506104f5610f14565b60405161050291906145f8565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d9190614613565b610f1a565b005b34801561054057600080fd5b5061055b60048036038101906105569190614640565b611029565b6040516105689190614527565b60405180910390f35b34801561057d57600080fd5b50610586611121565b60405161059391906146a2565b60405180910390f35b3480156105a857600080fd5b506105b1611127565b6040516105be91906145f8565b60405180910390f35b3480156105d357600080fd5b506105dc61112d565b6040516105e99190614527565b60405180910390f35b3480156105fe57600080fd5b50610607611140565b60405161061491906146d9565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f91906144cc565b611149565b6040516106519190614527565b60405180910390f35b34801561066657600080fd5b5061066f6111f5565b60405161067c91906146a2565b60405180910390f35b34801561069157600080fd5b5061069a611219565b6040516106a79190614527565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190614542565b61122c565b6040516106e49190614527565b60405180910390f35b3480156106f957600080fd5b50610702611282565b60405161070f91906145f8565b60405180910390f35b34801561072457600080fd5b5061072d611288565b60405161073a9190614527565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190614542565b61129b565b60405161077791906145f8565b60405180910390f35b34801561078c57600080fd5b506107956112e3565b005b3480156107a357600080fd5b506107be60048036038101906107b99190614613565b61136b565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190614720565b611440565b005b3480156107f557600080fd5b506107fe611580565b60405161080b9190614527565b60405180910390f35b34801561082057600080fd5b5061083b60048036038101906108369190614773565b611620565b005b34801561084957600080fd5b506108526116f7565b60405161085f91906146a2565b60405180910390f35b34801561087457600080fd5b5061087d61171d565b60405161088a91906145f8565b60405180910390f35b34801561089f57600080fd5b506108a8611723565b005b3480156108b657600080fd5b506108bf6117de565b6040516108cc91906146a2565b60405180910390f35b3480156108e157600080fd5b506108ea611808565b6040516108f791906146a2565b60405180910390f35b34801561090c57600080fd5b50610927600480360381019061092291906147b3565b61182e565b005b34801561093557600080fd5b5061093e6118c7565b60405161094b9190614411565b60405180910390f35b34801561096057600080fd5b5061097b60048036038101906109769190614773565b611cf6565b005b34801561098957600080fd5b50610992611e0e565b60405161099f91906145f8565b60405180910390f35b3480156109b457600080fd5b506109bd611e14565b6040516109ca91906145f8565b60405180910390f35b3480156109df57600080fd5b506109e8611e1a565b6040516109f591906145f8565b60405180910390f35b348015610a0a57600080fd5b50610a13611e20565b604051610a2091906145f8565b60405180910390f35b348015610a3557600080fd5b50610a506004803603810190610a4b91906144cc565b611e26565b604051610a5d9190614527565b60405180910390f35b348015610a7257600080fd5b50610a7b611f11565b604051610a8891906145f8565b60405180910390f35b348015610a9d57600080fd5b50610ab86004803603810190610ab391906144cc565b611f17565b604051610ac59190614527565b60405180910390f35b348015610ada57600080fd5b50610af56004803603810190610af09190614542565b611f35565b005b348015610b0357600080fd5b50610b1e6004803603810190610b199190614542565b611ff5565b604051610b2b9190614527565b60405180910390f35b348015610b4057600080fd5b50610b49612015565b604051610b569190614527565b60405180910390f35b348015610b6b57600080fd5b50610b866004803603810190610b819190614613565b612028565b005b348015610b9457600080fd5b50610baf6004803603810190610baa9190614773565b61213b565b005b348015610bbd57600080fd5b50610bd86004803603810190610bd39190614613565b612260565b005b348015610be657600080fd5b50610bef61236f565b604051610bfc9190614527565b60405180910390f35b348015610c1157600080fd5b50610c1a612382565b604051610c2791906145f8565b60405180910390f35b348015610c3c57600080fd5b50610c576004803603810190610c529190614613565b612388565b604051610c649190614527565b60405180910390f35b348015610c7957600080fd5b50610c826124dd565b604051610c8f91906145f8565b60405180910390f35b348015610ca457600080fd5b50610cbf6004803603810190610cba91906147e0565b6124e3565b604051610ccc91906145f8565b60405180910390f35b348015610ce157600080fd5b50610cea61256a565b604051610cf791906145f8565b60405180910390f35b348015610d0c57600080fd5b50610d15612570565b604051610d229190614527565b60405180910390f35b348015610d3757600080fd5b50610d526004803603810190610d4d9190614613565b612610565b005b348015610d6057600080fd5b50610d696126e5565b604051610d7691906145f8565b60405180910390f35b348015610d8b57600080fd5b50610da66004803603810190610da19190614542565b6126eb565b005b348015610db457600080fd5b50610dbd6127e2565b604051610dca91906145f8565b60405180910390f35b6060610ddd6118c7565b905090565b6000610df6610def6127e8565b84846127f0565b6001905092915050565b601d6020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b610e566127e8565b73ffffffffffffffffffffffffffffffffffffffff16610e746117de565b73ffffffffffffffffffffffffffffffffffffffff1614610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec19061486c565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b600b5481565b610f226127e8565b73ffffffffffffffffffffffffffffffffffffffff16610f406117de565b73ffffffffffffffffffffffffffffffffffffffff1614610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d9061486c565b60405180910390fd5b670de0b6b3a76400006103e86001610fac610e44565b610fb691906148bb565b610fc0919061492c565b610fca919061492c565b81101561100c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611003906149cf565b60405180910390fd5b670de0b6b3a76400008161102091906148bb565b60088190555050565b60006110368484846129b9565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110816127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890614a61565b60405180910390fd5b6111158561110d6127e8565b8584036127f0565b60019150509392505050565b61dead81565b600d5481565b600c60009054906101000a900460ff1681565b60006012905090565b60006111eb6111566127e8565b8484600160006111646127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111e69190614a81565b6127f0565b6001905092915050565b7f00000000000000000000000029bfe97685cdceaaa5991bd7b9b41d742c72dfdf81565b601160009054906101000a900460ff1681565b6000601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b601160029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112eb6127e8565b73ffffffffffffffffffffffffffffffffffffffff166113096117de565b73ffffffffffffffffffffffffffffffffffffffff161461135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113569061486c565b60405180910390fd5b6113696000613550565b565b6113736127e8565b73ffffffffffffffffffffffffffffffffffffffff166113916117de565b73ffffffffffffffffffffffffffffffffffffffff16146113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de9061486c565b60405180910390fd5b806017819055506017546014819055506063601454111561143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143490614b01565b60405180910390fd5b50565b6114486127e8565b73ffffffffffffffffffffffffffffffffffffffff166114666117de565b73ffffffffffffffffffffffffffffffffffffffff16146114bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b39061486c565b60405180910390fd5b610258831015611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614b93565b60405180910390fd5b6103e88211158015611514575060008210155b611553576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154a90614c25565b60405180910390fd5b82600d8190555081600b8190555080600c60006101000a81548160ff021916908315150217905550505050565b600061158a6127e8565b73ffffffffffffffffffffffffffffffffffffffff166115a86117de565b73ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f59061486c565b60405180910390fd5b6000601160006101000a81548160ff0219169083151502179055506001905090565b6116286127e8565b73ffffffffffffffffffffffffffffffffffffffff166116466117de565b73ffffffffffffffffffffffffffffffffffffffff161461169c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116939061486c565b60405180910390fd5b80601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155481565b61172b6127e8565b73ffffffffffffffffffffffffffffffffffffffff166117496117de565b73ffffffffffffffffffffffffffffffffffffffff161461179f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117969061486c565b60405180910390fd5b6001601160016101000a81548160ff0219169083151502179055506001601160026101000a81548160ff02191690831515021790555042600e81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118366127e8565b73ffffffffffffffffffffffffffffffffffffffff166118546117de565b73ffffffffffffffffffffffffffffffffffffffff16146118aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a19061486c565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b60606000601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611938573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195c9190614c71565b60ff16905060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190614cb3565b905060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a859190614cb3565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611ae1929190614ce0565b602060405180830381865afa158015611afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b229190614cb3565b90506000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190614d8b565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610611c1a578284611c1d565b83835b915091506000611c7a611c41670de0b6b3a76400008561361690919063ffffffff16565b611c6c60028b611c519190614dde565b600a611c5d9190614f45565b8561361690919063ffffffff16565b61361690919063ffffffff16565b905060006040518060400160405280600481526020017f583a202400000000000000000000000000000000000000000000000000000000815250905080611cc8611cc38461362c565b6136fa565b604051602001611cd9929190614fcc565b604051602081830303815290604052995050505050505050505090565b611cfe6127e8565b73ffffffffffffffffffffffffffffffffffffffff16611d1c6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d699061486c565b60405180910390fd5b7f00000000000000000000000029bfe97685cdceaaa5991bd7b9b41d742c72dfdf73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df790615062565b60405180910390fd5b611e0a8282613994565b5050565b60175481565b60105481565b601a5481565b60195481565b60008060016000611e356127e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee9906150f4565b60405180910390fd5b611f06611efd6127e8565b858584036127f0565b600191505092915050565b600e5481565b6000611f2b611f246127e8565b84846129b9565b6001905092915050565b611f3d6127e8565b73ffffffffffffffffffffffffffffffffffffffff16611f5b6117de565b73ffffffffffffffffffffffffffffffffffffffff1614611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa89061486c565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601e6020528060005260406000206000915054906101000a900460ff1681565b601160019054906101000a900460ff1681565b6120306127e8565b73ffffffffffffffffffffffffffffffffffffffff1661204e6117de565b73ffffffffffffffffffffffffffffffffffffffff16146120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b9061486c565b60405180910390fd5b6120ad81613a35565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516120f390615145565b60006040518083038185875af1925050503d8060008114612130576040519150601f19603f3d011682016040523d82523d6000602084013e612135565b606091505b50505050565b6121436127e8565b73ffffffffffffffffffffffffffffffffffffffff166121616117de565b73ffffffffffffffffffffffffffffffffffffffff16146121b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ae9061486c565b60405180910390fd5b80601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516122549190614527565b60405180910390a25050565b6122686127e8565b73ffffffffffffffffffffffffffffffffffffffff166122866117de565b73ffffffffffffffffffffffffffffffffffffffff16146122dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d39061486c565b60405180910390fd5b670de0b6b3a76400006103e860056122f2610e44565b6122fc91906148bb565b612306919061492c565b612310919061492c565b811015612352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612349906151cc565b60405180910390fd5b670de0b6b3a76400008161236691906148bb565b600a8190555050565b601360009054906101000a900460ff1681565b60085481565b60006123926127e8565b73ffffffffffffffffffffffffffffffffffffffff166123b06117de565b73ffffffffffffffffffffffffffffffffffffffff1614612406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fd9061486c565b60405180910390fd5b620186a06001612414610e44565b61241e91906148bb565b612428919061492c565b82101561246a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619061525e565b60405180910390fd5b6103e86005612477610e44565b61248191906148bb565b61248b919061492c565b8211156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c4906152f0565b60405180910390fd5b8160098190555060019050919050565b60145481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b600061257a6127e8565b73ffffffffffffffffffffffffffffffffffffffff166125986117de565b73ffffffffffffffffffffffffffffffffffffffff16146125ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e59061486c565b60405180910390fd5b6000601360006101000a81548160ff0219169083151502179055506001905090565b6126186127e8565b73ffffffffffffffffffffffffffffffffffffffff166126366117de565b73ffffffffffffffffffffffffffffffffffffffff161461268c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126839061486c565b60405180910390fd5b80601981905550601954601881905550606360185411156126e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d990614b01565b60405180910390fd5b50565b60165481565b6126f36127e8565b73ffffffffffffffffffffffffffffffffffffffff166127116117de565b73ffffffffffffffffffffffffffffffffffffffff1614612767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275e9061486c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cd90615382565b60405180910390fd5b6127df81613550565b50565b600a5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361285f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285690615414565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c5906154a6565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516129ac91906145f8565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1f90615538565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e906155ca565b60405180910390fd5b60008103612ab057612aab83836000613c72565b61354b565b601160009054906101000a900460ff161561317357612acd6117de565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612b3b5750612b0b6117de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612b745750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612bae575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612bc75750600560149054906101000a900460ff16155b1561317257601160019054906101000a900460ff16612cc157601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612c815750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790615636565b60405180910390fd5b5b601360009054906101000a900460ff168015612d105750612ce06117de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d6857507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612dbe5750601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612e895743601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3b906156ee565b60405180910390fd5b43601260003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612f2c5750601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612fd357600854811115612f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6d90615780565b60405180910390fd5b600a54612f828361129b565b82612f8d9190614a81565b1115612fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc5906157ec565b60405180910390fd5b613171565b601e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156130765750601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130c5576008548111156130c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b79061587e565b60405180910390fd5b613170565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661316f57600a546131228361129b565b8261312d9190614a81565b111561316e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613165906157ec565b60405180910390fd5b5b5b5b5b5b600061317e3061129b565b9050600060095482101590508080156131a35750601160029054906101000a900460ff165b80156131bc5750600560149054906101000a900460ff16155b80156132125750601e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156132685750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156132be5750601c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613302576001600560146101000a81548160ff0219169083151502179055506132e6613ef1565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806133b85750601c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156133c257600090505b6000811561353b57601e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561342557506000601854115b1561347257613452606461344460185488613ff590919063ffffffff16565b61361690919063ffffffff16565b905080601a60008282546134669190614a81565b92505081905550613517565b601e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134cd57506000601454115b15613516576134fa60646134ec60145488613ff590919063ffffffff16565b61361690919063ffffffff16565b905080601a600082825461350e9190614a81565b925050819055505b5b600081111561352c5761352b873083613c72565b5b80856135389190614dde565b94505b613546878787613c72565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008183613624919061492c565b905092915050565b60606000600161363b8461400b565b01905060008167ffffffffffffffff81111561365a5761365961589e565b5b6040519080825280601f01601f19166020018201604052801561368c5781602001600182028036833780820191505090505b509050600082602001820190505b6001156136ef578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816136e3576136e26148fd565b5b0494506000850361369a575b819350505050919050565b606060008290506000815190506000600267ffffffffffffffff8111156137245761372361589e565b5b6040519080825280601f01601f1916602001820160405280156137565781602001600182028036833780820191505090505b5090506000819050600283111561396857836002846137759190614dde565b81518110613786576137856158cd565b5b602001015160f81c60f81b816000815181106137a5576137a46158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350836001846137e29190614dde565b815181106137f3576137f26158cd565b5b602001015160f81c60f81b81600181518110613812576138116158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006002846138509190614dde565b67ffffffffffffffff8111156138695761386861589e565b5b6040519080825280601f01601f19166020018201604052801561389b5781602001600182028036833780820191505090505b509050600081905060005b6002866138b39190614dde565b81101561392d578681815181106138cd576138cc6158cd565b5b602001015160f81c60f81b8282815181106138eb576138ea6158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613925906158fc565b9150506138a6565b506139378161415e565b9150818460405160200161394c929190615990565b604051602081830303815290604052965050505050505061398f565b856040516020016139799190615a0b565b6040516020818303038152906040529450505050505b919050565b80601e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6000600267ffffffffffffffff811115613a5257613a5161589e565b5b604051908082528060200260200182016040528015613a805781602001602082028036833780820191505090505b5090503081600081518110613a9857613a976158cd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b619190614cb3565b81600181518110613b7557613b746158cd565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613bda307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846127f0565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613c3c959493929190615b26565b600060405180830381600087803b158015613c5657600080fd5b505af1158015613c6a573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ce1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cd890615538565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d47906155ca565b60405180910390fd5b613d5b838383614377565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd890615bf2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e749190614a81565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613ed891906145f8565b60405180910390a3613eeb84848461437c565b50505050565b6000613efc3061129b565b90506000601a549050600080831480613f155750600082145b15613f2257505050613ff3565b6014600954613f3191906148bb565b831115613f4a576014600954613f4791906148bb565b92505b6000839050613f5881613a35565b6000601a81905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051613fa690615145565b60006040518083038185875af1925050503d8060008114613fe3576040519150601f19603f3d011682016040523d82523d6000602084013e613fe8565b606091505b505080925050505050505b565b6000818361400391906148bb565b905092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310614069577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161405f5761405e6148fd565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106140a6576d04ee2d6d415b85acef8100000000838161409c5761409b6148fd565b5b0492506020810190505b662386f26fc1000083106140d557662386f26fc1000083816140cb576140ca6148fd565b5b0492506010810190505b6305f5e10083106140fe576305f5e10083816140f4576140f36148fd565b5b0492506008810190505b6127108310614123576127108381614119576141186148fd565b5b0492506004810190505b60648310614146576064838161413c5761413b6148fd565b5b0492506002810190505b600a8310614155576001810190505b80915050919050565b606060008290506000815190506000600360018361417c9190614dde565b614186919061492c565b9050600081836141969190614a81565b67ffffffffffffffff8111156141af576141ae61589e565b5b6040519080825280601f01601f1916602001820160405280156141e15781602001600182028036833780820191505090505b50905060006001905060005b848110156143695785600182876142049190614dde565b61420e9190614dde565b8151811061421f5761421e6158cd565b5b602001015160f81c60f81b838386886142389190614a81565b6142429190614dde565b81518110614253576142526158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060026003826142919190615c12565b1480156142aa57506001856142a69190614dde565b8114155b156143495781806142ba906158fc565b9250507f2c00000000000000000000000000000000000000000000000000000000000000838386886142ec9190614a81565b6142f69190614dde565b81518110614307576143066158cd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180614341906158fc565b925050614358565b8180614354906158fc565b9250505b80614362906158fc565b90506141ed565b508195505050505050919050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156143bb5780820151818401526020810190506143a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006143e382614381565b6143ed818561438c565b93506143fd81856020860161439d565b614406816143c7565b840191505092915050565b6000602082019050818103600083015261442b81846143d8565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061446382614438565b9050919050565b61447381614458565b811461447e57600080fd5b50565b6000813590506144908161446a565b92915050565b6000819050919050565b6144a981614496565b81146144b457600080fd5b50565b6000813590506144c6816144a0565b92915050565b600080604083850312156144e3576144e2614433565b5b60006144f185828601614481565b9250506020614502858286016144b7565b9150509250929050565b60008115159050919050565b6145218161450c565b82525050565b600060208201905061453c6000830184614518565b92915050565b60006020828403121561455857614557614433565b5b600061456684828501614481565b91505092915050565b6000819050919050565b600061459461458f61458a84614438565b61456f565b614438565b9050919050565b60006145a682614579565b9050919050565b60006145b88261459b565b9050919050565b6145c8816145ad565b82525050565b60006020820190506145e360008301846145bf565b92915050565b6145f281614496565b82525050565b600060208201905061460d60008301846145e9565b92915050565b60006020828403121561462957614628614433565b5b6000614637848285016144b7565b91505092915050565b60008060006060848603121561465957614658614433565b5b600061466786828701614481565b935050602061467886828701614481565b9250506040614689868287016144b7565b9150509250925092565b61469c81614458565b82525050565b60006020820190506146b76000830184614693565b92915050565b600060ff82169050919050565b6146d3816146bd565b82525050565b60006020820190506146ee60008301846146ca565b92915050565b6146fd8161450c565b811461470857600080fd5b50565b60008135905061471a816146f4565b92915050565b60008060006060848603121561473957614738614433565b5b6000614747868287016144b7565b9350506020614758868287016144b7565b92505060406147698682870161470b565b9150509250925092565b6000806040838503121561478a57614789614433565b5b600061479885828601614481565b92505060206147a98582860161470b565b9150509250929050565b6000602082840312156147c9576147c8614433565b5b60006147d78482850161470b565b91505092915050565b600080604083850312156147f7576147f6614433565b5b600061480585828601614481565b925050602061481685828601614481565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061485660208361438c565b915061486182614820565b602082019050919050565b6000602082019050818103600083015261488581614849565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148c682614496565b91506148d183614496565b92508282026148df81614496565b915082820484148315176148f6576148f561488c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061493782614496565b915061494283614496565b925082614952576149516148fd565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b60006149b9602f8361438c565b91506149c48261495d565b604082019050919050565b600060208201905081810360008301526149e8816149ac565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000614a4b60288361438c565b9150614a56826149ef565b604082019050919050565b60006020820190508181036000830152614a7a81614a3e565b9050919050565b6000614a8c82614496565b9150614a9783614496565b9250828201905080821115614aaf57614aae61488c565b5b92915050565b7f4d757374206b656570206665657320617420393925206f72206c657373000000600082015250565b6000614aeb601d8361438c565b9150614af682614ab5565b602082019050919050565b60006020820190508181036000830152614b1a81614ade565b9050919050565b7f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e20746860008201527f616e206576657279203130206d696e7574657300000000000000000000000000602082015250565b6000614b7d60338361438c565b9150614b8882614b21565b604082019050919050565b60006020820190508181036000830152614bac81614b70565b9050919050565b7f4d75737420736574206175746f204c50206275726e2070657263656e7420626560008201527f747765656e20302520616e642031302500000000000000000000000000000000602082015250565b6000614c0f60308361438c565b9150614c1a82614bb3565b604082019050919050565b60006020820190508181036000830152614c3e81614c02565b9050919050565b614c4e816146bd565b8114614c5957600080fd5b50565b600081519050614c6b81614c45565b92915050565b600060208284031215614c8757614c86614433565b5b6000614c9584828501614c5c565b91505092915050565b600081519050614cad8161446a565b92915050565b600060208284031215614cc957614cc8614433565b5b6000614cd784828501614c9e565b91505092915050565b6000604082019050614cf56000830185614693565b614d026020830184614693565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b614d2c81614d09565b8114614d3757600080fd5b50565b600081519050614d4981614d23565b92915050565b600063ffffffff82169050919050565b614d6881614d4f565b8114614d7357600080fd5b50565b600081519050614d8581614d5f565b92915050565b600080600060608486031215614da457614da3614433565b5b6000614db286828701614d3a565b9350506020614dc386828701614d3a565b9250506040614dd486828701614d76565b9150509250925092565b6000614de982614496565b9150614df483614496565b9250828203905081811115614e0c57614e0b61488c565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115614e6957808604811115614e4557614e4461488c565b5b6001851615614e545780820291505b8081029050614e6285614e12565b9450614e29565b94509492505050565b600082614e825760019050614f3e565b81614e905760009050614f3e565b8160018114614ea65760028114614eb057614edf565b6001915050614f3e565b60ff841115614ec257614ec161488c565b5b8360020a915084821115614ed957614ed861488c565b5b50614f3e565b5060208310610133831016604e8410600b8410161715614f145782820a905083811115614f0f57614f0e61488c565b5b614f3e565b614f218484846001614e1f565b92509050818404811115614f3857614f3761488c565b5b81810290505b9392505050565b6000614f5082614496565b9150614f5b83614496565b9250614f887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614e72565b905092915050565b600081905092915050565b6000614fa682614381565b614fb08185614f90565b9350614fc081856020860161439d565b80840191505092915050565b6000614fd88285614f9b565b9150614fe48284614f9b565b91508190509392505050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b600061504c60398361438c565b915061505782614ff0565b604082019050919050565b6000602082019050818103600083015261507b8161503f565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006150de60258361438c565b91506150e982615082565b604082019050919050565b6000602082019050818103600083015261510d816150d1565b9050919050565b600081905092915050565b50565b600061512f600083615114565b915061513a8261511f565b600082019050919050565b600061515082615122565b9150819050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e352500000000000000000000000000000000000000000000000000000000602082015250565b60006151b660248361438c565b91506151c18261515a565b604082019050919050565b600060208201905081810360008301526151e5816151a9565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061524860358361438c565b9150615253826151ec565b604082019050919050565b600060208201905081810360008301526152778161523b565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b60006152da60348361438c565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061536c60268361438c565b915061537782615310565b604082019050919050565b6000602082019050818103600083015261539b8161535f565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153fe60248361438c565b9150615409826153a2565b604082019050919050565b6000602082019050818103600083015261542d816153f1565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061549060228361438c565b915061549b82615434565b604082019050919050565b600060208201905081810360008301526154bf81615483565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061552260258361438c565b915061552d826154c6565b604082019050919050565b6000602082019050818103600083015261555181615515565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006155b460238361438c565b91506155bf82615558565b604082019050919050565b600060208201905081810360008301526155e3816155a7565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b600061562060168361438c565b915061562b826155ea565b602082019050919050565b6000602082019050818103600083015261564f81615613565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006156d860498361438c565b91506156e382615656565b606082019050919050565b60006020820190508181036000830152615707816156cb565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061576a60358361438c565b91506157758261570e565b604082019050919050565b600060208201905081810360008301526157998161575d565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b60006157d660138361438c565b91506157e1826157a0565b602082019050919050565b60006020820190508181036000830152615805816157c9565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b600061586860368361438c565b91506158738261580c565b604082019050919050565b600060208201905081810360008301526158978161585b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061590782614496565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159395761593861488c565b5b600182019050919050565b7f2e00000000000000000000000000000000000000000000000000000000000000600082015250565b600061597a600183614f90565b915061598582615944565b600182019050919050565b600061599c8285614f9b565b91506159a78261596d565b91506159b38284614f9b565b91508190509392505050565b7f302e000000000000000000000000000000000000000000000000000000000000600082015250565b60006159f5600283614f90565b9150615a00826159bf565b600282019050919050565b6000615a16826159e8565b9150615a228284614f9b565b915081905092915050565b6000819050919050565b6000615a52615a4d615a4884615a2d565b61456f565b614496565b9050919050565b615a6281615a37565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b615a9d81614458565b82525050565b6000615aaf8383615a94565b60208301905092915050565b6000602082019050919050565b6000615ad382615a68565b615add8185615a73565b9350615ae883615a84565b8060005b83811015615b19578151615b008882615aa3565b9750615b0b83615abb565b925050600181019050615aec565b5085935050505092915050565b600060a082019050615b3b60008301886145e9565b615b486020830187615a59565b8181036040830152615b5a8186615ac8565b9050615b696060830185614693565b615b7660808301846145e9565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615bdc60268361438c565b9150615be782615b80565b604082019050919050565b60006020820190508181036000830152615c0b81615bcf565b9050919050565b6000615c1d82614496565b9150615c2883614496565b925082615c3857615c376148fd565b5b82820690509291505056fea2646970667358221220c8a584e78f781b17151164155bf079710cecc60eedf26670676780ee02756d6264736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : _usdcAddress (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [1] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


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.