ETH Price: $3,418.81 (-2.26%)
Gas: 6 Gwei

Token

Foundation (FND)
 

Overview

Max Total Supply

100,000,000,000 FND

Holders

230

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 7 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Foundation

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//███████╗░█████╗░██╗░░░██╗███╗░░██╗██████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗
//██╔════╝██╔══██╗██║░░░██║████╗░██║██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║
//█████╗░░██║░░██║██║░░░██║██╔██╗██║██║░░██║███████║░░░██║░░░██║██║░░██║██╔██╗██║
//██╔══╝░░██║░░██║██║░░░██║██║╚████║██║░░██║██╔══██║░░░██║░░░██║██║░░██║██║╚████║
//██║░░░░░╚█████╔╝╚██████╔╝██║░╚███║██████╔╝██║░░██║░░░██║░░░██║╚█████╔╝██║░╚███║
//╚═╝░░░░░░╚════╝░░╚═════╝░╚═╝░░╚══╝╚═════╝░╚═╝░░╚═╝░░░╚═╝░░░╚═╝░╚════╝░╚═╝░░╚══╝

//████████╗░█████╗░██╗░░██╗███████╗███╗░░██╗
//╚══██╔══╝██╔══██╗██║░██╔╝██╔════╝████╗░██║
//░░░██║░░░██║░░██║█████═╝░█████╗░░██╔██╗██║
//░░░██║░░░██║░░██║██╔═██╗░██╔══╝░░██║╚████║
//░░░██║░░░╚█████╔╝██║░╚██╗███████╗██║░╚███║
//░░░╚═╝░░░░╚════╝░╚═╝░░╚═╝╚══════╝╚═╝░░╚══╝



// https://t.me/Foundation_Token
// https://foundationtoken.io/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapRouter02 is IUniswapRouter01 {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transfer.selector, to, value)
        );
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.approve.selector, spender, value)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(
                oldAllowance >= value,
                "SafeERC20: decreased allowance below zero"
            );
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(
                token,
                abi.encodeWithSelector(
                    token.approve.selector,
                    spender,
                    newAllowance
                )
            );
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(
            data,
            "SafeERC20: low-level call failed"
        );
        if (returndata.length > 0) {
            // Return data is optional
            require(
                abi.decode(returndata, (bool)),
                "SafeERC20: ERC20 operation did not succeed"
            );
        }
    }
}

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface uniswapV2Pair {
    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );
}

