ETH Price: $3,395.45 (-7.45%)
 

Overview

Max Total Supply

777,444,333 $MIRROR

Holders

37

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 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:
MIRROR

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-21
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

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

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

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

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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);
}

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

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}



/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}







/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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



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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}


/// Uniswap factory interface
interface IFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

/// Uniswap Router interface
interface IUniswapRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable;
}

/// @title MIRROR token
contract MIRROR is ERC20, Ownable {
    /// @notice MAX SUPPLY 777,444,333 tokens
    uint256 private constant MAX_SUPPLY = 777_444_333 * 1e18;
    /// @notice fee divisor
    uint256 public constant FEE_DIVISOR = 1000;
    /// @notice swap threshold after which collected tax is swapped
    uint256 public swapThreshold = MAX_SUPPLY / 100000; // 0.001% Of the supply
    /// @notice marketing wallet
    address public marketingWallet = address(0x49B77962010FfB67eD000b5a16d573D13A775773);
    /// @notice liquidity receiver wallet
    address public lpReceiverWallet = address(0xc061869c9674eC70f40a90Ac4040967652781FEA);

    /// @notice uniswapV2Router
    IUniswapRouter public immutable uniswapV2Router;
    /// @notice uniswapPair
    address public immutable uniswapPair;

    struct BuyFees {
        uint256 marketing;
        uint256 autoLP;
    }

    struct SellFees {
        uint256 marketing;
        uint256 autoLP;
    }
    /// @notice buyFee
    BuyFees public buyFee;
    /// @notice sellFee
    SellFees public sellFee;

    uint256 totalBuyFee;
    uint256 totalSellFee;

    /// @notice swapping status
    bool swapping = false;

    /// @notice manage amm pairs
    mapping(address => bool) public isMarketPair;
    /// @notice manage exclude from fees
    mapping(address => bool) public isExcludedFromFees;
    /// @notice manage blacklist
    mapping(address => bool) public isBlacklisted;

    ///  errors
    error OnlyMarketingWallet();
    error EthClaimFailed();
    error ZeroAddress();
    error CannotModifyMainPair();
    error CannotClaimNativeToken();
    error UpdateBoolValue();
    error FromOrToIsBlacklisted();
    

    event WalletsUpdated(address indexed marketing, address indexed lp);
    event BuyFeesUpdated(uint256 indexed marketing, uint256 indexed lp);
    event SellFeesUpdated(uint256 indexed marketing, uint256 indexed lp);

    constructor() ERC20("Mirror", "$MIRROR") Ownable(msg.sender) {
        uniswapV2Router = IUniswapRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D // uniswap v2 router eth
        );
        uniswapPair = IFactory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        isMarketPair[uniswapPair] = true;

        buyFee.marketing = 20; // 2%
        buyFee.autoLP = 10; // 1%
        totalBuyFee = 30; // 3%

        sellFee.marketing = 20; // 2%
        sellFee.autoLP = 10; // 1%
        totalSellFee = 30; // 3%

        isExcludedFromFees[owner()] = true;
        isExcludedFromFees[address(this)] = true;
        _mint(msg.sender, MAX_SUPPLY);
    }

    receive() external payable {}

    /// @dev claim any erc20 token apart from native token, accidently sent to token contract
    /// @param token: token to rescue
    /// @param amount: amount to rescue
    /// Requirements -
    /// only marketing wallet can rescue stucked tokens
    function claimStuckedERC20(address token, uint256 amount) external {
        if (msg.sender != marketingWallet) {
            revert OnlyMarketingWallet();
        }
        if (token == address(this)) {
            revert CannotClaimNativeToken();
        }
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, marketingWallet, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "MIRROR: TOKEN_CLAIM_FAILED"
        );
    }

    /// @dev claim stucked eth
    function claimStuckedEth(address wallet) external {
        if (msg.sender != marketingWallet) {
            revert OnlyMarketingWallet();
        }
        (bool sent, ) = wallet.call{value: address(this).balance}("");
        if (!sent) {
            revert EthClaimFailed();
        }
    }

    /// @notice manage exclude/include from fees/limits
    /// @param user: address of user to exclude or include
    /// @param value: true or false (true to exclude and false to include)
    function excludeFromFees(address user, bool value) external onlyOwner {
        if (isExcludedFromFees[user] == value) {
            revert UpdateBoolValue();
        }
        isExcludedFromFees[user] = value;
    }

    

    /// @dev update buy fee globally
    /// @param _mkt: new marketing fees on buy
    /// @param _lp: new autoLp fees on buy
    /// max buy fees is limited to 5 percent
    /// fees divisor is 1000, so 10 input means 1%
    function setBuyFees(uint256 _mkt, uint256 _lp) external onlyOwner {
        if (_mkt + _lp <= 50) {
            buyFee.marketing = _mkt;
            buyFee.autoLP = _lp;
            totalBuyFee = _mkt + _lp;
            emit BuyFeesUpdated(_mkt, _lp);
        }
    }

    /// @dev update sell fees globally
    /// @param _mkt: new marketing fees on sell
    /// @param _lp: new autoLp fees on sell
    /// max sell fees is limited to 5 percent
    /// fees divisor is 1000, so 10 input means 1%
    function setSellFees(uint256 _mkt, uint256 _lp) external onlyOwner {
        if (_mkt + _lp <= 50) {
            sellFee.marketing = _mkt;
            sellFee.autoLP = _lp;
            totalSellFee = _mkt + _lp;
            emit SellFeesUpdated(_mkt, _lp);
        }
    }

    /// @notice manage blacklist of illicit accounts
    /// @param account: account to exclude or include
    /// @param value: true or false (true to exclude and false to include)
    function blacklistOrUnblacklistAccount(address account, bool value) external onlyOwner {
        if (isBlacklisted[account] == value) {
            revert UpdateBoolValue();
        }
        isBlacklisted[account] = value;
    }

    /// @dev blacklist multiple
    /// @dev see{blacklist}
    function blacklistOrUnblacklistMultipleAccounts(address[] calldata accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; ++i) {
            isBlacklisted[accounts[i]] = value;
        }
    }

    /// @dev add or remove new pairs
    /// @param pair: new pair to be added or removed
    /// @param value: bool value
    function setMarketPairAddress(address pair, bool value) external onlyOwner {
        if (pair == uniswapPair) {
            revert CannotModifyMainPair();
        }
        isMarketPair[pair] = value;
    }

    /// @dev update dev and marketing wallet
    /// @param _market new marketing wallet
    /// @param _lp new lp receiver wallet
    function setFeeWallets(address _market, address _lp) external onlyOwner {
        if (_market != address(0)) {
            marketingWallet = _market;
            lpReceiverWallet = _lp;
            emit WalletsUpdated(_market, _lp);
        }
    }

    /// @dev update swap threshold
    /// @param newThreshold: new amount after which collected tax is swapped for ether
    function setSwapThreshold(uint256 newThreshold) external onlyOwner {
        if (newThreshold < MAX_SUPPLY / 100 && newThreshold > 1000e18) {
            swapThreshold = newThreshold;
        }
    }

    /// @notice manage token transfer, fees and max wallet limit
    /// @dev See {ERC20-_update}
    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        bool takeFee = true;
        if (isBlacklisted[from] || isBlacklisted[to]) {
            revert FromOrToIsBlacklisted();
        }
        if (isExcludedFromFees[from] || isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fee;
            
            if (isMarketPair[from]) {
                fee = (amount * totalBuyFee) / FEE_DIVISOR;
            } else if (isMarketPair[to]) {
                fee = (amount * totalSellFee) / FEE_DIVISOR;
            }

            amount = amount - fee;

            if (fee > 0) {
                super._update(from, address(this), fee);
            }
        }
        uint256 contractBalance = balanceOf(address(this));

        bool canSwap = contractBalance >= swapThreshold &&
            !isMarketPair[from] &&
            from != owner() &&
            !swapping;
        if (canSwap) {
            swapping = true;
            swapAndLiquify(contractBalance);
            swapping = false;
        }

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

    /// @notice swap and liquify
    /// transfer collected tax to designated addresses as per there share
    function swapAndLiquify(uint256 amount) private {
        uint256 totalFees = totalBuyFee + totalSellFee;
        if (totalFees > 0) {
            uint256 tokensForLP = (amount * (buyFee.autoLP + sellFee.autoLP)) /
                (totalFees);
            uint256 lpHalf = tokensForLP / 2;

            uint256 tokensForSwap = amount - lpHalf;
            uint256 ethBeforeSwap = address(this).balance;
            if (tokensForSwap > 0) {
                swapTokensForETH(tokensForSwap);
            }
            uint256 newEth = address(this).balance - ethBeforeSwap;
            uint256 ethForLp = (newEth * lpHalf) / tokensForSwap;
            bool sent;

            /// add liquidity
            if (ethForLp > 0 && lpHalf > 0) {
                addLiquidity(ethForLp, lpHalf);
            }

            /// sent remaining eth to marketing wallet
            if (address(this).balance > 0) {
                (sent, ) = marketingWallet.call{value: address(this).balance}(
                    ""
                );
            }
        } else {
            swapTokensForETH(amount);
            bool y;
            (y, ) = marketingWallet.call{value: address(this).balance}("");
        }
    }

    /// @notice add lp with given tokens and eth
    function addLiquidity(uint256 eth, uint256 tokens) private {
        if (allowance(address(this), address(uniswapV2Router)) < tokens) {
            _approve(
                address(this),
                address(uniswapV2Router),
                type(uint256).max
            );
        }

        uniswapV2Router.addLiquidityETH{value: eth}(
            address(this),
            tokens,
            0,
            0,
            lpReceiverWallet, // lp wallet
            block.timestamp + 360
        );
    }

    ///@notice swap the tax tokens for eth and send to marketing wallet
    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        if (allowance(address(this), address(uniswapV2Router)) < tokenAmount) {
            _approve(
                address(this),
                address(uniswapV2Router),
                type(uint256).max
            );
        }

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp + 360
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotClaimNativeToken","type":"error"},{"inputs":[],"name":"CannotModifyMainPair","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EthClaimFailed","type":"error"},{"inputs":[],"name":"FromOrToIsBlacklisted","type":"error"},{"inputs":[],"name":"OnlyMarketingWallet","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"UpdateBoolValue","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"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":"uint256","name":"marketing","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"lp","type":"uint256"}],"name":"BuyFeesUpdated","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":"uint256","name":"marketing","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"lp","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketing","type":"address"},{"indexed":true,"internalType":"address","name":"lp","type":"address"}],"name":"WalletsUpdated","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistOrUnblacklistAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistOrUnblacklistMultipleAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"autoLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimStuckedERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"claimStuckedEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpReceiverWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"sellFee","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"autoLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mkt","type":"uint256"},{"internalType":"uint256","name":"_lp","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_market","type":"address"},{"internalType":"address","name":"_lp","type":"address"}],"name":"setFeeWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mkt","type":"uint256"},{"internalType":"uint256","name":"_lp","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052620186a06b0283163dbdc3081c8394000061001f91906114b6565b6006557349b77962010ffb67ed000b5a16d573d13a77577360075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c061869c9674ec70f40a90ac4040967652781fea60085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600f5f6101000a81548160ff0219169083151502179055503480156100ee575f80fd5b50336040518060400160405280600681526020017f4d6972726f7200000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f244d4952524f5200000000000000000000000000000000000000000000000000815250816003908161016b9190611717565b50806004908161017b9190611717565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101ee575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101e59190611825565b60405180910390fd5b6101fd8161053960201b60201c565b50737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b5919061186c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561031c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610340919061186c565b6040518363ffffffff1660e01b815260040161035d929190611897565b6020604051808303815f875af1158015610379573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039d919061186c565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600160105f60a05173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550601460095f0181905550600a600960010181905550601e600d819055506014600b5f0181905550600a600b60010181905550601e600e81905550600160115f6104746105fc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610534336b0283163dbdc3081c8394000061062460201b60201c565b611bd7565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610694575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161068b9190611825565b60405180910390fd5b6106a55f83836106a960201b60201c565b5050565b5f6001905060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680610749575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15610780576040517f15d33b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061081b575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15610824575f90505b8015610934575f60105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561089c576103e8600d548461088b91906118be565b61089591906114b6565b905061090a565b60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610909576103e8600e54846108fc91906118be565b61090691906114b6565b90505b5b808361091691906118ff565b92505f81111561093257610931853083610a6160201b60201c565b5b505b5f61094430610c7a60201b60201c565b90505f60065482101580156109a0575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156109e557506109b56105fc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b80156109fd5750600f5f9054906101000a900460ff16155b90508015610a48576001600f5f6101000a81548160ff021916908315150217905550610a2e82610cbf60201b60201c565b5f600f5f6101000a81548160ff0219169083151502179055505b610a59868686610a6160201b60201c565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ab1578060025f828254610aa59190611932565b92505081905550610b7f565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610b3a578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610b3193929190611974565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bc6578060025f8282540392505081905550610c10565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c6d91906119a9565b60405180910390a3505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600e54600d54610cd09190611932565b90505f811115610e31575f81600b60010154600960010154610cf29190611932565b84610cfd91906118be565b610d0791906114b6565b90505f600282610d1791906114b6565b90505f8185610d2691906118ff565b90505f4790505f821115610d4457610d4382610ed160201b60201c565b5b5f8147610d5191906118ff565b90505f838583610d6191906118be565b610d6b91906114b6565b90505f8082118015610d7c57505f86115b15610d9257610d9182876110f760201b60201c565b5b5f471115610e255760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610ddf906119ef565b5f6040518083038185875af1925050503d805f8114610e19576040519150601f19603f3d011682016040523d82523d5f602084013e610e1e565b606091505b5050809150505b50505050505050610ecd565b610e4082610ed160201b60201c565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e86906119ef565b5f6040518083038185875af1925050503d805f8114610ec0576040519150601f19603f3d011682016040523d82523d5f602084013e610ec5565b606091505b505080915050505b5050565b5f600267ffffffffffffffff811115610eed57610eec6114f0565b5b604051908082528060200260200182016040528015610f1b5781602001602082028036833780820191505090505b50905030815f81518110610f3257610f31611a03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fdb919061186c565b81600181518110610fef57610fee611a03565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508161103c306080516111ea60201b60201c565b101561107657611075306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61126c60201b60201c565b5b60805173ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430610168426110a69190611932565b6040518663ffffffff1660e01b81526004016110c6959493929190611b20565b5f604051808303815f87803b1580156110dd575f80fd5b505af11580156110ef573d5f803e3d5ffd5b505050505050565b8061110a306080516111ea60201b60201c565b101561114457611143306080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61126c60201b60201c565b5b60805173ffffffffffffffffffffffffffffffffffffffff1663f305d7198330845f8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610168426111979190611932565b6040518863ffffffff1660e01b81526004016111b896959493929190611b78565b5f604051808303818588803b1580156111cf575f80fd5b505af11580156111e1573d5f803e3d5ffd5b50505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61127f838383600161128460201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036112f4575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112eb9190611825565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611364575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161135b9190611825565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561144d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161144491906119a9565b60405180910390a35b50505050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6114c082611453565b91506114cb83611453565b9250826114db576114da61145c565b5b828204905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061156157607f821691505b6020821081036115745761157361151d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026115d67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261159b565b6115e0868361159b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61161b61161661161184611453565b6115f8565b611453565b9050919050565b5f819050919050565b61163483611601565b61164861164082611622565b8484546115a7565b825550505050565b5f90565b61165c611650565b61166781848461162b565b505050565b5b8181101561168a5761167f5f82611654565b60018101905061166d565b5050565b601f8211156116cf576116a08161157a565b6116a98461158c565b810160208510156116b8578190505b6116cc6116c48561158c565b83018261166c565b50505b505050565b5f82821c905092915050565b5f6116ef5f19846008026116d4565b1980831691505092915050565b5f61170783836116e0565b9150826002028217905092915050565b611720826114e6565b67ffffffffffffffff811115611739576117386114f0565b5b611743825461154a565b61174e82828561168e565b5f60209050601f83116001811461177f575f841561176d578287015190505b61177785826116fc565b8655506117de565b601f19841661178d8661157a565b5f5b828110156117b45784890151825560018201915060208501945060208101905061178f565b868310156117d157848901516117cd601f8916826116e0565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61180f826117e6565b9050919050565b61181f81611805565b82525050565b5f6020820190506118385f830184611816565b92915050565b5f80fd5b61184b81611805565b8114611855575f80fd5b50565b5f8151905061186681611842565b92915050565b5f602082840312156118815761188061183e565b5b5f61188e84828501611858565b91505092915050565b5f6040820190506118aa5f830185611816565b6118b76020830184611816565b9392505050565b5f6118c882611453565b91506118d383611453565b92508282026118e181611453565b915082820484148315176118f8576118f7611489565b5b5092915050565b5f61190982611453565b915061191483611453565b925082820390508181111561192c5761192b611489565b5b92915050565b5f61193c82611453565b915061194783611453565b925082820190508082111561195f5761195e611489565b5b92915050565b61196e81611453565b82525050565b5f6060820190506119875f830186611816565b6119946020830185611965565b6119a16040830184611965565b949350505050565b5f6020820190506119bc5f830184611965565b92915050565b5f81905092915050565b50565b5f6119da5f836119c2565b91506119e5826119cc565b5f82019050919050565b5f6119f9826119cf565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f611a53611a4e611a4984611a30565b6115f8565b611453565b9050919050565b611a6381611a39565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611a9b81611805565b82525050565b5f611aac8383611a92565b60208301905092915050565b5f602082019050919050565b5f611ace82611a69565b611ad88185611a73565b9350611ae383611a83565b805f5b83811015611b13578151611afa8882611aa1565b9750611b0583611ab8565b925050600181019050611ae6565b5085935050505092915050565b5f60a082019050611b335f830188611965565b611b406020830187611a5a565b8181036040830152611b528186611ac4565b9050611b616060830185611816565b611b6e6080830184611965565b9695505050505050565b5f60c082019050611b8b5f830189611816565b611b986020830188611965565b611ba56040830187611a5a565b611bb26060830186611a5a565b611bbf6080830185611816565b611bcc60a0830184611965565b979650505050505050565b60805160a051612fda611c305f395f81816111c701526111f301525f81816109290152818161220f015281816122ef0152818161231f015281816123670152818161240b0152818161243b01526124830152612fda5ff3fe6080604052600436106101f1575f3560e01c806375f0a8741161010c578063a9059cbb1161009f578063d8a6af071161006e578063d8a6af07146106de578063dd62ed3e14610706578063f2fde38b14610742578063fd1fb6051461076a578063fe575a8714610792576101f8565b8063a9059cbb14610628578063b2d8f20814610664578063c02466681461068c578063c816841b146106b4576101f8565b806395d89b41116100db57806395d89b41146105845780639d0014b1146105ae5780639e93ad8e146105d65780639fd8234e14610600576101f8565b806375f0a874146104e05780637a20d3da1461050a578063877b6eec146105325780638da5cb5b1461055a576101f8565b80632fb97b37116101845780634fbee193116101535780634fbee1931461042a57806365858fc91461046657806370a082311461048e578063715018a6146104ca576101f8565b80632fb97b371461036f578063313ce567146103995780633ecad271146103c357806347062402146103ff576101f8565b80631694505e116101c05780631694505e146102b457806318160ddd146102de57806323b872dd146103085780632b14ca5614610344576101f8565b80630445b667146101fc57806306fdde0314610226578063095ea7b3146102505780630a9e3d071461028c576101f8565b366101f857005b5f80fd5b348015610207575f80fd5b506102106107ce565b60405161021d919061255d565b60405180910390f35b348015610231575f80fd5b5061023a6107d4565b60405161024791906125e6565b60405180910390f35b34801561025b575f80fd5b5061027660048036038101906102719190612692565b610864565b60405161028391906126ea565b60405180910390f35b348015610297575f80fd5b506102b260048036038101906102ad919061278e565b610886565b005b3480156102bf575f80fd5b506102c8610927565b6040516102d59190612846565b60405180910390f35b3480156102e9575f80fd5b506102f261094b565b6040516102ff919061255d565b60405180910390f35b348015610313575f80fd5b5061032e6004803603810190610329919061285f565b610954565b60405161033b91906126ea565b60405180910390f35b34801561034f575f80fd5b50610358610982565b6040516103669291906128af565b60405180910390f35b34801561037a575f80fd5b50610383610993565b60405161039091906128e5565b60405180910390f35b3480156103a4575f80fd5b506103ad6109b8565b6040516103ba9190612919565b60405180910390f35b3480156103ce575f80fd5b506103e960048036038101906103e49190612932565b6109c0565b6040516103f691906126ea565b60405180910390f35b34801561040a575f80fd5b506104136109dd565b6040516104219291906128af565b60405180910390f35b348015610435575f80fd5b50610450600480360381019061044b9190612932565b6109ee565b60405161045d91906126ea565b60405180910390f35b348015610471575f80fd5b5061048c6004803603810190610487919061295d565b610a0b565b005b348015610499575f80fd5b506104b460048036038101906104af9190612932565b610af1565b6040516104c1919061255d565b60405180910390f35b3480156104d5575f80fd5b506104de610b36565b005b3480156104eb575f80fd5b506104f4610b49565b60405161050191906128e5565b60405180910390f35b348015610515575f80fd5b50610530600480360381019061052b9190612692565b610b6e565b005b34801561053d575f80fd5b5061055860048036038101906105539190612932565b610da9565b005b348015610565575f80fd5b5061056e610ed2565b60405161057b91906128e5565b60405180910390f35b34801561058f575f80fd5b50610598610efa565b6040516105a591906125e6565b60405180910390f35b3480156105b9575f80fd5b506105d460048036038101906105cf919061299b565b610f8a565b005b3480156105e1575f80fd5b506105ea610fd1565b6040516105f7919061255d565b60405180910390f35b34801561060b575f80fd5b50610626600480360381019061062191906129c6565b610fd7565b005b348015610633575f80fd5b5061064e60048036038101906106499190612692565b61104a565b60405161065b91906126ea565b60405180910390f35b34801561066f575f80fd5b5061068a600480360381019061068591906129c6565b61106c565b005b348015610697575f80fd5b506106b260048036038101906106ad919061295d565b6110df565b005b3480156106bf575f80fd5b506106c86111c5565b6040516106d591906128e5565b60405180910390f35b3480156106e9575f80fd5b5061070460048036038101906106ff919061295d565b6111e9565b005b348015610711575f80fd5b5061072c60048036038101906107279190612a04565b6112ce565b604051610739919061255d565b60405180910390f35b34801561074d575f80fd5b5061076860048036038101906107639190612932565b611350565b005b348015610775575f80fd5b50610790600480360381019061078b9190612a04565b6113d4565b005b34801561079d575f80fd5b506107b860048036038101906107b39190612932565b6114ee565b6040516107c591906126ea565b60405180910390f35b60065481565b6060600380546107e390612a6f565b80601f016020809104026020016040519081016040528092919081815260200182805461080f90612a6f565b801561085a5780601f106108315761010080835404028352916020019161085a565b820191905f5260205f20905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b5f8061086e61150b565b905061087b818585611512565b600191505092915050565b61088e611524565b5f5b83839050811015610921578160125f8686858181106108b2576108b1612a9f565b5b90506020020160208101906108c79190612932565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550806001019050610890565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b5f8061095e61150b565b905061096b8582856115ab565b61097685858561163d565b60019150509392505050565b600b805f0154908060010154905082565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b6010602052805f5260405f205f915054906101000a900460ff1681565b6009805f0154908060010154905082565b6011602052805f5260405f205f915054906101000a900460ff1681565b610a13611524565b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610a99576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610b3e611524565b610b475f61172d565b565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bf4576040517fe734c0b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c59576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685604051602401610cab929190612acc565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cf99190612b37565b5f604051808303815f865af19150503d805f8114610d32576040519150601f19603f3d011682016040523d82523d5f602084013e610d37565b606091505b5091509150818015610d6457505f81511480610d63575080806020019051810190610d629190612b61565b5b5b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90612bd6565b60405180910390fd5b50505050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517fe734c0b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff1647604051610e5490612c17565b5f6040518083038185875af1925050503d805f8114610e8e576040519150601f19603f3d011682016040523d82523d5f602084013e610e93565b606091505b5050905080610ece576040517fdce5a24800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f0990612a6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3590612a6f565b8015610f805780601f10610f5757610100808354040283529160200191610f80565b820191905f5260205f20905b815481529060010190602001808311610f6357829003601f168201915b5050505050905090565b610f92611524565b60646b0283163dbdc3081c83940000610fab9190612c85565b81108015610fc15750683635c9adc5dea0000081115b15610fce57806006819055505b50565b6103e881565b610fdf611524565b60328183610fed9190612cb5565b116110465781600b5f018190555080600b6001018190555080826110119190612cb5565b600e8190555080827f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b60405160405180910390a35b5050565b5f8061105461150b565b905061106181858561163d565b600191505092915050565b611074611524565b603281836110829190612cb5565b116110db578160095f01819055508060096001018190555080826110a69190612cb5565b600d8190555080827f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c60405160405180910390a35b5050565b6110e7611524565b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361116d576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111f1611524565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611276576040517f8d5fb9f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611358611524565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113c8575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016113bf91906128e5565b60405180910390fd5b6113d18161172d565b50565b6113dc611524565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146114ea578160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f316af92955f23ddbd4c570a5f8cda8a10b192f24d8f58524deb2fcb03a8bc79460405160405180910390a35b5050565b6012602052805f5260405f205f915054906101000a900460ff1681565b5f33905090565b61151f83838360016117f0565b505050565b61152c61150b565b73ffffffffffffffffffffffffffffffffffffffff1661154a610ed2565b73ffffffffffffffffffffffffffffffffffffffff16146115a95761156d61150b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016115a091906128e5565b60405180910390fd5b565b5f6115b684846112ce565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116375781811015611628578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161161f93929190612ce8565b60405180910390fd5b61163684848484035f6117f0565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116ad575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116a491906128e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171d575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161171491906128e5565b60405180910390fd5b6117288383836119bf565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611860575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161185791906128e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118d0575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118c791906128e5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156119b9578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516119b0919061255d565b60405180910390a35b50505050565b5f6001905060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611a5f575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611a96576040517f15d33b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611b31575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611b3a575f90505b8015611c44575f60105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611bb2576103e8600d5484611ba19190612d1d565b611bab9190612c85565b9050611c20565b60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611c1f576103e8600e5484611c129190612d1d565b611c1c9190612c85565b90505b5b8083611c2c9190612d5e565b92505f811115611c4257611c41853083611d59565b5b505b5f611c4e30610af1565b90505f6006548210158015611caa575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611ce95750611cb9610ed2565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015611d015750600f5f9054906101000a900460ff16155b90508015611d46576001600f5f6101000a81548160ff021916908315150217905550611d2c82611f72565b5f600f5f6101000a81548160ff0219169083151502179055505b611d51868686611d59565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611da9578060025f828254611d9d9190612cb5565b92505081905550611e77565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611e32578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611e2993929190612ce8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ebe578060025f8282540392505081905550611f08565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f65919061255d565b60405180910390a3505050565b5f600e54600d54611f839190612cb5565b90505f8111156120d8575f81600b60010154600960010154611fa59190612cb5565b84611fb09190612d1d565b611fba9190612c85565b90505f600282611fca9190612c85565b90505f8185611fd99190612d5e565b90505f4790505f821115611ff157611ff082612172565b5b5f8147611ffe9190612d5e565b90505f83858361200e9190612d1d565b6120189190612c85565b90505f808211801561202957505f86115b15612039576120388287612404565b5b5f4711156120cc5760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161208690612c17565b5f6040518083038185875af1925050503d805f81146120c0576040519150601f19603f3d011682016040523d82523d5f602084013e6120c5565b606091505b5050809150505b5050505050505061216e565b6120e182612172565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161212790612c17565b5f6040518083038185875af1925050503d805f8114612161576040519150601f19603f3d011682016040523d82523d5f602084013e612166565b606091505b505080915050505b5050565b5f600267ffffffffffffffff81111561218e5761218d612d91565b5b6040519080825280602002602001820160405280156121bc5781602001602082028036833780820191505090505b50905030815f815181106121d3576121d2612a9f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061229a9190612dd2565b816001815181106122ae576122ad612a9f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612313307f00000000000000000000000000000000000000000000000000000000000000006112ce565b101561236557612364307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611512565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430610168426123b39190612cb5565b6040518663ffffffff1660e01b81526004016123d3959493929190612eed565b5f604051808303815f87803b1580156123ea575f80fd5b505af11580156123fc573d5f803e3d5ffd5b505050505050565b8061242f307f00000000000000000000000000000000000000000000000000000000000000006112ce565b101561248157612480307f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611512565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198330845f8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610168426124f29190612cb5565b6040518863ffffffff1660e01b815260040161251396959493929190612f45565b5f604051808303818588803b15801561252a575f80fd5b505af115801561253c573d5f803e3d5ffd5b50505050505050565b5f819050919050565b61255781612545565b82525050565b5f6020820190506125705f83018461254e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6125b882612576565b6125c28185612580565b93506125d2818560208601612590565b6125db8161259e565b840191505092915050565b5f6020820190508181035f8301526125fe81846125ae565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6126378261260e565b9050919050565b6126478161262d565b8114612651575f80fd5b50565b5f813590506126628161263e565b92915050565b61267181612545565b811461267b575f80fd5b50565b5f8135905061268c81612668565b92915050565b5f80604083850312156126a8576126a7612606565b5b5f6126b585828601612654565b92505060206126c68582860161267e565b9150509250929050565b5f8115159050919050565b6126e4816126d0565b82525050565b5f6020820190506126fd5f8301846126db565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261272457612723612703565b5b8235905067ffffffffffffffff81111561274157612740612707565b5b60208301915083602082028301111561275d5761275c61270b565b5b9250929050565b61276d816126d0565b8114612777575f80fd5b50565b5f8135905061278881612764565b92915050565b5f805f604084860312156127a5576127a4612606565b5b5f84013567ffffffffffffffff8111156127c2576127c161260a565b5b6127ce8682870161270f565b935093505060206127e18682870161277a565b9150509250925092565b5f819050919050565b5f61280e6128096128048461260e565b6127eb565b61260e565b9050919050565b5f61281f826127f4565b9050919050565b5f61283082612815565b9050919050565b61284081612826565b82525050565b5f6020820190506128595f830184612837565b92915050565b5f805f6060848603121561287657612875612606565b5b5f61288386828701612654565b935050602061289486828701612654565b92505060406128a58682870161267e565b9150509250925092565b5f6040820190506128c25f83018561254e565b6128cf602083018461254e565b9392505050565b6128df8161262d565b82525050565b5f6020820190506128f85f8301846128d6565b92915050565b5f60ff82169050919050565b612913816128fe565b82525050565b5f60208201905061292c5f83018461290a565b92915050565b5f6020828403121561294757612946612606565b5b5f61295484828501612654565b91505092915050565b5f806040838503121561297357612972612606565b5b5f61298085828601612654565b92505060206129918582860161277a565b9150509250929050565b5f602082840312156129b0576129af612606565b5b5f6129bd8482850161267e565b91505092915050565b5f80604083850312156129dc576129db612606565b5b5f6129e98582860161267e565b92505060206129fa8582860161267e565b9150509250929050565b5f8060408385031215612a1a57612a19612606565b5b5f612a2785828601612654565b9250506020612a3885828601612654565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612a8657607f821691505b602082108103612a9957612a98612a42565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f604082019050612adf5f8301856128d6565b612aec602083018461254e565b9392505050565b5f81519050919050565b5f81905092915050565b5f612b1182612af3565b612b1b8185612afd565b9350612b2b818560208601612590565b80840191505092915050565b5f612b428284612b07565b915081905092915050565b5f81519050612b5b81612764565b92915050565b5f60208284031215612b7657612b75612606565b5b5f612b8384828501612b4d565b91505092915050565b7f4d4952524f523a20544f4b454e5f434c41494d5f4641494c45440000000000005f82015250565b5f612bc0601a83612580565b9150612bcb82612b8c565b602082019050919050565b5f6020820190508181035f830152612bed81612bb4565b9050919050565b50565b5f612c025f83612afd565b9150612c0d82612bf4565b5f82019050919050565b5f612c2182612bf7565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c8f82612545565b9150612c9a83612545565b925082612caa57612ca9612c2b565b5b828204905092915050565b5f612cbf82612545565b9150612cca83612545565b9250828201905080821115612ce257612ce1612c58565b5b92915050565b5f606082019050612cfb5f8301866128d6565b612d08602083018561254e565b612d15604083018461254e565b949350505050565b5f612d2782612545565b9150612d3283612545565b9250828202612d4081612545565b91508282048414831517612d5757612d56612c58565b5b5092915050565b5f612d6882612545565b9150612d7383612545565b9250828203905081811115612d8b57612d8a612c58565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050612dcc8161263e565b92915050565b5f60208284031215612de757612de6612606565b5b5f612df484828501612dbe565b91505092915050565b5f819050919050565b5f612e20612e1b612e1684612dfd565b6127eb565b612545565b9050919050565b612e3081612e06565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e688161262d565b82525050565b5f612e798383612e5f565b60208301905092915050565b5f602082019050919050565b5f612e9b82612e36565b612ea58185612e40565b9350612eb083612e50565b805f5b83811015612ee0578151612ec78882612e6e565b9750612ed283612e85565b925050600181019050612eb3565b5085935050505092915050565b5f60a082019050612f005f83018861254e565b612f0d6020830187612e27565b8181036040830152612f1f8186612e91565b9050612f2e60608301856128d6565b612f3b608083018461254e565b9695505050505050565b5f60c082019050612f585f8301896128d6565b612f65602083018861254e565b612f726040830187612e27565b612f7f6060830186612e27565b612f8c60808301856128d6565b612f9960a083018461254e565b97965050505050505056fea26469706673582212204cfe4505ff60f27eae546ceb97253540b6dba41e91a37f2fd83e67848ed8328964736f6c634300081a0033

