ETH Price: $3,415.74 (+3.96%)

Token

Asakusa (ASAKU)
 

Overview

Max Total Supply

1,000,000,000 ASAKU

Holders

506

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
gugbot.eth
Balance
129,738.569619378942345316 ASAKU

Value
$0.00
0xbafae6afa1f7b0001860f627354130c859031b76
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:
Asakusa

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 9: Asakusa.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";
import "./Address.sol";
import "./Ownable.sol";
import "./IERC20.sol";

import "./IUniswapV2Factory.sol";
import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router01.sol";
import "./IUniswapV2Router02.sol";


/*
 * @author ~ 🅧🅘🅟🅩🅔🅡 ~ (https://twitter.com/Xipzer | https://t.me/Xipzer)
 *
 * ░█████╗░░██████╗░█████╗░██╗░░██╗██╗░░░██╗░██████╗░█████╗░
 * ██╔══██╗██╔════╝██╔══██╗██║░██╔╝██║░░░██║██╔════╝██╔══██╗
 * ███████║╚█████╗░███████║█████═╝░██║░░░██║╚█████╗░███████║
 * ██╔══██║░╚═══██╗██╔══██║██╔═██╗░██║░░░██║░╚═══██╗██╔══██║
 * ██║░░██║██████╔╝██║░░██║██║░╚██╗╚██████╔╝██████╔╝██║░░██║
 * ╚═╝░░╚═╝╚═════╝░╚═╝░░╚═╝╚═╝░░╚═╝░╚═════╝░╚═════╝░╚═╝░░╚═╝
 *
 */

contract Asakusa is Context, IERC20, Ownable
{
    using Address for address;

    string public name = "Asakusa";
    string public symbol = "ASAKU";

    uint public decimals = 18;
    uint public totalSupply = 1000000000 * 10 ** decimals;

    uint private maxTXN = (totalSupply * 15) / 1000;
    uint private maxWallet = (totalSupply * 15) / 1000;
    uint public swapThresholdMin = totalSupply / 5000;
    uint public swapThresholdMax = totalSupply / 1000;

    address public dexPair;
    IUniswapV2Router02 public dexRouter;

    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;

    mapping (address => uint) private balances;
    mapping (address => mapping (address => uint)) private allowances;

    mapping (address => bool) private isCaughtMEV;
    mapping (address => bool) private isFeeExempt;
    mapping (address => bool) private isTxnLimitExempt;
    mapping (address => bool) private isWalletLimitExempt;
    mapping (address => bool) public isMarketPair;

    struct Fees
    {
        uint inFee;
        uint outFee;
        uint transferFee;
    }

    struct FeeSplit
    {
        uint marketing;
        uint development;
    }

    struct FeeReceivers
    {
        address payable marketing;
        address payable development;
    }

    Fees public fees;
    FeeSplit public feeSplit;
    FeeReceivers public feeReceivers;

    bool public tradingEnabled;
    bool public protectionRenounced;
    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled;
    bool public swapAndLiquifyByLimitOnly;

    event SwapAndLiquifyStatusUpdated(bool status);
    event SwapAndLiquifyByLimitStatusUpdated(bool status);
    event SwapTokensForETH(uint amountIn, address[] path);

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

    constructor()
    {
        dexRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dexPair = IUniswapV2Factory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());

        allowances[address(this)][address(dexRouter)] = type(uint).max;

        fees.inFee = 1500;
        fees.outFee = 3500;
        fees.transferFee = 3500;

        feeReceivers.marketing = payable(0xb9Ff4ba6C638838ad09Ba9994a94278E11BFFa33);
        feeReceivers.development = payable(0xfF7372EF917f6242c3e71048Bda9322ec5da4973);

        feeSplit.marketing = 6000;
        feeSplit.development = 4000;

        isFeeExempt[owner()] = true;
        isFeeExempt[address(0)] = true;
        isFeeExempt[DEAD] = true;
        isFeeExempt[address(this)] = true;
        isFeeExempt[feeReceivers.marketing] = true;
        isFeeExempt[feeReceivers.development] = true;

        isTxnLimitExempt[owner()] = true;
        isTxnLimitExempt[address(0)] = true;
        isTxnLimitExempt[DEAD] = true;
        isTxnLimitExempt[address(this)] = true;
        isTxnLimitExempt[feeReceivers.marketing] = true;
        isTxnLimitExempt[feeReceivers.development] = true;

        isWalletLimitExempt[owner()] = true;
        isWalletLimitExempt[address(0)] = true;
        isWalletLimitExempt[DEAD] = true;
        isWalletLimitExempt[address(this)] = true;
        isWalletLimitExempt[feeReceivers.marketing] = true;
        isWalletLimitExempt[feeReceivers.development] = true;

        isWalletLimitExempt[address(dexPair)] = true;
        isMarketPair[address(dexPair)] = true;

        swapAndLiquifyEnabled = true;
        swapAndLiquifyByLimitOnly = true;

        balances[_msgSender()] = totalSupply;
        emit Transfer(address(0), _msgSender(), totalSupply);
    }

    function balanceOf(address wallet) public view override returns (uint)
    {
        return balances[wallet];
    }

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

    function getCirculatingSupply() public view returns (uint)
    {
        return totalSupply - balanceOf(address(0)) - balanceOf(DEAD);
    }

    function getMEVStatus(address wallet) public view returns (bool)
    {
        return isCaughtMEV[wallet];
    }

    function setWalletFeeStatus(address wallet, bool status) public onlyOwner()
    {
        isFeeExempt[wallet] = status;
    }

    function setWalletTxnStatus(address wallet, bool status) public onlyOwner()
    {
        isTxnLimitExempt[wallet] = status;
    }

    function setWalletLimitStatus(address wallet, bool status) public onlyOwner()
    {
        isWalletLimitExempt[wallet] = status;
    }

    function setMarketPairStatus(address wallet, bool status) public onlyOwner()
    {
        isMarketPair[wallet] = status;
    }

    function setMaxTXN(uint value) public onlyOwner()
    {
        require(value >= totalSupply / 10000, "ERROR: Minimum txn must be greater than 0.01% of total supply!");

        maxTXN = value;
    }

    function setMaxWallet(uint value) public onlyOwner()
    {
        require(value >= totalSupply / 10000, "ERROR: Minimum wallet size must be greater than 0.01% of total supply!");

        maxWallet = value;
    }

    function enableTrading() public onlyOwner()
    {
        require(!tradingEnabled, "ERROR: Trading is already enabled!");
        tradingEnabled = true;
    }

    function removeMaxTXN() public onlyOwner()
    {
        maxTXN = totalSupply;
    }

    function removeMaxWallet() public onlyOwner()
    {
        maxWallet = totalSupply;
    }

    function renounceMEVProtection() public onlyOwner()
    {
        require(!protectionRenounced, "ERROR: Anti-MEV system is already renounced!");
        protectionRenounced = true;
    }

    function setCaughtMEV(address[] memory wallets, bool status) public onlyOwner()
    {
        require(!protectionRenounced, "ERROR: Anti-MEV system is permanently disabled!");
        require(wallets.length <= 200, "ERROR: Maximum wallets at once is 200!");

        for (uint i = 0; i < wallets.length; i++)
            isCaughtMEV[wallets[i]] = status;
    }

    function setFees(uint inFee, uint outFee, uint transferFee) public onlyOwner()
    {
        require(inFee <= 5000 && outFee <= 5000 && transferFee <= 5000, "ERROR: Maximum directional fee is 50%!");

        fees.inFee = inFee;
        fees.outFee = outFee;
        fees.transferFee = transferFee;
    }

    function setFeeSplit(uint marketing, uint development) public onlyOwner()
    {
        require(marketing <= 10000 && development <= 10000, "ERROR: Fee split must not exceed 100%!");
        require(marketing + development <= 10000, "ERROR: Combined fee must not exceed 100%!");

        feeSplit.marketing = marketing;
        feeSplit.development = development;
    }

    function setFeeReceivers(address marketing, address development) public onlyOwner()
    {
        require(marketing != address(0) && development != address(0), "ERROR: Fee receiver must not be NULL address!");

        isFeeExempt[feeReceivers.marketing] = false;
        isFeeExempt[feeReceivers.development] = false;

        feeReceivers.marketing = payable(marketing);
        feeReceivers.development = payable(development);

        isFeeExempt[feeReceivers.marketing] = true;
        isFeeExempt[feeReceivers.development] = true;
    }

    function setSwapThresholds(uint swapMin, uint swapMax) public onlyOwner()
    {
        swapThresholdMin = swapMin;
        swapThresholdMax = swapMax;
    }

    function setSwapAndLiquifyStatus(bool status) public onlyOwner()
    {
        swapAndLiquifyEnabled = status;
        emit SwapAndLiquifyStatusUpdated(status);
    }

    function setSwapAndLiquifyByLimitStatus(bool status) public onlyOwner()
    {
        swapAndLiquifyByLimitOnly = status;
        emit SwapAndLiquifyByLimitStatusUpdated(status);
    }

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

    function _approve(address owner, address spender, uint amount) private
    {
        require(owner != address(0), "ERROR: Approve from the zero address!");
        require(spender != address(0), "ERROR: Approve to the zero address!");

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

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

    function transferFrom(address sender, address recipient, uint amount) public override returns (bool)
    {
        if (allowances[sender][_msgSender()] != type(uint256).max)
            allowances[sender][_msgSender()] -= amount;

        return _transfer(sender, recipient, amount);
    }

    function transferToAddressNative(address payable recipient, uint amount) private
    {
        require(recipient != address(0), "SolarGuard: Cannot send to the 0 address!");

        recipient.call{ value: amount }("");
    }

    function _transfer(address sender, address recipient, uint amount) private returns (bool)
    {
        require(sender != address(0), "ERROR: Transfer from the zero address!");
        require(recipient != address(0), "ERROR: Transfer to the zero address!");
        require(!isCaughtMEV[recipient] && !isCaughtMEV[sender], "ERROR: Transfers are not permitted!");

        if (inSwapAndLiquify)
        {
            unchecked
            {
                require(amount <= balances[sender], "ERROR: Insufficient balance!");
                balances[sender] -= amount;
            }

            balances[recipient] += amount;

            emit Transfer(sender, recipient, amount);
            return true;
        }
        else
        {
            if (!isFeeExempt[sender] && !isFeeExempt[recipient])
                require(tradingEnabled, "ERROR: Trading has not yet been enabled!");

            if (!isTxnLimitExempt[sender] && !isTxnLimitExempt[recipient])
                require(amount <= maxTXN, "ERROR: Transfer amount exceeds the maxTXN!");

            uint contractTokenBalance = balanceOf(address(this));
            if (!inSwapAndLiquify && swapAndLiquifyEnabled && !isMarketPair[sender] && contractTokenBalance >= swapThresholdMin)
            {
                if (swapAndLiquifyByLimitOnly)
                    contractTokenBalance = min(amount, min(contractTokenBalance, swapThresholdMax));

                swapAndLiquify(contractTokenBalance);
            }

            unchecked
            {
                require(amount <= balances[sender], "ERROR: Insufficient balance!");
                balances[sender] -= amount;
            }

            uint finalAmount = (isFeeExempt[sender] || isFeeExempt[recipient]) ? amount : takeFee(sender, recipient, amount);

            if (!isWalletLimitExempt[recipient])
                require(balanceOf(recipient) + finalAmount <= maxWallet, "ERROR: Transfer amount must not exceed max wallet conditions!");

            balances[recipient] += finalAmount;

            emit Transfer(sender, recipient, finalAmount);
            return true;
        }
    }

    function swapAndLiquify(uint amount) private lockTheSwap
    {
        swapTokensForETH(amount);
        uint amountReceived = address(this).balance;

        uint marketingAmount = (amountReceived * feeSplit.marketing) / 10000;
        uint developmentAmount = (amountReceived * feeSplit.development) / 10000;

        if (marketingAmount > 0)
            transferToAddressNative(feeReceivers.marketing, marketingAmount);
        if (developmentAmount > 0)
            transferToAddressNative(feeReceivers.development, developmentAmount);
    }

    function swapTokensForETH(uint amount) private
    {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        try dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(amount, 0, path, address(this), block.timestamp)
        {
            emit SwapTokensForETH(amount, path);
        }
        catch
        {
            return;
        }
    }

    function takeFee(address sender, address recipient, uint amount) internal returns (uint)
    {
        uint feeAmount = 0;

        if (isMarketPair[sender])
            feeAmount = (amount * fees.inFee) / 10000;
        else if (isMarketPair[recipient])
            feeAmount = (amount * fees.outFee) / 10000;
        else
            feeAmount = (amount * fees.transferFee) / 10000;

        if (feeAmount > 0)
        {
            balances[address(this)] += feeAmount;
            emit Transfer(sender, address(this), feeAmount);
        }

        return amount - feeAmount;
    }

    function withdrawStuckNative(address recipient, uint amount) public onlyOwner()
    {
        require(recipient != address(0), "ERROR: Cannot send to the 0 address!");
        payable(recipient).transfer(amount);
    }

    function withdrawForeignToken(address tokenAddress, address recipient, uint amount) public onlyOwner()
    {
        require(recipient != address(0), "ERROR: Cannot send to the 0 address!");
        IERC20(tokenAddress).transfer(recipient, amount);
    }

    function min(uint a, uint b) private pure returns (uint)
    {
        return (a >= b) ? b : a;
    }

    receive() external payable {}
}