contract Foundation is ERC20, Ownable {
    address payable public marketingFeeAddress;
    address payable public devFeeAddress;

    address public immutable deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public maxWallet;
    uint16 constant maxFeeLimit = 300;

    bool public tradingActive;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromMaxWallet;

    // these values are pretty much arbitrary since they get overwritten for every txn, but the placeholders make it easier to work with current contract.
    uint256 private _devFee;
    uint256 private _previousDevFee;

    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;

    uint256 private _marketingFee;
    uint256 private _previousMarketingFee;

    uint256 private _burnFee;
    uint256 private _previousBurnFee;

    uint16 public buyDevFee = 5;
    uint16 public buyLiquidityFee = 20;
    uint16 public buyMarketingFee = 20;
    uint16 public buyBurnFee = 5;

    uint16 public sellDevFee = 5;
    uint16 public sellLiquidityFee = 20;
    uint16 public sellMarketingFee = 20;
    uint16 public sellBurnFee = 5;

    uint16 public transferDevFee = 0;
    uint16 public transferLiquidityFee = 0;
    uint16 public transferMarketingFee = 0;
    uint16 public transferBurnFee = 0;

    uint256 private _liquidityTokensToSwap;
    uint256 private _marketingFeeTokensToSwap;
    uint256 private _devFeeTokens;
    uint256 private _burnFeeTokens;

    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 public minimumFeeTokensToTake;

    IUniswapRouter02 public immutable uniswapRouter;
    address public immutable uniswapPair;

    bool inSwapAndLiquify;

    address public bridge = address(0x123);

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

    constructor() ERC20("Foundation", "FND") {
        _mint(msg.sender, 1e11 * 10**decimals());
        
        marketingFeeAddress = payable(
            0xE91aC95e2631DcE9ee2f52b363eF7F79D2903d5a
        );
        devFeeAddress = payable(0xcbffC68A35Cf6391B003f11E85D2820a32F2387F);

        minimumFeeTokensToTake = 1e9 * 10**decimals();
        address routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        //address routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        uniswapRouter = IUniswapRouter02(payable(routerAddress));

        uniswapPair = IFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );

        isExcludedFromFee[_msgSender()] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[marketingFeeAddress] = true;
        isExcludedFromFee[devFeeAddress] = true;
        maxWallet = totalSupply() * 2 / 100;
        _approve(msg.sender, routerAddress, ~uint256(0));
        _setAutomatedMarketMakerPair(uniswapPair, true);
        bridge = 0x27F63B82e68c21452247Ba65b87c4f0Fb7508f44;
        isExcludedFromFee[bridge] = true;
        isExcludedFromMaxWallet[bridge] = true;
    }

    function setBridge(address _bridge) external onlyOwner {
        bridge = _bridge;
        isExcludedFromFee[bridge] = true;
        isExcludedFromMaxWallet[bridge] = true;
    }

    function setMaxWallet(uint256 _maxWallet) external onlyOwner {
        maxWallet = _maxWallet * 10**decimals();
        require(maxWallet > totalSupply() / 100, "Max wallet must be greater than 1%");
    }

    function decimals() public pure override returns (uint8) {
        return 7;
    }

    function bridgeBalance() public view returns (uint256) {
        return _balances[bridge];
    }

    function totalSupply() public view override returns (uint256) {
        return super.totalSupply() - bridgeBalance();
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (account == bridge) {
            return 0;
        }
        return super.balanceOf(account);
    }

    function setTradeStatus(bool status) external onlyOwner {
        tradingActive = status;
    }

    function updateMinimumTokensBeforeFeeTaken(uint256 _minimumFeeTokensToTake)
        external
        onlyOwner
    {
        minimumFeeTokensToTake = _minimumFeeTokensToTake * (10**decimals());
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(pair != uniswapPair, "The pair cannot be removed");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

    function excludeFromFee(address account) external onlyOwner {
        isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        isExcludedFromFee[account] = false;
    }
    
    function excludeFromMaxWallet(address account) external onlyOwner {
        isExcludedFromMaxWallet[account] = true;
    }

    function includeInMaxWallet(address account) external onlyOwner {
        isExcludedFromMaxWallet[account] = false;
    }

    function updateBuyFee(
        uint16 _buyDevFee,
        uint16 _buyLiquidityFee,
        uint16 _buyMarketingFee,
        uint16 _buyBurnFee
    ) external onlyOwner {
        buyDevFee = _buyDevFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyMarketingFee = _buyMarketingFee;
        buyBurnFee = _buyBurnFee;
        require(
            _buyDevFee + _buyLiquidityFee + _buyMarketingFee + _buyBurnFee <=
                maxFeeLimit,
            "Must keep fees below 30%"
        );
    }

    function updateSellFee(
        uint16 _sellDevFee,
        uint16 _sellLiquidityFee,
        uint16 _sellMarketingFee,
        uint16 _sellBurnFee
    ) external onlyOwner {
        sellDevFee = _sellDevFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellMarketingFee = _sellMarketingFee;
        sellBurnFee = _sellBurnFee;
        require(
            _sellDevFee + _sellLiquidityFee + _sellMarketingFee + _sellBurnFee <=
                maxFeeLimit,
            "Must keep fees <= 30%"
        );
    }

    function updateTransferFee(
        uint16 _transferDevFee,
        uint16 _transferLiquidityFee,
        uint16 _transferMarketingFee,
        uint16 _transferBurnFee
    ) external onlyOwner {
        transferDevFee = _transferDevFee;
        transferLiquidityFee = _transferLiquidityFee;
        transferMarketingFee = _transferMarketingFee;
        transferBurnFee = _transferBurnFee;
        require(
            _transferDevFee +
                _transferLiquidityFee +
                _transferMarketingFee + _transferBurnFee <= maxFeeLimit,
            "Must keep fees <= 30%"
        );
    }

    function updateMarketingFeeAddress(address a) external onlyOwner {
        require(a != address(0), "Can't set 0");
        marketingFeeAddress = payable(a);
    }

    function updateDevAddress(address a) external onlyOwner {
        require(a != address(0), "Can't set 0");
        devFeeAddress = payable(a);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (!tradingActive) {
            require(
                isExcludedFromFee[from] || isExcludedFromFee[to],
                "Trading is not active yet."
            );
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumFeeTokensToTake;

        // Take Fee
        if (
            !inSwapAndLiquify &&
            overMinimumTokenBalance &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }

        removeAllFee();

        // If any account belongs to isExcludedFromFee account then remove the fee
        if (!isExcludedFromFee[from] && !isExcludedFromFee[to]) {
            // High tax period

            // Buy
            if (automatedMarketMakerPairs[from]) {
                _devFee = (amount * buyDevFee) / 1000;
                _liquidityFee = (amount * buyLiquidityFee) / 1000;
                _marketingFee = (amount * buyMarketingFee) / 1000;
                _burnFee = (amount * buyBurnFee) / 1000;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {

                _devFee = (amount * sellDevFee) / 1000;
                _liquidityFee = (amount * sellLiquidityFee) / 1000;
                _marketingFee = (amount * sellMarketingFee) / 1000;
                _burnFee = (amount * sellBurnFee) / 1000;
            } else {
                _devFee = (amount * transferDevFee) / 1000;
                _liquidityFee = (amount * transferLiquidityFee) / 1000;
                _marketingFee = (amount * transferMarketingFee) / 1000;
                _burnFee = (amount * transferBurnFee) / 1000;
            }
        }

        uint256 _transferAmount = amount -
            _devFee -
            _liquidityFee -
            _marketingFee -
            _burnFee;
        super._transfer(from, to, _transferAmount);
        if (!isExcludedFromFee[from] && !isExcludedFromFee[to] && to != deadWallet && !automatedMarketMakerPairs[to] && !isExcludedFromMaxWallet[to]) {
            require(balanceOf(to) <= maxWallet, "Max wallet limit reached");
        }

        uint256 _feeTotal = _devFee + _liquidityFee + _marketingFee + _burnFee;
        if (_feeTotal > 0) {
            super._transfer(from, address(this), _feeTotal);
            _liquidityTokensToSwap += _liquidityFee;
            _marketingFeeTokensToSwap += _marketingFee;
            _devFeeTokens += _devFee;
            _burnFeeTokens += _burnFee;
        }
        restoreAllFee();
    }

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

        _previousDevFee = _devFee;
        _previousLiquidityFee = _liquidityFee;
        _previousMarketingFee = _marketingFee;
        _previousBurnFee = _burnFee;

        _devFee = 0;
        _liquidityFee = 0;
        _marketingFee = 0;
        _burnFee = 0;
    }

    function restoreAllFee() private {
        _devFee = _previousDevFee;
        _liquidityFee = _previousLiquidityFee;
        _marketingFee = _previousMarketingFee;
        _burnFee = _previousBurnFee;
    }

    function takeFee() private lockTheSwap {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensTaken = _liquidityTokensToSwap +
            _marketingFeeTokensToSwap +
            _devFeeTokens;
        if (totalTokensTaken == 0 || contractBalance - _burnFeeTokens < totalTokensTaken) {
            return;
        }

        uint256 tokensForLiquidity = _liquidityTokensToSwap / 2;
        uint256 initialETHBalance = address(this).balance;
        uint256 toSwap = tokensForLiquidity +
            _marketingFeeTokensToSwap +
            _devFeeTokens;
        swapTokensForETH(toSwap);
        uint256 ethBalance = address(this).balance - initialETHBalance;

        uint256 ethForMarketing = (ethBalance * _marketingFeeTokensToSwap) /
            toSwap;
        uint256 ethForLiquidity = (ethBalance * tokensForLiquidity) / toSwap;
        uint256 ethForDev = (ethBalance * _devFeeTokens) / toSwap;

        if (tokensForLiquidity > 0 && ethForLiquidity > 0) {
            addLiquidity(tokensForLiquidity, ethForLiquidity);
        }
        bool success;

        (success, ) = address(marketingFeeAddress).call{
            value: ethForMarketing,
            gas:50000
        }("");
        (success, ) = address(devFeeAddress).call{
            value: ethForDev,
            gas:50000
        }("");

        // send burn tokens to dead wallet
        if (_burnFeeTokens > 0) {
            super._transfer(address(this), deadWallet, _burnFeeTokens);
        }

        _liquidityTokensToSwap = 0;
        _marketingFeeTokensToSwap = 0;
        _devFeeTokens = 0;
        _burnFeeTokens = 0;
    }

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapRouter), tokenAmount);
        uniswapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    receive() external payable {}
 
    function withdrawETH() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function withdrawTokens(IERC20 tokenAddress, address walletAddress)
        external
        onlyOwner
    {
        require(
            walletAddress != address(0),
            "walletAddress can't be 0 address"
        );
        SafeERC20.safeTransfer(
            tokenAddress,
            walletAddress,
            tokenAddress.balanceOf(address(this))
        );
    }
}

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":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":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumFeeTokensToTake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setTradeStatus","outputs":[],"stateMutability":"nonpayable","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":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferBurnFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferDevFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyDevFee","type":"uint16"},{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyBurnFee","type":"uint16"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"updateMarketingFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumFeeTokensToTake","type":"uint256"}],"name":"updateMinimumTokensBeforeFeeTaken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellDevFee","type":"uint16"},{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_sellBurnFee","type":"uint16"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_transferDevFee","type":"uint16"},{"internalType":"uint16","name":"_transferLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_transferMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_transferBurnFee","type":"uint16"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"address","name":"walletAddress","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e060405261dead608052601480546001600160c01b0319166e050014001400050005001400140005179055601b805462012300610100600160a81b03199091161790553480156200005057600080fd5b506040518060400160405280600a8152602001692337bab73230ba34b7b760b11b8152506040518060400160405280600381526020016211939160ea1b8152508160039081620000a1919062000760565b506004620000b0828262000760565b505050620000cd620000c76200040460201b60201c565b62000408565b620000f733620000e06007600a62000941565b620000f19064174876e80062000959565b6200045a565b600680546001600160a01b031990811673e91ac95e2631dce9ee2f52b363ef7f79d2903d5a179091556007805490911673cbffc68a35cf6391b003f11e85d2820a32f2387f17905562000148600790565b6200015590600a62000941565b6200016590633b9aca0062000959565b601a55737a250d5630b4cf539739df2c5dacb4c659f2488d60a08190526040805163c45a015560e01b81529051829163c45a01559160048083019260209291908290030181865afa158015620001bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e5919062000973565b6001600160a01b031663c9c653963060a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025b919062000973565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cf919062000973565b6001600160a01b0390811660c052336000908152600a60205260408082208054600160ff199182168117909255308452828420805482168317905560065485168452828420805482168317905560075490941683529120805490921617905560646200033a62000543565b6200034790600262000959565b6200035391906200099e565b60085562000365338260001962000589565b60c0516001600160a01b03166000908152601960205260409020805460ff1916600117905550601b8054610100600160a81b0319167427f63b82e68c21452247ba65b87c4f0fb7508f4400178082556001600160a01b036101009182900481166000908152600a60209081526040808320805460ff1990811660019081179092559654959095049093168252600b9052208054909216179055620009ed565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004b65760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004ca9190620009c1565b90915550506001600160a01b03821660009081526020819052604081208054839290620004f9908490620009c1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b601b5461010090046001600160a01b031660009081526020819052604081205462000578620006b660201b620017051760201c565b620005849190620009d7565b905090565b6001600160a01b038316620005ed5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620004ad565b6001600160a01b038216620006505760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620004ad565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b60025490565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620006e757607f821691505b6020821081036200070857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006b157600081815260208120601f850160051c81016020861015620007375750805b601f850160051c820191505b81811015620007585782815560010162000743565b505050505050565b81516001600160401b038111156200077c576200077c620006bc565b62000794816200078d8454620006d2565b846200070e565b602080601f831160018114620007cc5760008415620007b35750858301515b600019600386901b1c1916600185901b17855562000758565b600085815260208120601f198616915b82811015620007fd57888601518255948401946001909101908401620007dc565b50858210156200081c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620008835781600019048211156200086757620008676200082c565b808516156200087557918102915b93841c939080029062000847565b509250929050565b6000826200089c575060016200093b565b81620008ab575060006200093b565b8160018114620008c45760028114620008cf57620008ef565b60019150506200093b565b60ff841115620008e357620008e36200082c565b50506001821b6200093b565b5060208310610133831016604e8410600b841016171562000914575081810a6200093b565b62000920838362000842565b80600019048211156200093757620009376200082c565b0290505b92915050565b60006200095260ff8416836200088b565b9392505050565b80820281158282048414176200093b576200093b6200082c565b6000602082840312156200098657600080fd5b81516001600160a01b03811681146200095257600080fd5b600082620009bc57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200093b576200093b6200082c565b818103818111156200093b576200093b6200082c565b60805160a05160c051612db762000a55600039600081816109b501526112c401526000818161070801528181612468015281816125210152818161255d015281816125d701526125fe01526000818161077f01528181611c8c01526120c40152612db76000f3fe60806040526004361061036f5760003560e01c806385c5b319116101c6578063bbc0c742116100f7578063e71dc3f511610095578063f11a24d31161006f578063f11a24d314610aa9578063f2fde38b14610aca578063f637434214610aea578063f8b45b0514610b0c57600080fd5b8063e71dc3f514610a42578063e78cea9214610a64578063ea2f0b3714610a8957600080fd5b8063c85817f9116100d1578063c85817f9146109d7578063dc9c30ca146109ed578063dd62ed3e14610a0d578063e086e5ec14610a2d57600080fd5b8063bbc0c74214610969578063c090709914610983578063c816841b146109a357600080fd5b80639c3b4fdc11610164578063a522ad251161013e578063a522ad25146108d7578063a9059cbb146108f7578063adb873bd14610917578063b62496f51461093957600080fd5b80639c3b4fdc1461087a578063a0d82dc514610895578063a457c2d7146108b757600080fd5b806392136913116101a0578063921369131461080157806395d89b41146108235780639a7a23d6146108385780639bb19a321461085857600080fd5b806385c5b319146107a15780638da5cb5b146107c35780638dd14802146107e157600080fd5b8063437823ec116102a05780636ebcf6071161023e578063735de9f711610218578063735de9f7146106f65780637bce5a041461072a578063850337621461074d57806385141a771461076d57600080fd5b80636ebcf6071461069457806370a08231146106c1578063715018a6146106e157600080fd5b80635b700d911161027a5780635b700d91146106045780635d0044ca14610624578063660d0af4146106445780636dd3d39f1461066457600080fd5b8063437823ec1461059457806352664423146105b45780635342acb4146105d457600080fd5b8063300ea7821161030d57806339509351116102e757806339509351146105005780633b1f6a01146105205780633f33e90914610552578063434339f31461057257600080fd5b8063300ea782146104a4578063313ce567146104c4578063392d6af7146104e057600080fd5b806318160ddd1161034957806318160ddd1461040a5780631c8a6adc1461042d578063239bda491461046257806323b872dd1461048457600080fd5b8063053e39a31461037b57806306fdde03146103b8578063095ea7b3146103da57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060065461039b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103c457600080fd5b506103cd610b22565b6040516103af919061287c565b3480156103e657600080fd5b506103fa6103f53660046128c4565b610bb4565b60405190151581526020016103af565b34801561041657600080fd5b5061041f610bce565b6040519081526020016103af565b34801561043957600080fd5b5060145461044f90600160b01b900461ffff1681565b60405161ffff90911681526020016103af565b34801561046e57600080fd5b5061048261047d366004612907565b610c00565b005b34801561049057600080fd5b506103fa61049f36600461295b565b610d04565b3480156104b057600080fd5b506104826104bf3660046129aa565b610d2a565b3480156104d057600080fd5b50604051600781526020016103af565b3480156104ec57600080fd5b506104826104fb366004612907565b610d67565b34801561050c57600080fd5b506103fa61051b3660046128c4565b610e56565b34801561052c57600080fd5b50601b5461010090046001600160a01b031660009081526020819052604090205461041f565b34801561055e57600080fd5b5061048261056d3660046129c7565b610e78565b34801561057e57600080fd5b5060145461044f90600160801b900461ffff1681565b3480156105a057600080fd5b506104826105af3660046129c7565b610ec3565b3480156105c057600080fd5b506104826105cf3660046129e4565b610f11565b3480156105e057600080fd5b506103fa6105ef3660046129c7565b600a6020526000908152604090205460ff1681565b34801561061057600080fd5b5061048261061f3660046129c7565b610f57565b34801561063057600080fd5b5061048261063f3660046129e4565b610fa5565b34801561065057600080fd5b5061048261065f3660046129c7565b61105a565b34801561067057600080fd5b506103fa61067f3660046129c7565b600b6020526000908152604090205460ff1681565b3480156106a057600080fd5b5061041f6106af3660046129c7565b60006020819052908152604090205481565b3480156106cd57600080fd5b5061041f6106dc3660046129c7565b6110ea565b3480156106ed57600080fd5b5061048261112e565b34801561070257600080fd5b5061039b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561073657600080fd5b5060145461044f90640100000000900461ffff1681565b34801561075957600080fd5b506104826107683660046129c7565b611164565b34801561077957600080fd5b5061039b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107ad57600080fd5b5060145461044f90600160a01b900461ffff1681565b3480156107cf57600080fd5b506005546001600160a01b031661039b565b3480156107ed57600080fd5b506104826107fc3660046129c7565b6111f4565b34801561080d57600080fd5b5060145461044f90600160601b900461ffff1681565b34801561082f57600080fd5b506103cd611289565b34801561084457600080fd5b506104826108533660046129fd565b611298565b34801561086457600080fd5b5060145461044f90600160901b900461ffff1681565b34801561088657600080fd5b5060145461044f9061ffff1681565b3480156108a157600080fd5b5060145461044f90600160401b900461ffff1681565b3480156108c357600080fd5b506103fa6108d23660046128c4565b61136f565b3480156108e357600080fd5b506104826108f2366004612a36565b6113f5565b34801561090357600080fd5b506103fa6109123660046128c4565b6114ea565b34801561092357600080fd5b5060145461044f90600160701b900461ffff1681565b34801561094557600080fd5b506103fa6109543660046129c7565b60196020526000908152604090205460ff1681565b34801561097557600080fd5b506009546103fa9060ff1681565b34801561098f57600080fd5b5060075461039b906001600160a01b031681565b3480156109af57600080fd5b5061039b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156109e357600080fd5b5061041f601a5481565b3480156109f957600080fd5b50610482610a08366004612907565b6114f8565b348015610a1957600080fd5b5061041f610a28366004612a36565b611594565b348015610a3957600080fd5b506104826115bf565b348015610a4e57600080fd5b5060145461044f90600160301b900461ffff1681565b348015610a7057600080fd5b50601b5461039b9061010090046001600160a01b031681565b348015610a9557600080fd5b50610482610aa43660046129c7565b611622565b348015610ab557600080fd5b5060145461044f9062010000900461ffff1681565b348015610ad657600080fd5b50610482610ae53660046129c7565b61166d565b348015610af657600080fd5b5060145461044f90600160501b900461ffff1681565b348015610b1857600080fd5b5061041f60085481565b606060038054610b3190612a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d90612a64565b8015610baa5780601f10610b7f57610100808354040283529160200191610baa565b820191906000526020600020905b815481529060010190602001808311610b8d57829003601f168201915b5050505050905090565b600033610bc281858561170b565b60019150505b92915050565b601b5461010090046001600160a01b0316600090815260208190526040812054600254610bfb9190612ab4565b905090565b6005546001600160a01b03163314610c335760405162461bcd60e51b8152600401610c2a90612ac7565b60405180910390fd5b6014805463ffffffff60801b1916600160801b61ffff8781169190910261ffff60901b191691909117600160901b868316021763ffffffff60a01b1916600160a01b8583160261ffff60b01b191617600160b01b9184169190910217905561012c8183610ca08688612afc565b610caa9190612afc565b610cb49190612afc565b61ffff161115610cfe5760405162461bcd60e51b81526020600482015260156024820152744d757374206b6565702066656573203c3d2033302560581b6044820152606401610c2a565b50505050565b600033610d1285828561182f565b610d1d8585856118a3565b60019150505b9392505050565b6005546001600160a01b03163314610d545760405162461bcd60e51b8152600401610c2a90612ac7565b6009805460ff1916911515919091179055565b6005546001600160a01b03163314610d915760405162461bcd60e51b8152600401610c2a90612ac7565b6014805461ffff86811663ffffffff199092169190911762010000868316021767ffffffff0000000019166401000000008583160267ffff000000000000191617600160301b9184169190910217905561012c8183610df08688612afc565b610dfa9190612afc565b610e049190612afc565b61ffff161115610cfe5760405162461bcd60e51b815260206004820152601860248201527f4d757374206b65657020666565732062656c6f772033302500000000000000006044820152606401610c2a565b600033610bc2818585610e698383611594565b610e739190612b1e565b61170b565b6005546001600160a01b03163314610ea25760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6005546001600160a01b03163314610eed5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6005546001600160a01b03163314610f3b5760405162461bcd60e51b8152600401610c2a90612ac7565b610f476007600a612c15565b610f519082612c24565b601a5550565b6005546001600160a01b03163314610f815760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610c2a90612ac7565b610fdb6007600a612c15565b610fe59082612c24565b6008556064610ff2610bce565b610ffc9190612c3b565b600854116110575760405162461bcd60e51b815260206004820152602260248201527f4d61782077616c6c6574206d7573742062652067726561746572207468616e20604482015261312560f01b6064820152608401610c2a565b50565b6005546001600160a01b031633146110845760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166110c85760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610c2a565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b601b546000906001600160a01b0361010090910481169083160361111057506000919050565b6001600160a01b038216600090815260208190526040902054610bc8565b6005546001600160a01b031633146111585760405162461bcd60e51b8152600401610c2a90612ac7565b6111626000611e37565b565b6005546001600160a01b0316331461118e5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166111d25760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610c2a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461121e5760405162461bcd60e51b8152600401610c2a90612ac7565b601b8054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600a60209081526040808320805460ff1990811660019081179092559554949094049095168252600b90529290922080549091169091179055565b606060048054610b3190612a64565b6005546001600160a01b031633146112c25760405162461bcd60e51b8152600401610c2a90612ac7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036113435760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610c2a565b6001600160a01b0382166000908152601960205260409020805460ff19168215151790555050565b5050565b6000338161137d8286611594565b9050838110156113dd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c2a565b6113ea828686840361170b565b506001949350505050565b6005546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166114755760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610c2a565b6040516370a0823160e01b815230600482015261136b90839083906001600160a01b038316906370a0823190602401602060405180830381865afa1580156114c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e59190612c5d565b611e89565b600033610bc28185856118a3565b6005546001600160a01b031633146115225760405162461bcd60e51b8152600401610c2a90612ac7565b601480546bffffffff00000000000000001916600160401b61ffff8781169190910261ffff60501b191691909117600160501b868316021763ffffffff60601b1916600160601b8583160261ffff60701b191617600160701b9184169190910217905561012c8183610ca08688612afc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146115e95760405162461bcd60e51b8152600401610c2a90612ac7565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611057573d6000803e3d6000fd5b6005546001600160a01b0316331461164c5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6005546001600160a01b031633146116975760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166116fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2a565b61105781611e37565b60025490565b6001600160a01b03831661176d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2a565b6001600160a01b0382166117ce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061183b8484611594565b90506000198114610cfe57818110156118965760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c2a565b610cfe848484840361170b565b60095460ff16611938576001600160a01b0383166000908152600a602052604090205460ff16806118ec57506001600160a01b0382166000908152600a602052604090205460ff165b6119385760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610c2a565b6000611943306110ea565b601a54601b549192508210159060ff1615801561195d5750805b801561198157506001600160a01b03841660009081526019602052604090205460ff165b1561198e5761198e611ee0565b611996612116565b6001600160a01b0385166000908152600a602052604090205460ff161580156119d857506001600160a01b0384166000908152600a602052604090205460ff16155b15611bfd576001600160a01b03851660009081526019602052604090205460ff1615611aa0576014546103e890611a139061ffff1685612c24565b611a1d9190612c3b565b600c556014546103e890611a3b9062010000900461ffff1685612c24565b611a459190612c3b565b600e556014546103e890611a6590640100000000900461ffff1685612c24565b611a6f9190612c3b565b6010556014546103e890611a8e90600160301b900461ffff1685612c24565b611a989190612c3b565b601255611bfd565b6001600160a01b03841660009081526019602052604090205460ff1615611b58576014546103e890611add90600160401b900461ffff1685612c24565b611ae79190612c3b565b600c556014546103e890611b0690600160501b900461ffff1685612c24565b611b109190612c3b565b600e556014546103e890611b2f90600160601b900461ffff1685612c24565b611b399190612c3b565b6010556014546103e890611a8e90600160701b900461ffff1685612c24565b6014546103e890611b7490600160801b900461ffff1685612c24565b611b7e9190612c3b565b600c556014546103e890611b9d90600160901b900461ffff1685612c24565b611ba79190612c3b565b600e556014546103e890611bc690600160a01b900461ffff1685612c24565b611bd09190612c3b565b6010556014546103e890611bef90600160b01b900461ffff1685612c24565b611bf99190612c3b565b6012555b6000601254601054600e54600c5487611c169190612ab4565b611c209190612ab4565b611c2a9190612ab4565b611c349190612ab4565b9050611c41868683612171565b6001600160a01b0386166000908152600a602052604090205460ff16158015611c8357506001600160a01b0385166000908152600a602052604090205460ff16155b8015611cc157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611ce657506001600160a01b03851660009081526019602052604090205460ff16155b8015611d0b57506001600160a01b0385166000908152600b602052604090205460ff16155b15611d6a57600854611d1c866110ea565b1115611d6a5760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c6574206c696d6974207265616368656400000000000000006044820152606401610c2a565b6000601254601054600e54600c54611d829190612b1e565b611d8c9190612b1e565b611d969190612b1e565b90508015611e1157611da9873083612171565b600e5460156000828254611dbd9190612b1e565b909155505060105460168054600090611dd7908490612b1e565b9091555050600c5460178054600090611df1908490612b1e565b909155505060125460188054600090611e0b908490612b1e565b90915550505b611e2e600d54600c55600f54600e55601154601055601354601255565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611edb90849061233f565b505050565b601b805460ff191660011790556000611ef8306110ea565b90506000601754601654601554611f0f9190612b1e565b611f199190612b1e565b9050801580611f3457508060185483611f329190612ab4565b105b15611f4057505061210a565b60006002601554611f519190612c3b565b90506000479050600060175460165484611f6b9190612b1e565b611f759190612b1e565b9050611f8081612411565b6000611f8c8347612ab4565b905060008260165483611f9f9190612c24565b611fa99190612c3b565b9050600083611fb88785612c24565b611fc29190612c3b565b905060008460175485611fd59190612c24565b611fdf9190612c3b565b9050600087118015611ff15750600082115b156120005761200087836125d1565b6006546040516000916001600160a01b03169061c35090869084818181858888f193505050503d8060008114612052576040519150601f19603f3d011682016040523d82523d6000602084013e612057565b606091505b50506007546040519192506001600160a01b03169061c3509084906000818181858888f193505050503d80600081146120ac576040519150601f19603f3d011682016040523d82523d6000602084013e6120b1565b606091505b5050601854909150156120eb576120eb307f0000000000000000000000000000000000000000000000000000000000000000601854612171565b5050600060158190556016819055601781905560185550505050505050505b601b805460ff19169055565b600c541580156121265750600e54155b80156121325750601054155b801561213e5750601254155b1561214557565b600c8054600d55600e8054600f5560108054601155601280546013556000938490559183905582905555565b6001600160a01b0383166121d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c2a565b6001600160a01b0382166122375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c2a565b6001600160a01b038316600090815260208190526040902054818110156122af5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c2a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906122e6908490612b1e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161233291815260200190565b60405180910390a3610cfe565b6000612394826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126d79092919063ffffffff16565b805190915015611edb57808060200190518101906123b29190612c76565b611edb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c2a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061244657612446612c93565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e89190612ca9565b816001815181106124fb576124fb612c93565b60200260200101906001600160a01b031690816001600160a01b031681525050612546307f00000000000000000000000000000000000000000000000000000000000000008461170b565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061259b908590600090869030904290600401612cc6565b600060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b505050505050565b6125fc307f00000000000000000000000000000000000000000000000000000000000000008461170b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806126436005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156126ab573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126d09190612d37565b5050505050565b60606126e684846000856126ee565b949350505050565b60608247101561274f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c2a565b6001600160a01b0385163b6127a65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c2a565b600080866001600160a01b031685876040516127c29190612d65565b60006040518083038185875af1925050503d80600081146127ff576040519150601f19603f3d011682016040523d82523d6000602084013e612804565b606091505b509150915061281482828661281f565b979650505050505050565b6060831561282e575081610d23565b82511561283e5782518084602001fd5b8160405162461bcd60e51b8152600401610c2a919061287c565b60005b8381101561287357818101518382015260200161285b565b50506000910152565b602081526000825180602084015261289b816040850160208701612858565b601f01601f19169190910160400192915050565b6001600160a01b038116811461105757600080fd5b600080604083850312156128d757600080fd5b82356128e2816128af565b946020939093013593505050565b803561ffff8116811461290257600080fd5b919050565b6000806000806080858703121561291d57600080fd5b612926856128f0565b9350612934602086016128f0565b9250612942604086016128f0565b9150612950606086016128f0565b905092959194509250565b60008060006060848603121561297057600080fd5b833561297b816128af565b9250602084013561298b816128af565b929592945050506040919091013590565b801515811461105757600080fd5b6000602082840312156129bc57600080fd5b8135610d238161299c565b6000602082840312156129d957600080fd5b8135610d23816128af565b6000602082840312156129f657600080fd5b5035919050565b60008060408385031215612a1057600080fd5b8235612a1b816128af565b91506020830135612a2b8161299c565b809150509250929050565b60008060408385031215612a4957600080fd5b8235612a54816128af565b91506020830135612a2b816128af565b600181811c90821680612a7857607f821691505b602082108103612a9857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc857610bc8612a9e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61ffff818116838216019080821115612b1757612b17612a9e565b5092915050565b80820180821115610bc857610bc8612a9e565b600181815b80851115612b6c578160001904821115612b5257612b52612a9e565b80851615612b5f57918102915b93841c9390800290612b36565b509250929050565b600082612b8357506001610bc8565b81612b9057506000610bc8565b8160018114612ba65760028114612bb057612bcc565b6001915050610bc8565b60ff841115612bc157612bc1612a9e565b50506001821b610bc8565b5060208310610133831016604e8410600b8410161715612bef575081810a610bc8565b612bf98383612b31565b8060001904821115612c0d57612c0d612a9e565b029392505050565b6000610d2360ff841683612b74565b8082028115828204841417610bc857610bc8612a9e565b600082612c5857634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c6f57600080fd5b5051919050565b600060208284031215612c8857600080fd5b8151610d238161299c565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cbb57600080fd5b8151610d23816128af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d165784516001600160a01b031683529383019391830191600101612cf1565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612d4c57600080fd5b8351925060208401519150604084015190509250925092565b60008251612d77818460208701612858565b919091019291505056fea26469706673582212201c35e8d32eb19a43cb5d264986529153de4a41d0f428811cd77e7b967bc4dec764736f6c63430008110033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c806385c5b319116101c6578063bbc0c742116100f7578063e71dc3f511610095578063f11a24d31161006f578063f11a24d314610aa9578063f2fde38b14610aca578063f637434214610aea578063f8b45b0514610b0c57600080fd5b8063e71dc3f514610a42578063e78cea9214610a64578063ea2f0b3714610a8957600080fd5b8063c85817f9116100d1578063c85817f9146109d7578063dc9c30ca146109ed578063dd62ed3e14610a0d578063e086e5ec14610a2d57600080fd5b8063bbc0c74214610969578063c090709914610983578063c816841b146109a357600080fd5b80639c3b4fdc11610164578063a522ad251161013e578063a522ad25146108d7578063a9059cbb146108f7578063adb873bd14610917578063b62496f51461093957600080fd5b80639c3b4fdc1461087a578063a0d82dc514610895578063a457c2d7146108b757600080fd5b806392136913116101a0578063921369131461080157806395d89b41146108235780639a7a23d6146108385780639bb19a321461085857600080fd5b806385c5b319146107a15780638da5cb5b146107c35780638dd14802146107e157600080fd5b8063437823ec116102a05780636ebcf6071161023e578063735de9f711610218578063735de9f7146106f65780637bce5a041461072a578063850337621461074d57806385141a771461076d57600080fd5b80636ebcf6071461069457806370a08231146106c1578063715018a6146106e157600080fd5b80635b700d911161027a5780635b700d91146106045780635d0044ca14610624578063660d0af4146106445780636dd3d39f1461066457600080fd5b8063437823ec1461059457806352664423146105b45780635342acb4146105d457600080fd5b8063300ea7821161030d57806339509351116102e757806339509351146105005780633b1f6a01146105205780633f33e90914610552578063434339f31461057257600080fd5b8063300ea782146104a4578063313ce567146104c4578063392d6af7146104e057600080fd5b806318160ddd1161034957806318160ddd1461040a5780631c8a6adc1461042d578063239bda491461046257806323b872dd1461048457600080fd5b8063053e39a31461037b57806306fdde03146103b8578063095ea7b3146103da57600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060065461039b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103c457600080fd5b506103cd610b22565b6040516103af919061287c565b3480156103e657600080fd5b506103fa6103f53660046128c4565b610bb4565b60405190151581526020016103af565b34801561041657600080fd5b5061041f610bce565b6040519081526020016103af565b34801561043957600080fd5b5060145461044f90600160b01b900461ffff1681565b60405161ffff90911681526020016103af565b34801561046e57600080fd5b5061048261047d366004612907565b610c00565b005b34801561049057600080fd5b506103fa61049f36600461295b565b610d04565b3480156104b057600080fd5b506104826104bf3660046129aa565b610d2a565b3480156104d057600080fd5b50604051600781526020016103af565b3480156104ec57600080fd5b506104826104fb366004612907565b610d67565b34801561050c57600080fd5b506103fa61051b3660046128c4565b610e56565b34801561052c57600080fd5b50601b5461010090046001600160a01b031660009081526020819052604090205461041f565b34801561055e57600080fd5b5061048261056d3660046129c7565b610e78565b34801561057e57600080fd5b5060145461044f90600160801b900461ffff1681565b3480156105a057600080fd5b506104826105af3660046129c7565b610ec3565b3480156105c057600080fd5b506104826105cf3660046129e4565b610f11565b3480156105e057600080fd5b506103fa6105ef3660046129c7565b600a6020526000908152604090205460ff1681565b34801561061057600080fd5b5061048261061f3660046129c7565b610f57565b34801561063057600080fd5b5061048261063f3660046129e4565b610fa5565b34801561065057600080fd5b5061048261065f3660046129c7565b61105a565b34801561067057600080fd5b506103fa61067f3660046129c7565b600b6020526000908152604090205460ff1681565b3480156106a057600080fd5b5061041f6106af3660046129c7565b60006020819052908152604090205481565b3480156106cd57600080fd5b5061041f6106dc3660046129c7565b6110ea565b3480156106ed57600080fd5b5061048261112e565b34801561070257600080fd5b5061039b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561073657600080fd5b5060145461044f90640100000000900461ffff1681565b34801561075957600080fd5b506104826107683660046129c7565b611164565b34801561077957600080fd5b5061039b7f000000000000000000000000000000000000000000000000000000000000dead81565b3480156107ad57600080fd5b5060145461044f90600160a01b900461ffff1681565b3480156107cf57600080fd5b506005546001600160a01b031661039b565b3480156107ed57600080fd5b506104826107fc3660046129c7565b6111f4565b34801561080d57600080fd5b5060145461044f90600160601b900461ffff1681565b34801561082f57600080fd5b506103cd611289565b34801561084457600080fd5b506104826108533660046129fd565b611298565b34801561086457600080fd5b5060145461044f90600160901b900461ffff1681565b34801561088657600080fd5b5060145461044f9061ffff1681565b3480156108a157600080fd5b5060145461044f90600160401b900461ffff1681565b3480156108c357600080fd5b506103fa6108d23660046128c4565b61136f565b3480156108e357600080fd5b506104826108f2366004612a36565b6113f5565b34801561090357600080fd5b506103fa6109123660046128c4565b6114ea565b34801561092357600080fd5b5060145461044f90600160701b900461ffff1681565b34801561094557600080fd5b506103fa6109543660046129c7565b60196020526000908152604090205460ff1681565b34801561097557600080fd5b506009546103fa9060ff1681565b34801561098f57600080fd5b5060075461039b906001600160a01b031681565b3480156109af57600080fd5b5061039b7f0000000000000000000000006d9b5eade5c64487c96c7eb6c45933563c85111e81565b3480156109e357600080fd5b5061041f601a5481565b3480156109f957600080fd5b50610482610a08366004612907565b6114f8565b348015610a1957600080fd5b5061041f610a28366004612a36565b611594565b348015610a3957600080fd5b506104826115bf565b348015610a4e57600080fd5b5060145461044f90600160301b900461ffff1681565b348015610a7057600080fd5b50601b5461039b9061010090046001600160a01b031681565b348015610a9557600080fd5b50610482610aa43660046129c7565b611622565b348015610ab557600080fd5b5060145461044f9062010000900461ffff1681565b348015610ad657600080fd5b50610482610ae53660046129c7565b61166d565b348015610af657600080fd5b5060145461044f90600160501b900461ffff1681565b348015610b1857600080fd5b5061041f60085481565b606060038054610b3190612a64565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5d90612a64565b8015610baa5780601f10610b7f57610100808354040283529160200191610baa565b820191906000526020600020905b815481529060010190602001808311610b8d57829003601f168201915b5050505050905090565b600033610bc281858561170b565b60019150505b92915050565b601b5461010090046001600160a01b0316600090815260208190526040812054600254610bfb9190612ab4565b905090565b6005546001600160a01b03163314610c335760405162461bcd60e51b8152600401610c2a90612ac7565b60405180910390fd5b6014805463ffffffff60801b1916600160801b61ffff8781169190910261ffff60901b191691909117600160901b868316021763ffffffff60a01b1916600160a01b8583160261ffff60b01b191617600160b01b9184169190910217905561012c8183610ca08688612afc565b610caa9190612afc565b610cb49190612afc565b61ffff161115610cfe5760405162461bcd60e51b81526020600482015260156024820152744d757374206b6565702066656573203c3d2033302560581b6044820152606401610c2a565b50505050565b600033610d1285828561182f565b610d1d8585856118a3565b60019150505b9392505050565b6005546001600160a01b03163314610d545760405162461bcd60e51b8152600401610c2a90612ac7565b6009805460ff1916911515919091179055565b6005546001600160a01b03163314610d915760405162461bcd60e51b8152600401610c2a90612ac7565b6014805461ffff86811663ffffffff199092169190911762010000868316021767ffffffff0000000019166401000000008583160267ffff000000000000191617600160301b9184169190910217905561012c8183610df08688612afc565b610dfa9190612afc565b610e049190612afc565b61ffff161115610cfe5760405162461bcd60e51b815260206004820152601860248201527f4d757374206b65657020666565732062656c6f772033302500000000000000006044820152606401610c2a565b600033610bc2818585610e698383611594565b610e739190612b1e565b61170b565b6005546001600160a01b03163314610ea25760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600b60205260409020805460ff19169055565b6005546001600160a01b03163314610eed5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600a60205260409020805460ff19166001179055565b6005546001600160a01b03163314610f3b5760405162461bcd60e51b8152600401610c2a90612ac7565b610f476007600a612c15565b610f519082612c24565b601a5550565b6005546001600160a01b03163314610f815760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610c2a90612ac7565b610fdb6007600a612c15565b610fe59082612c24565b6008556064610ff2610bce565b610ffc9190612c3b565b600854116110575760405162461bcd60e51b815260206004820152602260248201527f4d61782077616c6c6574206d7573742062652067726561746572207468616e20604482015261312560f01b6064820152608401610c2a565b50565b6005546001600160a01b031633146110845760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166110c85760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610c2a565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b601b546000906001600160a01b0361010090910481169083160361111057506000919050565b6001600160a01b038216600090815260208190526040902054610bc8565b6005546001600160a01b031633146111585760405162461bcd60e51b8152600401610c2a90612ac7565b6111626000611e37565b565b6005546001600160a01b0316331461118e5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166111d25760405162461bcd60e51b815260206004820152600b60248201526a043616e27742073657420360ac1b6044820152606401610c2a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461121e5760405162461bcd60e51b8152600401610c2a90612ac7565b601b8054610100600160a81b0319166101006001600160a01b0393841681029190911780835581900483166000908152600a60209081526040808320805460ff1990811660019081179092559554949094049095168252600b90529290922080549091169091179055565b606060048054610b3190612a64565b6005546001600160a01b031633146112c25760405162461bcd60e51b8152600401610c2a90612ac7565b7f0000000000000000000000006d9b5eade5c64487c96c7eb6c45933563c85111e6001600160a01b0316826001600160a01b0316036113435760405162461bcd60e51b815260206004820152601a60248201527f54686520706169722063616e6e6f742062652072656d6f7665640000000000006044820152606401610c2a565b6001600160a01b0382166000908152601960205260409020805460ff19168215151790555050565b5050565b6000338161137d8286611594565b9050838110156113dd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c2a565b6113ea828686840361170b565b506001949350505050565b6005546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166114755760405162461bcd60e51b815260206004820181905260248201527f77616c6c6574416464726573732063616e2774206265203020616464726573736044820152606401610c2a565b6040516370a0823160e01b815230600482015261136b90839083906001600160a01b038316906370a0823190602401602060405180830381865afa1580156114c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e59190612c5d565b611e89565b600033610bc28185856118a3565b6005546001600160a01b031633146115225760405162461bcd60e51b8152600401610c2a90612ac7565b601480546bffffffff00000000000000001916600160401b61ffff8781169190910261ffff60501b191691909117600160501b868316021763ffffffff60601b1916600160601b8583160261ffff60701b191617600160701b9184169190910217905561012c8183610ca08688612afc565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633146115e95760405162461bcd60e51b8152600401610c2a90612ac7565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611057573d6000803e3d6000fd5b6005546001600160a01b0316331461164c5760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b03166000908152600a60205260409020805460ff19169055565b6005546001600160a01b031633146116975760405162461bcd60e51b8152600401610c2a90612ac7565b6001600160a01b0381166116fc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c2a565b61105781611e37565b60025490565b6001600160a01b03831661176d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c2a565b6001600160a01b0382166117ce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c2a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061183b8484611594565b90506000198114610cfe57818110156118965760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c2a565b610cfe848484840361170b565b60095460ff16611938576001600160a01b0383166000908152600a602052604090205460ff16806118ec57506001600160a01b0382166000908152600a602052604090205460ff165b6119385760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610c2a565b6000611943306110ea565b601a54601b549192508210159060ff1615801561195d5750805b801561198157506001600160a01b03841660009081526019602052604090205460ff165b1561198e5761198e611ee0565b611996612116565b6001600160a01b0385166000908152600a602052604090205460ff161580156119d857506001600160a01b0384166000908152600a602052604090205460ff16155b15611bfd576001600160a01b03851660009081526019602052604090205460ff1615611aa0576014546103e890611a139061ffff1685612c24565b611a1d9190612c3b565b600c556014546103e890611a3b9062010000900461ffff1685612c24565b611a459190612c3b565b600e556014546103e890611a6590640100000000900461ffff1685612c24565b611a6f9190612c3b565b6010556014546103e890611a8e90600160301b900461ffff1685612c24565b611a989190612c3b565b601255611bfd565b6001600160a01b03841660009081526019602052604090205460ff1615611b58576014546103e890611add90600160401b900461ffff1685612c24565b611ae79190612c3b565b600c556014546103e890611b0690600160501b900461ffff1685612c24565b611b109190612c3b565b600e556014546103e890611b2f90600160601b900461ffff1685612c24565b611b399190612c3b565b6010556014546103e890611a8e90600160701b900461ffff1685612c24565b6014546103e890611b7490600160801b900461ffff1685612c24565b611b7e9190612c3b565b600c556014546103e890611b9d90600160901b900461ffff1685612c24565b611ba79190612c3b565b600e556014546103e890611bc690600160a01b900461ffff1685612c24565b611bd09190612c3b565b6010556014546103e890611bef90600160b01b900461ffff1685612c24565b611bf99190612c3b565b6012555b6000601254601054600e54600c5487611c169190612ab4565b611c209190612ab4565b611c2a9190612ab4565b611c349190612ab4565b9050611c41868683612171565b6001600160a01b0386166000908152600a602052604090205460ff16158015611c8357506001600160a01b0385166000908152600a602052604090205460ff16155b8015611cc157507f000000000000000000000000000000000000000000000000000000000000dead6001600160a01b0316856001600160a01b031614155b8015611ce657506001600160a01b03851660009081526019602052604090205460ff16155b8015611d0b57506001600160a01b0385166000908152600b602052604090205460ff16155b15611d6a57600854611d1c866110ea565b1115611d6a5760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c6574206c696d6974207265616368656400000000000000006044820152606401610c2a565b6000601254601054600e54600c54611d829190612b1e565b611d8c9190612b1e565b611d969190612b1e565b90508015611e1157611da9873083612171565b600e5460156000828254611dbd9190612b1e565b909155505060105460168054600090611dd7908490612b1e565b9091555050600c5460178054600090611df1908490612b1e565b909155505060125460188054600090611e0b908490612b1e565b90915550505b611e2e600d54600c55600f54600e55601154601055601354601255565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611edb90849061233f565b505050565b601b805460ff191660011790556000611ef8306110ea565b90506000601754601654601554611f0f9190612b1e565b611f199190612b1e565b9050801580611f3457508060185483611f329190612ab4565b105b15611f4057505061210a565b60006002601554611f519190612c3b565b90506000479050600060175460165484611f6b9190612b1e565b611f759190612b1e565b9050611f8081612411565b6000611f8c8347612ab4565b905060008260165483611f9f9190612c24565b611fa99190612c3b565b9050600083611fb88785612c24565b611fc29190612c3b565b905060008460175485611fd59190612c24565b611fdf9190612c3b565b9050600087118015611ff15750600082115b156120005761200087836125d1565b6006546040516000916001600160a01b03169061c35090869084818181858888f193505050503d8060008114612052576040519150601f19603f3d011682016040523d82523d6000602084013e612057565b606091505b50506007546040519192506001600160a01b03169061c3509084906000818181858888f193505050503d80600081146120ac576040519150601f19603f3d011682016040523d82523d6000602084013e6120b1565b606091505b5050601854909150156120eb576120eb307f000000000000000000000000000000000000000000000000000000000000dead601854612171565b5050600060158190556016819055601781905560185550505050505050505b601b805460ff19169055565b600c541580156121265750600e54155b80156121325750601054155b801561213e5750601254155b1561214557565b600c8054600d55600e8054600f5560108054601155601280546013556000938490559183905582905555565b6001600160a01b0383166121d55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c2a565b6001600160a01b0382166122375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c2a565b6001600160a01b038316600090815260208190526040902054818110156122af5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c2a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906122e6908490612b1e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161233291815260200190565b60405180910390a3610cfe565b6000612394826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126d79092919063ffffffff16565b805190915015611edb57808060200190518101906123b29190612c76565b611edb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610c2a565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061244657612446612c93565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e89190612ca9565b816001815181106124fb576124fb612c93565b60200260200101906001600160a01b031690816001600160a01b031681525050612546307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461170b565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061259b908590600090869030904290600401612cc6565b600060405180830381600087803b1580156125b557600080fd5b505af11580156125c9573d6000803e3d6000fd5b505050505050565b6125fc307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461170b565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806126436005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156126ab573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126d09190612d37565b5050505050565b60606126e684846000856126ee565b949350505050565b60608247101561274f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610c2a565b6001600160a01b0385163b6127a65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610c2a565b600080866001600160a01b031685876040516127c29190612d65565b60006040518083038185875af1925050503d80600081146127ff576040519150601f19603f3d011682016040523d82523d6000602084013e612804565b606091505b509150915061281482828661281f565b979650505050505050565b6060831561282e575081610d23565b82511561283e5782518084602001fd5b8160405162461bcd60e51b8152600401610c2a919061287c565b60005b8381101561287357818101518382015260200161285b565b50506000910152565b602081526000825180602084015261289b816040850160208701612858565b601f01601f19169190910160400192915050565b6001600160a01b038116811461105757600080fd5b600080604083850312156128d757600080fd5b82356128e2816128af565b946020939093013593505050565b803561ffff8116811461290257600080fd5b919050565b6000806000806080858703121561291d57600080fd5b612926856128f0565b9350612934602086016128f0565b9250612942604086016128f0565b9150612950606086016128f0565b905092959194509250565b60008060006060848603121561297057600080fd5b833561297b816128af565b9250602084013561298b816128af565b929592945050506040919091013590565b801515811461105757600080fd5b6000602082840312156129bc57600080fd5b8135610d238161299c565b6000602082840312156129d957600080fd5b8135610d23816128af565b6000602082840312156129f657600080fd5b5035919050565b60008060408385031215612a1057600080fd5b8235612a1b816128af565b91506020830135612a2b8161299c565b809150509250929050565b60008060408385031215612a4957600080fd5b8235612a54816128af565b91506020830135612a2b816128af565b600181811c90821680612a7857607f821691505b602082108103612a9857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc857610bc8612a9e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61ffff818116838216019080821115612b1757612b17612a9e565b5092915050565b80820180821115610bc857610bc8612a9e565b600181815b80851115612b6c578160001904821115612b5257612b52612a9e565b80851615612b5f57918102915b93841c9390800290612b36565b509250929050565b600082612b8357506001610bc8565b81612b9057506000610bc8565b8160018114612ba65760028114612bb057612bcc565b6001915050610bc8565b60ff841115612bc157612bc1612a9e565b50506001821b610bc8565b5060208310610133831016604e8410600b8410161715612bef575081810a610bc8565b612bf98383612b31565b8060001904821115612c0d57612c0d612a9e565b029392505050565b6000610d2360ff841683612b74565b8082028115828204841417610bc857610bc8612a9e565b600082612c5857634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c6f57600080fd5b5051919050565b600060208284031215612c8857600080fd5b8151610d238161299c565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612cbb57600080fd5b8151610d23816128af565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612d165784516001600160a01b031683529383019391830191600101612cf1565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215612d4c57600080fd5b8351925060208401519150604084015190509250925092565b60008251612d77818460208701612858565b919091019291505056fea26469706673582212201c35e8d32eb19a43cb5d264986529153de4a41d0f428811cd77e7b967bc4dec764736f6c63430008110033

Deployed Bytecode Sourcemap

38475:13967:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38520:42;;;;;;;;;;-1:-1:-1;38520:42:0;;;;-1:-1:-1;;;;;38520:42:0;;;;;;-1:-1:-1;;;;;194:32:1;;;176:51;;164:2;149:18;38520:42:0;;;;;;;;27087:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29579:242::-;;;;;;;;;;-1:-1:-1;29579:242:0;;;;;:::i;:::-;;:::i;:::-;;;1515:14:1;;1508:22;1490:41;;1478:2;1463:18;29579:242:0;1350:187:1;42305:125:0;;;;;;;;;;;;;:::i;:::-;;;1688:25:1;;;1676:2;1661:18;42305:125:0;1542:177:1;39829:33:0;;;;;;;;;;-1:-1:-1;39829:33:0;;;;-1:-1:-1;;;39829:33:0;;;;;;;;;1898:6:1;1886:19;;;1868:38;;1856:2;1841:18;39829:33:0;1724:188:1;44910:617:0;;;;;;;;;;-1:-1:-1;44910:617:0;;;;;:::i;:::-;;:::i;:::-;;30401:295;;;;;;;;;;-1:-1:-1;30401:295:0;;;;;:::i;:::-;;:::i;42639:97::-;;;;;;;;;;-1:-1:-1;42639:97:0;;;;;:::i;:::-;;:::i;42107:84::-;;;;;;;;;;-1:-1:-1;42107:84:0;;42182:1;3459:36:1;;3447:2;3432:18;42107:84:0;3317:184:1;43844:518:0;;;;;;;;;;-1:-1:-1;43844:518:0;;;;;:::i;:::-;;:::i;31105:270::-;;;;;;;;;;-1:-1:-1;31105:270:0;;;;;:::i;:::-;;:::i;42199:98::-;;;;;;;;;;-1:-1:-1;42282:6:0;;;;;-1:-1:-1;;;;;42282:6:0;42245:7;42272:17;;;;;;;;;;;42199:98;;43713:123;;;;;;;;;;-1:-1:-1;43713:123:0;;;;;:::i;:::-;;:::i;39700:32::-;;;;;;;;;;-1:-1:-1;39700:32:0;;;;-1:-1:-1;;;39700:32:0;;;;;;43338:112;;;;;;;;;;-1:-1:-1;43338:112:0;;;;;:::i;:::-;;:::i;42744:204::-;;;;;;;;;;-1:-1:-1;42744:204:0;;;;;:::i;:::-;;:::i;38808:49::-;;;;;;;;;;-1:-1:-1;38808:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43581:124;;;;;;;;;;-1:-1:-1;43581:124:0;;;;;:::i;:::-;;:::i;41891:208::-;;;;;;;;;;-1:-1:-1;41891:208:0;;;;;:::i;:::-;;:::i;45535:166::-;;;;;;;;;;-1:-1:-1;45535:166:0;;;;;:::i;:::-;;:::i;38864:55::-;;;;;;;;;;-1:-1:-1;38864:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;26365:44;;;;;;;;;;-1:-1:-1;26365:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;42438:193;;;;;;;;;;-1:-1:-1;42438:193:0;;;;;:::i;:::-;;:::i;9748:103::-;;;;;;;;;;;;;:::i;40151:47::-;;;;;;;;;;;;;;;39465:34;;;;;;;;;;-1:-1:-1;39465:34:0;;;;;;;;;;;45709:151;;;;;;;;;;-1:-1:-1;45709:151:0;;;;;:::i;:::-;;:::i;38614:80::-;;;;;;;;;;;;;;;39784:38;;;;;;;;;;-1:-1:-1;39784:38:0;;;;-1:-1:-1;;;39784:38:0;;;;;;9097:87;;;;;;;;;;-1:-1:-1;9170:6:0;;-1:-1:-1;;;;;9170:6:0;9097:87;;41701:182;;;;;;;;;;-1:-1:-1;41701:182:0;;;;;:::i;:::-;;:::i;39620:35::-;;;;;;;;;;-1:-1:-1;39620:35:0;;;;-1:-1:-1;;;39620:35:0;;;;;;27306:104;;;;;;;;;;;;;:::i;42956:236::-;;;;;;;;;;-1:-1:-1;42956:236:0;;;;;:::i;:::-;;:::i;39739:38::-;;;;;;;;;;-1:-1:-1;39739:38:0;;;;-1:-1:-1;;;39739:38:0;;;;;;39390:27;;;;;;;;;;-1:-1:-1;39390:27:0;;;;;;;;39543:28;;;;;;;;;;-1:-1:-1;39543:28:0;;;;-1:-1:-1;;;39543:28:0;;;;;;31878:505;;;;;;;;;;-1:-1:-1;31878:505:0;;;;;:::i;:::-;;:::i;52050:389::-;;;;;;;;;;-1:-1:-1;52050:389:0;;;;;:::i;:::-;;:::i;28761:234::-;;;;;;;;;;-1:-1:-1;28761:234:0;;;;;:::i;:::-;;:::i;39662:29::-;;;;;;;;;;-1:-1:-1;39662:29:0;;;;-1:-1:-1;;;39662:29:0;;;;;;40039:57;;;;;;;;;;-1:-1:-1;40039:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38774:25;;;;;;;;;;-1:-1:-1;38774:25:0;;;;;;;;38569:36;;;;;;;;;;-1:-1:-1;38569:36:0;;;;-1:-1:-1;;;;;38569:36:0;;;40205;;;;;;;;;;;;;;;40105:37;;;;;;;;;;;;;;;;44370:532;;;;;;;;;;-1:-1:-1;44370:532:0;;;;;:::i;:::-;;:::i;29058:201::-;;;;;;;;;;-1:-1:-1;29058:201:0;;;;;:::i;:::-;;:::i;51933:109::-;;;;;;;;;;;;;:::i;39506:28::-;;;;;;;;;;-1:-1:-1;39506:28:0;;;;-1:-1:-1;;;39506:28:0;;;;;;40280:38;;;;;;;;;;-1:-1:-1;40280:38:0;;;;;;;-1:-1:-1;;;;;40280:38:0;;;43458:111;;;;;;;;;;-1:-1:-1;43458:111:0;;;;;:::i;:::-;;:::i;39424:34::-;;;;;;;;;;-1:-1:-1;39424:34:0;;;;;;;;;;;10006:238;;;;;;;;;;-1:-1:-1;10006:238:0;;;;;:::i;:::-;;:::i;39578:35::-;;;;;;;;;;-1:-1:-1;39578:35:0;;;;-1:-1:-1;;;39578:35:0;;;;;;38701:24;;;;;;;;;;;;;;;;27087:100;27141:13;27174:5;27167:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27087:100;:::o;29579:242::-;29698:4;8394:10;29759:32;8394:10;29775:7;29784:6;29759:8;:32::i;:::-;29809:4;29802:11;;;29579:242;;;;;:::o;42305:125::-;42282:6;;;;;-1:-1:-1;;;;;42282:6:0;42358:7;42272:17;;;;;;;;;;;28295:12;;42385:37;;;;:::i;:::-;42378:44;;42305:125;:::o;44910:617::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;;;;;;;;;45119:14:::1;:32:::0;;-1:-1:-1;;;;45162:44:0;-1:-1:-1;;;45119:32:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;45162:44:0;;;;;-1:-1:-1;;;45162:44:0;;::::1;;;-1:-1:-1::0;;;;45272:34:0;-1:-1:-1;;;45217:44:0;;::::1;;-1:-1:-1::0;;;;45272:34:0;;-1:-1:-1;;;45272:34:0;;::::1;::::0;;;::::1;;::::0;;38762:3:::1;45272:34:::0;45217:44;45339:56:::1;45162:44:::0;45119:32;45339:56:::1;:::i;:::-;:97;;;;:::i;:::-;:116;;;;:::i;:::-;:131;;;;45317:202;;;::::0;-1:-1:-1;;;45317:202:0;;6957:2:1;45317:202:0::1;::::0;::::1;6939:21:1::0;6996:2;6976:18;;;6969:30;-1:-1:-1;;;7015:18:1;;;7008:51;7076:18;;45317:202:0::1;6755:345:1::0;45317:202:0::1;44910:617:::0;;;;:::o;30401:295::-;30532:4;8394:10;30590:38;30606:4;8394:10;30621:6;30590:15;:38::i;:::-;30639:27;30649:4;30655:2;30659:6;30639:9;:27::i;:::-;30684:4;30677:11;;;30401:295;;;;;;:::o;42639:97::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;42706:13:::1;:22:::0;;-1:-1:-1;;42706:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42639:97::o;43844:518::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;44028:9:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;44061:34:0;;;;;;;;;;::::1;;;-1:-1:-1::0;;44151:24:0;44106:34;;;::::1;;-1:-1:-1::0;;44151:24:0;;-1:-1:-1;;;44151:24:0;;::::1;::::0;;;::::1;;::::0;;38762:3:::1;44151:24:::0;44106:34;44208:29:::1;44061:34:::0;44028:22;44208:29:::1;:::i;:::-;:48;;;;:::i;:::-;:62;;;;:::i;:::-;:94;;;;44186:168;;;::::0;-1:-1:-1;;;44186:168:0;;7307:2:1;44186:168:0::1;::::0;::::1;7289:21:1::0;7346:2;7326:18;;;7319:30;7385:26;7365:18;;;7358:54;7429:18;;44186:168:0::1;7105:348:1::0;31105:270:0;31220:4;8394:10;31281:64;8394:10;31297:7;31334:10;31306:25;8394:10;31297:7;31306:9;:25::i;:::-;:38;;;;:::i;:::-;31281:8;:64::i;43713:123::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43788:32:0::1;43823:5;43788:32:::0;;;:23:::1;:32;::::0;;;;:40;;-1:-1:-1;;43788:40:0::1;::::0;;43713:123::o;43338:112::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43409:26:0::1;;::::0;;;:17:::1;:26;::::0;;;;:33;;-1:-1:-1;;43409:33:0::1;43438:4;43409:33;::::0;;43338:112::o;42744:204::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;42925:14:::1;42182:1:::0;42925:2:::1;:14;:::i;:::-;42898:42;::::0;:23;:42:::1;:::i;:::-;42873:22;:67:::0;-1:-1:-1;42744:204:0:o;43581:124::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43658:32:0::1;;::::0;;;:23:::1;:32;::::0;;;;:39;;-1:-1:-1;;43658:39:0::1;43693:4;43658:39;::::0;;43581:124::o;41891:208::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;41988:14:::1;42182:1:::0;41988:2:::1;:14;:::i;:::-;41975:27;::::0;:10;:27:::1;:::i;:::-;41963:9;:39:::0;42049:3:::1;42033:13;:11;:13::i;:::-;:19;;;;:::i;:::-;42021:9;;:31;42013:78;;;::::0;-1:-1:-1;;;42013:78:0;;9568:2:1;42013:78:0::1;::::0;::::1;9550:21:1::0;9607:2;9587:18;;;9580:30;9646:34;9626:18;;;9619:62;-1:-1:-1;;;9697:18:1;;;9690:32;9739:19;;42013:78:0::1;9366:398:1::0;42013:78:0::1;41891:208:::0;:::o;45535:166::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45619:15:0;::::1;45611:39;;;::::0;-1:-1:-1;;;45611:39:0;;9971:2:1;45611:39:0::1;::::0;::::1;9953:21:1::0;10010:2;9990:18;;;9983:30;-1:-1:-1;;;10029:18:1;;;10022:41;10080:18;;45611:39:0::1;9769:335:1::0;45611:39:0::1;45661:19;:32:::0;;-1:-1:-1;;;;;;45661:32:0::1;-1:-1:-1::0;;;;;45661:32:0;;;::::1;::::0;;;::::1;::::0;;45535:166::o;42438:193::-;42539:6;;42504:7;;-1:-1:-1;;;;;42539:6:0;;;;;;42528:17;;;;42524:58;;-1:-1:-1;42569:1:0;;42438:193;-1:-1:-1;42438:193:0:o;42524:58::-;-1:-1:-1;;;;;28529:18:0;;28497:7;28529:18;;;;;;;;;;;42599:24;28378:177;9748:103;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;9813:30:::1;9840:1;9813:18;:30::i;:::-;9748:103::o:0;45709:151::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45784:15:0;::::1;45776:39;;;::::0;-1:-1:-1;;;45776:39:0;;9971:2:1;45776:39:0::1;::::0;::::1;9953:21:1::0;10010:2;9990:18;;;9983:30;-1:-1:-1;;;10029:18:1;;;10022:41;10080:18;;45776:39:0::1;9769:335:1::0;45776:39:0::1;45826:13;:26:::0;;-1:-1:-1;;;;;;45826:26:0::1;-1:-1:-1::0;;;;;45826:26:0;;;::::1;::::0;;;::::1;::::0;;45709:151::o;41701:182::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;41767:6:::1;:16:::0;;-1:-1:-1;;;;;;41767:16:0::1;;-1:-1:-1::0;;;;;41767:16:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;41812:6;;::::1;::::0;::::1;-1:-1:-1::0;41794:25:0;;;:17:::1;:25;::::0;;;;;;;:32;;-1:-1:-1;;41794:32:0;;::::1;-1:-1:-1::0;41794:32:0;;::::1;::::0;;;41861:6;;;;;::::1;::::0;;::::1;41837:31:::0;;:23:::1;:31:::0;;;;;;:38;;;;::::1;::::0;;::::1;::::0;;41701:182::o;27306:104::-;27362:13;27395:7;27388:14;;;;;:::i;42956:236::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;43088:11:::1;-1:-1:-1::0;;;;;43080:19:0::1;:4;-1:-1:-1::0;;;;;43080:19:0::1;::::0;43072:58:::1;;;::::0;-1:-1:-1;;;43072:58:0;;10311:2:1;43072:58:0::1;::::0;::::1;10293:21:1::0;10350:2;10330:18;;;10323:30;10389:28;10369:18;;;10362:56;10435:18;;43072:58:0::1;10109:350:1::0;43072:58:0::1;-1:-1:-1::0;;;;;43283:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;43283:39:0;;;;;;;42956:236;;:::o;43143:41::-:1;42956:236:::0;;:::o;31878:505::-;31998:4;8394:10;31998:4;32086:25;8394:10;32103:7;32086:9;:25::i;:::-;32059:52;;32164:15;32144:16;:35;;32122:122;;;;-1:-1:-1;;;32122:122:0;;10666:2:1;32122:122:0;;;10648:21:1;10705:2;10685:18;;;10678:30;10744:34;10724:18;;;10717:62;-1:-1:-1;;;10795:18:1;;;10788:35;10840:19;;32122:122:0;10464:401:1;32122:122:0;32280:60;32289:5;32296:7;32324:15;32305:16;:34;32280:8;:60::i;:::-;-1:-1:-1;32371:4:0;;31878:505;-1:-1:-1;;;;31878:505:0:o;52050:389::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52193:27:0;::::1;52171:109;;;::::0;-1:-1:-1;;;52171:109:0;;11072:2:1;52171:109:0::1;::::0;::::1;11054:21:1::0;;;11091:18;;;11084:30;11150:34;11130:18;;;11123:62;11202:18;;52171:109:0::1;10870:356:1::0;52171:109:0::1;52383:37;::::0;-1:-1:-1;;;52383:37:0;;52414:4:::1;52383:37;::::0;::::1;176:51:1::0;52291:140:0::1;::::0;52328:12;;52355:13;;-1:-1:-1;;;;;52383:22:0;::::1;::::0;::::1;::::0;149:18:1;;52383:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52291:22;:140::i;28761:234::-:0;28876:4;8394:10;28937:28;8394:10;28954:2;28958:6;28937:9;:28::i;44370:532::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;44559:10:::1;:24:::0;;-1:-1:-1;;44594:36:0;-1:-1:-1;;;44559:24:0::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;44594:36:0;;;;;-1:-1:-1;;;44594:36:0;;::::1;;;-1:-1:-1::0;;;;44688:26:0;-1:-1:-1;;;44641:36:0;;::::1;;-1:-1:-1::0;;;;44688:26:0;;-1:-1:-1;;;44688:26:0;;::::1;::::0;;;::::1;;::::0;;38762:3:::1;44688:26:::0;44641:36;44747:31:::1;44594:36:::0;44559:24;44747:31:::1;:::i;29058:201::-:0;-1:-1:-1;;;;;29224:18:0;;;29192:7;29224:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;29058:201::o;51933:109::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;9170:6;;51986:48:::1;::::0;-1:-1:-1;;;;;9170:6:0;;;;52012:21:::1;51986:48:::0;::::1;;;::::0;::::1;::::0;;;52012:21;9170:6;51986:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;43458:111:::0;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43527:26:0::1;43556:5;43527:26:::0;;;:17:::1;:26;::::0;;;;:34;;-1:-1:-1;;43527:34:0::1;::::0;;43458:111::o;10006:238::-;9170:6;;-1:-1:-1;;;;;9170:6:0;8394:10;9317:23;9309:68;;;;-1:-1:-1;;;9309:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10109:22:0;::::1;10087:110;;;::::0;-1:-1:-1;;;10087:110:0;;11622:2:1;10087:110:0::1;::::0;::::1;11604:21:1::0;11661:2;11641:18;;;11634:30;11700:34;11680:18;;;11673:62;-1:-1:-1;;;11751:18:1;;;11744:36;11797:19;;10087:110:0::1;11420:402:1::0;10087:110:0::1;10208:28;10227:8;10208:18;:28::i;28207:108::-:0;28295:12;;;28207:108::o;35618:380::-;-1:-1:-1;;;;;35754:19:0;;35746:68;;;;-1:-1:-1;;;35746:68:0;;12029:2:1;35746:68:0;;;12011:21:1;12068:2;12048:18;;;12041:30;12107:34;12087:18;;;12080:62;-1:-1:-1;;;12158:18:1;;;12151:34;12202:19;;35746:68:0;11827:400:1;35746:68:0;-1:-1:-1;;;;;35833:21:0;;35825:68;;;;-1:-1:-1;;;35825:68:0;;12434:2:1;35825:68:0;;;12416:21:1;12473:2;12453:18;;;12446:30;12512:34;12492:18;;;12485:62;-1:-1:-1;;;12563:18:1;;;12556:32;12605:19;;35825:68:0;12232:398:1;35825:68:0;-1:-1:-1;;;;;35906:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;35958:32;;1688:25:1;;;35958:32:0;;1661:18:1;35958:32:0;;;;;;;35618:380;;;:::o;36289:502::-;36424:24;36451:25;36461:5;36468:7;36451:9;:25::i;:::-;36424:52;;-1:-1:-1;;36491:16:0;:37;36487:297;;36591:6;36571:16;:26;;36545:117;;;;-1:-1:-1;;;36545:117:0;;12837:2:1;36545:117:0;;;12819:21:1;12876:2;12856:18;;;12849:30;12915:31;12895:18;;;12888:59;12964:18;;36545:117:0;12635:353:1;36545:117:0;36706:51;36715:5;36722:7;36750:6;36731:16;:25;36706:8;:51::i;45868:2734::-;45997:13;;;;45992:183;;-1:-1:-1;;;;;46053:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;46080:21:0;;;;;;:17;:21;;;;;;;;46053:48;46027:136;;;;-1:-1:-1;;;46027:136:0;;13195:2:1;46027:136:0;;;13177:21:1;13234:2;13214:18;;;13207:30;13273:28;13253:18;;;13246:56;13319:18;;46027:136:0;12993:350:1;46027:136:0;46187:28;46218:24;46236:4;46218:9;:24::i;:::-;46321:22;;46396:16;;46187:55;;-1:-1:-1;46284:59:0;;;;46396:16;;46395:17;:57;;;;;46429:23;46395:57;:103;;;;-1:-1:-1;;;;;;46469:29:0;;;;;;:25;:29;;;;;;;;46395:103;46377:169;;;46525:9;:7;:9::i;:::-;46558:14;:12;:14::i;:::-;-1:-1:-1;;;;;46674:23:0;;;;;;:17;:23;;;;;;;;46673:24;:50;;;;-1:-1:-1;;;;;;46702:21:0;;;;;;:17;:21;;;;;;;;46701:22;46673:50;46669:1078;;;-1:-1:-1;;;;;46798:31:0;;;;;;:25;:31;;;;;;;;46794:942;;;46870:9;;46883:4;;46861:18;;46870:9;;46861:6;:18;:::i;:::-;46860:27;;;;:::i;:::-;46850:7;:37;46932:15;;46951:4;;46923:24;;46932:15;;;;;46923:6;:24;:::i;:::-;46922:33;;;;:::i;:::-;46906:13;:49;47000:15;;47019:4;;46991:24;;47000:15;;;;;46991:6;:24;:::i;:::-;46990:33;;;;:::i;:::-;46974:13;:49;47063:10;;47077:4;;47054:19;;-1:-1:-1;;;47063:10:0;;;;47054:6;:19;:::i;:::-;47053:28;;;;:::i;:::-;47042:8;:39;46794:942;;;-1:-1:-1;;;;;47141:29:0;;;;;;:25;:29;;;;;;;;47137:599;;;47213:10;;47227:4;;47204:19;;-1:-1:-1;;;47213:10:0;;;;47204:6;:19;:::i;:::-;47203:28;;;;:::i;:::-;47193:7;:38;47276:16;;47296:4;;47267:25;;-1:-1:-1;;;47276:16:0;;;;47267:6;:25;:::i;:::-;47266:34;;;;:::i;:::-;47250:13;:50;47345:16;;47365:4;;47336:25;;-1:-1:-1;;;47345:16:0;;;;47336:6;:25;:::i;:::-;47335:34;;;;:::i;:::-;47319:13;:50;47409:11;;47424:4;;47400:20;;-1:-1:-1;;;47409:11:0;;;;47400:6;:20;:::i;47137:599::-;47489:14;;47507:4;;47480:23;;-1:-1:-1;;;47489:14:0;;;;47480:6;:23;:::i;:::-;47479:32;;;;:::i;:::-;47469:7;:42;47556:20;;47580:4;;47547:29;;-1:-1:-1;;;47556:20:0;;;;47547:6;:29;:::i;:::-;47546:38;;;;:::i;:::-;47530:13;:54;47629:20;;47653:4;;47620:29;;-1:-1:-1;;;47629:20:0;;;;47620:6;:29;:::i;:::-;47619:38;;;;:::i;:::-;47603:13;:54;47697:15;;47716:4;;47688:24;;-1:-1:-1;;;47697:15:0;;;;47688:6;:24;:::i;:::-;47687:33;;;;:::i;:::-;47676:8;:44;47137:599;47759:23;47888:8;;47859:13;;47830;;47807:7;;47785:6;:29;;;;:::i;:::-;:58;;;;:::i;:::-;:87;;;;:::i;:::-;:111;;;;:::i;:::-;47759:137;;47907:42;47923:4;47929:2;47933:15;47907;:42::i;:::-;-1:-1:-1;;;;;47965:23:0;;;;;;:17;:23;;;;;;;;47964:24;:50;;;;-1:-1:-1;;;;;;47993:21:0;;;;;;:17;:21;;;;;;;;47992:22;47964:50;:70;;;;;48024:10;-1:-1:-1;;;;;48018:16:0;:2;-1:-1:-1;;;;;48018:16:0;;;47964:70;:104;;;;-1:-1:-1;;;;;;48039:29:0;;;;;;:25;:29;;;;;;;;48038:30;47964:104;:136;;;;-1:-1:-1;;;;;;48073:27:0;;;;;;:23;:27;;;;;;;;48072:28;47964:136;47960:232;;;48142:9;;48125:13;48135:2;48125:9;:13::i;:::-;:26;;48117:63;;;;-1:-1:-1;;;48117:63:0;;13550:2:1;48117:63:0;;;13532:21:1;13589:2;13569:18;;;13562:30;13628:26;13608:18;;;13601:54;13672:18;;48117:63:0;13348:348:1;48117:63:0;48204:17;48266:8;;48250:13;;48234;;48224:7;;:23;;;;:::i;:::-;:39;;;;:::i;:::-;:50;;;;:::i;:::-;48204:70;-1:-1:-1;48289:13:0;;48285:284;;48319:47;48335:4;48349;48356:9;48319:15;:47::i;:::-;48407:13;;48381:22;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;48464:13:0;;48435:25;:42;;:25;;:42;;48464:13;;48435:42;:::i;:::-;;;;-1:-1:-1;;48509:7:0;;48492:13;:24;;:13;;:24;;48509:7;;48492:24;:::i;:::-;;;;-1:-1:-1;;48549:8:0;;48531:14;:26;;:14;;:26;;48549:8;;48531:26;:::i;:::-;;;;-1:-1:-1;;48285:284:0;48579:15;49147;;49137:7;:25;49189:21;;49173:13;:37;49237:21;;49221:13;:37;49280:16;;49269:8;:27;49093:211;48579:15;45981:2621;;;;45868:2734;;;:::o;10404:191::-;10497:6;;;-1:-1:-1;;;;;10514:17:0;;;-1:-1:-1;;;;;;10514:17:0;;;;;;;10547:40;;10497:6;;;10514:17;10497:6;;10547:40;;10478:16;;10547:40;10467:128;10404:191;:::o;19406:248::-;19577:58;;;-1:-1:-1;;;;;13893:32:1;;19577:58:0;;;13875:51:1;13942:18;;;;13935:34;;;19577:58:0;;;;;;;;;;13848:18:1;;;;19577:58:0;;;;;;;;-1:-1:-1;;;;;19577:58:0;-1:-1:-1;;;19577:58:0;;;19523:123;;19557:5;;19523:19;:123::i;:::-;19406:248;;;:::o;49312:1684::-;40361:16;:23;;-1:-1:-1;;40361:23:0;40380:4;40361:23;;;:16;49388:24:::1;49406:4;49388:9;:24::i;:::-;49362:50;;49423:24;49529:13;;49488:25;;49450:22;;:63;;;;:::i;:::-;:92;;;;:::i;:::-;49423:119:::0;-1:-1:-1;49557:21:0;;;:76:::1;;;49617:16;49600:14;;49582:15;:32;;;;:::i;:::-;:51;49557:76;49553:115;;;49650:7;;;;49553:115;49680:26;49734:1;49709:22;;:26;;;;:::i;:::-;49680:55;;49746:25;49774:21;49746:49;;49806:14;49898:13;;49857:25;;49823:18;:59;;;;:::i;:::-;:88;;;;:::i;:::-;49806:105;;49922:24;49939:6;49922:16;:24::i;:::-;49957:18;49978:41;50002:17:::0;49978:21:::1;:41;:::i;:::-;49957:62;;50032:23;50114:6;50072:25;;50059:10;:38;;;;:::i;:::-;50058:62;;;;:::i;:::-;50032:88:::0;-1:-1:-1;50131:23:0::1;50193:6:::0;50158:31:::1;50171:18:::0;50158:10;:31:::1;:::i;:::-;50157:42;;;;:::i;:::-;50131:68;;50210:17;50261:6;50244:13;;50231:10;:26;;;;:::i;:::-;50230:37;;;;:::i;:::-;50210:57;;50305:1;50284:18;:22;:45;;;;;50328:1;50310:15;:19;50284:45;50280:127;;;50346:49;50359:18;50379:15;50346:12;:49::i;:::-;50464:19;::::0;50456:109:::1;::::0;50417:12:::1;::::0;-1:-1:-1;;;;;50464:19:0::1;::::0;50545:5:::1;::::0;50511:15;;50417:12;50456:109;50417:12;50456:109;50511:15;50464:19;50545:5;50456:109:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;50598:13:0::1;::::0;50590:97:::1;::::0;50442:123;;-1:-1:-1;;;;;;50598:13:0::1;::::0;50667:5:::1;::::0;50639:9;;50590:97:::1;::::0;;;50639:9;50598:13;50667:5;50590:97:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;50748:14:0::1;::::0;50576:111;;-1:-1:-1;50748:18:0;50744:109:::1;;50783:58;50807:4;50814:10;50826:14;;50783:15;:58::i;:::-;-1:-1:-1::0;;50890:1:0::1;50865:22;:26:::0;;;50902:25:::1;:29:::0;;;50942:13:::1;:17:::0;;;50970:14:::1;:18:::0;-1:-1:-1;;;;;;;;40395:1:0::1;40407:16:::0;:24;;-1:-1:-1;;40407:24:0;;;49312:1684::o;48610:475::-;48671:7;;:12;:47;;;;-1:-1:-1;48700:13:0;;:18;48671:47;:82;;;;-1:-1:-1;48735:13:0;;:18;48671:82;:113;;;;-1:-1:-1;48771:8:0;;:13;48671:113;48653:150;;;48610:475::o;48653:150::-;48833:7;;;48815:15;:25;48875:13;;;48851:21;:37;48923:13;;;48899:21;:37;48966:8;;;48947:16;:27;-1:-1:-1;48987:11:0;;;;49009:17;;;;49037;;;49065:12;48610:475::o;32862:708::-;-1:-1:-1;;;;;32993:18:0;;32985:68;;;;-1:-1:-1;;;32985:68:0;;14392:2:1;32985:68:0;;;14374:21:1;14431:2;14411:18;;;14404:30;14470:34;14450:18;;;14443:62;-1:-1:-1;;;14521:18:1;;;14514:35;14566:19;;32985:68:0;14190:401:1;32985:68:0;-1:-1:-1;;;;;33072:16:0;;33064:64;;;;-1:-1:-1;;;33064:64:0;;14798:2:1;33064:64:0;;;14780:21:1;14837:2;14817:18;;;14810:30;14876:34;14856:18;;;14849:62;-1:-1:-1;;;14927:18:1;;;14920:33;14970:19;;33064:64:0;14596:399:1;33064:64:0;-1:-1:-1;;;;;33214:15:0;;33192:19;33214:15;;;;;;;;;;;33262:21;;;;33240:109;;;;-1:-1:-1;;;33240:109:0;;15202:2:1;33240:109:0;;;15184:21:1;15241:2;15221:18;;;15214:30;15280:34;15260:18;;;15253:62;-1:-1:-1;;;15331:18:1;;;15324:36;15377:19;;33240:109:0;15000:402:1;33240:109:0;-1:-1:-1;;;;;33385:15:0;;;:9;:15;;;;;;;;;;;33403:20;;;33385:38;;33445:13;;;;;;;;:23;;33417:6;;33385:9;33445:23;;33417:6;;33445:23;:::i;:::-;;;;;;;;33501:2;-1:-1:-1;;;;;33486:26:0;33495:4;-1:-1:-1;;;;;33486:26:0;;33505:6;33486:26;;;;1688:25:1;;1676:2;1661:18;;1542:177;33486:26:0;;;;;;;;33525:37;19406:248;22373:802;22797:23;22823:106;22865:4;22823:106;;;;;;;;;;;;;;;;;22831:5;-1:-1:-1;;;;;22823:27:0;;;:106;;;;;:::i;:::-;22944:17;;22797:132;;-1:-1:-1;22944:21:0;22940:228;;23059:10;23048:30;;;;;;;;;;;;:::i;:::-;23022:134;;;;-1:-1:-1;;;23022:134:0;;15859:2:1;23022:134:0;;;15841:21:1;15898:2;15878:18;;;15871:30;15937:34;15917:18;;;15910:62;-1:-1:-1;;;15988:18:1;;;15981:40;16038:19;;23022:134:0;15657:406:1;51004:465:0;51094:16;;;51108:1;51094:16;;;;;;;;51070:21;;51094:16;;;;;;;;;;-1:-1:-1;51094:16:0;51070:40;;51139:4;51121;51126:1;51121:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;51121:23:0;;;-1:-1:-1;;;;;51121:23:0;;;;;51165:13;-1:-1:-1;;;;;51165:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51155:4;51160:1;51155:7;;;;;;;;:::i;:::-;;;;;;:30;-1:-1:-1;;;;;51155:30:0;;;-1:-1:-1;;;;;51155:30:0;;;;;51196:60;51213:4;51228:13;51244:11;51196:8;:60::i;:::-;51267:194;;-1:-1:-1;;;51267:194:0;;-1:-1:-1;;;;;51267:13:0;:64;;;;:194;;51346:11;;51372:1;;51388:4;;51415;;51435:15;;51267:194;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51059:410;51004:465;:::o;51477:410::-;51558:60;51575:4;51590:13;51606:11;51558:8;:60::i;:::-;51629:13;-1:-1:-1;;;;;51629:29:0;;51666:9;51699:4;51719:11;51745:1;51788;51831:7;9170:6;;-1:-1:-1;;;;;9170:6:0;;9097:87;51831:7;51629:250;;;;;;-1:-1:-1;;;;;;51629:250:0;;;-1:-1:-1;;;;;17932:15:1;;;51629:250:0;;;17914:34:1;17964:18;;;17957:34;;;;18007:18;;;18000:34;;;;18050:18;;;18043:34;18114:15;;;18093:19;;;18086:44;51853:15:0;18146:19:1;;;18139:35;17848:19;;51629:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;51477:410;;:::o;14452:229::-;14589:12;14621:52;14643:6;14651:4;14657:1;14660:12;14621:21;:52::i;:::-;14614:59;14452:229;-1:-1:-1;;;;14452:229:0:o;15668:571::-;15838:12;15910:5;15885:21;:30;;15863:118;;;;-1:-1:-1;;;15863:118:0;;18698:2:1;15863:118:0;;;18680:21:1;18737:2;18717:18;;;18710:30;18776:34;18756:18;;;18749:62;-1:-1:-1;;;18827:18:1;;;18820:36;18873:19;;15863:118:0;18496:402:1;15863:118:0;-1:-1:-1;;;;;11905:19:0;;;15992:60;;;;-1:-1:-1;;;15992:60:0;;19105:2:1;15992:60:0;;;19087:21:1;19144:2;19124:18;;;19117:30;19183:31;19163:18;;;19156:59;19232:18;;15992:60:0;18903:353:1;15992:60:0;16066:12;16080:23;16107:6;-1:-1:-1;;;;;16107:11:0;16126:5;16147:4;16107:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16065:97;;;;16180:51;16197:7;16206:10;16218:12;16180:16;:51::i;:::-;16173:58;15668:571;-1:-1:-1;;;;;;;15668:571:0:o;18628:712::-;18778:12;18807:7;18803:530;;;-1:-1:-1;18838:10:0;18831:17;;18803:530;18952:17;;:21;18948:374;;19150:10;19144:17;19211:15;19198:10;19194:2;19190:19;19183:44;18948:374;19293:12;19286:20;;-1:-1:-1;;;19286:20:0;;;;;;;;:::i;238:250:1:-;323:1;333:113;347:6;344:1;341:13;333:113;;;423:11;;;417:18;404:11;;;397:39;369:2;362:10;333:113;;;-1:-1:-1;;480:1:1;462:16;;455:27;238:250::o;493:396::-;642:2;631:9;624:21;605:4;674:6;668:13;717:6;712:2;701:9;697:18;690:34;733:79;805:6;800:2;789:9;785:18;780:2;772:6;768:15;733:79;:::i;:::-;873:2;852:15;-1:-1:-1;;848:29:1;833:45;;;;880:2;829:54;;493:396;-1:-1:-1;;493:396:1:o;894:131::-;-1:-1:-1;;;;;969:31:1;;959:42;;949:70;;1015:1;1012;1005:12;1030:315;1098:6;1106;1159:2;1147:9;1138:7;1134:23;1130:32;1127:52;;;1175:1;1172;1165:12;1127:52;1214:9;1201:23;1233:31;1258:5;1233:31;:::i;:::-;1283:5;1335:2;1320:18;;;;1307:32;;-1:-1:-1;;;1030:315:1:o;1917:159::-;1984:20;;2044:6;2033:18;;2023:29;;2013:57;;2066:1;2063;2056:12;2013:57;1917:159;;;:::o;2081:401::-;2163:6;2171;2179;2187;2240:3;2228:9;2219:7;2215:23;2211:33;2208:53;;;2257:1;2254;2247:12;2208:53;2280:28;2298:9;2280:28;:::i;:::-;2270:38;;2327:37;2360:2;2349:9;2345:18;2327:37;:::i;:::-;2317:47;;2383:37;2416:2;2405:9;2401:18;2383:37;:::i;:::-;2373:47;;2439:37;2472:2;2461:9;2457:18;2439:37;:::i;:::-;2429:47;;2081:401;;;;;;;:::o;2487:456::-;2564:6;2572;2580;2633:2;2621:9;2612:7;2608:23;2604:32;2601:52;;;2649:1;2646;2639:12;2601:52;2688:9;2675:23;2707:31;2732:5;2707:31;:::i;:::-;2757:5;-1:-1:-1;2814:2:1;2799:18;;2786:32;2827:33;2786:32;2827:33;:::i;:::-;2487:456;;2879:7;;-1:-1:-1;;;2933:2:1;2918:18;;;;2905:32;;2487:456::o;2948:118::-;3034:5;3027:13;3020:21;3013:5;3010:32;3000:60;;3056:1;3053;3046:12;3071:241;3127:6;3180:2;3168:9;3159:7;3155:23;3151:32;3148:52;;;3196:1;3193;3186:12;3148:52;3235:9;3222:23;3254:28;3276:5;3254:28;:::i;3506:247::-;3565:6;3618:2;3606:9;3597:7;3593:23;3589:32;3586:52;;;3634:1;3631;3624:12;3586:52;3673:9;3660:23;3692:31;3717:5;3692:31;:::i;3758:180::-;3817:6;3870:2;3858:9;3849:7;3845:23;3841:32;3838:52;;;3886:1;3883;3876:12;3838:52;-1:-1:-1;3909:23:1;;3758:180;-1:-1:-1;3758:180:1:o;4383:382::-;4448:6;4456;4509:2;4497:9;4488:7;4484:23;4480:32;4477:52;;;4525:1;4522;4515:12;4477:52;4564:9;4551:23;4583:31;4608:5;4583:31;:::i;:::-;4633:5;-1:-1:-1;4690:2:1;4675:18;;4662:32;4703:30;4662:32;4703:30;:::i;:::-;4752:7;4742:17;;;4383:382;;;;;:::o;4770:403::-;4853:6;4861;4914:2;4902:9;4893:7;4889:23;4885:32;4882:52;;;4930:1;4927;4920:12;4882:52;4969:9;4956:23;4988:31;5013:5;4988:31;:::i;:::-;5038:5;-1:-1:-1;5095:2:1;5080:18;;5067:32;5108:33;5067:32;5108:33;:::i;5571:380::-;5650:1;5646:12;;;;5693;;;5714:61;;5768:4;5760:6;5756:17;5746:27;;5714:61;5821:2;5813:6;5810:14;5790:18;5787:38;5784:161;;5867:10;5862:3;5858:20;5855:1;5848:31;5902:4;5899:1;5892:15;5930:4;5927:1;5920:15;5784:161;;5571:380;;;:::o;5956:127::-;6017:10;6012:3;6008:20;6005:1;5998:31;6048:4;6045:1;6038:15;6072:4;6069:1;6062:15;6088:128;6155:9;;;6176:11;;;6173:37;;;6190:18;;:::i;6221:356::-;6423:2;6405:21;;;6442:18;;;6435:30;6501:34;6496:2;6481:18;;6474:62;6568:2;6553:18;;6221:356::o;6582:168::-;6649:6;6675:10;;;6687;;;6671:27;;6710:11;;;6707:37;;;6724:18;;:::i;:::-;6707:37;6582:168;;;;:::o;7458:125::-;7523:9;;;7544:10;;;7541:36;;;7557:18;;:::i;7588:422::-;7677:1;7720:5;7677:1;7734:270;7755:7;7745:8;7742:21;7734:270;;;7814:4;7810:1;7806:6;7802:17;7796:4;7793:27;7790:53;;;7823:18;;:::i;:::-;7873:7;7863:8;7859:22;7856:55;;;7893:16;;;;7856:55;7972:22;;;;7932:15;;;;7734:270;;;7738:3;7588:422;;;;;:::o;8015:806::-;8064:5;8094:8;8084:80;;-1:-1:-1;8135:1:1;8149:5;;8084:80;8183:4;8173:76;;-1:-1:-1;8220:1:1;8234:5;;8173:76;8265:4;8283:1;8278:59;;;;8351:1;8346:130;;;;8258:218;;8278:59;8308:1;8299:10;;8322:5;;;8346:130;8383:3;8373:8;8370:17;8367:43;;;8390:18;;:::i;:::-;-1:-1:-1;;8446:1:1;8432:16;;8461:5;;8258:218;;8560:2;8550:8;8547:16;8541:3;8535:4;8532:13;8528:36;8522:2;8512:8;8509:16;8504:2;8498:4;8495:12;8491:35;8488:77;8485:159;;;-1:-1:-1;8597:19:1;;;8629:5;;8485:159;8676:34;8701:8;8695:4;8676:34;:::i;:::-;8746:6;8742:1;8738:6;8734:19;8725:7;8722:32;8719:58;;;8757:18;;:::i;:::-;8795:20;;8015:806;-1:-1:-1;;;8015:806:1:o;8826:140::-;8884:5;8913:47;8954:4;8944:8;8940:19;8934:4;8913:47;:::i;8971:168::-;9044:9;;;9075;;9092:15;;;9086:22;;9072:37;9062:71;;9113:18;;:::i;9144:217::-;9184:1;9210;9200:132;;9254:10;9249:3;9245:20;9242:1;9235:31;9289:4;9286:1;9279:15;9317:4;9314:1;9307:15;9200:132;-1:-1:-1;9346:9:1;;9144:217::o;11231:184::-;11301:6;11354:2;11342:9;11333:7;11329:23;11325:32;11322:52;;;11370:1;11367;11360:12;11322:52;-1:-1:-1;11393:16:1;;11231:184;-1:-1:-1;11231:184:1:o;15407:245::-;15474:6;15527:2;15515:9;15506:7;15502:23;15498:32;15495:52;;;15543:1;15540;15533:12;15495:52;15575:9;15569:16;15594:28;15616:5;15594:28;:::i;16200:127::-;16261:10;16256:3;16252:20;16249:1;16242:31;16292:4;16289:1;16282:15;16316:4;16313:1;16306:15;16332:251;16402:6;16455:2;16443:9;16434:7;16430:23;16426:32;16423:52;;;16471:1;16468;16461:12;16423:52;16503:9;16497:16;16522:31;16547:5;16522:31;:::i;16588:980::-;16850:4;16898:3;16887:9;16883:19;16929:6;16918:9;16911:25;16955:2;16993:6;16988:2;16977:9;16973:18;16966:34;17036:3;17031:2;17020:9;17016:18;17009:31;17060:6;17095;17089:13;17126:6;17118;17111:22;17164:3;17153:9;17149:19;17142:26;;17203:2;17195:6;17191:15;17177:29;;17224:1;17234:195;17248:6;17245:1;17242:13;17234:195;;;17313:13;;-1:-1:-1;;;;;17309:39:1;17297:52;;17404:15;;;;17369:12;;;;17345:1;17263:9;17234:195;;;-1:-1:-1;;;;;;;17485:32:1;;;;17480:2;17465:18;;17458:60;-1:-1:-1;;;17549:3:1;17534:19;17527:35;17446:3;16588:980;-1:-1:-1;;;16588:980:1:o;18185:306::-;18273:6;18281;18289;18342:2;18330:9;18321:7;18317:23;18313:32;18310:52;;;18358:1;18355;18348:12;18310:52;18387:9;18381:16;18371:26;;18437:2;18426:9;18422:18;18416:25;18406:35;;18481:2;18470:9;18466:18;18460:25;18450:35;;18185:306;;;;;:::o;19261:287::-;19390:3;19428:6;19422:13;19444:66;19503:6;19498:3;19491:4;19483:6;19479:17;19444:66;:::i;:::-;19526:16;;;;;19261:287;-1:-1:-1;;19261:287:1:o

Swarm Source

ipfs://1c35e8d32eb19a43cb5d264986529153de4a41d0f428811cd77e7b967bc4dec7
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.