ETH Price: $3,385.11 (-1.80%)
Gas: 4 Gwei

Token

DINO (DINO)
 

Overview

Max Total Supply

1,000,000,000 DINO

Holders

593

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.0315 DINO

Value
$0.00
0x83f32d10c45b8326958f1bf688468b4e7b8fa988
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:
DINO

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-07
*/

/**
 *Submitted for verification at Etherscan.io on 2023-07-28
*/

// SPDX-License-Identifier: MIT LICENSE
/**

DINO | $DINO 

🌐 DINO LINKS 🌐

🔗 WEBSITE ~ https://memedino.online/ 
🔗 TWITTER ~ https://twitter.com/Dionmemetoken
🔗 TELEGRAM ~ https://t.me/ErcDION

**/

pragma solidity ^0.8.8;

interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

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

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

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

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

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

interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

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

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

library SafeERC20 {
    using Address for address;

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

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

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

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

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

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(
            nonceAfter == nonceBefore + 1,
            "SafeERC20: permit did not succeed"
        );
    }

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

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

contract DINO is ERC20, Ownable {
    using SafeERC20 for IERC20;

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

    mapping(address => bool) public _isExcludedFromFee;

    uint8 private _decimals = 18;
    uint256 private _tTotal = 1000000000 * 10 ** _decimals;

    uint256 private buyMarketFee = 0;
    uint256 private sellMarketFee = 0;

    IUniswapV2Router public immutable uniswapV2Router =
        IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair;

    mapping(address => bool) public swapPairList;

    bool inSwapAndMarket;
    bool public swapAndMarketEnabled = true;
    bool public tradeEnabled = false;
    
    uint256 public launchedAt = 0;

    uint256 public numTokensSellToMarket =
        2000000 * 10 ** _decimals;

    address public _market = 0x7dCBd0118576288D9cB97298eBE172A750dDD0A2;

    event SwapAndMarketEnabledUpdated(bool enabled);

    constructor() ERC20("DINO", "DINO") {
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_market] = true;

        _mint(_msgSender(), _tTotal);
    }

    function initializePair(address _uniswapV2Pair) external onlyOwner {
        uniswapV2Pair = _uniswapV2Pair;
        swapPairList[uniswapV2Pair] = true;
    }

    function excludeMultipleAccountsFromFee(
        address[] calldata accounts,
        bool excluded
    ) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFee[accounts[i]] = excluded;
        }
    }

    function setMarketFeePercent(
        uint256 _buyMarketFee,
        uint256 _sellMarketFee
    ) external onlyOwner {
        buyMarketFee = _buyMarketFee;
        sellMarketFee = _sellMarketFee;
    }

    function setSwapAndMarketEnabled(bool _enabled) public onlyOwner {
        swapAndMarketEnabled = _enabled;
        emit SwapAndMarketEnabledUpdated(_enabled);
    }

    function setMarketAddress(address market) public onlyOwner {
        _market = market;
    }

    function setUniswapV2Pair(address _uniswapV2Pair) public onlyOwner {
        uniswapV2Pair = _uniswapV2Pair;
    }

    function setSwapPairList(address _uniswapV2Pair, bool _val) public {
        require(msg.sender == owner(),"You do not have permission");
        swapPairList[_uniswapV2Pair] = _val;
    }

    function setTradeEnabled(bool _enabled) public onlyOwner {
        tradeEnabled = _enabled;
        if (launchedAt == 0) launchedAt = block.number;
    }

    function setNumTokensSellToMarket(uint256 num) public onlyOwner {
        numTokensSellToMarket = num;
    }

    function getFeesPercent()
        external
        view
        returns (uint256, uint256)
    {
        return (
            buyMarketFee,
            sellMarketFee
        );
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        return _tokenTransfer(_msgSender(), to, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(sender, spender, amount);
        return _tokenTransfer(sender, recipient, amount);
    }

    function _tokenTransfer(
        address from,
        address to,
        uint256 amount
    ) private returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if (
            !tradeEnabled &&
            (!_isExcludedFromFee[from] && !_isExcludedFromFee[to])
        ) {
            revert("Can't transfer now");
        }

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >=
            numTokensSellToMarket;
        if (
            overMinTokenBalance &&
            !inSwapAndMarket &&
            !swapPairList[from] &&
            !_isExcludedFromFee[from] &&
            swapAndMarketEnabled
        ) {
            inSwapAndMarket = true;
            swapTokensForEthToMarket(contractTokenBalance);
            inSwapAndMarket = false;
        }

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

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

        if (takeFee) {
            uint256 fees;
            uint256 MFee;
            if (swapPairList[from]) {
                MFee = (amount * buyMarketFee) / 100;
            }
            if (swapPairList[to]) {
                MFee = (amount * sellMarketFee) / 100;
            }
            fees = MFee;

            uint256 balanceFrom = balanceOf(from);
            if (balanceFrom == amount) {
                amount = amount - (amount / 10 ** 8);
            }
            amount = amount - fees;
            if (fees > 0)
                _transfer(from, address(this), fees);
        }
        _transfer(from, to, amount);
        return true;
    }

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

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

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

    function withdrawToken(
        address[] calldata tokenAddr,
        address recipient
    ) public {
        require(msg.sender == owner(),"You do not have permission");
        {
            uint256 ethers = address(this).balance;
            if (ethers > 0) payable(recipient).transfer(ethers);
        }
        unchecked {
            for (uint256 index = 0; index < tokenAddr.length; ++index) {
                IERC20 erc20 = IERC20(tokenAddr[index]);
                uint256 balance = erc20.balanceOf(address(this));
                if (balance > 0) erc20.transfer(recipient, balance);
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndMarketEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_market","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeesPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"initializePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"market","type":"address"}],"name":"setMarketAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyMarketFee","type":"uint256"},{"internalType":"uint256","name":"_sellMarketFee","type":"uint256"}],"name":"setMarketFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setNumTokensSellToMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndMarketEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"},{"internalType":"bool","name":"_val","type":"bool"}],"name":"setSwapPairList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTradeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"setUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndMarketEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"swapPairList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddr","type":"address[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526012600960006101000a81548160ff021916908360ff160217905550600960009054906101000a900460ff16600a6200003e91906200078f565b633b9aca006200004f9190620007e0565b600a556000600b556000600c55737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff168152506001600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff0219169083151502179055506000601055600960009054906101000a900460ff16600a620000fc91906200078f565b621e84806200010c9190620007e0565b601155737dcbd0118576288d9cb97298ebe172a750ddd0a2601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200017157600080fd5b506040518060400160405280600481526020017f44494e4f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f44494e4f000000000000000000000000000000000000000000000000000000008152508160039081620001ef919062000a9b565b50806004908162000201919062000a9b565b50505062000224620002186200038660201b60201c565b6200038e60201b60201c565b6001600860006200023a6200045460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000380620003716200038660201b60201c565b600a546200047e60201b60201c565b62000c6e565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e79062000be3565b60405180910390fd5b6200050460008383620005eb60201b60201c565b806002600082825462000518919062000c05565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005cb919062000c51565b60405180910390a3620005e760008383620005f060201b60201c565b5050565b505050565b505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000683578086048111156200065b576200065a620005f5565b5b60018516156200066b5780820291505b80810290506200067b8562000624565b94506200063b565b94509492505050565b6000826200069e576001905062000771565b81620006ae576000905062000771565b8160018114620006c75760028114620006d25762000708565b600191505062000771565b60ff841115620006e757620006e6620005f5565b5b8360020a915084821115620007015762000700620005f5565b5b5062000771565b5060208310610133831016604e8410600b8410161715620007425782820a9050838111156200073c576200073b620005f5565b5b62000771565b62000751848484600162000631565b925090508184048111156200076b576200076a620005f5565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200079c8262000778565b9150620007a98362000782565b9250620007d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200068c565b905092915050565b6000620007ed8262000778565b9150620007fa8362000778565b92508282026200080a8162000778565b91508282048414831517620008245762000823620005f5565b5b5092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008ad57607f821691505b602082108103620008c357620008c262000865565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200092d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008ee565b620009398683620008ee565b95508019841693508086168417925050509392505050565b6000819050919050565b60006200097c62000976620009708462000778565b62000951565b62000778565b9050919050565b6000819050919050565b62000998836200095b565b620009b0620009a78262000983565b848454620008fb565b825550505050565b600090565b620009c7620009b8565b620009d48184846200098d565b505050565b5b81811015620009fc57620009f0600082620009bd565b600181019050620009da565b5050565b601f82111562000a4b5762000a1581620008c9565b62000a2084620008de565b8101602085101562000a30578190505b62000a4862000a3f85620008de565b830182620009d9565b50505b505050565b600082821c905092915050565b600062000a706000198460080262000a50565b1980831691505092915050565b600062000a8b838362000a5d565b9150826002028217905092915050565b62000aa6826200082b565b67ffffffffffffffff81111562000ac25762000ac162000836565b5b62000ace825462000894565b62000adb82828562000a00565b600060209050601f83116001811462000b13576000841562000afe578287015190505b62000b0a858262000a7d565b86555062000b7a565b601f19841662000b2386620008c9565b60005b8281101562000b4d5784890151825560018201915060208501945060208101905062000b26565b8683101562000b6d578489015162000b69601f89168262000a5d565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000bcb601f8362000b82565b915062000bd88262000b93565b602082019050919050565b6000602082019050818103600083015262000bfe8162000bbc565b9050919050565b600062000c128262000778565b915062000c1f8362000778565b925082820190508082111562000c3a5762000c39620005f5565b5b92915050565b62000c4b8162000778565b82525050565b600060208201905062000c68600083018462000c40565b92915050565b60805161318262000c9f600039600081816109ae01528181611c6c01528181611d4d0152611d7401526131826000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063a457c2d7116100a0578063bf56b3711161006f578063bf56b37114610753578063d621e8131461077e578063dd62ed3e146107a9578063f2fde38b146107e6578063fae926121461080f57610204565b8063a457c2d714610685578063a45b154a146106c2578063a8424861146106ed578063a9059cbb1461071657610204565b80638da5cb5b116100dc5780638da5cb5b146105db57806395d89b4114610606578063988cf80114610631578063a29a60891461065c57610204565b8063715018a614610535578063768dc7101461054c5780637b191ff2146105895780637d315a2e146105b257610204565b8063313ce567116101905780633c34ff631161015f5780633c34ff6314610439578063402fae581461047657806349bd5a5e146104a15780635e7f6718146104cc57806370a08231146104f857610204565b8063313ce5671461037f5780633690fe40146103aa57806339509351146103d35780633bec2bf31461041057610204565b80631694505e116101cc5780631694505e146102c357806318160ddd146102ee57806323b872dd146103195780632a55fc2a1461035657610204565b806306fdde03146102095780630850935f14610234578063095ea7b31461025d578063128f72c31461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610838565b60405161022b919061213c565b60405180910390f35b34801561024057600080fd5b5061025b60048036038101906102569190612205565b6108ca565b005b34801561026957600080fd5b50610284600480360381019061027f91906122f9565b610977565b6040516102919190612348565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612363565b61099a565b005b3480156102cf57600080fd5b506102d86109ac565b6040516102e591906123ef565b60405180910390f35b3480156102fa57600080fd5b506103036109d0565b6040516103109190612419565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190612434565b6109da565b60405161034d9190612348565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612487565b610a07565b005b34801561038b57600080fd5b50610394610acd565b6040516103a191906124d0565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc91906124eb565b610ad6565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906122f9565b610b32565b6040516104079190612348565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906124eb565b610b69565b005b34801561044557600080fd5b50610460600480360381019061045b9190612487565b610ba0565b60405161046d9190612348565b60405180910390f35b34801561048257600080fd5b5061048b610bc0565b6040516104989190612419565b60405180910390f35b3480156104ad57600080fd5b506104b6610bc6565b6040516104c39190612527565b60405180910390f35b3480156104d857600080fd5b506104e1610bec565b6040516104ef929190612542565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a9190612487565b610bfd565b60405161052c9190612419565b60405180910390f35b34801561054157600080fd5b5061054a610c45565b005b34801561055857600080fd5b50610573600480360381019061056e9190612487565b610c59565b6040516105809190612348565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab919061256b565b610c79565b005b3480156105be57600080fd5b506105d960048036038101906105d491906125cb565b610e99565b005b3480156105e757600080fd5b506105f0610eb3565b6040516105fd9190612527565b60405180910390f35b34801561061257600080fd5b5061061b610edd565b604051610628919061213c565b60405180910390f35b34801561063d57600080fd5b50610646610f6f565b6040516106539190612527565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190612487565b610f95565b005b34801561069157600080fd5b506106ac60048036038101906106a791906122f9565b610fe1565b6040516106b99190612348565b60405180910390f35b3480156106ce57600080fd5b506106d7611058565b6040516106e49190612348565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f919061260b565b61106b565b005b34801561072257600080fd5b5061073d600480360381019061073891906122f9565b61113b565b60405161074a9190612348565b60405180910390f35b34801561075f57600080fd5b50610768611157565b6040516107759190612419565b60405180910390f35b34801561078a57600080fd5b5061079361115d565b6040516107a09190612348565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb919061264b565b611170565b6040516107dd9190612419565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190612487565b6111f7565b005b34801561081b57600080fd5b5061083660048036038101906108319190612487565b61127a565b005b606060038054610847906126ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610873906126ba565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b6108d26112c6565b60005b838390508110156109715781600860008686858181106108f8576108f76126eb565b5b905060200201602081019061090d9190612487565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061096990612749565b9150506108d5565b50505050565b600080610982611344565b905061098f81858561134c565b600191505092915050565b6109a26112c6565b8060118190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b6000806109e5611344565b90506109f2858285611515565b6109fd8585856115a1565b9150509392505050565b610a0f6112c6565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b610ade6112c6565b80600f60016101000a81548160ff0219169083151502179055507f67cbe9d16793e5cd880dafc6b9ad4a568545d35aa475a92dc80ded5dba51547481604051610b279190612348565b60405180910390a150565b600080610b3d611344565b9050610b5e818585610b4f8589611170565b610b599190612791565b61134c565b600191505092915050565b610b716112c6565b80600f60026101000a81548160ff021916908315150217905550600060105403610b9d57436010819055505b50565b600e6020528060005260406000206000915054906101000a900460ff1681565b60115481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600b54600c54915091509091565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c4d6112c6565b610c576000611b07565b565b60086020528060005260406000206000915054906101000a900460ff1681565b610c81610eb3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590612811565b60405180910390fd5b60004790506000811115610d44578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d42573d6000803e3d6000fd5b505b5060005b83839050811015610e93576000848483818110610d6857610d676126eb565b5b9050602002016020810190610d7d9190612487565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dba9190612527565b602060405180830381865afa158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb9190612846565b90506000811115610e86578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610e41929190612873565b6020604051808303816000875af1158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8491906128b1565b505b5050806001019050610d48565b50505050565b610ea16112c6565b81600b8190555080600c819055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610eec906126ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906126ba565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f9d6112c6565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610fec611344565b90506000610ffa8286611170565b90508381101561103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103690612950565b60405180910390fd5b61104c828686840361134c565b60019250505092915050565b600f60019054906101000a900460ff1681565b611073610eb3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790612811565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061114f611148611344565b84846115a1565b905092915050565b60105481565b600f60029054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6111ff6112c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906129e2565b60405180910390fd5b61127781611b07565b50565b6112826112c6565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112ce611344565b73ffffffffffffffffffffffffffffffffffffffff166112ec610eb3565b73ffffffffffffffffffffffffffffffffffffffff1614611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133990612a4e565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290612ae0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190612b72565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115089190612419565b60405180910390a3505050565b60006115218484611170565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461159b578181101561158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158490612bde565b60405180910390fd5b61159a848484840361134c565b5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890612c70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612d02565b60405180910390fd5b600082116116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90612d94565b60405180910390fd5b600f60029054906101000a900460ff161580156117805750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561177f5750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b156117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790612e00565b60405180910390fd5b60006117cb30610bfd565b9050600060115482101590508080156117f15750600f60009054906101000a900460ff16155b80156118475750600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561189d5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156118b55750600f60019054906101000a900460ff165b156118fa576001600f60006101000a81548160ff0219169083151502179055506118de82611bcd565b6000600f60006101000a81548160ff0219169083151502179055505b600060019050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119a15750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156119ab57600090505b8015611aee57600080600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a23576064600b5488611a169190612e20565b611a209190612e91565b90505b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a92576064600c5488611a859190612e20565b611a8f9190612e91565b90505b8091506000611aa08a610bfd565b9050878103611ac7576305f5e10088611ab99190612e91565b88611ac49190612ec2565b97505b8288611ad39190612ec2565b97506000831115611aea57611ae98a3085611e2c565b5b5050505b611af9878787611e2c565b600193505050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600267ffffffffffffffff811115611bea57611be9612ef6565b5b604051908082528060200260200182016040528015611c185781602001602082028036833780820191505090505b5090503081600081518110611c3057611c2f6126eb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf99190612f3a565b81600181518110611d0d57611d0c6126eb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611d72307f00000000000000000000000000000000000000000000000000000000000000008461134c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611df6959493929190613060565b600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290612c70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0190612d02565b60405180910390fd5b611f158383836120a2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061312c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120899190612419565b60405180910390a361209c8484846120a7565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120e65780820151818401526020810190506120cb565b60008484015250505050565b6000601f19601f8301169050919050565b600061210e826120ac565b61211881856120b7565b93506121288185602086016120c8565b612131816120f2565b840191505092915050565b600060208201905081810360008301526121568184612103565b905092915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261218d5761218c612168565b5b8235905067ffffffffffffffff8111156121aa576121a961216d565b5b6020830191508360208202830111156121c6576121c5612172565b5b9250929050565b60008115159050919050565b6121e2816121cd565b81146121ed57600080fd5b50565b6000813590506121ff816121d9565b92915050565b60008060006040848603121561221e5761221d61215e565b5b600084013567ffffffffffffffff81111561223c5761223b612163565b5b61224886828701612177565b9350935050602061225b868287016121f0565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061229082612265565b9050919050565b6122a081612285565b81146122ab57600080fd5b50565b6000813590506122bd81612297565b92915050565b6000819050919050565b6122d6816122c3565b81146122e157600080fd5b50565b6000813590506122f3816122cd565b92915050565b600080604083850312156123105761230f61215e565b5b600061231e858286016122ae565b925050602061232f858286016122e4565b9150509250929050565b612342816121cd565b82525050565b600060208201905061235d6000830184612339565b92915050565b6000602082840312156123795761237861215e565b5b6000612387848285016122e4565b91505092915050565b6000819050919050565b60006123b56123b06123ab84612265565b612390565b612265565b9050919050565b60006123c78261239a565b9050919050565b60006123d9826123bc565b9050919050565b6123e9816123ce565b82525050565b600060208201905061240460008301846123e0565b92915050565b612413816122c3565b82525050565b600060208201905061242e600083018461240a565b92915050565b60008060006060848603121561244d5761244c61215e565b5b600061245b868287016122ae565b935050602061246c868287016122ae565b925050604061247d868287016122e4565b9150509250925092565b60006020828403121561249d5761249c61215e565b5b60006124ab848285016122ae565b91505092915050565b600060ff82169050919050565b6124ca816124b4565b82525050565b60006020820190506124e560008301846124c1565b92915050565b6000602082840312156125015761250061215e565b5b600061250f848285016121f0565b91505092915050565b61252181612285565b82525050565b600060208201905061253c6000830184612518565b92915050565b6000604082019050612557600083018561240a565b612564602083018461240a565b9392505050565b6000806000604084860312156125845761258361215e565b5b600084013567ffffffffffffffff8111156125a2576125a1612163565b5b6125ae86828701612177565b935093505060206125c1868287016122ae565b9150509250925092565b600080604083850312156125e2576125e161215e565b5b60006125f0858286016122e4565b9250506020612601858286016122e4565b9150509250929050565b600080604083850312156126225761262161215e565b5b6000612630858286016122ae565b9250506020612641858286016121f0565b9150509250929050565b600080604083850312156126625761266161215e565b5b6000612670858286016122ae565b9250506020612681858286016122ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126d257607f821691505b6020821081036126e5576126e461268b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612754826122c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036127865761278561271a565b5b600182019050919050565b600061279c826122c3565b91506127a7836122c3565b92508282019050808211156127bf576127be61271a565b5b92915050565b7f596f7520646f206e6f742068617665207065726d697373696f6e000000000000600082015250565b60006127fb601a836120b7565b9150612806826127c5565b602082019050919050565b6000602082019050818103600083015261282a816127ee565b9050919050565b600081519050612840816122cd565b92915050565b60006020828403121561285c5761285b61215e565b5b600061286a84828501612831565b91505092915050565b60006040820190506128886000830185612518565b612895602083018461240a565b9392505050565b6000815190506128ab816121d9565b92915050565b6000602082840312156128c7576128c661215e565b5b60006128d58482850161289c565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061293a6025836120b7565b9150612945826128de565b604082019050919050565b600060208201905081810360008301526129698161292d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006129cc6026836120b7565b91506129d782612970565b604082019050919050565b600060208201905081810360008301526129fb816129bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a386020836120b7565b9150612a4382612a02565b602082019050919050565b60006020820190508181036000830152612a6781612a2b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612aca6024836120b7565b9150612ad582612a6e565b604082019050919050565b60006020820190508181036000830152612af981612abd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b5c6022836120b7565b9150612b6782612b00565b604082019050919050565b60006020820190508181036000830152612b8b81612b4f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612bc8601d836120b7565b9150612bd382612b92565b602082019050919050565b60006020820190508181036000830152612bf781612bbb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c5a6025836120b7565b9150612c6582612bfe565b604082019050919050565b60006020820190508181036000830152612c8981612c4d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cec6023836120b7565b9150612cf782612c90565b604082019050919050565b60006020820190508181036000830152612d1b81612cdf565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000612d7e6029836120b7565b9150612d8982612d22565b604082019050919050565b60006020820190508181036000830152612dad81612d71565b9050919050565b7f43616e2774207472616e73666572206e6f770000000000000000000000000000600082015250565b6000612dea6012836120b7565b9150612df582612db4565b602082019050919050565b60006020820190508181036000830152612e1981612ddd565b9050919050565b6000612e2b826122c3565b9150612e36836122c3565b9250828202612e44816122c3565b91508282048414831517612e5b57612e5a61271a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e9c826122c3565b9150612ea7836122c3565b925082612eb757612eb6612e62565b5b828204905092915050565b6000612ecd826122c3565b9150612ed8836122c3565b9250828203905081811115612ef057612eef61271a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050612f3481612297565b92915050565b600060208284031215612f5057612f4f61215e565b5b6000612f5e84828501612f25565b91505092915050565b6000819050919050565b6000612f8c612f87612f8284612f67565b612390565b6122c3565b9050919050565b612f9c81612f71565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fd781612285565b82525050565b6000612fe98383612fce565b60208301905092915050565b6000602082019050919050565b600061300d82612fa2565b6130178185612fad565b935061302283612fbe565b8060005b8381101561305357815161303a8882612fdd565b975061304583612ff5565b925050600181019050613026565b5085935050505092915050565b600060a082019050613075600083018861240a565b6130826020830187612f93565b81810360408301526130948186613002565b90506130a36060830185612518565b6130b0608083018461240a565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006131166026836120b7565b9150613121826130ba565b604082019050919050565b6000602082019050818103600083015261314581613109565b905091905056fea2646970667358221220b9892e1e1117d0770db0d48af57c3bd5f49086fcf4c4972b9d8c9e0f22a792d664736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c8063715018a61161010d578063a457c2d7116100a0578063bf56b3711161006f578063bf56b37114610753578063d621e8131461077e578063dd62ed3e146107a9578063f2fde38b146107e6578063fae926121461080f57610204565b8063a457c2d714610685578063a45b154a146106c2578063a8424861146106ed578063a9059cbb1461071657610204565b80638da5cb5b116100dc5780638da5cb5b146105db57806395d89b4114610606578063988cf80114610631578063a29a60891461065c57610204565b8063715018a614610535578063768dc7101461054c5780637b191ff2146105895780637d315a2e146105b257610204565b8063313ce567116101905780633c34ff631161015f5780633c34ff6314610439578063402fae581461047657806349bd5a5e146104a15780635e7f6718146104cc57806370a08231146104f857610204565b8063313ce5671461037f5780633690fe40146103aa57806339509351146103d35780633bec2bf31461041057610204565b80631694505e116101cc5780631694505e146102c357806318160ddd146102ee57806323b872dd146103195780632a55fc2a1461035657610204565b806306fdde03146102095780630850935f14610234578063095ea7b31461025d578063128f72c31461029a57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e610838565b60405161022b919061213c565b60405180910390f35b34801561024057600080fd5b5061025b60048036038101906102569190612205565b6108ca565b005b34801561026957600080fd5b50610284600480360381019061027f91906122f9565b610977565b6040516102919190612348565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612363565b61099a565b005b3480156102cf57600080fd5b506102d86109ac565b6040516102e591906123ef565b60405180910390f35b3480156102fa57600080fd5b506103036109d0565b6040516103109190612419565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190612434565b6109da565b60405161034d9190612348565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612487565b610a07565b005b34801561038b57600080fd5b50610394610acd565b6040516103a191906124d0565b60405180910390f35b3480156103b657600080fd5b506103d160048036038101906103cc91906124eb565b610ad6565b005b3480156103df57600080fd5b506103fa60048036038101906103f591906122f9565b610b32565b6040516104079190612348565b60405180910390f35b34801561041c57600080fd5b50610437600480360381019061043291906124eb565b610b69565b005b34801561044557600080fd5b50610460600480360381019061045b9190612487565b610ba0565b60405161046d9190612348565b60405180910390f35b34801561048257600080fd5b5061048b610bc0565b6040516104989190612419565b60405180910390f35b3480156104ad57600080fd5b506104b6610bc6565b6040516104c39190612527565b60405180910390f35b3480156104d857600080fd5b506104e1610bec565b6040516104ef929190612542565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a9190612487565b610bfd565b60405161052c9190612419565b60405180910390f35b34801561054157600080fd5b5061054a610c45565b005b34801561055857600080fd5b50610573600480360381019061056e9190612487565b610c59565b6040516105809190612348565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab919061256b565b610c79565b005b3480156105be57600080fd5b506105d960048036038101906105d491906125cb565b610e99565b005b3480156105e757600080fd5b506105f0610eb3565b6040516105fd9190612527565b60405180910390f35b34801561061257600080fd5b5061061b610edd565b604051610628919061213c565b60405180910390f35b34801561063d57600080fd5b50610646610f6f565b6040516106539190612527565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e9190612487565b610f95565b005b34801561069157600080fd5b506106ac60048036038101906106a791906122f9565b610fe1565b6040516106b99190612348565b60405180910390f35b3480156106ce57600080fd5b506106d7611058565b6040516106e49190612348565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f919061260b565b61106b565b005b34801561072257600080fd5b5061073d600480360381019061073891906122f9565b61113b565b60405161074a9190612348565b60405180910390f35b34801561075f57600080fd5b50610768611157565b6040516107759190612419565b60405180910390f35b34801561078a57600080fd5b5061079361115d565b6040516107a09190612348565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb919061264b565b611170565b6040516107dd9190612419565b60405180910390f35b3480156107f257600080fd5b5061080d60048036038101906108089190612487565b6111f7565b005b34801561081b57600080fd5b5061083660048036038101906108319190612487565b61127a565b005b606060038054610847906126ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610873906126ba565b80156108c05780601f10610895576101008083540402835291602001916108c0565b820191906000526020600020905b8154815290600101906020018083116108a357829003601f168201915b5050505050905090565b6108d26112c6565b60005b838390508110156109715781600860008686858181106108f8576108f76126eb565b5b905060200201602081019061090d9190612487565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061096990612749565b9150506108d5565b50505050565b600080610982611344565b905061098f81858561134c565b600191505092915050565b6109a26112c6565b8060118190555050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b6000806109e5611344565b90506109f2858285611515565b6109fd8585856115a1565b9150509392505050565b610a0f6112c6565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b610ade6112c6565b80600f60016101000a81548160ff0219169083151502179055507f67cbe9d16793e5cd880dafc6b9ad4a568545d35aa475a92dc80ded5dba51547481604051610b279190612348565b60405180910390a150565b600080610b3d611344565b9050610b5e818585610b4f8589611170565b610b599190612791565b61134c565b600191505092915050565b610b716112c6565b80600f60026101000a81548160ff021916908315150217905550600060105403610b9d57436010819055505b50565b600e6020528060005260406000206000915054906101000a900460ff1681565b60115481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600b54600c54915091509091565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c4d6112c6565b610c576000611b07565b565b60086020528060005260406000206000915054906101000a900460ff1681565b610c81610eb3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590612811565b60405180910390fd5b60004790506000811115610d44578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d42573d6000803e3d6000fd5b505b5060005b83839050811015610e93576000848483818110610d6857610d676126eb565b5b9050602002016020810190610d7d9190612487565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610dba9190612527565b602060405180830381865afa158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb9190612846565b90506000811115610e86578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401610e41929190612873565b6020604051808303816000875af1158015610e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8491906128b1565b505b5050806001019050610d48565b50505050565b610ea16112c6565b81600b8190555080600c819055505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610eec906126ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610f18906126ba565b8015610f655780601f10610f3a57610100808354040283529160200191610f65565b820191906000526020600020905b815481529060010190602001808311610f4857829003601f168201915b5050505050905090565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f9d6112c6565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610fec611344565b90506000610ffa8286611170565b90508381101561103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103690612950565b60405180910390fd5b61104c828686840361134c565b60019250505092915050565b600f60019054906101000a900460ff1681565b611073610eb3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790612811565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061114f611148611344565b84846115a1565b905092915050565b60105481565b600f60029054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6111ff6112c6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906129e2565b60405180910390fd5b61127781611b07565b50565b6112826112c6565b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112ce611344565b73ffffffffffffffffffffffffffffffffffffffff166112ec610eb3565b73ffffffffffffffffffffffffffffffffffffffff1614611342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133990612a4e565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290612ae0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190612b72565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516115089190612419565b60405180910390a3505050565b60006115218484611170565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461159b578181101561158d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158490612bde565b60405180910390fd5b61159a848484840361134c565b5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890612c70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611680576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167790612d02565b60405180910390fd5b600082116116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba90612d94565b60405180910390fd5b600f60029054906101000a900460ff161580156117805750600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561177f5750600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b156117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790612e00565b60405180910390fd5b60006117cb30610bfd565b9050600060115482101590508080156117f15750600f60009054906101000a900460ff16155b80156118475750600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561189d5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156118b55750600f60019054906101000a900460ff165b156118fa576001600f60006101000a81548160ff0219169083151502179055506118de82611bcd565b6000600f60006101000a81548160ff0219169083151502179055505b600060019050600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119a15750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156119ab57600090505b8015611aee57600080600e60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a23576064600b5488611a169190612e20565b611a209190612e91565b90505b600e60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a92576064600c5488611a859190612e20565b611a8f9190612e91565b90505b8091506000611aa08a610bfd565b9050878103611ac7576305f5e10088611ab99190612e91565b88611ac49190612ec2565b97505b8288611ad39190612ec2565b97506000831115611aea57611ae98a3085611e2c565b5b5050505b611af9878787611e2c565b600193505050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600267ffffffffffffffff811115611bea57611be9612ef6565b5b604051908082528060200260200182016040528015611c185781602001602082028036833780820191505090505b5090503081600081518110611c3057611c2f6126eb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf99190612f3a565b81600181518110611d0d57611d0c6126eb565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611d72307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461134c565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611df6959493929190613060565b600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290612c70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0190612d02565b60405180910390fd5b611f158383836120a2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f929061312c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516120899190612419565b60405180910390a361209c8484846120a7565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120e65780820151818401526020810190506120cb565b60008484015250505050565b6000601f19601f8301169050919050565b600061210e826120ac565b61211881856120b7565b93506121288185602086016120c8565b612131816120f2565b840191505092915050565b600060208201905081810360008301526121568184612103565b905092915050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f84011261218d5761218c612168565b5b8235905067ffffffffffffffff8111156121aa576121a961216d565b5b6020830191508360208202830111156121c6576121c5612172565b5b9250929050565b60008115159050919050565b6121e2816121cd565b81146121ed57600080fd5b50565b6000813590506121ff816121d9565b92915050565b60008060006040848603121561221e5761221d61215e565b5b600084013567ffffffffffffffff81111561223c5761223b612163565b5b61224886828701612177565b9350935050602061225b868287016121f0565b9150509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061229082612265565b9050919050565b6122a081612285565b81146122ab57600080fd5b50565b6000813590506122bd81612297565b92915050565b6000819050919050565b6122d6816122c3565b81146122e157600080fd5b50565b6000813590506122f3816122cd565b92915050565b600080604083850312156123105761230f61215e565b5b600061231e858286016122ae565b925050602061232f858286016122e4565b9150509250929050565b612342816121cd565b82525050565b600060208201905061235d6000830184612339565b92915050565b6000602082840312156123795761237861215e565b5b6000612387848285016122e4565b91505092915050565b6000819050919050565b60006123b56123b06123ab84612265565b612390565b612265565b9050919050565b60006123c78261239a565b9050919050565b60006123d9826123bc565b9050919050565b6123e9816123ce565b82525050565b600060208201905061240460008301846123e0565b92915050565b612413816122c3565b82525050565b600060208201905061242e600083018461240a565b92915050565b60008060006060848603121561244d5761244c61215e565b5b600061245b868287016122ae565b935050602061246c868287016122ae565b925050604061247d868287016122e4565b9150509250925092565b60006020828403121561249d5761249c61215e565b5b60006124ab848285016122ae565b91505092915050565b600060ff82169050919050565b6124ca816124b4565b82525050565b60006020820190506124e560008301846124c1565b92915050565b6000602082840312156125015761250061215e565b5b600061250f848285016121f0565b91505092915050565b61252181612285565b82525050565b600060208201905061253c6000830184612518565b92915050565b6000604082019050612557600083018561240a565b612564602083018461240a565b9392505050565b6000806000604084860312156125845761258361215e565b5b600084013567ffffffffffffffff8111156125a2576125a1612163565b5b6125ae86828701612177565b935093505060206125c1868287016122ae565b9150509250925092565b600080604083850312156125e2576125e161215e565b5b60006125f0858286016122e4565b9250506020612601858286016122e4565b9150509250929050565b600080604083850312156126225761262161215e565b5b6000612630858286016122ae565b9250506020612641858286016121f0565b9150509250929050565b600080604083850312156126625761266161215e565b5b6000612670858286016122ae565b9250506020612681858286016122ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126d257607f821691505b6020821081036126e5576126e461268b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612754826122c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036127865761278561271a565b5b600182019050919050565b600061279c826122c3565b91506127a7836122c3565b92508282019050808211156127bf576127be61271a565b5b92915050565b7f596f7520646f206e6f742068617665207065726d697373696f6e000000000000600082015250565b60006127fb601a836120b7565b9150612806826127c5565b602082019050919050565b6000602082019050818103600083015261282a816127ee565b9050919050565b600081519050612840816122cd565b92915050565b60006020828403121561285c5761285b61215e565b5b600061286a84828501612831565b91505092915050565b60006040820190506128886000830185612518565b612895602083018461240a565b9392505050565b6000815190506128ab816121d9565b92915050565b6000602082840312156128c7576128c661215e565b5b60006128d58482850161289c565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061293a6025836120b7565b9150612945826128de565b604082019050919050565b600060208201905081810360008301526129698161292d565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006129cc6026836120b7565b91506129d782612970565b604082019050919050565b600060208201905081810360008301526129fb816129bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612a386020836120b7565b9150612a4382612a02565b602082019050919050565b60006020820190508181036000830152612a6781612a2b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612aca6024836120b7565b9150612ad582612a6e565b604082019050919050565b60006020820190508181036000830152612af981612abd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b5c6022836120b7565b9150612b6782612b00565b604082019050919050565b60006020820190508181036000830152612b8b81612b4f565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612bc8601d836120b7565b9150612bd382612b92565b602082019050919050565b60006020820190508181036000830152612bf781612bbb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612c5a6025836120b7565b9150612c6582612bfe565b604082019050919050565b60006020820190508181036000830152612c8981612c4d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612cec6023836120b7565b9150612cf782612c90565b604082019050919050565b60006020820190508181036000830152612d1b81612cdf565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b6000612d7e6029836120b7565b9150612d8982612d22565b604082019050919050565b60006020820190508181036000830152612dad81612d71565b9050919050565b7f43616e2774207472616e73666572206e6f770000000000000000000000000000600082015250565b6000612dea6012836120b7565b9150612df582612db4565b602082019050919050565b60006020820190508181036000830152612e1981612ddd565b9050919050565b6000612e2b826122c3565b9150612e36836122c3565b9250828202612e44816122c3565b91508282048414831517612e5b57612e5a61271a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e9c826122c3565b9150612ea7836122c3565b925082612eb757612eb6612e62565b5b828204905092915050565b6000612ecd826122c3565b9150612ed8836122c3565b9250828203905081811115612ef057612eef61271a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050612f3481612297565b92915050565b600060208284031215612f5057612f4f61215e565b5b6000612f5e84828501612f25565b91505092915050565b6000819050919050565b6000612f8c612f87612f8284612f67565b612390565b6122c3565b9050919050565b612f9c81612f71565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fd781612285565b82525050565b6000612fe98383612fce565b60208301905092915050565b6000602082019050919050565b600061300d82612fa2565b6130178185612fad565b935061302283612fbe565b8060005b8381101561305357815161303a8882612fdd565b975061304583612ff5565b925050600181019050613026565b5085935050505092915050565b600060a082019050613075600083018861240a565b6130826020830187612f93565b81810360408301526130948186613002565b90506130a36060830185612518565b6130b0608083018461240a565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006131166026836120b7565b9150613121826130ba565b604082019050919050565b6000602082019050818103600083015261314581613109565b905091905056fea2646970667358221220b9892e1e1117d0770db0d48af57c3bd5f49086fcf4c4972b9d8c9e0f22a792d664736f6c63430008120033

Deployed Bytecode Sourcemap

40869:7197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4477:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42352:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6894:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43600:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41309:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5597:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44194:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42183:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5439:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42835:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8404:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43436:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41474:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41683:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41437:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43718:191;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;5768:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19360:103;;;;;;;;;;;;;:::i;:::-;;41071:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47424:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42619:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18712:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4696:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41765:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43113:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9170:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41554:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43237:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44010:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41645:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41600:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6398:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19618:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43011:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4477:100;4531:13;4564:5;4557:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4477:100;:::o;42352:259::-;18598:13;:11;:13::i;:::-;42494:9:::1;42489:115;42513:8;;:15;;42509:1;:19;42489:115;;;42584:8;42550:18;:31;42569:8;;42578:1;42569:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42550:31;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;42530:3;;;;;:::i;:::-;;;;42489:115;;;;42352:259:::0;;;:::o;6894:226::-;7002:4;7019:13;7035:12;:10;:12::i;:::-;7019:28;;7058:32;7067:5;7074:7;7083:6;7058:8;:32::i;:::-;7108:4;7101:11;;;6894:226;;;;:::o;43600:110::-;18598:13;:11;:13::i;:::-;43699:3:::1;43675:21;:27;;;;43600:110:::0;:::o;41309:121::-;;;:::o;5597:108::-;5658:7;5685:12;;5678:19;;5597:108;:::o;44194:305::-;44334:4;44351:15;44369:12;:10;:12::i;:::-;44351:30;;44392:40;44408:6;44416:7;44425:6;44392:15;:40::i;:::-;44450:41;44465:6;44473:9;44484:6;44450:14;:41::i;:::-;44443:48;;;44194:305;;;;;:::o;42183:161::-;18598:13;:11;:13::i;:::-;42277:14:::1;42261:13;;:30;;;;;;;;;;;;;;;;;;42332:4;42302:12;:27;42315:13;;;;;;;;;;;42302:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;42183:161:::0;:::o;5439:93::-;5497:5;5522:2;5515:9;;5439:93;:::o;42835:168::-;18598:13;:11;:13::i;:::-;42934:8:::1;42911:20;;:31;;;;;;;;;;;;;;;;;;42958:37;42986:8;42958:37;;;;;;:::i;:::-;;;;;;;;42835:168:::0;:::o;8404:263::-;8517:4;8534:13;8550:12;:10;:12::i;:::-;8534:28;;8573:64;8582:5;8589:7;8626:10;8598:25;8608:5;8615:7;8598:9;:25::i;:::-;:38;;;;:::i;:::-;8573:8;:64::i;:::-;8655:4;8648:11;;;8404:263;;;;:::o;43436:156::-;18598:13;:11;:13::i;:::-;43519:8:::1;43504:12;;:23;;;;;;;;;;;;;;;;;;43556:1;43542:10;;:15:::0;43538:46:::1;;43572:12;43559:10;:25;;;;43538:46;43436:156:::0;:::o;41474:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;41683:73::-;;;;:::o;41437:28::-;;;;;;;;;;;;;:::o;43718:191::-;43794:7;43803;43850:12;;43877:13;;43828:73;;;;43718:191;;:::o;5768:143::-;5858:7;5885:9;:18;5895:7;5885:18;;;;;;;;;;;;;;;;5878:25;;5768:143;;;:::o;19360:103::-;18598:13;:11;:13::i;:::-;19425:30:::1;19452:1;19425:18;:30::i;:::-;19360:103::o:0;41071:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;47424:639::-;47561:7;:5;:7::i;:::-;47547:21;;:10;:21;;;47539:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;47624:14;47641:21;47624:38;;47690:1;47681:6;:10;47677:51;;;47701:9;47693:27;;:35;47721:6;47693:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47677:51;47609:131;47780:13;47775:270;47807:9;;:16;;47799:5;:24;47775:270;;;47853:12;47875:9;;47885:5;47875:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;47853:39;;47911:15;47929:5;:15;;;47953:4;47929:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47911:48;;47992:1;47982:7;:11;47978:51;;;47995:5;:14;;;48010:9;48021:7;47995:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47978:51;47834:211;;47825:7;;;;;47775:270;;;;47424:639;;;:::o;42619:208::-;18598:13;:11;:13::i;:::-;42765::::1;42750:12;:28;;;;42805:14;42789:13;:30;;;;42619:208:::0;;:::o;18712:87::-;18758:7;18785:6;;;;;;;;;;;18778:13;;18712:87;:::o;4696:104::-;4752:13;4785:7;4778:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4696:104;:::o;41765:67::-;;;;;;;;;;;;;:::o;43113:116::-;18598:13;:11;:13::i;:::-;43207:14:::1;43191:13;;:30;;;;;;;;;;;;;;;;;;43113:116:::0;:::o;9170:498::-;9288:4;9305:13;9321:12;:10;:12::i;:::-;9305:28;;9344:24;9371:25;9381:5;9388:7;9371:9;:25::i;:::-;9344:52;;9449:15;9429:16;:35;;9407:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;9565:60;9574:5;9581:7;9609:15;9590:16;:34;9565:8;:60::i;:::-;9656:4;9649:11;;;;9170:498;;;;:::o;41554:39::-;;;;;;;;;;;;;:::o;43237:191::-;43337:7;:5;:7::i;:::-;43323:21;;:10;:21;;;43315:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43416:4;43385:12;:28;43398:14;43385:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;43237:191;;:::o;44010:176::-;44114:4;44138:40;44153:12;:10;:12::i;:::-;44167:2;44171:6;44138:14;:40::i;:::-;44131:47;;44010:176;;;;:::o;41645:29::-;;;;:::o;41600:32::-;;;;;;;;;;;;;:::o;6398:176::-;6512:7;6539:11;:18;6551:5;6539:18;;;;;;;;;;;;;;;:27;6558:7;6539:27;;;;;;;;;;;;;;;;6532:34;;6398:176;;;;:::o;19618:238::-;18598:13;:11;:13::i;:::-;19741:1:::1;19721:22;;:8;:22;;::::0;19699:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19820:28;19839:8;19820:18;:28::i;:::-;19618:238:::0;:::o;43011:94::-;18598:13;:11;:13::i;:::-;43091:6:::1;43081:7;;:16;;;;;;;;;;;;;;;;;;43011:94:::0;:::o;18877:132::-;18952:12;:10;:12::i;:::-;18941:23;;:7;:5;:7::i;:::-;:23;;;18933:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18877:132::o;3483:98::-;3536:7;3563:10;3556:17;;3483:98;:::o;13296:380::-;13449:1;13432:19;;:5;:19;;;13424:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13530:1;13511:21;;:7;:21;;;13503:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13614:6;13584:11;:18;13596:5;13584:18;;;;;;;;;;;;;;;:27;13603:7;13584:27;;;;;;;;;;;;;;;:36;;;;13652:7;13636:32;;13645:5;13636:32;;;13661:6;13636:32;;;;;;:::i;:::-;;;;;;;;13296:380;;;:::o;13967:502::-;14102:24;14129:25;14139:5;14146:7;14129:9;:25::i;:::-;14102:52;;14189:17;14169:16;:37;14165:297;;14269:6;14249:16;:26;;14223:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;14384:51;14393:5;14400:7;14428:6;14409:16;:25;14384:8;:51::i;:::-;14165:297;14091:378;13967:502;;;:::o;44507:2310::-;44624:4;44665:1;44649:18;;:4;:18;;;44641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44742:1;44728:16;;:2;:16;;;44720:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44812:1;44803:6;:10;44795:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44891:12;;;;;;;;;;;44890:13;:84;;;;;44922:18;:24;44941:4;44922:24;;;;;;;;;;;;;;;;;;;;;;;;;44921:25;:52;;;;;44951:18;:22;44970:2;44951:22;;;;;;;;;;;;;;;;;;;;;;;;;44950:23;44921:52;44890:84;44872:169;;;45001:28;;;;;;;;;;:::i;:::-;;;;;;;;44872:169;45335:28;45366:24;45384:4;45366:9;:24::i;:::-;45335:55;;45403:24;45467:21;;45430:20;:58;;45403:85;;45517:19;:52;;;;;45554:15;;;;;;;;;;;45553:16;45517:52;:88;;;;;45587:12;:18;45600:4;45587:18;;;;;;;;;;;;;;;;;;;;;;;;;45586:19;45517:88;:130;;;;;45623:18;:24;45642:4;45623:24;;;;;;;;;;;;;;;;;;;;;;;;;45622:25;45517:130;:167;;;;;45664:20;;;;;;;;;;;45517:167;45499:345;;;45729:4;45711:15;;:22;;;;;;;;;;;;;;;;;;45748:46;45773:20;45748:24;:46::i;:::-;45827:5;45809:15;;:23;;;;;;;;;;;;;;;;;;45499:345;45917:12;45932:4;45917:19;;46037:18;:24;46056:4;46037:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;46065:18;:22;46084:2;46065:22;;;;;;;;;;;;;;;;;;;;;;;;;46037:50;46033:98;;;46114:5;46104:15;;46033:98;46147:7;46143:607;;;46171:12;46198;46229;:18;46242:4;46229:18;;;;;;;;;;;;;;;;;;;;;;;;;46225:95;;;46301:3;46285:12;;46276:6;:21;;;;:::i;:::-;46275:29;;;;:::i;:::-;46268:36;;46225:95;46338:12;:16;46351:2;46338:16;;;;;;;;;;;;;;;;;;;;;;;;;46334:94;;;46409:3;46392:13;;46383:6;:22;;;;:::i;:::-;46382:30;;;;:::i;:::-;46375:37;;46334:94;46449:4;46442:11;;46470:19;46492:15;46502:4;46492:9;:15::i;:::-;46470:37;;46541:6;46526:11;:21;46522:98;;46596:7;46587:6;:16;;;;:::i;:::-;46577:6;:27;;;;:::i;:::-;46568:36;;46522:98;46652:4;46643:6;:13;;;;:::i;:::-;46634:22;;46682:1;46675:4;:8;46671:67;;;46702:36;46712:4;46726;46733;46702:9;:36::i;:::-;46671:67;46156:594;;;46143:607;46760:27;46770:4;46776:2;46780:6;46760:9;:27::i;:::-;46805:4;46798:11;;;;;44507:2310;;;;;:::o;20016:191::-;20090:16;20109:6;;;;;;;;;;;20090:25;;20135:8;20126:6;;:17;;;;;;;;;;;;;;;;;;20190:8;20159:40;;20180:8;20159:40;;;;;;;;;;;;20079:128;20016:191;:::o;46825:591::-;46959:21;46997:1;46983:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46959:40;;47028:4;47010;47015:1;47010:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;47054:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47044:4;47049:1;47044:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;47089:62;47106:4;47121:15;47139:11;47089:8;:62::i;:::-;47190:15;:66;;;47271:11;47297:1;47341:4;47360:7;;;;;;;;;;;47382:15;47190:218;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46888:528;46825:591;:::o;10138:877::-;10285:1;10269:18;;:4;:18;;;10261:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10362:1;10348:16;;:2;:16;;;10340:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10417:38;10438:4;10444:2;10448:6;10417:20;:38::i;:::-;10468:19;10490:9;:15;10500:4;10490:15;;;;;;;;;;;;;;;;10468:37;;10553:6;10538:11;:21;;10516:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;10693:6;10679:11;:20;10661:9;:15;10671:4;10661:15;;;;;;;;;;;;;;;:38;;;;10896:6;10879:9;:13;10889:2;10879:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;10946:2;10931:26;;10940:4;10931:26;;;10950:6;10931:26;;;;;;:::i;:::-;;;;;;;;10970:37;10990:4;10996:2;11000:6;10970:19;:37::i;:::-;10250:765;10138:877;;;:::o;15069:125::-;;;;:::o;15798:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:117;1785:1;1782;1775:12;1799:117;1908:1;1905;1898:12;1922:117;2031:1;2028;2021:12;2062:568;2135:8;2145:6;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2316:6;2303:20;2293:30;;2346:18;2338:6;2335:30;2332:117;;;2368:79;;:::i;:::-;2332:117;2482:4;2474:6;2470:17;2458:29;;2536:3;2528:4;2520:6;2516:17;2506:8;2502:32;2499:41;2496:128;;;2543:79;;:::i;:::-;2496:128;2062:568;;;;;:::o;2636:90::-;2670:7;2713:5;2706:13;2699:21;2688:32;;2636:90;;;:::o;2732:116::-;2802:21;2817:5;2802:21;:::i;:::-;2795:5;2792:32;2782:60;;2838:1;2835;2828:12;2782:60;2732:116;:::o;2854:133::-;2897:5;2935:6;2922:20;2913:29;;2951:30;2975:5;2951:30;:::i;:::-;2854:133;;;;:::o;2993:698::-;3085:6;3093;3101;3150:2;3138:9;3129:7;3125:23;3121:32;3118:119;;;3156:79;;:::i;:::-;3118:119;3304:1;3293:9;3289:17;3276:31;3334:18;3326:6;3323:30;3320:117;;;3356:79;;:::i;:::-;3320:117;3469:80;3541:7;3532:6;3521:9;3517:22;3469:80;:::i;:::-;3451:98;;;;3247:312;3598:2;3624:50;3666:7;3657:6;3646:9;3642:22;3624:50;:::i;:::-;3614:60;;3569:115;2993:698;;;;;:::o;3697:126::-;3734:7;3774:42;3767:5;3763:54;3752:65;;3697:126;;;:::o;3829:96::-;3866:7;3895:24;3913:5;3895:24;:::i;:::-;3884:35;;3829:96;;;:::o;3931:122::-;4004:24;4022:5;4004:24;:::i;:::-;3997:5;3994:35;3984:63;;4043:1;4040;4033:12;3984:63;3931:122;:::o;4059:139::-;4105:5;4143:6;4130:20;4121:29;;4159:33;4186:5;4159:33;:::i;:::-;4059:139;;;;:::o;4204:77::-;4241:7;4270:5;4259:16;;4204:77;;;:::o;4287:122::-;4360:24;4378:5;4360:24;:::i;:::-;4353:5;4350:35;4340:63;;4399:1;4396;4389:12;4340:63;4287:122;:::o;4415:139::-;4461:5;4499:6;4486:20;4477:29;;4515:33;4542:5;4515:33;:::i;:::-;4415:139;;;;:::o;4560:474::-;4628:6;4636;4685:2;4673:9;4664:7;4660:23;4656:32;4653:119;;;4691:79;;:::i;:::-;4653:119;4811:1;4836:53;4881:7;4872:6;4861:9;4857:22;4836:53;:::i;:::-;4826:63;;4782:117;4938:2;4964:53;5009:7;5000:6;4989:9;4985:22;4964:53;:::i;:::-;4954:63;;4909:118;4560:474;;;;;:::o;5040:109::-;5121:21;5136:5;5121:21;:::i;:::-;5116:3;5109:34;5040:109;;:::o;5155:210::-;5242:4;5280:2;5269:9;5265:18;5257:26;;5293:65;5355:1;5344:9;5340:17;5331:6;5293:65;:::i;:::-;5155:210;;;;:::o;5371:329::-;5430:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:119;;;5485:79;;:::i;:::-;5447:119;5605:1;5630:53;5675:7;5666:6;5655:9;5651:22;5630:53;:::i;:::-;5620:63;;5576:117;5371:329;;;;:::o;5706:60::-;5734:3;5755:5;5748:12;;5706:60;;;:::o;5772:142::-;5822:9;5855:53;5873:34;5882:24;5900:5;5882:24;:::i;:::-;5873:34;:::i;:::-;5855:53;:::i;:::-;5842:66;;5772:142;;;:::o;5920:126::-;5970:9;6003:37;6034:5;6003:37;:::i;:::-;5990:50;;5920:126;;;:::o;6052:151::-;6127:9;6160:37;6191:5;6160:37;:::i;:::-;6147:50;;6052:151;;;:::o;6209:181::-;6321:62;6377:5;6321:62;:::i;:::-;6316:3;6309:75;6209:181;;:::o;6396:272::-;6514:4;6552:2;6541:9;6537:18;6529:26;;6565:96;6658:1;6647:9;6643:17;6634:6;6565:96;:::i;:::-;6396:272;;;;:::o;6674:118::-;6761:24;6779:5;6761:24;:::i;:::-;6756:3;6749:37;6674:118;;:::o;6798:222::-;6891:4;6929:2;6918:9;6914:18;6906:26;;6942:71;7010:1;6999:9;6995:17;6986:6;6942:71;:::i;:::-;6798:222;;;;:::o;7026:619::-;7103:6;7111;7119;7168:2;7156:9;7147:7;7143:23;7139:32;7136:119;;;7174:79;;:::i;:::-;7136:119;7294:1;7319:53;7364:7;7355:6;7344:9;7340:22;7319:53;:::i;:::-;7309:63;;7265:117;7421:2;7447:53;7492:7;7483:6;7472:9;7468:22;7447:53;:::i;:::-;7437:63;;7392:118;7549:2;7575:53;7620:7;7611:6;7600:9;7596:22;7575:53;:::i;:::-;7565:63;;7520:118;7026:619;;;;;:::o;7651:329::-;7710:6;7759:2;7747:9;7738:7;7734:23;7730:32;7727:119;;;7765:79;;:::i;:::-;7727:119;7885:1;7910:53;7955:7;7946:6;7935:9;7931:22;7910:53;:::i;:::-;7900:63;;7856:117;7651:329;;;;:::o;7986:86::-;8021:7;8061:4;8054:5;8050:16;8039:27;;7986:86;;;:::o;8078:112::-;8161:22;8177:5;8161:22;:::i;:::-;8156:3;8149:35;8078:112;;:::o;8196:214::-;8285:4;8323:2;8312:9;8308:18;8300:26;;8336:67;8400:1;8389:9;8385:17;8376:6;8336:67;:::i;:::-;8196:214;;;;:::o;8416:323::-;8472:6;8521:2;8509:9;8500:7;8496:23;8492:32;8489:119;;;8527:79;;:::i;:::-;8489:119;8647:1;8672:50;8714:7;8705:6;8694:9;8690:22;8672:50;:::i;:::-;8662:60;;8618:114;8416:323;;;;:::o;8745:118::-;8832:24;8850:5;8832:24;:::i;:::-;8827:3;8820:37;8745:118;;:::o;8869:222::-;8962:4;9000:2;8989:9;8985:18;8977:26;;9013:71;9081:1;9070:9;9066:17;9057:6;9013:71;:::i;:::-;8869:222;;;;:::o;9097:332::-;9218:4;9256:2;9245:9;9241:18;9233:26;;9269:71;9337:1;9326:9;9322:17;9313:6;9269:71;:::i;:::-;9350:72;9418:2;9407:9;9403:18;9394:6;9350:72;:::i;:::-;9097:332;;;;;:::o;9435:704::-;9530:6;9538;9546;9595:2;9583:9;9574:7;9570:23;9566:32;9563:119;;;9601:79;;:::i;:::-;9563:119;9749:1;9738:9;9734:17;9721:31;9779:18;9771:6;9768:30;9765:117;;;9801:79;;:::i;:::-;9765:117;9914:80;9986:7;9977:6;9966:9;9962:22;9914:80;:::i;:::-;9896:98;;;;9692:312;10043:2;10069:53;10114:7;10105:6;10094:9;10090:22;10069:53;:::i;:::-;10059:63;;10014:118;9435:704;;;;;:::o;10145:474::-;10213:6;10221;10270:2;10258:9;10249:7;10245:23;10241:32;10238:119;;;10276:79;;:::i;:::-;10238:119;10396:1;10421:53;10466:7;10457:6;10446:9;10442:22;10421:53;:::i;:::-;10411:63;;10367:117;10523:2;10549:53;10594:7;10585:6;10574:9;10570:22;10549:53;:::i;:::-;10539:63;;10494:118;10145:474;;;;;:::o;10625:468::-;10690:6;10698;10747:2;10735:9;10726:7;10722:23;10718:32;10715:119;;;10753:79;;:::i;:::-;10715:119;10873:1;10898:53;10943:7;10934:6;10923:9;10919:22;10898:53;:::i;:::-;10888:63;;10844:117;11000:2;11026:50;11068:7;11059:6;11048:9;11044:22;11026:50;:::i;:::-;11016:60;;10971:115;10625:468;;;;;:::o;11099:474::-;11167:6;11175;11224:2;11212:9;11203:7;11199:23;11195:32;11192:119;;;11230:79;;:::i;:::-;11192:119;11350:1;11375:53;11420:7;11411:6;11400:9;11396:22;11375:53;:::i;:::-;11365:63;;11321:117;11477:2;11503:53;11548:7;11539:6;11528:9;11524:22;11503:53;:::i;:::-;11493:63;;11448:118;11099:474;;;;;:::o;11579:180::-;11627:77;11624:1;11617:88;11724:4;11721:1;11714:15;11748:4;11745:1;11738:15;11765:320;11809:6;11846:1;11840:4;11836:12;11826:22;;11893:1;11887:4;11883:12;11914:18;11904:81;;11970:4;11962:6;11958:17;11948:27;;11904:81;12032:2;12024:6;12021:14;12001:18;11998:38;11995:84;;12051:18;;:::i;:::-;11995:84;11816:269;11765:320;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:180;12325:77;12322:1;12315:88;12422:4;12419:1;12412:15;12446:4;12443:1;12436:15;12463:233;12502:3;12525:24;12543:5;12525:24;:::i;:::-;12516:33;;12571:66;12564:5;12561:77;12558:103;;12641:18;;:::i;:::-;12558:103;12688:1;12681:5;12677:13;12670:20;;12463:233;;;:::o;12702:191::-;12742:3;12761:20;12779:1;12761:20;:::i;:::-;12756:25;;12795:20;12813:1;12795:20;:::i;:::-;12790:25;;12838:1;12835;12831:9;12824:16;;12859:3;12856:1;12853:10;12850:36;;;12866:18;;:::i;:::-;12850:36;12702:191;;;;:::o;12899:176::-;13039:28;13035:1;13027:6;13023:14;13016:52;12899:176;:::o;13081:366::-;13223:3;13244:67;13308:2;13303:3;13244:67;:::i;:::-;13237:74;;13320:93;13409:3;13320:93;:::i;:::-;13438:2;13433:3;13429:12;13422:19;;13081:366;;;:::o;13453:419::-;13619:4;13657:2;13646:9;13642:18;13634:26;;13706:9;13700:4;13696:20;13692:1;13681:9;13677:17;13670:47;13734:131;13860:4;13734:131;:::i;:::-;13726:139;;13453:419;;;:::o;13878:143::-;13935:5;13966:6;13960:13;13951:22;;13982:33;14009:5;13982:33;:::i;:::-;13878:143;;;;:::o;14027:351::-;14097:6;14146:2;14134:9;14125:7;14121:23;14117:32;14114:119;;;14152:79;;:::i;:::-;14114:119;14272:1;14297:64;14353:7;14344:6;14333:9;14329:22;14297:64;:::i;:::-;14287:74;;14243:128;14027:351;;;;:::o;14384:332::-;14505:4;14543:2;14532:9;14528:18;14520:26;;14556:71;14624:1;14613:9;14609:17;14600:6;14556:71;:::i;:::-;14637:72;14705:2;14694:9;14690:18;14681:6;14637:72;:::i;:::-;14384:332;;;;;:::o;14722:137::-;14776:5;14807:6;14801:13;14792:22;;14823:30;14847:5;14823:30;:::i;:::-;14722:137;;;;:::o;14865:345::-;14932:6;14981:2;14969:9;14960:7;14956:23;14952:32;14949:119;;;14987:79;;:::i;:::-;14949:119;15107:1;15132:61;15185:7;15176:6;15165:9;15161:22;15132:61;:::i;:::-;15122:71;;15078:125;14865:345;;;;:::o;15216:224::-;15356:34;15352:1;15344:6;15340:14;15333:58;15425:7;15420:2;15412:6;15408:15;15401:32;15216:224;:::o;15446:366::-;15588:3;15609:67;15673:2;15668:3;15609:67;:::i;:::-;15602:74;;15685:93;15774:3;15685:93;:::i;:::-;15803:2;15798:3;15794:12;15787:19;;15446:366;;;:::o;15818:419::-;15984:4;16022:2;16011:9;16007:18;15999:26;;16071:9;16065:4;16061:20;16057:1;16046:9;16042:17;16035:47;16099:131;16225:4;16099:131;:::i;:::-;16091:139;;15818:419;;;:::o;16243:225::-;16383:34;16379:1;16371:6;16367:14;16360:58;16452:8;16447:2;16439:6;16435:15;16428:33;16243:225;:::o;16474:366::-;16616:3;16637:67;16701:2;16696:3;16637:67;:::i;:::-;16630:74;;16713:93;16802:3;16713:93;:::i;:::-;16831:2;16826:3;16822:12;16815:19;;16474:366;;;:::o;16846:419::-;17012:4;17050:2;17039:9;17035:18;17027:26;;17099:9;17093:4;17089:20;17085:1;17074:9;17070:17;17063:47;17127:131;17253:4;17127:131;:::i;:::-;17119:139;;16846:419;;;:::o;17271:182::-;17411:34;17407:1;17399:6;17395:14;17388:58;17271:182;:::o;17459:366::-;17601:3;17622:67;17686:2;17681:3;17622:67;:::i;:::-;17615:74;;17698:93;17787:3;17698:93;:::i;:::-;17816:2;17811:3;17807:12;17800:19;;17459:366;;;:::o;17831:419::-;17997:4;18035:2;18024:9;18020:18;18012:26;;18084:9;18078:4;18074:20;18070:1;18059:9;18055:17;18048:47;18112:131;18238:4;18112:131;:::i;:::-;18104:139;;17831:419;;;:::o;18256:223::-;18396:34;18392:1;18384:6;18380:14;18373:58;18465:6;18460:2;18452:6;18448:15;18441:31;18256:223;:::o;18485:366::-;18627:3;18648:67;18712:2;18707:3;18648:67;:::i;:::-;18641:74;;18724:93;18813:3;18724:93;:::i;:::-;18842:2;18837:3;18833:12;18826:19;;18485:366;;;:::o;18857:419::-;19023:4;19061:2;19050:9;19046:18;19038:26;;19110:9;19104:4;19100:20;19096:1;19085:9;19081:17;19074:47;19138:131;19264:4;19138:131;:::i;:::-;19130:139;;18857:419;;;:::o;19282:221::-;19422:34;19418:1;19410:6;19406:14;19399:58;19491:4;19486:2;19478:6;19474:15;19467:29;19282:221;:::o;19509:366::-;19651:3;19672:67;19736:2;19731:3;19672:67;:::i;:::-;19665:74;;19748:93;19837:3;19748:93;:::i;:::-;19866:2;19861:3;19857:12;19850:19;;19509:366;;;:::o;19881:419::-;20047:4;20085:2;20074:9;20070:18;20062:26;;20134:9;20128:4;20124:20;20120:1;20109:9;20105:17;20098:47;20162:131;20288:4;20162:131;:::i;:::-;20154:139;;19881:419;;;:::o;20306:179::-;20446:31;20442:1;20434:6;20430:14;20423:55;20306:179;:::o;20491:366::-;20633:3;20654:67;20718:2;20713:3;20654:67;:::i;:::-;20647:74;;20730:93;20819:3;20730:93;:::i;:::-;20848:2;20843:3;20839:12;20832:19;;20491:366;;;:::o;20863:419::-;21029:4;21067:2;21056:9;21052:18;21044:26;;21116:9;21110:4;21106:20;21102:1;21091:9;21087:17;21080:47;21144:131;21270:4;21144:131;:::i;:::-;21136:139;;20863:419;;;:::o;21288:224::-;21428:34;21424:1;21416:6;21412:14;21405:58;21497:7;21492:2;21484:6;21480:15;21473:32;21288:224;:::o;21518:366::-;21660:3;21681:67;21745:2;21740:3;21681:67;:::i;:::-;21674:74;;21757:93;21846:3;21757:93;:::i;:::-;21875:2;21870:3;21866:12;21859:19;;21518:366;;;:::o;21890:419::-;22056:4;22094:2;22083:9;22079:18;22071:26;;22143:9;22137:4;22133:20;22129:1;22118:9;22114:17;22107:47;22171:131;22297:4;22171:131;:::i;:::-;22163:139;;21890:419;;;:::o;22315:222::-;22455:34;22451:1;22443:6;22439:14;22432:58;22524:5;22519:2;22511:6;22507:15;22500:30;22315:222;:::o;22543:366::-;22685:3;22706:67;22770:2;22765:3;22706:67;:::i;:::-;22699:74;;22782:93;22871:3;22782:93;:::i;:::-;22900:2;22895:3;22891:12;22884:19;;22543:366;;;:::o;22915:419::-;23081:4;23119:2;23108:9;23104:18;23096:26;;23168:9;23162:4;23158:20;23154:1;23143:9;23139:17;23132:47;23196:131;23322:4;23196:131;:::i;:::-;23188:139;;22915:419;;;:::o;23340:228::-;23480:34;23476:1;23468:6;23464:14;23457:58;23549:11;23544:2;23536:6;23532:15;23525:36;23340:228;:::o;23574:366::-;23716:3;23737:67;23801:2;23796:3;23737:67;:::i;:::-;23730:74;;23813:93;23902:3;23813:93;:::i;:::-;23931:2;23926:3;23922:12;23915:19;;23574:366;;;:::o;23946:419::-;24112:4;24150:2;24139:9;24135:18;24127:26;;24199:9;24193:4;24189:20;24185:1;24174:9;24170:17;24163:47;24227:131;24353:4;24227:131;:::i;:::-;24219:139;;23946:419;;;:::o;24371:168::-;24511:20;24507:1;24499:6;24495:14;24488:44;24371:168;:::o;24545:366::-;24687:3;24708:67;24772:2;24767:3;24708:67;:::i;:::-;24701:74;;24784:93;24873:3;24784:93;:::i;:::-;24902:2;24897:3;24893:12;24886:19;;24545:366;;;:::o;24917:419::-;25083:4;25121:2;25110:9;25106:18;25098:26;;25170:9;25164:4;25160:20;25156:1;25145:9;25141:17;25134:47;25198:131;25324:4;25198:131;:::i;:::-;25190:139;;24917:419;;;:::o;25342:410::-;25382:7;25405:20;25423:1;25405:20;:::i;:::-;25400:25;;25439:20;25457:1;25439:20;:::i;:::-;25434:25;;25494:1;25491;25487:9;25516:30;25534:11;25516:30;:::i;:::-;25505:41;;25695:1;25686:7;25682:15;25679:1;25676:22;25656:1;25649:9;25629:83;25606:139;;25725:18;;:::i;:::-;25606:139;25390:362;25342:410;;;;:::o;25758:180::-;25806:77;25803:1;25796:88;25903:4;25900:1;25893:15;25927:4;25924:1;25917:15;25944:185;25984:1;26001:20;26019:1;26001:20;:::i;:::-;25996:25;;26035:20;26053:1;26035:20;:::i;:::-;26030:25;;26074:1;26064:35;;26079:18;;:::i;:::-;26064:35;26121:1;26118;26114:9;26109:14;;25944:185;;;;:::o;26135:194::-;26175:4;26195:20;26213:1;26195:20;:::i;:::-;26190:25;;26229:20;26247:1;26229:20;:::i;:::-;26224:25;;26273:1;26270;26266:9;26258:17;;26297:1;26291:4;26288:11;26285:37;;;26302:18;;:::i;:::-;26285:37;26135:194;;;;:::o;26335:180::-;26383:77;26380:1;26373:88;26480:4;26477:1;26470:15;26504:4;26501:1;26494:15;26521:143;26578:5;26609:6;26603:13;26594:22;;26625:33;26652:5;26625:33;:::i;:::-;26521:143;;;;:::o;26670:351::-;26740:6;26789:2;26777:9;26768:7;26764:23;26760:32;26757:119;;;26795:79;;:::i;:::-;26757:119;26915:1;26940:64;26996:7;26987:6;26976:9;26972:22;26940:64;:::i;:::-;26930:74;;26886:128;26670:351;;;;:::o;27027:85::-;27072:7;27101:5;27090:16;;27027:85;;;:::o;27118:158::-;27176:9;27209:61;27227:42;27236:32;27262:5;27236:32;:::i;:::-;27227:42;:::i;:::-;27209:61;:::i;:::-;27196:74;;27118:158;;;:::o;27282:147::-;27377:45;27416:5;27377:45;:::i;:::-;27372:3;27365:58;27282:147;;:::o;27435:114::-;27502:6;27536:5;27530:12;27520:22;;27435:114;;;:::o;27555:184::-;27654:11;27688:6;27683:3;27676:19;27728:4;27723:3;27719:14;27704:29;;27555:184;;;;:::o;27745:132::-;27812:4;27835:3;27827:11;;27865:4;27860:3;27856:14;27848:22;;27745:132;;;:::o;27883:108::-;27960:24;27978:5;27960:24;:::i;:::-;27955:3;27948:37;27883:108;;:::o;27997:179::-;28066:10;28087:46;28129:3;28121:6;28087:46;:::i;:::-;28165:4;28160:3;28156:14;28142:28;;27997:179;;;;:::o;28182:113::-;28252:4;28284;28279:3;28275:14;28267:22;;28182:113;;;:::o;28331:732::-;28450:3;28479:54;28527:5;28479:54;:::i;:::-;28549:86;28628:6;28623:3;28549:86;:::i;:::-;28542:93;;28659:56;28709:5;28659:56;:::i;:::-;28738:7;28769:1;28754:284;28779:6;28776:1;28773:13;28754:284;;;28855:6;28849:13;28882:63;28941:3;28926:13;28882:63;:::i;:::-;28875:70;;28968:60;29021:6;28968:60;:::i;:::-;28958:70;;28814:224;28801:1;28798;28794:9;28789:14;;28754:284;;;28758:14;29054:3;29047:10;;28455:608;;;28331:732;;;;:::o;29069:831::-;29332:4;29370:3;29359:9;29355:19;29347:27;;29384:71;29452:1;29441:9;29437:17;29428:6;29384:71;:::i;:::-;29465:80;29541:2;29530:9;29526:18;29517:6;29465:80;:::i;:::-;29592:9;29586:4;29582:20;29577:2;29566:9;29562:18;29555:48;29620:108;29723:4;29714:6;29620:108;:::i;:::-;29612:116;;29738:72;29806:2;29795:9;29791:18;29782:6;29738:72;:::i;:::-;29820:73;29888:3;29877:9;29873:19;29864:6;29820:73;:::i;:::-;29069:831;;;;;;;;:::o;29906:225::-;30046:34;30042:1;30034:6;30030:14;30023:58;30115:8;30110:2;30102:6;30098:15;30091:33;29906:225;:::o;30137:366::-;30279:3;30300:67;30364:2;30359:3;30300:67;:::i;:::-;30293:74;;30376:93;30465:3;30376:93;:::i;:::-;30494:2;30489:3;30485:12;30478:19;;30137:366;;;:::o;30509:419::-;30675:4;30713:2;30702:9;30698:18;30690:26;;30762:9;30756:4;30752:20;30748:1;30737:9;30733:17;30726:47;30790:131;30916:4;30790:131;:::i;:::-;30782:139;;30509:419;;;:::o

Swarm Source

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