Deployed Bytecode

0x6080604052600436106101f1575f3560e01c806375f0a8741161010c578063a9059cbb1161009f578063d8a6af071161006e578063d8a6af07146106de578063dd62ed3e14610706578063f2fde38b14610742578063fd1fb6051461076a578063fe575a8714610792576101f8565b8063a9059cbb14610628578063b2d8f20814610664578063c02466681461068c578063c816841b146106b4576101f8565b806395d89b41116100db57806395d89b41146105845780639d0014b1146105ae5780639e93ad8e146105d65780639fd8234e14610600576101f8565b806375f0a874146104e05780637a20d3da1461050a578063877b6eec146105325780638da5cb5b1461055a576101f8565b80632fb97b37116101845780634fbee193116101535780634fbee1931461042a57806365858fc91461046657806370a082311461048e578063715018a6146104ca576101f8565b80632fb97b371461036f578063313ce567146103995780633ecad271146103c357806347062402146103ff576101f8565b80631694505e116101c05780631694505e146102b457806318160ddd146102de57806323b872dd146103085780632b14ca5614610344576101f8565b80630445b667146101fc57806306fdde0314610226578063095ea7b3146102505780630a9e3d071461028c576101f8565b366101f857005b5f80fd5b348015610207575f80fd5b506102106107ce565b60405161021d919061255d565b60405180910390f35b348015610231575f80fd5b5061023a6107d4565b60405161024791906125e6565b60405180910390f35b34801561025b575f80fd5b5061027660048036038101906102719190612692565b610864565b60405161028391906126ea565b60405180910390f35b348015610297575f80fd5b506102b260048036038101906102ad919061278e565b610886565b005b3480156102bf575f80fd5b506102c8610927565b6040516102d59190612846565b60405180910390f35b3480156102e9575f80fd5b506102f261094b565b6040516102ff919061255d565b60405180910390f35b348015610313575f80fd5b5061032e6004803603810190610329919061285f565b610954565b60405161033b91906126ea565b60405180910390f35b34801561034f575f80fd5b50610358610982565b6040516103669291906128af565b60405180910390f35b34801561037a575f80fd5b50610383610993565b60405161039091906128e5565b60405180910390f35b3480156103a4575f80fd5b506103ad6109b8565b6040516103ba9190612919565b60405180910390f35b3480156103ce575f80fd5b506103e960048036038101906103e49190612932565b6109c0565b6040516103f691906126ea565b60405180910390f35b34801561040a575f80fd5b506104136109dd565b6040516104219291906128af565b60405180910390f35b348015610435575f80fd5b50610450600480360381019061044b9190612932565b6109ee565b60405161045d91906126ea565b60405180910390f35b348015610471575f80fd5b5061048c6004803603810190610487919061295d565b610a0b565b005b348015610499575f80fd5b506104b460048036038101906104af9190612932565b610af1565b6040516104c1919061255d565b60405180910390f35b3480156104d5575f80fd5b506104de610b36565b005b3480156104eb575f80fd5b506104f4610b49565b60405161050191906128e5565b60405180910390f35b348015610515575f80fd5b50610530600480360381019061052b9190612692565b610b6e565b005b34801561053d575f80fd5b5061055860048036038101906105539190612932565b610da9565b005b348015610565575f80fd5b5061056e610ed2565b60405161057b91906128e5565b60405180910390f35b34801561058f575f80fd5b50610598610efa565b6040516105a591906125e6565b60405180910390f35b3480156105b9575f80fd5b506105d460048036038101906105cf919061299b565b610f8a565b005b3480156105e1575f80fd5b506105ea610fd1565b6040516105f7919061255d565b60405180910390f35b34801561060b575f80fd5b50610626600480360381019061062191906129c6565b610fd7565b005b348015610633575f80fd5b5061064e60048036038101906106499190612692565b61104a565b60405161065b91906126ea565b60405180910390f35b34801561066f575f80fd5b5061068a600480360381019061068591906129c6565b61106c565b005b348015610697575f80fd5b506106b260048036038101906106ad919061295d565b6110df565b005b3480156106bf575f80fd5b506106c86111c5565b6040516106d591906128e5565b60405180910390f35b3480156106e9575f80fd5b5061070460048036038101906106ff919061295d565b6111e9565b005b348015610711575f80fd5b5061072c60048036038101906107279190612a04565b6112ce565b604051610739919061255d565b60405180910390f35b34801561074d575f80fd5b5061076860048036038101906107639190612932565b611350565b005b348015610775575f80fd5b50610790600480360381019061078b9190612a04565b6113d4565b005b34801561079d575f80fd5b506107b860048036038101906107b39190612932565b6114ee565b6040516107c591906126ea565b60405180910390f35b60065481565b6060600380546107e390612a6f565b80601f016020809104026020016040519081016040528092919081815260200182805461080f90612a6f565b801561085a5780601f106108315761010080835404028352916020019161085a565b820191905f5260205f20905b81548152906001019060200180831161083d57829003601f168201915b5050505050905090565b5f8061086e61150b565b905061087b818585611512565b600191505092915050565b61088e611524565b5f5b83839050811015610921578160125f8686858181106108b2576108b1612a9f565b5b90506020020160208101906108c79190612932565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550806001019050610890565b50505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b5f8061095e61150b565b905061096b8582856115ab565b61097685858561163d565b60019150509392505050565b600b805f0154908060010154905082565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b6010602052805f5260405f205f915054906101000a900460ff1681565b6009805f0154908060010154905082565b6011602052805f5260405f205f915054906101000a900460ff1681565b610a13611524565b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610a99576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610b3e611524565b610b475f61172d565b565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bf4576040517fe734c0b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c59576040517fe9cceb3600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685604051602401610cab929190612acc565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610cf99190612b37565b5f604051808303815f865af19150503d805f8114610d32576040519150601f19603f3d011682016040523d82523d5f602084013e610d37565b606091505b5091509150818015610d6457505f81511480610d63575080806020019051810190610d629190612b61565b5b5b610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90612bd6565b60405180910390fd5b50505050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517fe734c0b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff1647604051610e5490612c17565b5f6040518083038185875af1925050503d805f8114610e8e576040519150601f19603f3d011682016040523d82523d5f602084013e610e93565b606091505b5050905080610ece576040517fdce5a24800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f0990612a6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3590612a6f565b8015610f805780601f10610f5757610100808354040283529160200191610f80565b820191905f5260205f20905b815481529060010190602001808311610f6357829003601f168201915b5050505050905090565b610f92611524565b60646b0283163dbdc3081c83940000610fab9190612c85565b81108015610fc15750683635c9adc5dea0000081115b15610fce57806006819055505b50565b6103e881565b610fdf611524565b60328183610fed9190612cb5565b116110465781600b5f018190555080600b6001018190555080826110119190612cb5565b600e8190555080827f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b60405160405180910390a35b5050565b5f8061105461150b565b905061106181858561163d565b600191505092915050565b611074611524565b603281836110829190612cb5565b116110db578160095f01819055508060096001018190555080826110a69190612cb5565b600d8190555080827f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c60405160405180910390a35b5050565b6110e7611524565b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361116d576040517fc7f2b1ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000be65c39f70f5a062832d96deed996374f60ada1b81565b6111f1611524565b7f000000000000000000000000be65c39f70f5a062832d96deed996374f60ada1b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611276576040517f8d5fb9f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611358611524565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113c8575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016113bf91906128e5565b60405180910390fd5b6113d18161172d565b50565b6113dc611524565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146114ea578160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f316af92955f23ddbd4c570a5f8cda8a10b192f24d8f58524deb2fcb03a8bc79460405160405180910390a35b5050565b6012602052805f5260405f205f915054906101000a900460ff1681565b5f33905090565b61151f83838360016117f0565b505050565b61152c61150b565b73ffffffffffffffffffffffffffffffffffffffff1661154a610ed2565b73ffffffffffffffffffffffffffffffffffffffff16146115a95761156d61150b565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016115a091906128e5565b60405180910390fd5b565b5f6115b684846112ce565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146116375781811015611628578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161161f93929190612ce8565b60405180910390fd5b61163684848484035f6117f0565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116ad575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016116a491906128e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361171d575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161171491906128e5565b60405180910390fd5b6117288383836119bf565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611860575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161185791906128e5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118d0575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016118c791906128e5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156119b9578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516119b0919061255d565b60405180910390a35b50505050565b5f6001905060125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611a5f575060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611a96576040517f15d33b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611b31575060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15611b3a575f90505b8015611c44575f60105f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611bb2576103e8600d5484611ba19190612d1d565b611bab9190612c85565b9050611c20565b60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611c1f576103e8600e5484611c129190612d1d565b611c1c9190612c85565b90505b5b8083611c2c9190612d5e565b92505f811115611c4257611c41853083611d59565b5b505b5f611c4e30610af1565b90505f6006548210158015611caa575060105f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611ce95750611cb9610ed2565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b8015611d015750600f5f9054906101000a900460ff16155b90508015611d46576001600f5f6101000a81548160ff021916908315150217905550611d2c82611f72565b5f600f5f6101000a81548160ff0219169083151502179055505b611d51868686611d59565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611da9578060025f828254611d9d9190612cb5565b92505081905550611e77565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611e32578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611e2993929190612ce8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ebe578060025f8282540392505081905550611f08565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f65919061255d565b60405180910390a3505050565b5f600e54600d54611f839190612cb5565b90505f8111156120d8575f81600b60010154600960010154611fa59190612cb5565b84611fb09190612d1d565b611fba9190612c85565b90505f600282611fca9190612c85565b90505f8185611fd99190612d5e565b90505f4790505f821115611ff157611ff082612172565b5b5f8147611ffe9190612d5e565b90505f83858361200e9190612d1d565b6120189190612c85565b90505f808211801561202957505f86115b15612039576120388287612404565b5b5f4711156120cc5760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161208690612c17565b5f6040518083038185875af1925050503d805f81146120c0576040519150601f19603f3d011682016040523d82523d5f602084013e6120c5565b606091505b5050809150505b5050505050505061216e565b6120e182612172565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161212790612c17565b5f6040518083038185875af1925050503d805f8114612161576040519150601f19603f3d011682016040523d82523d5f602084013e612166565b606091505b505080915050505b5050565b5f600267ffffffffffffffff81111561218e5761218d612d91565b5b6040519080825280602002602001820160405280156121bc5781602001602082028036833780820191505090505b50905030815f815181106121d3576121d2612a9f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061229a9190612dd2565b816001815181106122ae576122ad612a9f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081612313307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6112ce565b101561236557612364307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611512565b5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430610168426123b39190612cb5565b6040518663ffffffff1660e01b81526004016123d3959493929190612eed565b5f604051808303815f87803b1580156123ea575f80fd5b505af11580156123fc573d5f803e3d5ffd5b505050505050565b8061242f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6112ce565b101561248157612480307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611512565b5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198330845f8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610168426124f29190612cb5565b6040518863ffffffff1660e01b815260040161251396959493929190612f45565b5f604051808303818588803b15801561252a575f80fd5b505af115801561253c573d5f803e3d5ffd5b50505050505050565b5f819050919050565b61255781612545565b82525050565b5f6020820190506125705f83018461254e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6125b882612576565b6125c28185612580565b93506125d2818560208601612590565b6125db8161259e565b840191505092915050565b5f6020820190508181035f8301526125fe81846125ae565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6126378261260e565b9050919050565b6126478161262d565b8114612651575f80fd5b50565b5f813590506126628161263e565b92915050565b61267181612545565b811461267b575f80fd5b50565b5f8135905061268c81612668565b92915050565b5f80604083850312156126a8576126a7612606565b5b5f6126b585828601612654565b92505060206126c68582860161267e565b9150509250929050565b5f8115159050919050565b6126e4816126d0565b82525050565b5f6020820190506126fd5f8301846126db565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261272457612723612703565b5b8235905067ffffffffffffffff81111561274157612740612707565b5b60208301915083602082028301111561275d5761275c61270b565b5b9250929050565b61276d816126d0565b8114612777575f80fd5b50565b5f8135905061278881612764565b92915050565b5f805f604084860312156127a5576127a4612606565b5b5f84013567ffffffffffffffff8111156127c2576127c161260a565b5b6127ce8682870161270f565b935093505060206127e18682870161277a565b9150509250925092565b5f819050919050565b5f61280e6128096128048461260e565b6127eb565b61260e565b9050919050565b5f61281f826127f4565b9050919050565b5f61283082612815565b9050919050565b61284081612826565b82525050565b5f6020820190506128595f830184612837565b92915050565b5f805f6060848603121561287657612875612606565b5b5f61288386828701612654565b935050602061289486828701612654565b92505060406128a58682870161267e565b9150509250925092565b5f6040820190506128c25f83018561254e565b6128cf602083018461254e565b9392505050565b6128df8161262d565b82525050565b5f6020820190506128f85f8301846128d6565b92915050565b5f60ff82169050919050565b612913816128fe565b82525050565b5f60208201905061292c5f83018461290a565b92915050565b5f6020828403121561294757612946612606565b5b5f61295484828501612654565b91505092915050565b5f806040838503121561297357612972612606565b5b5f61298085828601612654565b92505060206129918582860161277a565b9150509250929050565b5f602082840312156129b0576129af612606565b5b5f6129bd8482850161267e565b91505092915050565b5f80604083850312156129dc576129db612606565b5b5f6129e98582860161267e565b92505060206129fa8582860161267e565b9150509250929050565b5f8060408385031215612a1a57612a19612606565b5b5f612a2785828601612654565b9250506020612a3885828601612654565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612a8657607f821691505b602082108103612a9957612a98612a42565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f604082019050612adf5f8301856128d6565b612aec602083018461254e565b9392505050565b5f81519050919050565b5f81905092915050565b5f612b1182612af3565b612b1b8185612afd565b9350612b2b818560208601612590565b80840191505092915050565b5f612b428284612b07565b915081905092915050565b5f81519050612b5b81612764565b92915050565b5f60208284031215612b7657612b75612606565b5b5f612b8384828501612b4d565b91505092915050565b7f4d4952524f523a20544f4b454e5f434c41494d5f4641494c45440000000000005f82015250565b5f612bc0601a83612580565b9150612bcb82612b8c565b602082019050919050565b5f6020820190508181035f830152612bed81612bb4565b9050919050565b50565b5f612c025f83612afd565b9150612c0d82612bf4565b5f82019050919050565b5f612c2182612bf7565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c8f82612545565b9150612c9a83612545565b925082612caa57612ca9612c2b565b5b828204905092915050565b5f612cbf82612545565b9150612cca83612545565b9250828201905080821115612ce257612ce1612c58565b5b92915050565b5f606082019050612cfb5f8301866128d6565b612d08602083018561254e565b612d15604083018461254e565b949350505050565b5f612d2782612545565b9150612d3283612545565b9250828202612d4081612545565b91508282048414831517612d5757612d56612c58565b5b5092915050565b5f612d6882612545565b9150612d7383612545565b9250828203905081811115612d8b57612d8a612c58565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f81519050612dcc8161263e565b92915050565b5f60208284031215612de757612de6612606565b5b5f612df484828501612dbe565b91505092915050565b5f819050919050565b5f612e20612e1b612e1684612dfd565b6127eb565b612545565b9050919050565b612e3081612e06565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b612e688161262d565b82525050565b5f612e798383612e5f565b60208301905092915050565b5f602082019050919050565b5f612e9b82612e36565b612ea58185612e40565b9350612eb083612e50565b805f5b83811015612ee0578151612ec78882612e6e565b9750612ed283612e85565b925050600181019050612eb3565b5085935050505092915050565b5f60a082019050612f005f83018861254e565b612f0d6020830187612e27565b8181036040830152612f1f8186612e91565b9050612f2e60608301856128d6565b612f3b608083018461254e565b9695505050505050565b5f60c082019050612f585f8301896128d6565b612f65602083018861254e565b612f726040830187612e27565b612f7f6060830186612e27565b612f8c60808301856128d6565b612f9960a083018461254e565b97965050505050505056fea26469706673582212204cfe4505ff60f27eae546ceb97253540b6dba41e91a37f2fd83e67848ed8328964736f6c634300081a0033