File 1 of 9: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 3 of 9: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 9: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 5 of 9: IUniswapV2Factory.sol
pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 6 of 9: IUniswapV2Pair.sol
pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 7 of 9: IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 8 of 9: IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 9 of 9: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SwapAndLiquifyByLimitStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SwapAndLiquifyStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"wallet","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeReceivers","outputs":[{"internalType":"address payable","name":"marketing","type":"address"},{"internalType":"address payable","name":"development","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeSplit","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"uint256","name":"inFee","type":"uint256"},{"internalType":"uint256","name":"outFee","type":"uint256"},{"internalType":"uint256","name":"transferFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getMEVStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protectionRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeMaxTXN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMEVProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setCaughtMEV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketing","type":"address"},{"internalType":"address","name":"development","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"}],"name":"setFeeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inFee","type":"uint256"},{"internalType":"uint256","name":"outFee","type":"uint256"},{"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setMarketPairStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxTXN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapAndLiquifyByLimitStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapAndLiquifyStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapMin","type":"uint256"},{"internalType":"uint256","name":"swapMax","type":"uint256"}],"name":"setSwapThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWalletFeeStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWalletLimitStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWalletTxnStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyByLimitOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdMin","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawStuckNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405260076080908152664173616b75736160c81b60a0526001906200002890826200075e565b506040805180820190915260058152644153414b5560d81b60208201526002906200005490826200075e565b50601260038190556200006990600a6200093f565b6200007990633b9aca0062000954565b6004556103e8600454600f62000090919062000954565b6200009c91906200096e565b6005556103e8600454600f620000b3919062000954565b620000bf91906200096e565b600655611388600454620000d491906200096e565b6007556103e8600454620000e991906200096e565b600855348015620000f957600080fd5b50620001053362000667565b600a80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200016a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000190919062000991565b6001600160a01b031663c9c6539630600a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000219919062000991565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000267573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028d919062000991565b600980546001600160a01b039283166001600160a01b031991821617909155306000908152600c60209081526040808320600a54909516835293905291822060001990556105dc601255610dac601381905560145560178054821673b9ff4ba6c638838ad09ba9994a94278e11bffa331790556018805490911673ff7372ef917f6242c3e71048bda9322ec5da4973179055611770601555610fa0601655600190600e90620003446000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600e9093527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c8054851660019081179091557ff77e91909e61d18f67b875b2bfcae1f683a8d555e55382e3a6b082e2c59ea57a80548616821790553084528284208054861682179055601754821684528284208054861682179055601854909116835290822080549093168117909255600f90620004186000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600f9093527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec3758054851660019081179091557f99629f56119585bf27511b6b7d295dffb54757453fcc3dabcf51d92028301f1080548616821790553084528284208054861682179055601754821684528284208054861682179055601854909116835290822080549093168117909255601090620004ec6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055601084527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb018054861660019081179091557f9e93e1db4a1f807cc22b2aecf4deeb0bf5745f1ecb319e87c68c5624c0fa6b69805487168217905530825283822080548716821790556017548316825283822080548716821790556018548316825283822080548716821790556009805484168352848320805488168317905554909216815260119093529082208054909316179091556019805464010100000064ffff0000001990911617905560045490600b90620005f63390565b6001600160a01b03168152602081019190915260400160002055336001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6004546040516200065991815260200190565b60405180910390a3620009bc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006e257607f821691505b6020821081036200070357634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000759576000816000526020600020601f850160051c81016020861015620007345750805b601f850160051c820191505b81811015620007555782815560010162000740565b5050505b505050565b81516001600160401b038111156200077a576200077a620006b7565b62000792816200078b8454620006cd565b8462000709565b602080601f831160018114620007ca5760008415620007b15750858301515b600019600386901b1c1916600185901b17855562000755565b600085815260208120601f198616915b82811015620007fb57888601518255948401946001909101908401620007da565b50858210156200081a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620008815781600019048211156200086557620008656200082a565b808516156200087357918102915b93841c939080029062000845565b509250929050565b6000826200089a5750600162000939565b81620008a95750600062000939565b8160018114620008c25760028114620008cd57620008ed565b600191505062000939565b60ff841115620008e157620008e16200082a565b50506001821b62000939565b5060208310610133831016604e8410600b841016171562000912575081810a62000939565b6200091e838362000840565b80600019048211156200093557620009356200082a565b0290505b92915050565b60006200094d838362000889565b9392505050565b80820281158282048414176200093957620009396200082a565b6000826200098c57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620009a457600080fd5b81516001600160a01b03811681146200094d57600080fd5b61253d80620009cc6000396000f3fe60806040526004361061028c5760003560e01c80637e6335c71161015a578063bbfad5b5116100c1578063dc07b6171161007a578063dc07b617146107e6578063dd62ed3e146107fb578063dd9cdaed14610841578063ee2e5a2e14610888578063f242ab41146108a8578063f2fde38b146108c857600080fd5b8063bbfad5b51461072f578063c3fea9ba1461074f578063cddaf9de14610764578063cec10c1114610784578063d0354d6b146107a4578063da00097d146107c457600080fd5b80639af1d35a116101135780639af1d35a14610647578063a070cb7414610681578063a4b45c00146106a1578063a9059cbb146106c1578063adbdaec2146106e1578063b7c7429c146106f657600080fd5b80637e6335c71461059f578063830d010a146105bf578063844d591c146105df5780638a8c523c146105ff5780638da5cb5b1461061457806395d89b411461063257600080fd5b80632d409179116101fe5780635988f53f116101b75780635988f53f146104ce5780635d0044ca146104e45780636373ea69146105045780636be4432c1461053457806370a0823114610554578063715018a61461058a57600080fd5b80632d4091791461040e578063313ce5671461042e5780633ecad271146104445780634a74bb02146104745780634ada218b146104955780635351de8b146104af57600080fd5b806318160ddd1161025057806318160ddd1461035f5780631afc2b3a1461038357806321917cdc14610399578063220f6696146103b957806323b872dd146103d95780632b112e49146103f957600080fd5b806303fd2a45146102985780630659ce5c146102cb57806306fdde03146102ed5780630758d9241461030f578063095ea7b31461032f57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d757600080fd5b506102eb6102e6366004612066565b6108e8565b005b3480156102f957600080fd5b50610302610998565b6040516102c291906120a7565b34801561031b57600080fd5b50600a546102ae906001600160a01b031681565b34801561033b57600080fd5b5061034f61034a3660046120f6565b610a26565b60405190151581526020016102c2565b34801561036b57600080fd5b5061037560045481565b6040519081526020016102c2565b34801561038f57600080fd5b5061037560085481565b3480156103a557600080fd5b506102eb6103b436600461213b565b610a3d565b3480156103c557600080fd5b5060195461034f9062010000900460ff1681565b3480156103e557600080fd5b5061034f6103f4366004612066565b610a70565b34801561040557600080fd5b50610375610aea565b34801561041a57600080fd5b506102eb61042936600461213b565b610b57565b34801561043a57600080fd5b5061037560035481565b34801561045057600080fd5b5061034f61045f366004612174565b60116020526000908152604090205460ff1681565b34801561048057600080fd5b5060195461034f906301000000900460ff1681565b3480156104a157600080fd5b5060195461034f9060ff1681565b3480156104bb57600080fd5b5060195461034f90610100900460ff1681565b3480156104da57600080fd5b5061037560075481565b3480156104f057600080fd5b506102eb6104ff366004612191565b610b8a565b34801561051057600080fd5b5060155460165461051f919082565b604080519283526020830191909152016102c2565b34801561054057600080fd5b506102eb61054f3660046121c0565b610c2b565b34801561056057600080fd5b5061037561056f366004612174565b6001600160a01b03166000908152600b602052604090205490565b34801561059657600080fd5b506102eb610d66565b3480156105ab57600080fd5b506102eb6105ba366004612297565b610d7a565b3480156105cb57600080fd5b506102eb6105da3660046120f6565b610e69565b3480156105eb57600080fd5b506102eb6105fa36600461213b565b610ecd565b34801561060b57600080fd5b506102eb610f00565b34801561062057600080fd5b506000546001600160a01b03166102ae565b34801561063e57600080fd5b50610302610f75565b34801561065357600080fd5b5060125460135460145461066692919083565b604080519384526020840192909252908201526060016102c2565b34801561068d57600080fd5b506102eb61069c3660046122b9565b610f82565b3480156106ad57600080fd5b506102eb6106bc3660046122d6565b610fe4565b3480156106cd57600080fd5b5061034f6106dc3660046120f6565b6110f3565b3480156106ed57600080fd5b506102eb61110a565b34801561070257600080fd5b5061034f610711366004612174565b6001600160a01b03166000908152600d602052604090205460ff1690565b34801561073b57600080fd5b506102eb61074a366004612297565b61111a565b34801561075b57600080fd5b506102eb61112d565b34801561077057600080fd5b506102eb61077f366004612191565b6111b3565b34801561079057600080fd5b506102eb61079f366004612304565b611245565b3480156107b057600080fd5b506102eb6107bf36600461213b565b6112d8565b3480156107d057600080fd5b5060195461034f90640100000000900460ff1681565b3480156107f257600080fd5b506102eb61130b565b34801561080757600080fd5b506103756108163660046122d6565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561084d57600080fd5b50601754601854610868916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016102c2565b34801561089457600080fd5b506102eb6108a33660046122b9565b61131b565b3480156108b457600080fd5b506009546102ae906001600160a01b031681565b3480156108d457600080fd5b506102eb6108e3366004612174565b611370565b6108f06113e9565b6001600160a01b03821661091f5760405162461bcd60e51b815260040161091690612330565b60405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af115801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190612374565b50505050565b600180546109a590612391565b80601f01602080910402602001604051908101604052809291908181526020018280546109d190612391565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505081565b6000610a33338484611443565b5060015b92915050565b610a456113e9565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b0383166000908152600c6020908152604080832033845290915281205460001914610ad5576001600160a01b0384166000908152600c6020908152604080832033845290915281208054849290610acf9084906123db565b90915550505b610ae084848461156a565b90505b9392505050565b600b6020527f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac34155460008080527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7654600454919291610b4891906123db565b610b5291906123db565b905090565b610b5f6113e9565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b610b926113e9565b612710600454610ba291906123ee565b811015610c265760405162461bcd60e51b815260206004820152604660248201527f4552524f523a204d696e696d756d2077616c6c65742073697a65206d7573742060448201527f62652067726561746572207468616e20302e303125206f6620746f74616c20736064820152657570706c792160d01b608482015260a401610916565b600655565b610c336113e9565b601954610100900460ff1615610ca35760405162461bcd60e51b815260206004820152602f60248201527f4552524f523a20416e74692d4d45562073797374656d206973207065726d616e60448201526e656e746c792064697361626c65642160881b6064820152608401610916565b60c882511115610d045760405162461bcd60e51b815260206004820152602660248201527f4552524f523a204d6178696d756d2077616c6c657473206174206f6e6365206960448201526573203230302160d01b6064820152608401610916565b60005b8251811015610d615781600d6000858481518110610d2757610d27612410565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610d07565b505050565b610d6e6113e9565b610d786000611be8565b565b610d826113e9565b6127108211158015610d9657506127108111155b610df15760405162461bcd60e51b815260206004820152602660248201527f4552524f523a204665652073706c6974206d757374206e6f742065786365656460448201526520313030252160d01b6064820152608401610916565b612710610dfe8284612426565b1115610e5e5760405162461bcd60e51b815260206004820152602960248201527f4552524f523a20436f6d62696e656420666565206d757374206e6f742065786360448201526865656420313030252160b81b6064820152608401610916565b601591909155601655565b610e716113e9565b6001600160a01b038216610e975760405162461bcd60e51b815260040161091690612330565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d61573d6000803e3d6000fd5b610ed56113e9565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b610f086113e9565b60195460ff1615610f665760405162461bcd60e51b815260206004820152602260248201527f4552524f523a2054726164696e6720697320616c726561647920656e61626c65604482015261642160f01b6064820152608401610916565b6019805460ff19166001179055565b600280546109a590612391565b610f8a6113e9565b601980548215156401000000000264ff00000000199091161790556040517f2a91bab0ff55298148711f2e71f46774b795fb3d098246292d3a9d288d67730790610fd990831515815260200190565b60405180910390a150565b610fec6113e9565b6001600160a01b0382161580159061100c57506001600160a01b03811615155b61106e5760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a20466565207265636569766572206d757374206e6f742062652060448201526c4e554c4c20616464726573732160981b6064820152608401610916565b601780546001600160a01b039081166000908152600e6020526040808220805460ff19908116909155601880548516845282842080548316905585549785166001600160a01b03199889168117909655805496851696909716959095178655928152828120805485166001908117909155945490911681522080549091169091179055565b600061110033848461156a565b5060019392505050565b6111126113e9565b600454600555565b6111226113e9565b600791909155600855565b6111356113e9565b601954610100900460ff16156111a25760405162461bcd60e51b815260206004820152602c60248201527f4552524f523a20416e74692d4d45562073797374656d20697320616c7265616460448201526b792072656e6f756e6365642160a01b6064820152608401610916565b6019805461ff001916610100179055565b6111bb6113e9565b6127106004546111cb91906123ee565b8110156112405760405162461bcd60e51b815260206004820152603e60248201527f4552524f523a204d696e696d756d2074786e206d75737420626520677265617460448201527f6572207468616e20302e303125206f6620746f74616c20737570706c792100006064820152608401610916565b600555565b61124d6113e9565b611388831115801561126157506113888211155b801561126f57506113888111155b6112ca5760405162461bcd60e51b815260206004820152602660248201527f4552524f523a204d6178696d756d20646972656374696f6e616c20666565206960448201526573203530252160d01b6064820152608401610916565b601292909255601355601455565b6112e06113e9565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6113136113e9565b600454600655565b6113236113e9565b6019805482151563010000000263ff000000199091161790556040517f083ec94fdbe7b9156108be7401c9808cd45be92d8bcba03f203523515831146c90610fd990831515815260200190565b6113786113e9565b6001600160a01b0381166113dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610916565b6113e681611be8565b50565b6000546001600160a01b03163314610d785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610916565b6001600160a01b0383166114a75760405162461bcd60e51b815260206004820152602560248201527f4552524f523a20417070726f76652066726f6d20746865207a65726f20616464604482015264726573732160d81b6064820152608401610916565b6001600160a01b0382166115095760405162461bcd60e51b815260206004820152602360248201527f4552524f523a20417070726f766520746f20746865207a65726f20616464726560448201526273732160e81b6064820152608401610916565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b0384166115d15760405162461bcd60e51b815260206004820152602660248201527f4552524f523a205472616e736665722066726f6d20746865207a65726f20616460448201526564726573732160d01b6064820152608401610916565b6001600160a01b0383166116335760405162461bcd60e51b8152602060048201526024808201527f4552524f523a205472616e7366657220746f20746865207a65726f20616464726044820152636573732160e01b6064820152608401610916565b6001600160a01b0383166000908152600d602052604090205460ff1615801561167557506001600160a01b0384166000908152600d602052604090205460ff16155b6116cd5760405162461bcd60e51b815260206004820152602360248201527f4552524f523a205472616e736665727320617265206e6f74207065726d69747460448201526265642160e81b6064820152608401610916565b60195462010000900460ff16156117db576001600160a01b0384166000908152600b60205260409020548211156117465760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20496e73756666696369656e742062616c616e636521000000006044820152606401610916565b6001600160a01b038085166000908152600b6020526040808220805486900390559185168152908120805484929061177f908490612426565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117cb91815260200190565b60405180910390a3506001610ae3565b6001600160a01b0384166000908152600e602052604090205460ff1615801561181d57506001600160a01b0383166000908152600e602052604090205460ff16155b156118855760195460ff166118855760405162461bcd60e51b815260206004820152602860248201527f4552524f523a2054726164696e6720686173206e6f7420796574206265656e20604482015267656e61626c65642160c01b6064820152608401610916565b6001600160a01b0384166000908152600f602052604090205460ff161580156118c757506001600160a01b0383166000908152600f602052604090205460ff16155b15611931576005548211156119315760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a205472616e7366657220616d6f756e74206578636565647320746044820152696865206d617854584e2160b01b6064820152608401610916565b306000908152600b602052604090205460195462010000900460ff1615801561196357506019546301000000900460ff165b801561198857506001600160a01b03851660009081526011602052604090205460ff16155b801561199657506007548110155b156119cf57601954640100000000900460ff16156119c6576119c3836119be83600854611c38565b611c38565b90505b6119cf81611c4e565b6001600160a01b0385166000908152600b6020526040902054831115611a375760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20496e73756666696369656e742062616c616e636521000000006044820152606401610916565b6001600160a01b0385166000908152600b6020908152604080832080548790039055600e90915281205460ff1680611a8757506001600160a01b0385166000908152600e602052604090205460ff165b611a9b57611a96868686611cf6565b611a9d565b835b6001600160a01b03861660009081526010602052604090205490915060ff16611b615760065481611ae3876001600160a01b03166000908152600b602052604090205490565b611aed9190612426565b1115611b615760405162461bcd60e51b815260206004820152603d60248201527f4552524f523a205472616e7366657220616d6f756e74206d757374206e6f742060448201527f657863656564206d61782077616c6c657420636f6e646974696f6e73210000006064820152608401610916565b6001600160a01b0385166000908152600b602052604081208054839290611b89908490612426565b92505081905550846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bd591815260200190565b60405180910390a3600192505050610ae3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081831015611c485782610ae3565b50919050565b6019805462ff0000191662010000179055611c6881611e09565b601554479060009061271090611c7e9084612439565b611c8891906123ee565b9050600061271060156001015484611ca09190612439565b611caa91906123ee565b90508115611cc857601754611cc8906001600160a01b031683611f84565b8015611ce457601854611ce4906001600160a01b031682611f84565b50506019805462ff0000191690555050565b6001600160a01b038316600090815260116020526040812054819060ff1615611d3b5760125461271090611d2a9085612439565b611d3491906123ee565b9050611d8b565b6001600160a01b03841660009081526011602052604090205460ff1615611d6d5760135461271090611d2a9085612439565b60145461271090611d7e9085612439565b611d8891906123ee565b90505b8015611df657306000908152600b602052604081208054839290611db0908490612426565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b611e0081846123db565b95945050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611e3e57611e3e612410565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb9190612450565b81600181518110611ece57611ece612410565b6001600160a01b039283166020918202929092010152600a5460405163791ac94760e01b815291169063791ac94790611f149085906000908690309042906004016124b2565b600060405180830381600087803b158015611f2e57600080fd5b505af1925050508015611f3f575060015b611f47575050565b7f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051611f789291906124ee565b60405180910390a15050565b6001600160a01b038216611fec5760405162461bcd60e51b815260206004820152602960248201527f536f6c617247756172643a2043616e6e6f742073656e6420746f20746865203060448201526820616464726573732160b81b6064820152608401610916565b6040516001600160a01b038316908290600081818185875af1925050503d8060008114612035576040519150601f19603f3d011682016040523d82523d6000602084013e61203a565b606091505b5050505050565b6001600160a01b03811681146113e657600080fd5b803561206181612041565b919050565b60008060006060848603121561207b57600080fd5b833561208681612041565b9250602084013561209681612041565b929592945050506040919091013590565b60006020808352835180602085015260005b818110156120d5578581018301518582016040015282016120b9565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561210957600080fd5b823561211481612041565b946020939093013593505050565b80151581146113e657600080fd5b803561206181612122565b6000806040838503121561214e57600080fd5b823561215981612041565b9150602083013561216981612122565b809150509250929050565b60006020828403121561218657600080fd5b8135610ae381612041565b6000602082840312156121a357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156121d357600080fd5b823567ffffffffffffffff808211156121eb57600080fd5b818501915085601f8301126121ff57600080fd5b8135602082821115612213576122136121aa565b8160051b604051601f19603f83011681018181108682111715612238576122386121aa565b60405292835281830193508481018201928984111561225657600080fd5b948201945b8386101561227b5761226c86612056565b8552948201949382019361225b565b965061228a9050878201612130565b9450505050509250929050565b600080604083850312156122aa57600080fd5b50508035926020909101359150565b6000602082840312156122cb57600080fd5b8135610ae381612122565b600080604083850312156122e957600080fd5b82356122f481612041565b9150602083013561216981612041565b60008060006060848603121561231957600080fd5b505081359360208301359350604090920135919050565b60208082526024908201527f4552524f523a2043616e6e6f742073656e6420746f20746865203020616464726040820152636573732160e01b606082015260800190565b60006020828403121561238657600080fd5b8151610ae381612122565b600181811c908216806123a557607f821691505b602082108103611c4857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610a3757610a376123c5565b60008261240b57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a3757610a376123c5565b8082028115828204841417610a3757610a376123c5565b60006020828403121561246257600080fd5b8151610ae381612041565b60008151808452602080850194506020840160005b838110156124a75781516001600160a01b031687529582019590820190600101612482565b509495945050505050565b85815284602082015260a0604082015260006124d160a083018661246d565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000610ae0604083018461246d56fea26469706673582212206aa48143f2a15926eccc2924e7417bca46714849c6ca20328d06bde0edd947f864736f6c63430008160033

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80637e6335c71161015a578063bbfad5b5116100c1578063dc07b6171161007a578063dc07b617146107e6578063dd62ed3e146107fb578063dd9cdaed14610841578063ee2e5a2e14610888578063f242ab41146108a8578063f2fde38b146108c857600080fd5b8063bbfad5b51461072f578063c3fea9ba1461074f578063cddaf9de14610764578063cec10c1114610784578063d0354d6b146107a4578063da00097d146107c457600080fd5b80639af1d35a116101135780639af1d35a14610647578063a070cb7414610681578063a4b45c00146106a1578063a9059cbb146106c1578063adbdaec2146106e1578063b7c7429c146106f657600080fd5b80637e6335c71461059f578063830d010a146105bf578063844d591c146105df5780638a8c523c146105ff5780638da5cb5b1461061457806395d89b411461063257600080fd5b80632d409179116101fe5780635988f53f116101b75780635988f53f146104ce5780635d0044ca146104e45780636373ea69146105045780636be4432c1461053457806370a0823114610554578063715018a61461058a57600080fd5b80632d4091791461040e578063313ce5671461042e5780633ecad271146104445780634a74bb02146104745780634ada218b146104955780635351de8b146104af57600080fd5b806318160ddd1161025057806318160ddd1461035f5780631afc2b3a1461038357806321917cdc14610399578063220f6696146103b957806323b872dd146103d95780632b112e49146103f957600080fd5b806303fd2a45146102985780630659ce5c146102cb57806306fdde03146102ed5780630758d9241461030f578063095ea7b31461032f57600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae61dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102d757600080fd5b506102eb6102e6366004612066565b6108e8565b005b3480156102f957600080fd5b50610302610998565b6040516102c291906120a7565b34801561031b57600080fd5b50600a546102ae906001600160a01b031681565b34801561033b57600080fd5b5061034f61034a3660046120f6565b610a26565b60405190151581526020016102c2565b34801561036b57600080fd5b5061037560045481565b6040519081526020016102c2565b34801561038f57600080fd5b5061037560085481565b3480156103a557600080fd5b506102eb6103b436600461213b565b610a3d565b3480156103c557600080fd5b5060195461034f9062010000900460ff1681565b3480156103e557600080fd5b5061034f6103f4366004612066565b610a70565b34801561040557600080fd5b50610375610aea565b34801561041a57600080fd5b506102eb61042936600461213b565b610b57565b34801561043a57600080fd5b5061037560035481565b34801561045057600080fd5b5061034f61045f366004612174565b60116020526000908152604090205460ff1681565b34801561048057600080fd5b5060195461034f906301000000900460ff1681565b3480156104a157600080fd5b5060195461034f9060ff1681565b3480156104bb57600080fd5b5060195461034f90610100900460ff1681565b3480156104da57600080fd5b5061037560075481565b3480156104f057600080fd5b506102eb6104ff366004612191565b610b8a565b34801561051057600080fd5b5060155460165461051f919082565b604080519283526020830191909152016102c2565b34801561054057600080fd5b506102eb61054f3660046121c0565b610c2b565b34801561056057600080fd5b5061037561056f366004612174565b6001600160a01b03166000908152600b602052604090205490565b34801561059657600080fd5b506102eb610d66565b3480156105ab57600080fd5b506102eb6105ba366004612297565b610d7a565b3480156105cb57600080fd5b506102eb6105da3660046120f6565b610e69565b3480156105eb57600080fd5b506102eb6105fa36600461213b565b610ecd565b34801561060b57600080fd5b506102eb610f00565b34801561062057600080fd5b506000546001600160a01b03166102ae565b34801561063e57600080fd5b50610302610f75565b34801561065357600080fd5b5060125460135460145461066692919083565b604080519384526020840192909252908201526060016102c2565b34801561068d57600080fd5b506102eb61069c3660046122b9565b610f82565b3480156106ad57600080fd5b506102eb6106bc3660046122d6565b610fe4565b3480156106cd57600080fd5b5061034f6106dc3660046120f6565b6110f3565b3480156106ed57600080fd5b506102eb61110a565b34801561070257600080fd5b5061034f610711366004612174565b6001600160a01b03166000908152600d602052604090205460ff1690565b34801561073b57600080fd5b506102eb61074a366004612297565b61111a565b34801561075b57600080fd5b506102eb61112d565b34801561077057600080fd5b506102eb61077f366004612191565b6111b3565b34801561079057600080fd5b506102eb61079f366004612304565b611245565b3480156107b057600080fd5b506102eb6107bf36600461213b565b6112d8565b3480156107d057600080fd5b5060195461034f90640100000000900460ff1681565b3480156107f257600080fd5b506102eb61130b565b34801561080757600080fd5b506103756108163660046122d6565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b34801561084d57600080fd5b50601754601854610868916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016102c2565b34801561089457600080fd5b506102eb6108a33660046122b9565b61131b565b3480156108b457600080fd5b506009546102ae906001600160a01b031681565b3480156108d457600080fd5b506102eb6108e3366004612174565b611370565b6108f06113e9565b6001600160a01b03821661091f5760405162461bcd60e51b815260040161091690612330565b60405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af115801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190612374565b50505050565b600180546109a590612391565b80601f01602080910402602001604051908101604052809291908181526020018280546109d190612391565b8015610a1e5780601f106109f357610100808354040283529160200191610a1e565b820191906000526020600020905b815481529060010190602001808311610a0157829003601f168201915b505050505081565b6000610a33338484611443565b5060015b92915050565b610a456113e9565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6001600160a01b0383166000908152600c6020908152604080832033845290915281205460001914610ad5576001600160a01b0384166000908152600c6020908152604080832033845290915281208054849290610acf9084906123db565b90915550505b610ae084848461156a565b90505b9392505050565b600b6020527f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac34155460008080527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7654600454919291610b4891906123db565b610b5291906123db565b905090565b610b5f6113e9565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b610b926113e9565b612710600454610ba291906123ee565b811015610c265760405162461bcd60e51b815260206004820152604660248201527f4552524f523a204d696e696d756d2077616c6c65742073697a65206d7573742060448201527f62652067726561746572207468616e20302e303125206f6620746f74616c20736064820152657570706c792160d01b608482015260a401610916565b600655565b610c336113e9565b601954610100900460ff1615610ca35760405162461bcd60e51b815260206004820152602f60248201527f4552524f523a20416e74692d4d45562073797374656d206973207065726d616e60448201526e656e746c792064697361626c65642160881b6064820152608401610916565b60c882511115610d045760405162461bcd60e51b815260206004820152602660248201527f4552524f523a204d6178696d756d2077616c6c657473206174206f6e6365206960448201526573203230302160d01b6064820152608401610916565b60005b8251811015610d615781600d6000858481518110610d2757610d27612410565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101610d07565b505050565b610d6e6113e9565b610d786000611be8565b565b610d826113e9565b6127108211158015610d9657506127108111155b610df15760405162461bcd60e51b815260206004820152602660248201527f4552524f523a204665652073706c6974206d757374206e6f742065786365656460448201526520313030252160d01b6064820152608401610916565b612710610dfe8284612426565b1115610e5e5760405162461bcd60e51b815260206004820152602960248201527f4552524f523a20436f6d62696e656420666565206d757374206e6f742065786360448201526865656420313030252160b81b6064820152608401610916565b601591909155601655565b610e716113e9565b6001600160a01b038216610e975760405162461bcd60e51b815260040161091690612330565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610d61573d6000803e3d6000fd5b610ed56113e9565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b610f086113e9565b60195460ff1615610f665760405162461bcd60e51b815260206004820152602260248201527f4552524f523a2054726164696e6720697320616c726561647920656e61626c65604482015261642160f01b6064820152608401610916565b6019805460ff19166001179055565b600280546109a590612391565b610f8a6113e9565b601980548215156401000000000264ff00000000199091161790556040517f2a91bab0ff55298148711f2e71f46774b795fb3d098246292d3a9d288d67730790610fd990831515815260200190565b60405180910390a150565b610fec6113e9565b6001600160a01b0382161580159061100c57506001600160a01b03811615155b61106e5760405162461bcd60e51b815260206004820152602d60248201527f4552524f523a20466565207265636569766572206d757374206e6f742062652060448201526c4e554c4c20616464726573732160981b6064820152608401610916565b601780546001600160a01b039081166000908152600e6020526040808220805460ff19908116909155601880548516845282842080548316905585549785166001600160a01b03199889168117909655805496851696909716959095178655928152828120805485166001908117909155945490911681522080549091169091179055565b600061110033848461156a565b5060019392505050565b6111126113e9565b600454600555565b6111226113e9565b600791909155600855565b6111356113e9565b601954610100900460ff16156111a25760405162461bcd60e51b815260206004820152602c60248201527f4552524f523a20416e74692d4d45562073797374656d20697320616c7265616460448201526b792072656e6f756e6365642160a01b6064820152608401610916565b6019805461ff001916610100179055565b6111bb6113e9565b6127106004546111cb91906123ee565b8110156112405760405162461bcd60e51b815260206004820152603e60248201527f4552524f523a204d696e696d756d2074786e206d75737420626520677265617460448201527f6572207468616e20302e303125206f6620746f74616c20737570706c792100006064820152608401610916565b600555565b61124d6113e9565b611388831115801561126157506113888211155b801561126f57506113888111155b6112ca5760405162461bcd60e51b815260206004820152602660248201527f4552524f523a204d6178696d756d20646972656374696f6e616c20666565206960448201526573203530252160d01b6064820152608401610916565b601292909255601355601455565b6112e06113e9565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6113136113e9565b600454600655565b6113236113e9565b6019805482151563010000000263ff000000199091161790556040517f083ec94fdbe7b9156108be7401c9808cd45be92d8bcba03f203523515831146c90610fd990831515815260200190565b6113786113e9565b6001600160a01b0381166113dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610916565b6113e681611be8565b50565b6000546001600160a01b03163314610d785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610916565b6001600160a01b0383166114a75760405162461bcd60e51b815260206004820152602560248201527f4552524f523a20417070726f76652066726f6d20746865207a65726f20616464604482015264726573732160d81b6064820152608401610916565b6001600160a01b0382166115095760405162461bcd60e51b815260206004820152602360248201527f4552524f523a20417070726f766520746f20746865207a65726f20616464726560448201526273732160e81b6064820152608401610916565b6001600160a01b038381166000818152600c602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006001600160a01b0384166115d15760405162461bcd60e51b815260206004820152602660248201527f4552524f523a205472616e736665722066726f6d20746865207a65726f20616460448201526564726573732160d01b6064820152608401610916565b6001600160a01b0383166116335760405162461bcd60e51b8152602060048201526024808201527f4552524f523a205472616e7366657220746f20746865207a65726f20616464726044820152636573732160e01b6064820152608401610916565b6001600160a01b0383166000908152600d602052604090205460ff1615801561167557506001600160a01b0384166000908152600d602052604090205460ff16155b6116cd5760405162461bcd60e51b815260206004820152602360248201527f4552524f523a205472616e736665727320617265206e6f74207065726d69747460448201526265642160e81b6064820152608401610916565b60195462010000900460ff16156117db576001600160a01b0384166000908152600b60205260409020548211156117465760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20496e73756666696369656e742062616c616e636521000000006044820152606401610916565b6001600160a01b038085166000908152600b6020526040808220805486900390559185168152908120805484929061177f908490612426565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117cb91815260200190565b60405180910390a3506001610ae3565b6001600160a01b0384166000908152600e602052604090205460ff1615801561181d57506001600160a01b0383166000908152600e602052604090205460ff16155b156118855760195460ff166118855760405162461bcd60e51b815260206004820152602860248201527f4552524f523a2054726164696e6720686173206e6f7420796574206265656e20604482015267656e61626c65642160c01b6064820152608401610916565b6001600160a01b0384166000908152600f602052604090205460ff161580156118c757506001600160a01b0383166000908152600f602052604090205460ff16155b15611931576005548211156119315760405162461bcd60e51b815260206004820152602a60248201527f4552524f523a205472616e7366657220616d6f756e74206578636565647320746044820152696865206d617854584e2160b01b6064820152608401610916565b306000908152600b602052604090205460195462010000900460ff1615801561196357506019546301000000900460ff165b801561198857506001600160a01b03851660009081526011602052604090205460ff16155b801561199657506007548110155b156119cf57601954640100000000900460ff16156119c6576119c3836119be83600854611c38565b611c38565b90505b6119cf81611c4e565b6001600160a01b0385166000908152600b6020526040902054831115611a375760405162461bcd60e51b815260206004820152601c60248201527f4552524f523a20496e73756666696369656e742062616c616e636521000000006044820152606401610916565b6001600160a01b0385166000908152600b6020908152604080832080548790039055600e90915281205460ff1680611a8757506001600160a01b0385166000908152600e602052604090205460ff165b611a9b57611a96868686611cf6565b611a9d565b835b6001600160a01b03861660009081526010602052604090205490915060ff16611b615760065481611ae3876001600160a01b03166000908152600b602052604090205490565b611aed9190612426565b1115611b615760405162461bcd60e51b815260206004820152603d60248201527f4552524f523a205472616e7366657220616d6f756e74206d757374206e6f742060448201527f657863656564206d61782077616c6c657420636f6e646974696f6e73210000006064820152608401610916565b6001600160a01b0385166000908152600b602052604081208054839290611b89908490612426565b92505081905550846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bd591815260200190565b60405180910390a3600192505050610ae3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081831015611c485782610ae3565b50919050565b6019805462ff0000191662010000179055611c6881611e09565b601554479060009061271090611c7e9084612439565b611c8891906123ee565b9050600061271060156001015484611ca09190612439565b611caa91906123ee565b90508115611cc857601754611cc8906001600160a01b031683611f84565b8015611ce457601854611ce4906001600160a01b031682611f84565b50506019805462ff0000191690555050565b6001600160a01b038316600090815260116020526040812054819060ff1615611d3b5760125461271090611d2a9085612439565b611d3491906123ee565b9050611d8b565b6001600160a01b03841660009081526011602052604090205460ff1615611d6d5760135461271090611d2a9085612439565b60145461271090611d7e9085612439565b611d8891906123ee565b90505b8015611df657306000908152600b602052604081208054839290611db0908490612426565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b611e0081846123db565b95945050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611e3e57611e3e612410565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb9190612450565b81600181518110611ece57611ece612410565b6001600160a01b039283166020918202929092010152600a5460405163791ac94760e01b815291169063791ac94790611f149085906000908690309042906004016124b2565b600060405180830381600087803b158015611f2e57600080fd5b505af1925050508015611f3f575060015b611f47575050565b7f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051611f789291906124ee565b60405180910390a15050565b6001600160a01b038216611fec5760405162461bcd60e51b815260206004820152602960248201527f536f6c617247756172643a2043616e6e6f742073656e6420746f20746865203060448201526820616464726573732160b81b6064820152608401610916565b6040516001600160a01b038316908290600081818185875af1925050503d8060008114612035576040519150601f19603f3d011682016040523d82523d6000602084013e61203a565b606091505b5050505050565b6001600160a01b03811681146113e657600080fd5b803561206181612041565b919050565b60008060006060848603121561207b57600080fd5b833561208681612041565b9250602084013561209681612041565b929592945050506040919091013590565b60006020808352835180602085015260005b818110156120d5578581018301518582016040015282016120b9565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561210957600080fd5b823561211481612041565b946020939093013593505050565b80151581146113e657600080fd5b803561206181612122565b6000806040838503121561214e57600080fd5b823561215981612041565b9150602083013561216981612122565b809150509250929050565b60006020828403121561218657600080fd5b8135610ae381612041565b6000602082840312156121a357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156121d357600080fd5b823567ffffffffffffffff808211156121eb57600080fd5b818501915085601f8301126121ff57600080fd5b8135602082821115612213576122136121aa565b8160051b604051601f19603f83011681018181108682111715612238576122386121aa565b60405292835281830193508481018201928984111561225657600080fd5b948201945b8386101561227b5761226c86612056565b8552948201949382019361225b565b965061228a9050878201612130565b9450505050509250929050565b600080604083850312156122aa57600080fd5b50508035926020909101359150565b6000602082840312156122cb57600080fd5b8135610ae381612122565b600080604083850312156122e957600080fd5b82356122f481612041565b9150602083013561216981612041565b60008060006060848603121561231957600080fd5b505081359360208301359350604090920135919050565b60208082526024908201527f4552524f523a2043616e6e6f742073656e6420746f20746865203020616464726040820152636573732160e01b606082015260800190565b60006020828403121561238657600080fd5b8151610ae381612122565b600181811c908216806123a557607f821691505b602082108103611c4857634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610a3757610a376123c5565b60008261240b57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820180821115610a3757610a376123c5565b8082028115828204841417610a3757610a376123c5565b60006020828403121561246257600080fd5b8151610ae381612041565b60008151808452602080850194506020840160005b838110156124a75781516001600160a01b031687529582019590820190600101612482565b509495945050505050565b85815284602082015260a0604082015260006124d160a083018661246d565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000610ae0604083018461246d56fea26469706673582212206aa48143f2a15926eccc2924e7417bca46714849c6ca20328d06bde0edd947f864736f6c63430008160033

Deployed Bytecode Sourcemap

1473:13739:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2028:73;;;;;;;;;;;;2059:42;2028:73;;;;;-1:-1:-1;;;;;178:32:9;;;160:51;;148:2;133:18;2028:73:1;;;;;;;;14802:258;;;;;;;;;;-1:-1:-1;14802:258:1;;;;;:::i;:::-;;:::i;:::-;;1560:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1984:35::-;;;;;;;;;;-1:-1:-1;1984:35:1;;;;-1:-1:-1;;;;;1984:35:1;;;9526:163;;;;;;;;;;-1:-1:-1;9526:163:1;;;;;:::i;:::-;;:::i;:::-;;;2231:14:9;;2224:22;2206:41;;2194:2;2179:18;9526:163:1;2066:187:9;1668:53:1;;;;;;;;;;;;;;;;;;;2404:25:9;;;2392:2;2377:18;1668:53:1;2258:177:9;1897:49:1;;;;;;;;;;;;;;;;5780:128;;;;;;;;;;-1:-1:-1;5780:128:1;;;;;:::i;:::-;;:::i;2981:28::-;;;;;;;;;;-1:-1:-1;2981:28:1;;;;;;;;;;;10222:295;;;;;;;;;;-1:-1:-1;10222:295:1;;;;;:::i;:::-;;:::i;5506:143::-;;;;;;;;;;;;;:::i;5916:133::-;;;;;;;;;;-1:-1:-1;5916:133:1;;;;;:::i;:::-;;:::i;1636:25::-;;;;;;;;;;;;;;;;2454:45;;;;;;;;;;-1:-1:-1;2454:45:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;3016:33;;;;;;;;;;-1:-1:-1;3016:33:1;;;;;;;;;;;2910:26;;;;;;;;;;-1:-1:-1;2910:26:1;;;;;;;;2943:31;;;;;;;;;;-1:-1:-1;2943:31:1;;;;;;;;;;;1841:49;;;;;;;;;;;;;;;;6553:218;;;;;;;;;;-1:-1:-1;6553:218:1;;;;;:::i;:::-;;:::i;2838:24::-;;;;;;;;;;-1:-1:-1;2838:24:1;;;;;;;;;;;;;3694:25:9;;;3750:2;3735:18;;3728:34;;;;3667:18;2838:24:1;3520:248:9;7343:367:1;;;;;;;;;;-1:-1:-1;7343:367:1;;;;;:::i;:::-;;:::i;5228:118::-;;;;;;;;;;-1:-1:-1;5228:118:1;;;;;:::i;:::-;-1:-1:-1;;;;;5322:16:1;5293:4;5322:16;;;:8;:16;;;;;;;5228:118;1817:101:8;;;;;;;;;;;;;:::i;8037:376:1:-;;;;;;;;;;-1:-1:-1;8037:376:1;;;;;:::i;:::-;;:::i;14572:222::-;;;;;;;;;;-1:-1:-1;14572:222:1;;;;;:::i;:::-;;:::i;6203:130::-;;;;;;;;;;-1:-1:-1;6203:130:1;;;;;:::i;:::-;;:::i;6779:162::-;;;;;;;;;;;;;:::i;1194:85:8:-;;;;;;;;;;-1:-1:-1;1240:7:8;1266:6;-1:-1:-1;;;;;1266:6:8;1194:85;;1597:30:1;;;;;;;;;;;;;:::i;2815:16::-;;;;;;;;;;-1:-1:-1;2815:16:1;;;;;;;;;;;;;;;;5556:25:9;;;5612:2;5597:18;;5590:34;;;;5640:18;;;5633:34;5544:2;5529:18;2815:16:1;5354:319:9;9330:188:1;;;;;;;;;;-1:-1:-1;9330:188:1;;;;;:::i;:::-;;:::i;8421:554::-;;;;;;;;;;-1:-1:-1;8421:554:1;;;;;:::i;:::-;;:::i;10045:169::-;;;;;;;;;;-1:-1:-1;10045:169:1;;;;;:::i;:::-;;:::i;6949:87::-;;;;;;;;;;;;;:::i;5657:115::-;;;;;;;;;;-1:-1:-1;5657:115:1;;;;;:::i;:::-;-1:-1:-1;;;;;5745:19:1;5716:4;5745:19;;;:11;:19;;;;;;;;;5657:115;8983:161;;;;;;;;;;-1:-1:-1;8983:161:1;;;;;:::i;:::-;;:::i;7145:190::-;;;;;;;;;;;;;:::i;6341:204::-;;;;;;;;;;-1:-1:-1;6341:204:1;;;;;:::i;:::-;;:::i;7718:311::-;;;;;;;;;;-1:-1:-1;7718:311:1;;;;;:::i;:::-;;:::i;6057:138::-;;;;;;;;;;-1:-1:-1;6057:138:1;;;;;:::i;:::-;;:::i;3056:37::-;;;;;;;;;;-1:-1:-1;3056:37:1;;;;;;;;;;;7044:93;;;;;;;;;;;;;:::i;5354:144::-;;;;;;;;;;-1:-1:-1;5354:144:1;;;;;:::i;:::-;-1:-1:-1;;;;;5464:17:1;;;5435:4;5464:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;5354:144;2869:32;;;;;;;;;;-1:-1:-1;2869:32:1;;;;;;-1:-1:-1;;;;;2869:32:1;;;;;;;;;;;-1:-1:-1;;;;;6900:15:9;;;6882:34;;6952:15;;;;6947:2;6932:18;;6925:43;6817:18;2869:32:1;6638:336:9;9152:170:1;;;;;;;;;;-1:-1:-1;9152:170:1;;;;;:::i;:::-;;:::i;1955:22::-;;;;;;;;;;-1:-1:-1;1955:22:1;;;;-1:-1:-1;;;;;1955:22:1;;;2067:198:8;;;;;;;;;;-1:-1:-1;2067:198:8;;;;;:::i;:::-;;:::i;14802:258:1:-;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;14929:23:1;::::1;14921:72;;;;-1:-1:-1::0;;;14921:72:1::1;;;;;;;:::i;:::-;;;;;;;;;15004:48;::::0;-1:-1:-1;;;15004:48:1;;-1:-1:-1;;;;;7576:32:9;;;15004:48:1::1;::::0;::::1;7558:51:9::0;7625:18;;;7618:34;;;15004:29:1;::::1;::::0;::::1;::::0;7531:18:9;;15004:48:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14802:258:::0;;;:::o;1560:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9526:163::-;9598:4;9620:39;719:10:2;9643:7:1;9652:6;9620:8;:39::i;:::-;-1:-1:-1;9677:4:1;9526:163;;;;;:::o;5780:128::-;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;5872:19:1;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;5872:28:1::1;::::0;::::1;;::::0;;;::::1;::::0;;5780:128::o;10222:295::-;-1:-1:-1;;;;;10343:18:1;;10317:4;10343:18;;;:10;:18;;;;;;;;719:10:2;10343:32:1;;;;;;;;-1:-1:-1;;10343:53:1;10339:114;;-1:-1:-1;;;;;10411:18:1;;;;;;:10;:18;;;;;;;;719:10:2;10411:32:1;;;;;;;:42;;10447:6;;10411:18;:42;;10447:6;;10411:42;:::i;:::-;;;;-1:-1:-1;;10339:114:1;10473:36;10483:6;10491:9;10502:6;10473:9;:36::i;:::-;10466:43;;10222:295;;;;;;:::o;5506:143::-;5322:8;:16;;;;5559:4;5322:16;;;;;5588:11;;5559:4;;5322:16;5588:35;;5322:16;5588:35;:::i;:::-;:53;;;;:::i;:::-;5581:60;;5506:143;:::o;5916:133::-;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;6008:24:1;;;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;6008:33:1::1;::::0;::::1;;::::0;;;::::1;::::0;;5916:133::o;6553:218::-;1087:13:8;:11;:13::i;:::-;6653:5:1::1;6639:11;;:19;;;;:::i;:::-;6630:5;:28;;6622:111;;;::::0;-1:-1:-1;;;6622:111:1;;8987:2:9;6622:111:1::1;::::0;::::1;8969:21:9::0;9026:2;9006:18;;;8999:30;9065:34;9045:18;;;9038:62;9136:34;9116:18;;;9109:62;-1:-1:-1;;;9187:19:9;;;9180:37;9234:19;;6622:111:1::1;8785:474:9::0;6622:111:1::1;6746:9;:17:::0;6553:218::o;7343:367::-;1087:13:8;:11;:13::i;:::-;7448:19:1::1;::::0;::::1;::::0;::::1;;;7447:20;7439:80;;;::::0;-1:-1:-1;;;7439:80:1;;9466:2:9;7439:80:1::1;::::0;::::1;9448:21:9::0;9505:2;9485:18;;;9478:30;9544:34;9524:18;;;9517:62;-1:-1:-1;;;9595:18:9;;;9588:45;9650:19;;7439:80:1::1;9264:411:9::0;7439:80:1::1;7556:3;7538:7;:14;:21;;7530:72;;;::::0;-1:-1:-1;;;7530:72:1;;9882:2:9;7530:72:1::1;::::0;::::1;9864:21:9::0;9921:2;9901:18;;;9894:30;9960:34;9940:18;;;9933:62;-1:-1:-1;;;10011:18:9;;;10004:36;10057:19;;7530:72:1::1;9680:402:9::0;7530:72:1::1;7620:6;7615:87;7636:7;:14;7632:1;:18;7615:87;;;7696:6;7670:11;:23;7682:7;7690:1;7682:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;7670:23:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;7670:23:1;:32;;-1:-1:-1;;7670:32:1::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;7652:3:1::1;7615:87;;;;7343:367:::0;;:::o;1817:101:8:-;1087:13;:11;:13::i;:::-;1881:30:::1;1908:1;1881:18;:30::i;:::-;1817:101::o:0;8037:376:1:-;1087:13:8;:11;:13::i;:::-;8148:5:1::1;8135:9;:18;;:42;;;;;8172:5;8157:11;:20;;8135:42;8127:93;;;::::0;-1:-1:-1;;;8127:93:1;;10421:2:9;8127:93:1::1;::::0;::::1;10403:21:9::0;10460:2;10440:18;;;10433:30;10499:34;10479:18;;;10472:62;-1:-1:-1;;;10550:18:9;;;10543:36;10596:19;;8127:93:1::1;10219:402:9::0;8127:93:1::1;8266:5;8239:23;8251:11:::0;8239:9;:23:::1;:::i;:::-;:32;;8231:86;;;::::0;-1:-1:-1;;;8231:86:1;;10958:2:9;8231:86:1::1;::::0;::::1;10940:21:9::0;10997:2;10977:18;;;10970:30;11036:34;11016:18;;;11009:62;-1:-1:-1;;;11087:18:9;;;11080:39;11136:19;;8231:86:1::1;10756:405:9::0;8231:86:1::1;8330:8;:30:::0;;;;8371:20;:34;8037:376::o;14572:222::-;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;14676:23:1;::::1;14668:72;;;;-1:-1:-1::0;;;14668:72:1::1;;;;;;;:::i;:::-;14751:35;::::0;-1:-1:-1;;;;;14751:27:1;::::1;::::0;:35;::::1;;;::::0;14779:6;;14751:35:::1;::::0;;;14779:6;14751:27;:35;::::1;;;;;;;;;;;;;::::0;::::1;;;;6203:130:::0;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;6296:20:1;;;::::1;;::::0;;;:12:::1;:20;::::0;;;;:29;;-1:-1:-1;;6296:29:1::1;::::0;::::1;;::::0;;;::::1;::::0;;6203:130::o;6779:162::-;1087:13:8;:11;:13::i;:::-;6848:14:1::1;::::0;::::1;;6847:15;6839:62;;;::::0;-1:-1:-1;;;6839:62:1;;11368:2:9;6839:62:1::1;::::0;::::1;11350:21:9::0;11407:2;11387:18;;;11380:30;11446:34;11426:18;;;11419:62;-1:-1:-1;;;11497:18:9;;;11490:32;11539:19;;6839:62:1::1;11166:398:9::0;6839:62:1::1;6912:14;:21:::0;;-1:-1:-1;;6912:21:1::1;6929:4;6912:21;::::0;;6779:162::o;1597:30::-;;;;;;;:::i;9330:188::-;1087:13:8;:11;:13::i;:::-;9418:25:1::1;:34:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;9418:34:1;;::::1;;::::0;;9468:42:::1;::::0;::::1;::::0;::::1;::::0;9446:6;2231:14:9;2224:22;2206:41;;2194:2;2179:18;;2066:187;9468:42:1::1;;;;;;;;9330:188:::0;:::o;8421:554::-;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;8529:23:1;::::1;::::0;;::::1;::::0;:52:::1;;-1:-1:-1::0;;;;;;8556:25:1;::::1;::::0;::::1;8529:52;8521:110;;;::::0;-1:-1:-1;;;8521:110:1;;11771:2:9;8521:110:1::1;::::0;::::1;11753:21:9::0;11810:2;11790:18;;;11783:30;11849:34;11829:18;;;11822:62;-1:-1:-1;;;11900:18:9;;;11893:43;11953:19;;8521:110:1::1;11569:409:9::0;8521:110:1::1;8656:12;:22:::0;;-1:-1:-1;;;;;8656:22:1;;::::1;8682:5;8644:35:::0;;;:11:::1;:35;::::0;;;;;:43;;-1:-1:-1;;8644:43:1;;::::1;::::0;;;8710:24;;;;::::1;8698:37:::0;;;;;:45;;;::::1;::::0;;8756:43;;;;::::1;-1:-1:-1::0;;;;;;8756:43:1;;::::1;::::0;::::1;::::0;;;8810:47;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;8870:35;;;;;;:42;;;::::1;8656:22:::0;8870:42;;::::1;::::0;;;8935:24;;;;::::1;8923:37:::0;;;:44;;;;::::1;::::0;;::::1;::::0;;8421:554::o;10045:169::-;10120:4;10142:42;719:10:2;10166:9:1;10177:6;10142:9;:42::i;:::-;-1:-1:-1;10202:4:1;;10045:169;-1:-1:-1;;;10045:169:1:o;6949:87::-;1087:13:8;:11;:13::i;:::-;7017:11:1::1;::::0;7008:6:::1;:20:::0;6949:87::o;8983:161::-;1087:13:8;:11;:13::i;:::-;9073:16:1::1;:26:::0;;;;9110:16:::1;:26:::0;8983:161::o;7145:190::-;1087:13:8;:11;:13::i;:::-;7222:19:1::1;::::0;::::1;::::0;::::1;;;7221:20;7213:77;;;::::0;-1:-1:-1;;;7213:77:1;;12185:2:9;7213:77:1::1;::::0;::::1;12167:21:9::0;12224:2;12204:18;;;12197:30;12263:34;12243:18;;;12236:62;-1:-1:-1;;;12314:18:9;;;12307:42;12366:19;;7213:77:1::1;11983:408:9::0;7213:77:1::1;7301:19;:26:::0;;-1:-1:-1;;7301:26:1::1;;;::::0;;7145:190::o;6341:204::-;1087:13:8;:11;:13::i;:::-;6438:5:1::1;6424:11;;:19;;;;:::i;:::-;6415:5;:28;;6407:103;;;::::0;-1:-1:-1;;;6407:103:1;;12598:2:9;6407:103:1::1;::::0;::::1;12580:21:9::0;12637:2;12617:18;;;12610:30;12676:34;12656:18;;;12649:62;12747:32;12727:18;;;12720:60;12797:19;;6407:103:1::1;12396:426:9::0;6407:103:1::1;6523:6;:14:::0;6341:204::o;7718:311::-;1087:13:8;:11;:13::i;:::-;7830:4:1::1;7821:5;:13;;:31;;;;;7848:4;7838:6;:14;;7821:31;:54;;;;;7871:4;7856:11;:19;;7821:54;7813:105;;;::::0;-1:-1:-1;;;7813:105:1;;13029:2:9;7813:105:1::1;::::0;::::1;13011:21:9::0;13068:2;13048:18;;;13041:30;13107:34;13087:18;;;13080:62;-1:-1:-1;;;13158:18:9;;;13151:36;13204:19;;7813:105:1::1;12827:402:9::0;7813:105:1::1;7931:4;:18:::0;;;;7960:11;:20;7991:16;:30;7718:311::o;6057:138::-;1087:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;6151:27:1;;;::::1;;::::0;;;:19:::1;:27;::::0;;;;:36;;-1:-1:-1;;6151:36:1::1;::::0;::::1;;::::0;;;::::1;::::0;;6057:138::o;7044:93::-;1087:13:8;:11;:13::i;:::-;7118:11:1::1;::::0;7106:9:::1;:23:::0;7044:93::o;9152:170::-;1087:13:8;:11;:13::i;:::-;9233:21:1::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;9233:30:1;;::::1;;::::0;;9279:35:::1;::::0;::::1;::::0;::::1;::::0;9257:6;2231:14:9;2224:22;2206:41;;2194:2;2179:18;;2066:187;2067:198:8;1087:13;:11;:13::i;:::-;-1:-1:-1;;;;;2155:22:8;::::1;2147:73;;;::::0;-1:-1:-1;;;2147:73:8;;13436:2:9;2147:73:8::1;::::0;::::1;13418:21:9::0;13475:2;13455:18;;;13448:30;13514:34;13494:18;;;13487:62;-1:-1:-1;;;13565:18:9;;;13558:36;13611:19;;2147:73:8::1;13234:402:9::0;2147:73:8::1;2230:28;2249:8;2230:18;:28::i;:::-;2067:198:::0;:::o;1352:130::-;1240:7;1266:6;-1:-1:-1;;;;;1266:6:8;719:10:2;1415:23:8;1407:68;;;;-1:-1:-1;;;1407:68:8;;13843:2:9;1407:68:8;;;13825:21:9;;;13862:18;;;13855:30;13921:34;13901:18;;;13894:62;13973:18;;1407:68:8;13641:356:9;9697:340:1;-1:-1:-1;;;;;9792:19:1;;9784:69;;;;-1:-1:-1;;;9784:69:1;;14204:2:9;9784:69:1;;;14186:21:9;14243:2;14223:18;;;14216:30;14282:34;14262:18;;;14255:62;-1:-1:-1;;;14333:18:9;;;14326:35;14378:19;;9784:69:1;14002:401:9;9784:69:1;-1:-1:-1;;;;;9872:21:1;;9864:69;;;;-1:-1:-1;;;9864:69:1;;14610:2:9;9864:69:1;;;14592:21:9;14649:2;14629:18;;;14622:30;14688:34;14668:18;;;14661:62;-1:-1:-1;;;14739:18:9;;;14732:33;14782:19;;9864:69:1;14408:399:9;9864:69:1;-1:-1:-1;;;;;9946:17:1;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;:35;;;9997:32;;2404:25:9;;;9997:32:1;;2377:18:9;9997:32:1;;;;;;;9697:340;;;:::o;10763:2180::-;10847:4;-1:-1:-1;;;;;10877:20:1;;10869:71;;;;-1:-1:-1;;;10869:71:1;;15014:2:9;10869:71:1;;;14996:21:9;15053:2;15033:18;;;15026:30;15092:34;15072:18;;;15065:62;-1:-1:-1;;;15143:18:9;;;15136:36;15189:19;;10869:71:1;14812:402:9;10869:71:1;-1:-1:-1;;;;;10959:23:1;;10951:72;;;;-1:-1:-1;;;10951:72:1;;15421:2:9;10951:72:1;;;15403:21:9;15460:2;15440:18;;;15433:30;15499:34;15479:18;;;15472:62;-1:-1:-1;;;15550:18:9;;;15543:34;15594:19;;10951:72:1;15219:400:9;10951:72:1;-1:-1:-1;;;;;11043:22:1;;;;;;:11;:22;;;;;;;;11042:23;:47;;;;-1:-1:-1;;;;;;11070:19:1;;;;;;:11;:19;;;;;;;;11069:20;11042:47;11034:95;;;;-1:-1:-1;;;11034:95:1;;15826:2:9;11034:95:1;;;15808:21:9;15865:2;15845:18;;;15838:30;15904:34;15884:18;;;15877:62;-1:-1:-1;;;15955:18:9;;;15948:33;15998:19;;11034:95:1;15624:399:9;11034:95:1;11146:16;;;;;;;11142:1794;;;-1:-1:-1;;;;;11248:16:1;;;;;;:8;:16;;;;;;11238:26;;;11230:67;;;;-1:-1:-1;;;11230:67:1;;16230:2:9;11230:67:1;;;16212:21:9;16269:2;16249:18;;;16242:30;16308;16288:18;;;16281:58;16356:18;;11230:67:1;16028:352:9;11230:67:1;-1:-1:-1;;;;;11316:16:1;;;;;;;:8;:16;;;;;;:26;;;;;;;11374:19;;;;;;;;:29;;11336:6;;11316:16;11374:29;;11336:6;;11374:29;:::i;:::-;;;;;;;;11442:9;-1:-1:-1;;;;;11425:35:1;11434:6;-1:-1:-1;;;;;11425:35:1;;11453:6;11425:35;;;;2404:25:9;;2392:2;2377:18;;2258:177;11425:35:1;;;;;;;;-1:-1:-1;11482:4:1;11475:11;;11142:1794;-1:-1:-1;;;;;11542:19:1;;;;;;:11;:19;;;;;;;;11541:20;:47;;;;-1:-1:-1;;;;;;11566:22:1;;;;;;:11;:22;;;;;;;;11565:23;11541:47;11537:137;;;11615:14;;;;11607:67;;;;-1:-1:-1;;;11607:67:1;;16587:2:9;11607:67:1;;;16569:21:9;16626:2;16606:18;;;16599:30;16665:34;16645:18;;;16638:62;-1:-1:-1;;;16716:18:9;;;16709:38;16764:19;;11607:67:1;16385:404:9;11607:67:1;-1:-1:-1;;;;;11696:24:1;;;;;;:16;:24;;;;;;;;11695:25;:57;;;;-1:-1:-1;;;;;;11725:27:1;;;;;;:16;:27;;;;;;;;11724:28;11695:57;11691:151;;;11789:6;;11779;:16;;11771:71;;;;-1:-1:-1;;;11771:71:1;;16996:2:9;11771:71:1;;;16978:21:9;17035:2;17015:18;;;17008:30;17074:34;17054:18;;;17047:62;-1:-1:-1;;;17125:18:9;;;17118:40;17175:19;;11771:71:1;16794:406:9;11771:71:1;11905:4;11859:25;5322:16;;;:8;:16;;;;;;11931;;;;;;;11930:17;:42;;;;-1:-1:-1;11951:21:1;;;;;;;11930:42;:67;;;;-1:-1:-1;;;;;;11977:20:1;;;;;;:12;:20;;;;;;;;11976:21;11930:67;:111;;;;;12025:16;;12001:20;:40;;11930:111;11926:353;;;12079:25;;;;;;;12075:131;;;12150:56;12154:6;12162:43;12166:20;12188:16;;12162:3;:43::i;:::-;12150:3;:56::i;:::-;12127:79;;12075:131;12227:36;12242:20;12227:14;:36::i;:::-;-1:-1:-1;;;;;12355:16:1;;;;;;:8;:16;;;;;;12345:26;;;12337:67;;;;-1:-1:-1;;;12337:67:1;;16230:2:9;12337:67:1;;;16212:21:9;16269:2;16249:18;;;16242:30;16308;16288:18;;;16281:58;16356:18;;12337:67:1;16028:352:9;12337:67:1;-1:-1:-1;;;;;12423:16:1;;;;;;:8;:16;;;;;;;;:26;;;;;;;12501:11;:19;;;;;;;;;:45;;-1:-1:-1;;;;;;12524:22:1;;;;;;:11;:22;;;;;;;;12501:45;12500:93;;12559:34;12567:6;12575:9;12586:6;12559:7;:34::i;:::-;12500:93;;;12550:6;12500:93;-1:-1:-1;;;;;12615:30:1;;;;;;:19;:30;;;;;;12481:112;;-1:-1:-1;12615:30:1;;12610:175;;12710:9;;12695:11;12672:20;12682:9;-1:-1:-1;;;;;5322:16:1;5293:4;5322:16;;;:8;:16;;;;;;;5228:118;12672:20;:34;;;;:::i;:::-;:47;;12664:121;;;;-1:-1:-1;;;12664:121:1;;17407:2:9;12664:121:1;;;17389:21:9;17446:2;17426:18;;;17419:30;17485:34;17465:18;;;17458:62;17556:31;17536:18;;;17529:59;17605:19;;12664:121:1;17205:425:9;12664:121:1;-1:-1:-1;;;;;12802:19:1;;;;;;:8;:19;;;;;:34;;12825:11;;12802:19;:34;;12825:11;;12802:34;:::i;:::-;;;;;;;;12875:9;-1:-1:-1;;;;;12858:40:1;12867:6;-1:-1:-1;;;;;12858:40:1;;12886:11;12858:40;;;;2404:25:9;;2392:2;2377:18;;2258:177;12858:40:1;;;;;;;;12920:4;12913:11;;;;;;2419:187:8;2492:16;2511:6;;-1:-1:-1;;;;;2527:17:8;;;-1:-1:-1;;;;;;2527:17:8;;;;;;2559:40;;2511:6;;;;;;;2559:40;;2492:16;2559:40;2482:124;2419:187;:::o;15068:104:1:-;15119:4;15154:1;15149;:6;;15148:16;;15163:1;15148:16;;;-1:-1:-1;15159:1:1;15141:23;-1:-1:-1;15068:104:1:o;12951:557::-;3314:16;:23;;-1:-1:-1;;3314:23:1;;;;;13024:24:::1;13041:6:::0;13024:16:::1;:24::i;:::-;13156:8;:18:::0;13081:21:::1;::::0;13059:19:::1;::::0;13178:5:::1;::::0;13139:35:::1;::::0;13081:21;13139:35:::1;:::i;:::-;13138:45;;;;:::i;:::-;13115:68;;13194:22;13261:5;13237:8;:20;;;13220:14;:37;;;;:::i;:::-;13219:47;;;;:::i;:::-;13194:72:::0;-1:-1:-1;13283:19:1;;13279:102:::1;;13341:12;:22:::0;13317:64:::1;::::0;-1:-1:-1;;;;;13341:22:1::1;13365:15:::0;13317:23:::1;:64::i;:::-;13396:21:::0;;13392:108:::1;;13456:24:::0;;13432:68:::1;::::0;-1:-1:-1;;;;;13456:24:1::1;13482:17:::0;13432:23:::1;:68::i;:::-;-1:-1:-1::0;;3360:16:1;:24;;-1:-1:-1;;3360:24:1;;;-1:-1:-1;;12951:557:1:o;13961:603::-;-1:-1:-1;;;;;14101:20:1;;14044:4;14101:20;;;:12;:20;;;;;;14044:4;;14101:20;;14097:256;;;14158:4;:10;14172:5;;14149:19;;:6;:19;:::i;:::-;14148:29;;;;:::i;:::-;14136:41;;14097:256;;;-1:-1:-1;;;;;14197:23:1;;;;;;:12;:23;;;;;;;;14193:160;;;14257:11;;14272:5;;14248:20;;:6;:20;:::i;14193:160::-;14328:16;;14348:5;;14319:25;;:6;:25;:::i;:::-;14318:35;;;;:::i;:::-;14306:47;;14193:160;14370:13;;14366:153;;14426:4;14409:23;;;;:8;:23;;;;;:36;;14436:9;;14409:23;:36;;14436:9;;14409:36;:::i;:::-;;;;-1:-1:-1;;14465:42:1;;2404:25:9;;;14490:4:1;;-1:-1:-1;;;;;14465:42:1;;;;;2392:2:9;2377:18;14465:42:1;;;;;;;14366:153;14538:18;14547:9;14538:6;:18;:::i;:::-;14531:25;13961:603;-1:-1:-1;;;;;13961:603:1:o;13516:437::-;13603:16;;;13617:1;13603:16;;;;;;;;13579:21;;13603:16;;;;;;;;;;-1:-1:-1;13603:16:1;13579:40;;13648:4;13630;13635:1;13630:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13630:23:1;;;:7;;;;;;;;;;:23;;;;13674:9;;:16;;;-1:-1:-1;;;13674:16:1;;;;:9;;;;;:14;;:16;;;;;13630:7;;13674:16;;;;;:9;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13664:4;13669:1;13664:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13664:26:1;;;:7;;;;;;;;;:26;13707:9;;:109;;-1:-1:-1;;;13707:109:1;;:9;;;:60;;:109;;13768:6;;13707:9;;13779:4;;13793;;13800:15;;13707:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13703:243;;13928:7;13516:437;:::o;13703:243::-;13846:30;13863:6;13871:4;13846:30;;;;;;;:::i;:::-;;;;;;;;13568:385;13516:437;:::o;10525:230::-;-1:-1:-1;;;;;10630:23:1;;10622:77;;;;-1:-1:-1;;;10622:77:1;;19660:2:9;10622:77:1;;;19642:21:9;19699:2;19679:18;;;19672:30;19738:34;19718:18;;;19711:62;-1:-1:-1;;;19789:18:9;;;19782:39;19838:19;;10622:77:1;19458:405:9;10622:77:1;10712:35;;-1:-1:-1;;;;;10712:14:1;;;10735:6;;10712:35;;;;10735:6;10712:14;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10525:230;;:::o;222:131:9:-;-1:-1:-1;;;;;297:31:9;;287:42;;277:70;;343:1;340;333:12;358:134;426:20;;455:31;426:20;455:31;:::i;:::-;358:134;;;:::o;497:456::-;574:6;582;590;643:2;631:9;622:7;618:23;614:32;611:52;;;659:1;656;649:12;611:52;698:9;685:23;717:31;742:5;717:31;:::i;:::-;767:5;-1:-1:-1;824:2:9;809:18;;796:32;837:33;796:32;837:33;:::i;:::-;497:456;;889:7;;-1:-1:-1;;;943:2:9;928:18;;;;915:32;;497:456::o;958:548::-;1070:4;1099:2;1128;1117:9;1110:21;1160:6;1154:13;1203:6;1198:2;1187:9;1183:18;1176:34;1228:1;1238:140;1252:6;1249:1;1246:13;1238:140;;;1347:14;;;1343:23;;1337:30;1313:17;;;1332:2;1309:26;1302:66;1267:10;;1238:140;;;1242:3;1427:1;1422:2;1413:6;1402:9;1398:22;1394:31;1387:42;1497:2;1490;1486:7;1481:2;1473:6;1469:15;1465:29;1454:9;1450:45;1446:54;1438:62;;;;958:548;;;;:::o;1746:315::-;1814:6;1822;1875:2;1863:9;1854:7;1850:23;1846:32;1843:52;;;1891:1;1888;1881:12;1843:52;1930:9;1917:23;1949:31;1974:5;1949:31;:::i;:::-;1999:5;2051:2;2036:18;;;;2023:32;;-1:-1:-1;;;1746:315:9:o;2440:118::-;2526:5;2519:13;2512:21;2505:5;2502:32;2492:60;;2548:1;2545;2538:12;2563:128;2628:20;;2657:28;2628:20;2657:28;:::i;2696:382::-;2761:6;2769;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;2877:9;2864:23;2896:31;2921:5;2896:31;:::i;:::-;2946:5;-1:-1:-1;3003:2:9;2988:18;;2975:32;3016:30;2975:32;3016:30;:::i;:::-;3065:7;3055:17;;;2696:382;;;;;:::o;3083:247::-;3142:6;3195:2;3183:9;3174:7;3170:23;3166:32;3163:52;;;3211:1;3208;3201:12;3163:52;3250:9;3237:23;3269:31;3294:5;3269:31;:::i;3335:180::-;3394:6;3447:2;3435:9;3426:7;3422:23;3418:32;3415:52;;;3463:1;3460;3453:12;3415:52;-1:-1:-1;3486:23:9;;3335:180;-1:-1:-1;3335:180:9:o;3773:127::-;3834:10;3829:3;3825:20;3822:1;3815:31;3865:4;3862:1;3855:15;3889:4;3886:1;3879:15;3905:1191;3995:6;4003;4056:2;4044:9;4035:7;4031:23;4027:32;4024:52;;;4072:1;4069;4062:12;4024:52;4112:9;4099:23;4141:18;4182:2;4174:6;4171:14;4168:34;;;4198:1;4195;4188:12;4168:34;4236:6;4225:9;4221:22;4211:32;;4281:7;4274:4;4270:2;4266:13;4262:27;4252:55;;4303:1;4300;4293:12;4252:55;4339:2;4326:16;4361:4;4384:2;4380;4377:10;4374:36;;;4390:18;;:::i;:::-;4436:2;4433:1;4429:10;4468:2;4462:9;4531:2;4527:7;4522:2;4518;4514:11;4510:25;4502:6;4498:38;4586:6;4574:10;4571:22;4566:2;4554:10;4551:18;4548:46;4545:72;;;4597:18;;:::i;:::-;4633:2;4626:22;4683:18;;;4717:15;;;;-1:-1:-1;4759:11:9;;;4755:20;;;4787:19;;;4784:39;;;4819:1;4816;4809:12;4784:39;4843:11;;;;4863:148;4879:6;4874:3;4871:15;4863:148;;;4945:23;4964:3;4945:23;:::i;:::-;4933:36;;4896:12;;;;4989;;;;4863:148;;;5030:6;-1:-1:-1;5055:35:9;;-1:-1:-1;5071:18:9;;;5055:35;:::i;:::-;5045:45;;;;;;3905:1191;;;;;:::o;5101:248::-;5169:6;5177;5230:2;5218:9;5209:7;5205:23;5201:32;5198:52;;;5246:1;5243;5236:12;5198:52;-1:-1:-1;;5269:23:9;;;5339:2;5324:18;;;5311:32;;-1:-1:-1;5101:248:9:o;5678:241::-;5734:6;5787:2;5775:9;5766:7;5762:23;5758:32;5755:52;;;5803:1;5800;5793:12;5755:52;5842:9;5829:23;5861:28;5883:5;5861:28;:::i;5924:388::-;5992:6;6000;6053:2;6041:9;6032:7;6028:23;6024:32;6021:52;;;6069:1;6066;6059:12;6021:52;6108:9;6095:23;6127:31;6152:5;6127:31;:::i;:::-;6177:5;-1:-1:-1;6234:2:9;6219:18;;6206:32;6247:33;6206:32;6247:33;:::i;6317:316::-;6394:6;6402;6410;6463:2;6451:9;6442:7;6438:23;6434:32;6431:52;;;6479:1;6476;6469:12;6431:52;-1:-1:-1;;6502:23:9;;;6572:2;6557:18;;6544:32;;-1:-1:-1;6623:2:9;6608:18;;;6595:32;;6317:316;-1:-1:-1;6317:316:9:o;6979:400::-;7181:2;7163:21;;;7220:2;7200:18;;;7193:30;7259:34;7254:2;7239:18;;7232:62;-1:-1:-1;;;7325:2:9;7310:18;;7303:34;7369:3;7354:19;;6979:400::o;7663:245::-;7730:6;7783:2;7771:9;7762:7;7758:23;7754:32;7751:52;;;7799:1;7796;7789:12;7751:52;7831:9;7825:16;7850:28;7872:5;7850:28;:::i;7913:380::-;7992:1;7988:12;;;;8035;;;8056:61;;8110:4;8102:6;8098:17;8088:27;;8056:61;8163:2;8155:6;8152:14;8132:18;8129:38;8126:161;;8209:10;8204:3;8200:20;8197:1;8190:31;8244:4;8241:1;8234:15;8272:4;8269:1;8262:15;8298:127;8359:10;8354:3;8350:20;8347:1;8340:31;8390:4;8387:1;8380:15;8414:4;8411:1;8404:15;8430:128;8497:9;;;8518:11;;;8515:37;;;8532:18;;:::i;8563:217::-;8603:1;8629;8619:132;;8673:10;8668:3;8664:20;8661:1;8654:31;8708:4;8705:1;8698:15;8736:4;8733:1;8726:15;8619:132;-1:-1:-1;8765:9:9;;8563:217::o;10087:127::-;10148:10;10143:3;10139:20;10136:1;10129:31;10179:4;10176:1;10169:15;10203:4;10200:1;10193:15;10626:125;10691:9;;;10712:10;;;10709:36;;;10725:18;;:::i;17635:168::-;17708:9;;;17739;;17756:15;;;17750:22;;17736:37;17726:71;;17777:18;;:::i;17808:251::-;17878:6;17931:2;17919:9;17910:7;17906:23;17902:32;17899:52;;;17947:1;17944;17937:12;17899:52;17979:9;17973:16;17998:31;18023:5;17998:31;:::i;18064:465::-;18117:3;18155:5;18149:12;18182:6;18177:3;18170:19;18208:4;18237;18232:3;18228:14;18221:21;;18276:4;18269:5;18265:16;18299:1;18309:195;18323:6;18320:1;18317:13;18309:195;;;18388:13;;-1:-1:-1;;;;;18384:39:9;18372:52;;18444:12;;;;18479:15;;;;18420:1;18338:9;18309:195;;;-1:-1:-1;18520:3:9;;18064:465;-1:-1:-1;;;;;18064:465:9:o;18534:582::-;18833:6;18822:9;18815:25;18876:6;18871:2;18860:9;18856:18;18849:34;18919:3;18914:2;18903:9;18899:18;18892:31;18796:4;18940:57;18992:3;18981:9;18977:19;18969:6;18940:57;:::i;:::-;-1:-1:-1;;;;;19033:32:9;;;;19028:2;19013:18;;19006:60;-1:-1:-1;19097:3:9;19082:19;19075:35;18932:65;18534:582;-1:-1:-1;;;18534:582:9:o;19121:332::-;19328:6;19317:9;19310:25;19371:2;19366;19355:9;19351:18;19344:30;19291:4;19391:56;19443:2;19432:9;19428:18;19420:6;19391:56;:::i

Swarm Source

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