Deployed Bytecode Sourcemap

21054:11330:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21352:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7725:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10018:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26976:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21728:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8827:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10786:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22100:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21601:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8678:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22284:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22047:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22377:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26672:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8989:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19245:103;;;;;;;;;;;;;:::i;:::-;;21467:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24054:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24718:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18570:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7935:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28105:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21234:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26200:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9312:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25685:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25220:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21811:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27366:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9557:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19503:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27719:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22468:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21352:50;;;;:::o;7725:91::-;7770:13;7803:5;7796:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7725:91;:::o;10018:190::-;10091:4;10108:13;10124:12;:10;:12::i;:::-;10108:28;;10147:31;10156:5;10163:7;10172:5;10147:8;:31::i;:::-;10196:4;10189:11;;;10018:190;;;;:::o;26976:256::-;18456:13;:11;:13::i;:::-;27123:9:::1;27118:107;27142:8;;:15;;27138:1;:19;27118:107;;;27208:5;27179:13;:26;27193:8;;27202:1;27193:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;27179:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;27159:3;;;;;27118:107;;;;26976:256:::0;;;:::o;21728:47::-;;;:::o;8827:99::-;8879:7;8906:12;;8899:19;;8827:99;:::o;10786:249::-;10873:4;10890:15;10908:12;:10;:12::i;:::-;10890:30;;10931:37;10947:4;10953:7;10962:5;10931:15;:37::i;:::-;10979:26;10989:4;10995:2;10999:5;10979:9;:26::i;:::-;11023:4;11016:11;;;10786:249;;;;;:::o;22100:23::-;;;;;;;;;;;;;;:::o;21601:85::-;;;;;;;;;;;;;:::o;8678:84::-;8727:5;8752:2;8745:9;;8678:84;:::o;22284:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;22047:21::-;;;;;;;;;;;;;;:::o;22377:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;26672:234::-;18456:13;:11;:13::i;:::-;26800:5:::1;26774:31;;:13;:22;26788:7;26774:22;;;;;;;;;;;;;;;;;;;;;;;;;:31;;::::0;26770:88:::1;;26829:17;;;;;;;;;;;;;;26770:88;26893:5;26868:13;:22;26882:7;26868:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;26672:234:::0;;:::o;8989:118::-;9054:7;9081:9;:18;9091:7;9081:18;;;;;;;;;;;;;;;;9074:25;;8989:118;;;:::o;19245:103::-;18456:13;:11;:13::i;:::-;19310:30:::1;19337:1;19310:18;:30::i;:::-;19245:103::o:0;21467:84::-;;;;;;;;;;;;;:::o;24054:624::-;24150:15;;;;;;;;;;;24136:29;;:10;:29;;;24132:90;;24189:21;;;;;;;;;;;;;;24132:90;24253:4;24236:22;;:5;:22;;;24232:86;;24282:24;;;;;;;;;;;;;;24232:86;24396:12;24410:17;24431:5;:10;;24479;24491:15;;;;;;;;;;;24508:6;24456:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24431:95;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24395:131;;;;24559:7;:57;;;;;24586:1;24571:4;:11;:16;:44;;;;24602:4;24591:24;;;;;;;;;;;;:::i;:::-;24571:44;24559:57;24537:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;24121:557;;24054:624;;:::o;24718:301::-;24797:15;;;;;;;;;;;24783:29;;:10;:29;;;24779:90;;24836:21;;;;;;;;;;;;;;24779:90;24880:9;24895:6;:11;;24914:21;24895:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24879:61;;;24956:4;24951:61;;24984:16;;;;;;;;;;;;;;24951:61;24768:251;24718:301;:::o;18570:87::-;18616:7;18643:6;;;;;;;;;;;18636:13;;18570:87;:::o;7935:95::-;7982:13;8015:7;8008:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7935:95;:::o;28105:203::-;18456:13;:11;:13::i;:::-;28215:3:::1;21180:18;28202:16;;;;:::i;:::-;28187:12;:31;:57;;;;;28237:7;28222:12;:22;28187:57;28183:118;;;28277:12;28261:13;:28;;;;28183:118;28105:203:::0;:::o;21234:42::-;21272:4;21234:42;:::o;26200:279::-;18456:13;:11;:13::i;:::-;26296:2:::1;26289:3;26282:4;:10;;;;:::i;:::-;:16;26278:194;;26335:4;26315:7;:17;;:24;;;;26371:3;26354:7;:14;;:20;;;;26411:3;26404:4;:10;;;;:::i;:::-;26389:12;:25;;;;26456:3;26450:4;26434:26;;;;;;;;;;26278:194;26200:279:::0;;:::o;9312:182::-;9381:4;9398:13;9414:12;:10;:12::i;:::-;9398:28;;9437:27;9447:5;9454:2;9458:5;9437:9;:27::i;:::-;9482:4;9475:11;;;9312:182;;;;:::o;25685:274::-;18456:13;:11;:13::i;:::-;25780:2:::1;25773:3;25766:4;:10;;;;:::i;:::-;:16;25762:190;;25818:4;25799:6;:16;;:23;;;;25853:3;25837:6;:13;;:19;;;;25892:3;25885:4;:10;;;;:::i;:::-;25871:11;:24;;;;25936:3;25930:4;25915:25;;;;;;;;;;25762:190;25685:274:::0;;:::o;25220:221::-;18456:13;:11;:13::i;:::-;25333:5:::1;25305:33;;:18;:24;25324:4;25305:24;;;;;;;;;;;;;;;;;;;;;;;;;:33;;::::0;25301:90:::1;;25362:17;;;;;;;;;;;;;;25301:90;25428:5;25401:18;:24;25420:4;25401:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;25220:221:::0;;:::o;21811:36::-;;;:::o;27366:211::-;18456:13;:11;:13::i;:::-;27464:11:::1;27456:19;;:4;:19;;::::0;27452:81:::1;;27499:22;;;;;;;;;;;;;;27452:81;27564:5;27543:12;:18;27556:4;27543:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;27366:211:::0;;:::o;9557:142::-;9637:7;9664:11;:18;9676:5;9664:18;;;;;;;;;;;;;;;:27;9683:7;9664:27;;;;;;;;;;;;;;;;9657:34;;9557:142;;;;:::o;19503:220::-;18456:13;:11;:13::i;:::-;19608:1:::1;19588:22;;:8;:22;;::::0;19584:93:::1;;19662:1;19634:31;;;;;;;;;;;:::i;:::-;;;;;;;;19584:93;19687:28;19706:8;19687:18;:28::i;:::-;19503:220:::0;:::o;27719:254::-;18456:13;:11;:13::i;:::-;27825:1:::1;27806:21;;:7;:21;;;27802:164;;27862:7;27844:15;;:25;;;;;;;;;;;;;;;;;;27903:3;27884:16;;:22;;;;;;;;;;;;;;;;;;27950:3;27926:28;;27941:7;27926:28;;;;;;;;;;;;27802:164;27719:254:::0;;:::o;22468:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;3836:98::-;3889:7;3916:10;3909:17;;3836:98;:::o;14845:130::-;14930:37;14939:5;14946:7;14955:5;14962:4;14930:8;:37::i;:::-;14845:130;;;:::o;18735:166::-;18806:12;:10;:12::i;:::-;18795:23;;:7;:5;:7::i;:::-;:23;;;18791:103;;18869:12;:10;:12::i;:::-;18842:40;;;;;;;;;;;:::i;:::-;;;;;;;;18791:103;18735:166::o;16561:487::-;16661:24;16688:25;16698:5;16705:7;16688:9;:25::i;:::-;16661:52;;16748:17;16728:16;:37;16724:317;;16805:5;16786:16;:24;16782:132;;;16865:7;16874:16;16892:5;16838:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;16782:132;16957:57;16966:5;16973:7;17001:5;16982:16;:24;17008:5;16957:8;:57::i;:::-;16724:317;16650:398;16561:487;;;:::o;11420:308::-;11520:1;11504:18;;:4;:18;;;11500:88;;11573:1;11546:30;;;;;;;;;;;:::i;:::-;;;;;;;;11500:88;11616:1;11602:16;;:2;:16;;;11598:88;;11671:1;11642:32;;;;;;;;;;;:::i;:::-;;;;;;;;11598:88;11696:24;11704:4;11710:2;11714:5;11696:7;:24::i;:::-;11420:308;;;:::o;19883:191::-;19957:16;19976:6;;;;;;;;;;;19957:25;;20002:8;19993:6;;:17;;;;;;;;;;;;;;;;;;20057:8;20026:40;;20047:8;20026:40;;;;;;;;;;;;19946:128;19883:191;:::o;15826:443::-;15956:1;15939:19;;:5;:19;;;15935:91;;16011:1;15982:32;;;;;;;;;;;:::i;:::-;;;;;;;;15935:91;16059:1;16040:21;;:7;:21;;;16036:92;;16113:1;16085:31;;;;;;;;;;;:::i;:::-;;;;;;;;16036:92;16168:5;16138:11;:18;16150:5;16138:18;;;;;;;;;;;;;;;:27;16157:7;16138:27;;;;;;;;;;;;;;;:35;;;;16188:9;16184:78;;;16235:7;16219:31;;16228:5;16219:31;;;16244:5;16219:31;;;;;;:::i;:::-;;;;;;;;16184:78;15826:443;;;;:::o;28416:1210::-;28538:12;28553:4;28538:19;;28572:13;:19;28586:4;28572:19;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;28595:13;:17;28609:2;28595:17;;;;;;;;;;;;;;;;;;;;;;;;;28572:40;28568:103;;;28636:23;;;;;;;;;;;;;;28568:103;28685:18;:24;28704:4;28685:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;28713:18;:22;28732:2;28713:22;;;;;;;;;;;;;;;;;;;;;;;;;28685:50;28681:98;;;28762:5;28752:15;;28681:98;28795:7;28791:427;;;28819:11;28863:12;:18;28876:4;28863:18;;;;;;;;;;;;;;;;;;;;;;;;;28859:207;;;21272:4;28918:11;;28909:6;:20;;;;:::i;:::-;28908:36;;;;:::i;:::-;28902:42;;28859:207;;;28970:12;:16;28983:2;28970:16;;;;;;;;;;;;;;;;;;;;;;;;;28966:100;;;21272:4;29023:12;;29014:6;:21;;;;:::i;:::-;29013:37;;;;:::i;:::-;29007:43;;28966:100;28859:207;29100:3;29091:6;:12;;;;:::i;:::-;29082:21;;29130:1;29124:3;:7;29120:87;;;29152:39;29166:4;29180;29187:3;29152:13;:39::i;:::-;29120:87;28804:414;28791:427;29228:23;29254:24;29272:4;29254:9;:24::i;:::-;29228:50;;29291:12;29325:13;;29306:15;:32;;:68;;;;;29356:12;:18;29369:4;29356:18;;;;;;;;;;;;;;;;;;;;;;;;;29355:19;29306:68;:100;;;;;29399:7;:5;:7::i;:::-;29391:15;;:4;:15;;;;29306:100;:126;;;;;29424:8;;;;;;;;;;;29423:9;29306:126;29291:141;;29447:7;29443:132;;;29482:4;29471:8;;:15;;;;;;;;;;;;;;;;;;29501:31;29516:15;29501:14;:31::i;:::-;29558:5;29547:8;;:16;;;;;;;;;;;;;;;;;;29443:132;29587:31;29601:4;29607:2;29611:6;29587:13;:31::i;:::-;28527:1099;;;28416:1210;;;:::o;12052:1135::-;12158:1;12142:18;;:4;:18;;;12138:552;;12296:5;12280:12;;:21;;;;;;;:::i;:::-;;;;;;;;12138:552;;;12334:19;12356:9;:15;12366:4;12356:15;;;;;;;;;;;;;;;;12334:37;;12404:5;12390:11;:19;12386:117;;;12462:4;12468:11;12481:5;12437:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;12386:117;12658:5;12644:11;:19;12626:9;:15;12636:4;12626:15;;;;;;;;;;;;;;;:37;;;;12319:371;12138:552;12720:1;12706:16;;:2;:16;;;12702:435;;12888:5;12872:12;;:21;;;;;;;;;;;12702:435;;;13105:5;13088:9;:13;13098:2;13088:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;12702:435;13169:2;13154:25;;13163:4;13154:25;;;13173:5;13154:25;;;;;;:::i;:::-;;;;;;;;12052:1135;;;:::o;29743:1233::-;29802:17;29836:12;;29822:11;;:26;;;;:::i;:::-;29802:46;;29875:1;29863:9;:13;29859:1110;;;29893:19;29979:9;29942:7;:14;;;29926:6;:13;;;:30;;;;:::i;:::-;29916:6;:41;;;;:::i;:::-;29915:74;;;;:::i;:::-;29893:96;;30004:14;30035:1;30021:11;:15;;;;:::i;:::-;30004:32;;30053:21;30086:6;30077;:15;;;;:::i;:::-;30053:39;;30107:21;30131;30107:45;;30187:1;30171:13;:17;30167:89;;;30209:31;30226:13;30209:16;:31::i;:::-;30167:89;30270:14;30311:13;30287:21;:37;;;;:::i;:::-;30270:54;;30339:16;30378:13;30368:6;30359;:15;;;;:::i;:::-;30358:33;;;;:::i;:::-;30339:52;;30406:9;30478:1;30467:8;:12;:26;;;;;30492:1;30483:6;:10;30467:26;30463:97;;;30514:30;30527:8;30537:6;30514:12;:30::i;:::-;30463:97;30660:1;30636:21;:25;30632:171;;;30693:15;;;;;;;;;;;:20;;30721:21;30693:94;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30682:105;;;;;30632:171;29878:936;;;;;;;29859:1110;;;30835:24;30852:6;30835:16;:24::i;:::-;30874:6;30903:15;;;;;;;;;;;:20;;30931:21;30903:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30895:62;;;;;30820:149;29859:1110;29791:1185;29743:1233;:::o;31646:735::-;31772:21;31810:1;31796:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31772:40;;31841:4;31823;31828:1;31823:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;31867:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31857:4;31862:1;31857:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;31959:11;31906:50;31924:4;31939:15;31906:9;:50::i;:::-;:64;31902:231;;;31987:134;32022:4;32054:15;32089:17;31987:8;:134::i;:::-;31902:231;32171:15;:66;;;32252:11;32278:1;32294:4;32321;32359:3;32341:15;:21;;;;:::i;:::-;32171:202;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31701:680;31646:735;:::o;31034:531::-;31161:6;31108:50;31126:4;31141:15;31108:9;:50::i;:::-;:59;31104:226;;;31184:134;31219:4;31251:15;31286:17;31184:8;:134::i;:::-;31104:226;31342:15;:31;;;31381:3;31408:4;31428:6;31449:1;31465;31481:16;;;;;;;;;;;31543:3;31525:15;:21;;;;:::i;:::-;31342:215;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31034:531;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:99::-;494:6;528:5;522:12;512:22;;442:99;;;:::o;547:169::-;631:11;665:6;660:3;653:19;705:4;700:3;696:14;681:29;;547:169;;;;:::o;722:139::-;811:6;806:3;801;795:23;852:1;843:6;838:3;834:16;827:27;722:139;;;:::o;867:102::-;908:6;959:2;955:7;950:2;943:5;939:14;935:28;925:38;;867:102;;;:::o;975:377::-;1063:3;1091:39;1124:5;1091:39;:::i;:::-;1146:71;1210:6;1205:3;1146:71;:::i;:::-;1139:78;;1226:65;1284:6;1279:3;1272:4;1265:5;1261:16;1226:65;:::i;:::-;1316:29;1338:6;1316:29;:::i;:::-;1311:3;1307:39;1300:46;;1067:285;975:377;;;;:::o;1358:313::-;1471:4;1509:2;1498:9;1494:18;1486:26;;1558:9;1552:4;1548:20;1544:1;1533:9;1529:17;1522:47;1586:78;1659:4;1650:6;1586:78;:::i;:::-;1578:86;;1358:313;;;;:::o;1758:117::-;1867:1;1864;1857:12;1881:117;1990:1;1987;1980:12;2004:126;2041:7;2081:42;2074:5;2070:54;2059:65;;2004:126;;;:::o;2136:96::-;2173:7;2202:24;2220:5;2202:24;:::i;:::-;2191:35;;2136:96;;;:::o;2238:122::-;2311:24;2329:5;2311:24;:::i;:::-;2304:5;2301:35;2291:63;;2350:1;2347;2340:12;2291:63;2238:122;:::o;2366:139::-;2412:5;2450:6;2437:20;2428:29;;2466:33;2493:5;2466:33;:::i;:::-;2366:139;;;;:::o;2511:122::-;2584:24;2602:5;2584:24;:::i;:::-;2577:5;2574:35;2564:63;;2623:1;2620;2613:12;2564:63;2511:122;:::o;2639:139::-;2685:5;2723:6;2710:20;2701:29;;2739:33;2766:5;2739:33;:::i;:::-;2639:139;;;;:::o;2784:474::-;2852:6;2860;2909:2;2897:9;2888:7;2884:23;2880:32;2877:119;;;2915:79;;:::i;:::-;2877:119;3035:1;3060:53;3105:7;3096:6;3085:9;3081:22;3060:53;:::i;:::-;3050:63;;3006:117;3162:2;3188:53;3233:7;3224:6;3213:9;3209:22;3188:53;:::i;:::-;3178:63;;3133:118;2784:474;;;;;:::o;3264:90::-;3298:7;3341:5;3334:13;3327:21;3316:32;;3264:90;;;:::o;3360:109::-;3441:21;3456:5;3441:21;:::i;:::-;3436:3;3429:34;3360:109;;:::o;3475:210::-;3562:4;3600:2;3589:9;3585:18;3577:26;;3613:65;3675:1;3664:9;3660:17;3651:6;3613:65;:::i;:::-;3475:210;;;;:::o;3691:117::-;3800:1;3797;3790:12;3814:117;3923:1;3920;3913:12;3937:117;4046:1;4043;4036:12;4077:568;4150:8;4160:6;4210:3;4203:4;4195:6;4191:17;4187:27;4177:122;;4218:79;;:::i;:::-;4177:122;4331:6;4318:20;4308:30;;4361:18;4353:6;4350:30;4347:117;;;4383:79;;:::i;:::-;4347:117;4497:4;4489:6;4485:17;4473:29;;4551:3;4543:4;4535:6;4531:17;4521:8;4517:32;4514:41;4511:128;;;4558:79;;:::i;:::-;4511:128;4077:568;;;;;:::o;4651:116::-;4721:21;4736:5;4721:21;:::i;:::-;4714:5;4711:32;4701:60;;4757:1;4754;4747:12;4701:60;4651:116;:::o;4773:133::-;4816:5;4854:6;4841:20;4832:29;;4870:30;4894:5;4870:30;:::i;:::-;4773:133;;;;:::o;4912:698::-;5004:6;5012;5020;5069:2;5057:9;5048:7;5044:23;5040:32;5037:119;;;5075:79;;:::i;:::-;5037:119;5223:1;5212:9;5208:17;5195:31;5253:18;5245:6;5242:30;5239:117;;;5275:79;;:::i;:::-;5239:117;5388:80;5460:7;5451:6;5440:9;5436:22;5388:80;:::i;:::-;5370:98;;;;5166:312;5517:2;5543:50;5585:7;5576:6;5565:9;5561:22;5543:50;:::i;:::-;5533:60;;5488:115;4912:698;;;;;:::o;5616:60::-;5644:3;5665:5;5658:12;;5616:60;;;:::o;5682:142::-;5732:9;5765:53;5783:34;5792:24;5810:5;5792:24;:::i;:::-;5783:34;:::i;:::-;5765:53;:::i;:::-;5752:66;;5682:142;;;:::o;5830:126::-;5880:9;5913:37;5944:5;5913:37;:::i;:::-;5900:50;;5830:126;;;:::o;5962:148::-;6034:9;6067:37;6098:5;6067:37;:::i;:::-;6054:50;;5962:148;;;:::o;6116:175::-;6225:59;6278:5;6225:59;:::i;:::-;6220:3;6213:72;6116:175;;:::o;6297:266::-;6412:4;6450:2;6439:9;6435:18;6427:26;;6463:93;6553:1;6542:9;6538:17;6529:6;6463:93;:::i;:::-;6297:266;;;;:::o;6569:619::-;6646:6;6654;6662;6711:2;6699:9;6690:7;6686:23;6682:32;6679:119;;;6717:79;;:::i;:::-;6679:119;6837:1;6862:53;6907:7;6898:6;6887:9;6883:22;6862:53;:::i;:::-;6852:63;;6808:117;6964:2;6990:53;7035:7;7026:6;7015:9;7011:22;6990:53;:::i;:::-;6980:63;;6935:118;7092:2;7118:53;7163:7;7154:6;7143:9;7139:22;7118:53;:::i;:::-;7108:63;;7063:118;6569:619;;;;;:::o;7194:332::-;7315:4;7353:2;7342:9;7338:18;7330:26;;7366:71;7434:1;7423:9;7419:17;7410:6;7366:71;:::i;:::-;7447:72;7515:2;7504:9;7500:18;7491:6;7447:72;:::i;:::-;7194:332;;;;;:::o;7532:118::-;7619:24;7637:5;7619:24;:::i;:::-;7614:3;7607:37;7532:118;;:::o;7656:222::-;7749:4;7787:2;7776:9;7772:18;7764:26;;7800:71;7868:1;7857:9;7853:17;7844:6;7800:71;:::i;:::-;7656:222;;;;:::o;7884:86::-;7919:7;7959:4;7952:5;7948:16;7937:27;;7884:86;;;:::o;7976:112::-;8059:22;8075:5;8059:22;:::i;:::-;8054:3;8047:35;7976:112;;:::o;8094:214::-;8183:4;8221:2;8210:9;8206:18;8198:26;;8234:67;8298:1;8287:9;8283:17;8274:6;8234:67;:::i;:::-;8094:214;;;;:::o;8314:329::-;8373:6;8422:2;8410:9;8401:7;8397:23;8393:32;8390:119;;;8428:79;;:::i;:::-;8390:119;8548:1;8573:53;8618:7;8609:6;8598:9;8594:22;8573:53;:::i;:::-;8563:63;;8519:117;8314:329;;;;:::o;8649:468::-;8714:6;8722;8771:2;8759:9;8750:7;8746:23;8742:32;8739:119;;;8777:79;;:::i;:::-;8739:119;8897:1;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8868:117;9024:2;9050:50;9092:7;9083:6;9072:9;9068:22;9050:50;:::i;:::-;9040:60;;8995:115;8649:468;;;;;:::o;9123:329::-;9182:6;9231:2;9219:9;9210:7;9206:23;9202:32;9199:119;;;9237:79;;:::i;:::-;9199:119;9357:1;9382:53;9427:7;9418:6;9407:9;9403:22;9382:53;:::i;:::-;9372:63;;9328:117;9123:329;;;;:::o;9458:474::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:53;9907:7;9898:6;9887:9;9883:22;9862:53;:::i;:::-;9852:63;;9807:118;9458:474;;;;;:::o;9938:::-;10006:6;10014;10063:2;10051:9;10042:7;10038:23;10034:32;10031:119;;;10069:79;;:::i;:::-;10031:119;10189:1;10214:53;10259:7;10250:6;10239:9;10235:22;10214:53;:::i;:::-;10204:63;;10160:117;10316:2;10342:53;10387:7;10378:6;10367:9;10363:22;10342:53;:::i;:::-;10332:63;;10287:118;9938:474;;;;;:::o;10418:180::-;10466:77;10463:1;10456:88;10563:4;10560:1;10553:15;10587:4;10584:1;10577:15;10604:320;10648:6;10685:1;10679:4;10675:12;10665:22;;10732:1;10726:4;10722:12;10753:18;10743:81;;10809:4;10801:6;10797:17;10787:27;;10743:81;10871:2;10863:6;10860:14;10840:18;10837:38;10834:84;;10890:18;;:::i;:::-;10834:84;10655:269;10604:320;;;:::o;10930:180::-;10978:77;10975:1;10968:88;11075:4;11072:1;11065:15;11099:4;11096:1;11089:15;11116:332;11237:4;11275:2;11264:9;11260:18;11252:26;;11288:71;11356:1;11345:9;11341:17;11332:6;11288:71;:::i;:::-;11369:72;11437:2;11426:9;11422:18;11413:6;11369:72;:::i;:::-;11116:332;;;;;:::o;11454:98::-;11505:6;11539:5;11533:12;11523:22;;11454:98;;;:::o;11558:147::-;11659:11;11696:3;11681:18;;11558:147;;;;:::o;11711:386::-;11815:3;11843:38;11875:5;11843:38;:::i;:::-;11897:88;11978:6;11973:3;11897:88;:::i;:::-;11890:95;;11994:65;12052:6;12047:3;12040:4;12033:5;12029:16;11994:65;:::i;:::-;12084:6;12079:3;12075:16;12068:23;;11819:278;11711:386;;;;:::o;12103:271::-;12233:3;12255:93;12344:3;12335:6;12255:93;:::i;:::-;12248:100;;12365:3;12358:10;;12103:271;;;;:::o;12380:137::-;12434:5;12465:6;12459:13;12450:22;;12481:30;12505:5;12481:30;:::i;:::-;12380:137;;;;:::o;12523:345::-;12590:6;12639:2;12627:9;12618:7;12614:23;12610:32;12607:119;;;12645:79;;:::i;:::-;12607:119;12765:1;12790:61;12843:7;12834:6;12823:9;12819:22;12790:61;:::i;:::-;12780:71;;12736:125;12523:345;;;;:::o;12874:176::-;13014:28;13010:1;13002:6;12998:14;12991:52;12874:176;:::o;13056:366::-;13198:3;13219:67;13283:2;13278:3;13219:67;:::i;:::-;13212:74;;13295:93;13384:3;13295:93;:::i;:::-;13413:2;13408:3;13404:12;13397:19;;13056:366;;;:::o;13428:419::-;13594:4;13632:2;13621:9;13617:18;13609:26;;13681:9;13675:4;13671:20;13667:1;13656:9;13652:17;13645:47;13709:131;13835:4;13709:131;:::i;:::-;13701:139;;13428:419;;;:::o;13853:114::-;;:::o;13973:398::-;14132:3;14153:83;14234:1;14229:3;14153:83;:::i;:::-;14146:90;;14245:93;14334:3;14245:93;:::i;:::-;14363:1;14358:3;14354:11;14347:18;;13973:398;;;:::o;14377:379::-;14561:3;14583:147;14726:3;14583:147;:::i;:::-;14576:154;;14747:3;14740:10;;14377:379;;;:::o;14762:180::-;14810:77;14807:1;14800:88;14907:4;14904:1;14897:15;14931:4;14928:1;14921:15;14948:180;14996:77;14993:1;14986:88;15093:4;15090:1;15083:15;15117:4;15114:1;15107:15;15134:185;15174:1;15191:20;15209:1;15191:20;:::i;:::-;15186:25;;15225:20;15243:1;15225:20;:::i;:::-;15220:25;;15264:1;15254:35;;15269:18;;:::i;:::-;15254:35;15311:1;15308;15304:9;15299:14;;15134:185;;;;:::o;15325:191::-;15365:3;15384:20;15402:1;15384:20;:::i;:::-;15379:25;;15418:20;15436:1;15418:20;:::i;:::-;15413:25;;15461:1;15458;15454:9;15447:16;;15482:3;15479:1;15476:10;15473:36;;;15489:18;;:::i;:::-;15473:36;15325:191;;;;:::o;15522:442::-;15671:4;15709:2;15698:9;15694:18;15686:26;;15722:71;15790:1;15779:9;15775:17;15766:6;15722:71;:::i;:::-;15803:72;15871:2;15860:9;15856:18;15847:6;15803:72;:::i;:::-;15885;15953:2;15942:9;15938:18;15929:6;15885:72;:::i;:::-;15522:442;;;;;;:::o;15970:410::-;16010:7;16033:20;16051:1;16033:20;:::i;:::-;16028:25;;16067:20;16085:1;16067:20;:::i;:::-;16062:25;;16122:1;16119;16115:9;16144:30;16162:11;16144:30;:::i;:::-;16133:41;;16323:1;16314:7;16310:15;16307:1;16304:22;16284:1;16277:9;16257:83;16234:139;;16353:18;;:::i;:::-;16234:139;16018:362;15970:410;;;;:::o;16386:194::-;16426:4;16446:20;16464:1;16446:20;:::i;:::-;16441:25;;16480:20;16498:1;16480:20;:::i;:::-;16475:25;;16524:1;16521;16517:9;16509:17;;16548:1;16542:4;16539:11;16536:37;;;16553:18;;:::i;:::-;16536:37;16386:194;;;;:::o;16586:180::-;16634:77;16631:1;16624:88;16731:4;16728:1;16721:15;16755:4;16752:1;16745:15;16772:143;16829:5;16860:6;16854:13;16845:22;;16876:33;16903:5;16876:33;:::i;:::-;16772:143;;;;:::o;16921:351::-;16991:6;17040:2;17028:9;17019:7;17015:23;17011:32;17008:119;;;17046:79;;:::i;:::-;17008:119;17166:1;17191:64;17247:7;17238:6;17227:9;17223:22;17191:64;:::i;:::-;17181:74;;17137:128;16921:351;;;;:::o;17278:85::-;17323:7;17352:5;17341:16;;17278:85;;;:::o;17369:158::-;17427:9;17460:61;17478:42;17487:32;17513:5;17487:32;:::i;:::-;17478:42;:::i;:::-;17460:61;:::i;:::-;17447:74;;17369:158;;;:::o;17533:147::-;17628:45;17667:5;17628:45;:::i;:::-;17623:3;17616:58;17533:147;;:::o;17686:114::-;17753:6;17787:5;17781:12;17771:22;;17686:114;;;:::o;17806:184::-;17905:11;17939:6;17934:3;17927:19;17979:4;17974:3;17970:14;17955:29;;17806:184;;;;:::o;17996:132::-;18063:4;18086:3;18078:11;;18116:4;18111:3;18107:14;18099:22;;17996:132;;;:::o;18134:108::-;18211:24;18229:5;18211:24;:::i;:::-;18206:3;18199:37;18134:108;;:::o;18248:179::-;18317:10;18338:46;18380:3;18372:6;18338:46;:::i;:::-;18416:4;18411:3;18407:14;18393:28;;18248:179;;;;:::o;18433:113::-;18503:4;18535;18530:3;18526:14;18518:22;;18433:113;;;:::o;18582:732::-;18701:3;18730:54;18778:5;18730:54;:::i;:::-;18800:86;18879:6;18874:3;18800:86;:::i;:::-;18793:93;;18910:56;18960:5;18910:56;:::i;:::-;18989:7;19020:1;19005:284;19030:6;19027:1;19024:13;19005:284;;;19106:6;19100:13;19133:63;19192:3;19177:13;19133:63;:::i;:::-;19126:70;;19219:60;19272:6;19219:60;:::i;:::-;19209:70;;19065:224;19052:1;19049;19045:9;19040:14;;19005:284;;;19009:14;19305:3;19298:10;;18706:608;;;18582:732;;;;:::o;19320:831::-;19583:4;19621:3;19610:9;19606:19;19598:27;;19635:71;19703:1;19692:9;19688:17;19679:6;19635:71;:::i;:::-;19716:80;19792:2;19781:9;19777:18;19768:6;19716:80;:::i;:::-;19843:9;19837:4;19833:20;19828:2;19817:9;19813:18;19806:48;19871:108;19974:4;19965:6;19871:108;:::i;:::-;19863:116;;19989:72;20057:2;20046:9;20042:18;20033:6;19989:72;:::i;:::-;20071:73;20139:3;20128:9;20124:19;20115:6;20071:73;:::i;:::-;19320:831;;;;;;;;:::o;20157:807::-;20406:4;20444:3;20433:9;20429:19;20421:27;;20458:71;20526:1;20515:9;20511:17;20502:6;20458:71;:::i;:::-;20539:72;20607:2;20596:9;20592:18;20583:6;20539:72;:::i;:::-;20621:80;20697:2;20686:9;20682:18;20673:6;20621:80;:::i;:::-;20711;20787:2;20776:9;20772:18;20763:6;20711:80;:::i;:::-;20801:73;20869:3;20858:9;20854:19;20845:6;20801:73;:::i;:::-;20884;20952:3;20941:9;20937:19;20928:6;20884:73;:::i;:::-;20157:807;;;;;;;;;:::o

Swarm Source

ipfs://4cfe4505ff60f27eae546ceb97253540b6dba41e91a37f2fd83e67848ed83289
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.