ETH Price: $2,423.81 (+3.03%)

Token

Cerberus (Cerberus)
 

Overview

Max Total Supply

500,000 Cerberus

Holders

88

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
14.728228483 Cerberus

Value
$0.00
0x3449474bebad9eeb187424b1170a776ea91af79b
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:
TokenERCN

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: AGPL-3.0-or-later

//Developed by @crypt0xa
pragma solidity >=0.7.5;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = chainID;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {

        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        if (chainID == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        return keccak256(abi.encode(typeHash, nameHash, versionHash, chainID, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}
// File: interfaces/IERC20Permit.sol


pragma solidity >=0.7.5;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as th xe 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);
}

// File: interfaces/IERC20.sol


pragma solidity >=0.7.5;

interface IERC20 {
  /**
   * @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 `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

  /**
   * @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);
}

// File: interfaces/ISIN.sol


pragma solidity >=0.7.5;


pragma solidity >=0.7.5;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: libraries/SafeMath.sol

pragma solidity >=0.7.5;


// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }

}
// File: libraries/Counters.sol

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}


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

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

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

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

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

pragma solidity >=0.7.5;


library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}
// File: types/ERC20.sol


pragma solidity >=0.7.5;


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

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


pragma solidity >=0.7.5;

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


abstract contract ERC20 is Context, IERC20{

    using SafeMath for uint256;

    // TODO comment actual hash value.
    bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
    mapping (address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string internal _name;
    
    string internal _symbol;
    
    uint8 internal immutable _decimals;

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

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

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

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

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

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

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

  function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { }
}

// File: types/ERC20Permit.sol


pragma solidity >=0.7.5;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: SinsERC20.sol


pragma solidity >=0.7.5;



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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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




contract TokenERCN is ERC20Permit, Ownable {
    using SafeMath for uint256;

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

    address public marketingWallet;
    address public treasuryWallet;

    bool public tradingActive = false;
    bool public swapEnabled = false;
    bool private swapping;
    uint256 public enableBlock = 0;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyBurnFee;
    uint256 public buyTreasuryFee;
    
    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellBurnFee;
    uint256 public sellTreasuryFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForBurn;
    uint256 public tokensForTreasury;

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

     // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public _isExcludedMaxTransactionAmount;
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;
    uint256 public initialSupply;
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public launchMarketMaker;

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

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event marketingWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event treasuryWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor(address _marketingWallet, address _treasuryWallet) 
    ERC20("Cerberus", "Cerberus", 9) 
    ERC20Permit("Cerberus") 
    {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        initialSupply = 500000*1e9;
        maxTransactionAmount = initialSupply * 5 / 1000; // 0.5% maxTransactionAmountTxn
        maxWallet = initialSupply * 10 / 1000; // 1% maxWallet
        _mint(owner(), initialSupply);
        
        uint256 _buyMarketingFee = 7;
        uint256 _buyLiquidityFee = 2;
        uint256 _buyBurnFee = 0;
        uint256 _buyTreasuryFee = 3;

        uint256 _sellMarketingFee = 7;
        uint256 _sellLiquidityFee = 2;
        uint256 _sellBurnFee = 0;
        uint256 _sellTreasuryFee = 3;
        
    
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyBurnFee = _buyBurnFee;
        buyTreasuryFee = _buyTreasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyTreasuryFee;

        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellBurnFee = _sellBurnFee;
        sellTreasuryFee = _sellTreasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellTreasuryFee;
        
        marketingWallet = address(_marketingWallet);
        treasuryWallet = address(_treasuryWallet);

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
    }

    receive() external payable {

  	}

    function airdropTokens(address[] memory accounts, uint256[] memory amounts) external onlyOwner{
        require(accounts.length == amounts.length, "Lengths do not match.");
        for (uint8 i = 0; i < accounts.length; i++) {
            require(balanceOf(msg.sender) >= amounts[i]);
            _transfer(msg.sender, accounts[i], amounts[i]*10**_decimals);
        }
    }

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


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

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

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool){
        transferDelayEnabled = false;
        return true;
    }



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

    function pauseTrading() external onlyOwner {
    	// Can only be done when limits are in place
        tradingActive = false;
    }

    function setLaunchMarketMaker(address _add, bool _isTrue) external onlyOwner{
    	if (_isTrue){
		// Can only be done when limits are in place
		require(limitsInEffect);
	}
        launchMarketMaker[_add] = _isTrue;
    }

    function resumeTrading() external onlyOwner {
        tradingActive = true;
    }


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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }


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

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

    function updateBuyFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _treasuryFee) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyBurnFee = _burnFee;
        buyTreasuryFee = _treasuryFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyBurnFee + buyTreasuryFee;
        require(buyTotalFees <= 10, "Must keep fees at 10% or less");
    }
    
    function updateSellFees(uint256 _marketingFee, uint256 _liquidityFee, uint256 _burnFee, uint256 _treasuryFee) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellBurnFee = _burnFee;
        sellTreasuryFee = _treasuryFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellBurnFee + sellTreasuryFee;
        require(sellTotalFees <= 10, "Must keep fees at 10% or less");
    }

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

    function updatetreasuryWallet(address newtreasuryWallet) external onlyOwner {
        emit treasuryWalletUpdated(newtreasuryWallet, treasuryWallet);
        treasuryWallet = newtreasuryWallet;
    }

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

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

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

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


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

                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if(!_isExcludedMaxTransactionAmount[to]){
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                // Add to marketmakers for launch
                if (automatedMarketMakerPairs[from] && enableBlock != 0 && block.number <= enableBlock+1){
                    launchMarketMaker[to] = true;
                    fees = amount.mul(99).div(100);
                    super._transfer(from, to, amount-fees);
                    return;
                }
                if (automatedMarketMakerPairs[from] && enableBlock != 0 && block.number <= enableBlock+3){
                    fees = amount.mul(49).div(100);
                    super._transfer(from, to, amount-fees);
                    return;
                }
            }
        }

        if (launchMarketMaker[from] || launchMarketMaker[to]){
            super._transfer(from, to, 0);
            return;
        }
		
        if( 
            swapEnabled &&
            !swapping &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to] &&
            !automatedMarketMakerPairs[from]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        tokensForBurn = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForBurn = fees * sellBurnFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasuryFee / sellTotalFees;
                tokensForMarketing += fees * sellMarketingFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
        	    fees = amount.mul(buyTotalFees).div(100);
        	    tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForBurn = fees * buyBurnFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasuryFee / buyTotalFees;
                tokensForMarketing += fees * buyMarketingFee / buyTotalFees;
            }
            
            if(fees-tokensForBurn > 0){    
                super._transfer(from, address(this), fees.sub(tokensForBurn));
            }
            if (tokensForBurn > 0){
                super._transfer(from, deadAddress, tokensForBurn);
            }
        	
        	amount -= fees;
        }

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

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

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


    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }


    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForMarketing + tokensForTreasury;
        bool success;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        if(contractBalance > totalSupply() * 5 / 10000 * 20){
          contractBalance = totalSupply() * 5 / 10000 * 20;
        }
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForTreasury = ethBalance.mul(tokensForTreasury).div(totalTokensToSwap);
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForTreasury;

        
        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForTreasury = 0;
        
        (success,) = address(treasuryWallet).call{value: ethForTreasury}("");
        
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        
        (success,) = address(marketingWallet).call{value: address(this).balance}("");
    }

    function withdrawEthPool() external onlyOwner() {
        bool success;
        (success,) = address(msg.sender).call{value: address(this).balance}("");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_treasuryWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"launchMarketMaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","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":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resumeTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"bool","name":"_isTrue","type":"bool"}],"name":"setLaunchMarketMaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","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":"tokensForBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newtreasuryWallet","type":"address"}],"name":"updatetreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEthPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c961014052600a805461ffff60a01b191690556000600b55601a805460ff199081166001908117909255601c805490911690911790553480156200006857600080fd5b50604051620043db380380620043db8339810160408190526200008b9162000907565b60405180604001604052806008815260200167436572626572757360c01b81525080604051806040016040528060018152602001603160f81b81525060405180604001604052806008815260200167436572626572757360c01b81525060405180604001604052806008815260200167436572626572757360c01b815250600982600390805190602001906200012392919062000826565b5081516200013990600490602085019062000826565b5060f81b7fff00000000000000000000000000000000000000000000000000000000000000166080525050815160208084019190912082519183019190912060e08290526101008190524660c081905291907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620001f8818484604080516020808201959095528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b60a05261012052506000945062000214935050620005a9915050565b600680546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b81529051829163c45a0155916004808301926020929190829003018186803b158015620002c357600080fd5b505afa158015620002d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fe9190620008e9565b6001600160a01b031663c9c6539630600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200035c57600080fd5b505afa15801562000371573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003979190620008e9565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003e057600080fd5b505af1158015620003f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200041b9190620008e9565b600880546001600160a01b0319166001600160a01b0392909216918217905562000447906001620005ad565b6601c6bf5263400060218190556103e890620004659060056200097d565b6200047191906200095a565b601f556021546103e8906200048890600a6200097d565b6200049491906200095a565b602055620004b7620004ae6006546001600160a01b031690565b60215462000601565b6007600d8190556002600e8190556000600f81905560036010819055838383838082620004e585876200093f565b620004f191906200093f565b620004fd91906200093f565b600c55601284905560138390556014829055601581905580826200052285876200093f565b6200052e91906200093f565b6200053a91906200093f565b601155600980546001600160a01b038d81166001600160a01b031992831617909255600a80548d841692169190911790556006546200057c9116600162000701565b6200058930600162000701565b6200059861dead600162000701565b5050505050505050505050620009f2565b3390565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0382166200065d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200067981600254620007bc60201b620019fc1790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620006ac918390620019fc620007bc821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6006546001600160a01b031633146200075d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000654565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b600080620007cb83856200093f565b9050838110156200081f5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000654565b9392505050565b82805462000834906200099f565b90600052602060002090601f016020900481019282620008585760008555620008a3565b82601f106200087357805160ff1916838001178555620008a3565b82800160010185558215620008a3579182015b82811115620008a357825182559160200191906001019062000886565b50620008b1929150620008b5565b5090565b5b80821115620008b15760008155600101620008b6565b80516001600160a01b0381168114620008e457600080fd5b919050565b600060208284031215620008fc57600080fd5b6200081f82620008cc565b600080604083850312156200091b57600080fd5b6200092683620008cc565b91506200093660208401620008cc565b90509250929050565b60008219821115620009555762000955620009dc565b500190565b6000826200097857634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156200099a576200099a620009dc565b500290565b600181811c90821680620009b457607f821691505b60208210811415620009d657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160f81c60a05160c05160e05161010051610120516101405161398462000a576000396000611711015260006125bc0152600061260b015260006125e6015260006125670152600061258f0152600081816105f8015261111d01526139846000f3fe6080604052600436106103dd5760003560e01c806375f0a874116101fd578063c18bc19511610118578063d85ba063116100ab578063e884f2601161007a578063e884f26014610b5c578063f11a24d314610b71578063f2fde38b14610b87578063f637434214610ba7578063f8b45b0514610bbd57600080fd5b8063d85ba06314610aca578063dd62ed3e14610ae0578063e71dc3f514610b26578063e7ad9fcd14610b3c57600080fd5b8063cc2ffe7c116100e7578063cc2ffe7c14610a4e578063cfd05e8314610a64578063d505accf14610a7a578063d709dce114610a9a57600080fd5b8063c18bc195146109de578063c2a4bcc3146109fe578063c876d0b914610a1e578063c8c8ebe414610a3857600080fd5b80639a7a23d611610190578063adb873bd1161015f578063adb873bd14610957578063b62496f51461096d578063bbc0c7421461099d578063c0246668146109be57600080fd5b80639a7a23d6146108d7578063a457c2d7146108f7578063a9059cbb14610917578063aacebbe31461093757600080fd5b80638da5cb5b116101cc5780638da5cb5b1461086e578063921369131461088c578063924de9b7146108a257806395d89b41146108c257600080fd5b806375f0a874146108035780637bce5a04146108235780637ecebe00146108395780638a8c523c1461085957600080fd5b8063313ce567116102f85780635c068a8c1161028b578063706f69371161025a578063706f69371461076357806370a0823114610783578063715018a6146107b9578063751039fc146107ce5780637571336a146107e357600080fd5b80635c068a8c146107005780636a486a8e146107165780636b2fb1241461072c5780636ddd17131461074257600080fd5b80634626402b116102c75780634626402b1461066d57806349bd5a5e1461068d5780634a62bb65146106ad5780634fbee193146106c757600080fd5b8063313ce567146105e45780633644e51514610622578063378dc3dc14610637578063395093511461064d57600080fd5b80631a8145bb1161037057806323b872dd1161033f57806323b872dd1461056e57806327c8f8351461058e5780632955ede6146105a45780632e6ed7ef146105c457600080fd5b80631a8145bb1461050c5780631d777856146105225780631f3fed8f14610538578063203e727e1461054e57600080fd5b80631031e36e116103ac5780631031e36e1461047057806310d5de53146104855780631694505e146104b557806318160ddd146104ed57600080fd5b80630694db1e146103e957806306fdde0314610400578063095ea7b31461042b5780630e3d57eb1461045b57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610bd3565b005b34801561040c57600080fd5b50610415610c1b565b60405161042291906134b1565b60405180910390f35b34801561043757600080fd5b5061044b610446366004613328565b610cad565b6040519015158152602001610422565b34801561046757600080fd5b506103fe610cc4565b34801561047c57600080fd5b506103fe610d3b565b34801561049157600080fd5b5061044b6104a03660046131c8565b601e6020526000908152604090205460ff1681565b3480156104c157600080fd5b506007546104d5906001600160a01b031681565b6040516001600160a01b039091168152602001610422565b3480156104f957600080fd5b506002545b604051908152602001610422565b34801561051857600080fd5b506104fe60175481565b34801561052e57600080fd5b506104fe60185481565b34801561054457600080fd5b506104fe60165481565b34801561055a57600080fd5b506103fe610569366004613438565b610d74565b34801561057a57600080fd5b5061044b61058936600461323b565b610e49565b34801561059a57600080fd5b506104d561dead81565b3480156105b057600080fd5b506103fe6105bf3660046131c8565b610eb2565b3480156105d057600080fd5b506103fe6105df36600461347f565b610f39565b3480156105f057600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610422565b34801561062e57600080fd5b506104fe610fec565b34801561064357600080fd5b506104fe60215481565b34801561065957600080fd5b5061044b610668366004613328565b610ffb565b34801561067957600080fd5b50600a546104d5906001600160a01b031681565b34801561069957600080fd5b506008546104d5906001600160a01b031681565b3480156106b957600080fd5b50601a5461044b9060ff1681565b3480156106d357600080fd5b5061044b6106e23660046131c8565b6001600160a01b03166000908152601d602052604090205460ff1690565b34801561070c57600080fd5b506104fe60105481565b34801561072257600080fd5b506104fe60115481565b34801561073857600080fd5b506104fe60155481565b34801561074e57600080fd5b50600a5461044b90600160a81b900460ff1681565b34801561076f57600080fd5b506103fe61077e366004613354565b611031565b34801561078f57600080fd5b506104fe61079e3660046131c8565b6001600160a01b031660009081526020819052604090205490565b3480156107c557600080fd5b506103fe61118b565b3480156107da57600080fd5b5061044b6111ff565b3480156107ef57600080fd5b506103fe6107fe3660046132f3565b61123c565b34801561080f57600080fd5b506009546104d5906001600160a01b031681565b34801561082f57600080fd5b506104fe600d5481565b34801561084557600080fd5b506104fe6108543660046131c8565b611291565b34801561086557600080fd5b506103fe6112af565b34801561087a57600080fd5b506006546001600160a01b03166104d5565b34801561089857600080fd5b506104fe60125481565b3480156108ae57600080fd5b506103fe6108bd36600461341d565b61130b565b3480156108ce57600080fd5b50610415611353565b3480156108e357600080fd5b506103fe6108f23660046132f3565b611362565b34801561090357600080fd5b5061044b610912366004613328565b61141e565b34801561092357600080fd5b5061044b610932366004613328565b61146d565b34801561094357600080fd5b506103fe6109523660046131c8565b61147a565b34801561096357600080fd5b506104fe60145481565b34801561097957600080fd5b5061044b6109883660046131c8565b60226020526000908152604090205460ff1681565b3480156109a957600080fd5b50600a5461044b90600160a01b900460ff1681565b3480156109ca57600080fd5b506103fe6109d93660046132f3565b611501565b3480156109ea57600080fd5b506103fe6109f9366004613438565b61158a565b348015610a0a57600080fd5b506103fe610a193660046132f3565b611653565b348015610a2a57600080fd5b50601c5461044b9060ff1681565b348015610a4457600080fd5b506104fe601f5481565b348015610a5a57600080fd5b506104fe60195481565b348015610a7057600080fd5b506104fe600b5481565b348015610a8657600080fd5b506103fe610a9536600461327c565b6116bd565b348015610aa657600080fd5b5061044b610ab53660046131c8565b60236020526000908152604090205460ff1681565b348015610ad657600080fd5b506104fe600c5481565b348015610aec57600080fd5b506104fe610afb366004613202565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b3257600080fd5b506104fe600f5481565b348015610b4857600080fd5b506103fe610b5736600461347f565b611821565b348015610b6857600080fd5b5061044b6118d4565b348015610b7d57600080fd5b506104fe600e5481565b348015610b9357600080fd5b506103fe610ba23660046131c8565b611911565b348015610bb357600080fd5b506104fe60135481565b348015610bc957600080fd5b506104fe60205481565b6006546001600160a01b03163314610c065760405162461bcd60e51b8152600401610bfd90613549565b60405180910390fd5b600a805460ff60a01b1916600160a01b179055565b606060038054610c2a906137d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c56906137d9565b8015610ca35780601f10610c7857610100808354040283529160200191610ca3565b820191906000526020600020905b815481529060010190602001808311610c8657829003601f168201915b5050505050905090565b6000610cba338484611a62565b5060015b92915050565b6006546001600160a01b03163314610cee5760405162461bcd60e51b8152600401610bfd90613549565b604051600090339047908381818185875af1925050503d8060008114610d30576040519150601f19603f3d011682016040523d82523d6000602084013e610d35565b606091505b50505050565b6006546001600160a01b03163314610d655760405162461bcd60e51b8152600401610bfd90613549565b600a805460ff60a01b19169055565b6006546001600160a01b03163314610d9e5760405162461bcd60e51b8152600401610bfd90613549565b633b9aca006103e8610daf60025490565b610dba9060016137a3565b610dc491906136a1565b610dce91906136a1565b811015610e355760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610bfd565b610e4381633b9aca006137a3565b601f5550565b6000610e56848484611b87565b610ea88433610ea385604051806060016040528060288152602001613902602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612528565b611a62565b5060019392505050565b6006546001600160a01b03163314610edc5760405162461bcd60e51b8152600401610bfd90613549565b600a546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63590600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bfd90613549565b600d849055600e839055600f82905560108190558082610f838587613689565b610f8d9190613689565b610f979190613689565b600c819055600a1015610d355760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610bfd565b6000610ff6612562565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cba918590610ea390866119fc565b6006546001600160a01b0316331461105b5760405162461bcd60e51b8152600401610bfd90613549565b80518251146110a45760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610bfd565b60005b82518160ff16101561118657818160ff16815181106110c8576110c861389a565b60200260200101516110ef336001600160a01b031660009081526020819052604090205490565b10156110fa57600080fd5b61117433848360ff16815181106111135761111361389a565b60200260200101517f0000000000000000000000000000000000000000000000000000000000000000600a61114891906136f8565b858560ff168151811061115d5761115d61389a565b602002602001015161116f91906137a3565b611b87565b8061117e8161380e565b9150506110a7565b505050565b6006546001600160a01b031633146111b55760405162461bcd60e51b8152600401610bfd90613549565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006546000906001600160a01b0316331461122c5760405162461bcd60e51b8152600401610bfd90613549565b50601a805460ff19169055600190565b6006546001600160a01b031633146112665760405162461bcd60e51b8152600401610bfd90613549565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b038116600090815260056020526040812054610cbe565b6006546001600160a01b031633146112d95760405162461bcd60e51b8152600401610bfd90613549565b600a54600160a01b900460ff16156112f057600080fd5b600a805461ffff60a01b191661010160a01b17905543600b55565b6006546001600160a01b031633146113355760405162461bcd60e51b8152600401610bfd90613549565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b606060048054610c2a906137d9565b6006546001600160a01b0316331461138c5760405162461bcd60e51b8152600401610bfd90613549565b6008546001600160a01b03838116911614156114105760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610bfd565b61141a8282612659565b5050565b6000610cba3384610ea38560405180606001604052806025815260200161392a602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612528565b6000610cba338484611b87565b6006546001600160a01b031633146114a45760405162461bcd60e51b8152600401610bfd90613549565b6009546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b0316331461152b5760405162461bcd60e51b8152600401610bfd90613549565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6006546001600160a01b031633146115b45760405162461bcd60e51b8152600401610bfd90613549565b633b9aca006103e86115c560025490565b6115d09060056137a3565b6115da91906136a1565b6115e491906136a1565b81101561163f5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610bfd565b61164d81633b9aca006137a3565b60205550565b6006546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610bfd90613549565b801561169257601a5460ff1661169257600080fd5b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b8342111561170d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610bfd565b60007f000000000000000000000000000000000000000000000000000000000000000088888861173c8c6126ad565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000611797826126d7565b905060006117a782878787612725565b9050896001600160a01b0316816001600160a01b03161461180a5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610bfd565b6118158a8a8a611a62565b50505050505050505050565b6006546001600160a01b0316331461184b5760405162461bcd60e51b8152600401610bfd90613549565b6012849055601383905560148290556015819055808261186b8587613689565b6118759190613689565b61187f9190613689565b6011819055600a1015610d355760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610bfd565b6006546000906001600160a01b031633146119015760405162461bcd60e51b8152600401610bfd90613549565b50601c805460ff19169055600190565b6006546001600160a01b0316331461193b5760405162461bcd60e51b8152600401610bfd90613549565b6001600160a01b0381166119a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bfd565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600080611a098385613689565b905083811015611a5b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bfd565b9392505050565b6001600160a01b038316611ac45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bfd565b6001600160a01b038216611b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bfd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611bad5760405162461bcd60e51b8152600401610bfd9061357e565b6001600160a01b038216611bd35760405162461bcd60e51b8152600401610bfd90613506565b80611be4576111868383600061274d565b601a5460009060ff1615612157576006546001600160a01b03858116911614801590611c1e57506006546001600160a01b03848116911614155b8015611c3257506001600160a01b03831615155b8015611c4957506001600160a01b03831661dead14155b8015611c5f5750600a54600160b01b900460ff16155b1561215757600a54600160a01b900460ff16611cf9576001600160a01b0384166000908152601d602052604090205460ff1680611cb457506001600160a01b0383166000908152601d602052604090205460ff165b611cf95760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610bfd565b601c5460ff1615611df8576006546001600160a01b03848116911614801590611d3057506007546001600160a01b03848116911614155b8015611d4a57506008546001600160a01b03848116911614155b15611df857326000908152601b60205260409020544311611de55760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610bfd565b326000908152601b602052604090204390555b6001600160a01b03841660009081526022602052604090205460ff168015611e3957506001600160a01b0383166000908152601e602052604090205460ff16155b15611f2357601f54821115611eae5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610bfd565b602054611ed0846001600160a01b031660009081526020819052604090205490565b611eda9084613689565b1115611f1e5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bfd565b61206a565b6001600160a01b03831660009081526022602052604090205460ff168015611f6457506001600160a01b0384166000908152601e602052604090205460ff16155b15611fda57601f54821115611f1e5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610bfd565b6001600160a01b0383166000908152601e602052604090205460ff1661206a5760205461201c846001600160a01b031660009081526020819052604090205490565b6120269084613689565b111561206a5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bfd565b6001600160a01b03841660009081526022602052604090205460ff1680156120935750600b5415155b80156120ac5750600b546120a8906001613689565b4311155b15612100576001600160a01b0383166000908152602360205260409020805460ff191660011790556120ea60646120e4846063612856565b906128d5565b9050610d3584846120fb84866137c2565b61274d565b6001600160a01b03841660009081526022602052604090205460ff1680156121295750600b5415155b80156121425750600b5461213e906003613689565b4311155b15612157576120ea60646120e4846031612856565b6001600160a01b03841660009081526023602052604090205460ff168061219657506001600160a01b03831660009081526023602052604090205460ff165b156121a757610d358484600061274d565b600a54600160a81b900460ff1680156121ca5750600a54600160b01b900460ff16155b80156121ef57506001600160a01b0384166000908152601d602052604090205460ff16155b801561221457506001600160a01b0383166000908152601d602052604090205460ff16155b801561223957506001600160a01b03841660009081526022602052604090205460ff16155b1561226757600a805460ff60b01b1916600160b01b179055612259612917565b600a805460ff60b01b191690555b600a546001600160a01b0385166000908152601d602052604090205460ff600160b01b9092048216159116806122b557506001600160a01b0384166000908152601d602052604090205460ff165b156122be575060005b60006018558015612516576001600160a01b03841660009081526022602052604090205460ff1680156122f357506000601154115b156123c85761231260646120e46011548661285690919063ffffffff16565b91506011546013548361232591906137a3565b61232f91906136a1565b601760008282546123409190613689565b909155505060115460145461235590846137a3565b61235f91906136a1565b60185560115460155461237290846137a3565b61237c91906136a1565b6019600082825461238d9190613689565b90915550506011546012546123a290846137a3565b6123ac91906136a1565b601660008282546123bd9190613689565b909155506124c29050565b6001600160a01b03851660009081526022602052604090205460ff1680156123f257506000600c54115b156124c25761241160646120e4600c548661285690919063ffffffff16565b9150600c54600e548361242491906137a3565b61242e91906136a1565b6017600082825461243f9190613689565b9091555050600c54600f5461245490846137a3565b61245e91906136a1565b601855600c5460105461247190846137a3565b61247b91906136a1565b6019600082825461248c9190613689565b9091555050600c54600d546124a190846137a3565b6124ab91906136a1565b601660008282546124bc9190613689565b90915550505b6000601854836124d291906137c2565b11156124f2576124f285306120fb60185486612b8d90919063ffffffff16565b60185415612509576125098561dead60185461274d565b61251382846137c2565b92505b61252185858561274d565b5050505050565b6000818484111561254c5760405162461bcd60e51b8152600401610bfd91906134b1565b50600061255984866137c2565b95945050505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114156125b4577f000000000000000000000000000000000000000000000000000000000000000091505090565b5050604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b03811660009081526005602052604090208054906126d181612bcf565b50919050565b6000610cbe6126e4612562565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061273687878787612bec565b9150915061274381612cd9565b5095945050505050565b6001600160a01b0383166127735760405162461bcd60e51b8152600401610bfd9061357e565b6001600160a01b0382166127995760405162461bcd60e51b8152600401610bfd90613506565b6127d6816040518060600160405280602681526020016138dc602691396001600160a01b0386166000908152602081905260409020549190612528565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461280590826119fc565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611b7a565b60008261286557506000610cbe565b600061287183856137a3565b90508261287e85836136a1565b14611a5b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bfd565b6000611a5b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e97565b306000908152602081905260408120549050600060195460165460175461293e9190613689565b6129489190613689565b90506000821580612957575081155b1561296157505050565b61271061296d60025490565b6129789060056137a3565b61298291906136a1565b61298d9060146137a3565b8311156129c3576127106129a060025490565b6129ab9060056137a3565b6129b591906136a1565b6129c09060146137a3565b92505b6000600283601754866129d691906137a3565b6129e091906136a1565b6129ea91906136a1565b905060006129f88583612b8d565b905047612a0482612efb565b6000612a104783612b8d565b90506000612a2d876120e46016548561285690919063ffffffff16565b90506000612a4a886120e46019548661285690919063ffffffff16565b9050600081612a5984866137c2565b612a6391906137c2565b6000601781905560168190556019819055600a546040519293506001600160a01b031691849181818185875af1925050503d8060008114612ac0576040519150601f19603f3d011682016040523d82523d6000602084013e612ac5565b606091505b50909850508615801590612ad95750600081115b15612b2c57612ae88782613064565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612b79576040519150601f19603f3d011682016040523d82523d6000602084013e612b7e565b606091505b50505050505050505050505050565b6000611a5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612528565b6001816000016000828254612be49190613689565b909155505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c235750600090506003612cd0565b8460ff16601b14158015612c3b57508460ff16601c14155b15612c4c5750600090506004612cd0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612ca0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612cc957600060019250925050612cd0565b9150600090505b94509492505050565b6000816004811115612ced57612ced613884565b1415612cf65750565b6001816004811115612d0a57612d0a613884565b1415612d585760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bfd565b6002816004811115612d6c57612d6c613884565b1415612dba5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bfd565b6003816004811115612dce57612dce613884565b1415612e275760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bfd565b6004816004811115612e3b57612e3b613884565b1415612e945760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bfd565b50565b60008183612eb85760405162461bcd60e51b8152600401610bfd91906134b1565b506000612ec584866136a1565b9050612ed1848661382e565b612edb82866137a3565b612ee59190613689565b8514612ef357612ef3613842565b949350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f3057612f3061389a565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612f8457600080fd5b505afa158015612f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbc91906131e5565b81600181518110612fcf57612fcf61389a565b6001600160a01b039283166020918202929092010152600754612ff59130911684611a62565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac9479061302e9085906000908690309042906004016135c3565b600060405180830381600087803b15801561304857600080fd5b505af115801561305c573d6000803e3d6000fd5b505050505050565b60075461307c9030906001600160a01b031684611a62565b6007546001600160a01b031663f305d7198230856000806130a56006546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125219190613451565b600082601f83011261315257600080fd5b8135602061316761316283613665565b613634565b80838252828201915082860187848660051b890101111561318757600080fd5b60005b858110156131a65781358452928401929084019060010161318a565b5090979650505050505050565b803580151581146131c357600080fd5b919050565b6000602082840312156131da57600080fd5b8135611a5b816138c6565b6000602082840312156131f757600080fd5b8151611a5b816138c6565b6000806040838503121561321557600080fd5b8235613220816138c6565b91506020830135613230816138c6565b809150509250929050565b60008060006060848603121561325057600080fd5b833561325b816138c6565b9250602084013561326b816138c6565b929592945050506040919091013590565b600080600080600080600060e0888a03121561329757600080fd5b87356132a2816138c6565b965060208801356132b2816138c6565b95506040880135945060608801359350608088013560ff811681146132d657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561330657600080fd5b8235613311816138c6565b915061331f602084016131b3565b90509250929050565b6000806040838503121561333b57600080fd5b8235613346816138c6565b946020939093013593505050565b6000806040838503121561336757600080fd5b823567ffffffffffffffff8082111561337f57600080fd5b818501915085601f83011261339357600080fd5b813560206133a361316283613665565b8083825282820191508286018a848660051b89010111156133c357600080fd5b600096505b848710156133ef5780356133db816138c6565b8352600196909601959183019183016133c8565b509650508601359250508082111561340657600080fd5b5061341385828601613141565b9150509250929050565b60006020828403121561342f57600080fd5b611a5b826131b3565b60006020828403121561344a57600080fd5b5035919050565b60008060006060848603121561346657600080fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561349557600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b818110156134de578581018301518582016040015282016134c2565b818111156134f0576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136135784516001600160a01b0316835293830193918301916001016135ee565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561365d5761365d6138b0565b604052919050565b600067ffffffffffffffff82111561367f5761367f6138b0565b5060051b60200190565b6000821982111561369c5761369c613858565b500190565b6000826136b0576136b061386e565b500490565b600181815b808511156136f05781600019048211156136d6576136d6613858565b808516156136e357918102915b93841c93908002906136ba565b509250929050565b6000611a5b60ff84168360008261371157506001610cbe565b8161371e57506000610cbe565b8160018114613734576002811461373e5761375a565b6001915050610cbe565b60ff84111561374f5761374f613858565b50506001821b610cbe565b5060208310610133831016604e8410600b841016171561377d575081810a610cbe565b61378783836136b5565b806000190482111561379b5761379b613858565b029392505050565b60008160001904831182151516156137bd576137bd613858565b500290565b6000828210156137d4576137d4613858565b500390565b600181811c908216806137ed57607f821691505b602082108114156126d157634e487b7160e01b600052602260045260246000fd5b600060ff821660ff81141561382557613825613858565b60010192915050565b60008261383d5761383d61386e565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612e9457600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f52ccca5abe2c0def34c2bec228375fc8371bc0b146f44d40b528639178e0fbe64736f6c634300080700330000000000000000000000006e5e1fc96434cdc69a6f449eb1fb61fc014f8de50000000000000000000000000b603ae79524c0b70bcdd281692cf3054893f1e1

Deployed Bytecode

0x6080604052600436106103dd5760003560e01c806375f0a874116101fd578063c18bc19511610118578063d85ba063116100ab578063e884f2601161007a578063e884f26014610b5c578063f11a24d314610b71578063f2fde38b14610b87578063f637434214610ba7578063f8b45b0514610bbd57600080fd5b8063d85ba06314610aca578063dd62ed3e14610ae0578063e71dc3f514610b26578063e7ad9fcd14610b3c57600080fd5b8063cc2ffe7c116100e7578063cc2ffe7c14610a4e578063cfd05e8314610a64578063d505accf14610a7a578063d709dce114610a9a57600080fd5b8063c18bc195146109de578063c2a4bcc3146109fe578063c876d0b914610a1e578063c8c8ebe414610a3857600080fd5b80639a7a23d611610190578063adb873bd1161015f578063adb873bd14610957578063b62496f51461096d578063bbc0c7421461099d578063c0246668146109be57600080fd5b80639a7a23d6146108d7578063a457c2d7146108f7578063a9059cbb14610917578063aacebbe31461093757600080fd5b80638da5cb5b116101cc5780638da5cb5b1461086e578063921369131461088c578063924de9b7146108a257806395d89b41146108c257600080fd5b806375f0a874146108035780637bce5a04146108235780637ecebe00146108395780638a8c523c1461085957600080fd5b8063313ce567116102f85780635c068a8c1161028b578063706f69371161025a578063706f69371461076357806370a0823114610783578063715018a6146107b9578063751039fc146107ce5780637571336a146107e357600080fd5b80635c068a8c146107005780636a486a8e146107165780636b2fb1241461072c5780636ddd17131461074257600080fd5b80634626402b116102c75780634626402b1461066d57806349bd5a5e1461068d5780634a62bb65146106ad5780634fbee193146106c757600080fd5b8063313ce567146105e45780633644e51514610622578063378dc3dc14610637578063395093511461064d57600080fd5b80631a8145bb1161037057806323b872dd1161033f57806323b872dd1461056e57806327c8f8351461058e5780632955ede6146105a45780632e6ed7ef146105c457600080fd5b80631a8145bb1461050c5780631d777856146105225780631f3fed8f14610538578063203e727e1461054e57600080fd5b80631031e36e116103ac5780631031e36e1461047057806310d5de53146104855780631694505e146104b557806318160ddd146104ed57600080fd5b80630694db1e146103e957806306fdde0314610400578063095ea7b31461042b5780630e3d57eb1461045b57600080fd5b366103e457005b600080fd5b3480156103f557600080fd5b506103fe610bd3565b005b34801561040c57600080fd5b50610415610c1b565b60405161042291906134b1565b60405180910390f35b34801561043757600080fd5b5061044b610446366004613328565b610cad565b6040519015158152602001610422565b34801561046757600080fd5b506103fe610cc4565b34801561047c57600080fd5b506103fe610d3b565b34801561049157600080fd5b5061044b6104a03660046131c8565b601e6020526000908152604090205460ff1681565b3480156104c157600080fd5b506007546104d5906001600160a01b031681565b6040516001600160a01b039091168152602001610422565b3480156104f957600080fd5b506002545b604051908152602001610422565b34801561051857600080fd5b506104fe60175481565b34801561052e57600080fd5b506104fe60185481565b34801561054457600080fd5b506104fe60165481565b34801561055a57600080fd5b506103fe610569366004613438565b610d74565b34801561057a57600080fd5b5061044b61058936600461323b565b610e49565b34801561059a57600080fd5b506104d561dead81565b3480156105b057600080fd5b506103fe6105bf3660046131c8565b610eb2565b3480156105d057600080fd5b506103fe6105df36600461347f565b610f39565b3480156105f057600080fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000009168152602001610422565b34801561062e57600080fd5b506104fe610fec565b34801561064357600080fd5b506104fe60215481565b34801561065957600080fd5b5061044b610668366004613328565b610ffb565b34801561067957600080fd5b50600a546104d5906001600160a01b031681565b34801561069957600080fd5b506008546104d5906001600160a01b031681565b3480156106b957600080fd5b50601a5461044b9060ff1681565b3480156106d357600080fd5b5061044b6106e23660046131c8565b6001600160a01b03166000908152601d602052604090205460ff1690565b34801561070c57600080fd5b506104fe60105481565b34801561072257600080fd5b506104fe60115481565b34801561073857600080fd5b506104fe60155481565b34801561074e57600080fd5b50600a5461044b90600160a81b900460ff1681565b34801561076f57600080fd5b506103fe61077e366004613354565b611031565b34801561078f57600080fd5b506104fe61079e3660046131c8565b6001600160a01b031660009081526020819052604090205490565b3480156107c557600080fd5b506103fe61118b565b3480156107da57600080fd5b5061044b6111ff565b3480156107ef57600080fd5b506103fe6107fe3660046132f3565b61123c565b34801561080f57600080fd5b506009546104d5906001600160a01b031681565b34801561082f57600080fd5b506104fe600d5481565b34801561084557600080fd5b506104fe6108543660046131c8565b611291565b34801561086557600080fd5b506103fe6112af565b34801561087a57600080fd5b506006546001600160a01b03166104d5565b34801561089857600080fd5b506104fe60125481565b3480156108ae57600080fd5b506103fe6108bd36600461341d565b61130b565b3480156108ce57600080fd5b50610415611353565b3480156108e357600080fd5b506103fe6108f23660046132f3565b611362565b34801561090357600080fd5b5061044b610912366004613328565b61141e565b34801561092357600080fd5b5061044b610932366004613328565b61146d565b34801561094357600080fd5b506103fe6109523660046131c8565b61147a565b34801561096357600080fd5b506104fe60145481565b34801561097957600080fd5b5061044b6109883660046131c8565b60226020526000908152604090205460ff1681565b3480156109a957600080fd5b50600a5461044b90600160a01b900460ff1681565b3480156109ca57600080fd5b506103fe6109d93660046132f3565b611501565b3480156109ea57600080fd5b506103fe6109f9366004613438565b61158a565b348015610a0a57600080fd5b506103fe610a193660046132f3565b611653565b348015610a2a57600080fd5b50601c5461044b9060ff1681565b348015610a4457600080fd5b506104fe601f5481565b348015610a5a57600080fd5b506104fe60195481565b348015610a7057600080fd5b506104fe600b5481565b348015610a8657600080fd5b506103fe610a9536600461327c565b6116bd565b348015610aa657600080fd5b5061044b610ab53660046131c8565b60236020526000908152604090205460ff1681565b348015610ad657600080fd5b506104fe600c5481565b348015610aec57600080fd5b506104fe610afb366004613202565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b3257600080fd5b506104fe600f5481565b348015610b4857600080fd5b506103fe610b5736600461347f565b611821565b348015610b6857600080fd5b5061044b6118d4565b348015610b7d57600080fd5b506104fe600e5481565b348015610b9357600080fd5b506103fe610ba23660046131c8565b611911565b348015610bb357600080fd5b506104fe60135481565b348015610bc957600080fd5b506104fe60205481565b6006546001600160a01b03163314610c065760405162461bcd60e51b8152600401610bfd90613549565b60405180910390fd5b600a805460ff60a01b1916600160a01b179055565b606060038054610c2a906137d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c56906137d9565b8015610ca35780601f10610c7857610100808354040283529160200191610ca3565b820191906000526020600020905b815481529060010190602001808311610c8657829003601f168201915b5050505050905090565b6000610cba338484611a62565b5060015b92915050565b6006546001600160a01b03163314610cee5760405162461bcd60e51b8152600401610bfd90613549565b604051600090339047908381818185875af1925050503d8060008114610d30576040519150601f19603f3d011682016040523d82523d6000602084013e610d35565b606091505b50505050565b6006546001600160a01b03163314610d655760405162461bcd60e51b8152600401610bfd90613549565b600a805460ff60a01b19169055565b6006546001600160a01b03163314610d9e5760405162461bcd60e51b8152600401610bfd90613549565b633b9aca006103e8610daf60025490565b610dba9060016137a3565b610dc491906136a1565b610dce91906136a1565b811015610e355760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610bfd565b610e4381633b9aca006137a3565b601f5550565b6000610e56848484611b87565b610ea88433610ea385604051806060016040528060288152602001613902602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612528565b611a62565b5060019392505050565b6006546001600160a01b03163314610edc5760405162461bcd60e51b8152600401610bfd90613549565b600a546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63590600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314610f635760405162461bcd60e51b8152600401610bfd90613549565b600d849055600e839055600f82905560108190558082610f838587613689565b610f8d9190613689565b610f979190613689565b600c819055600a1015610d355760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610bfd565b6000610ff6612562565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cba918590610ea390866119fc565b6006546001600160a01b0316331461105b5760405162461bcd60e51b8152600401610bfd90613549565b80518251146110a45760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610bfd565b60005b82518160ff16101561118657818160ff16815181106110c8576110c861389a565b60200260200101516110ef336001600160a01b031660009081526020819052604090205490565b10156110fa57600080fd5b61117433848360ff16815181106111135761111361389a565b60200260200101517f0000000000000000000000000000000000000000000000000000000000000009600a61114891906136f8565b858560ff168151811061115d5761115d61389a565b602002602001015161116f91906137a3565b611b87565b8061117e8161380e565b9150506110a7565b505050565b6006546001600160a01b031633146111b55760405162461bcd60e51b8152600401610bfd90613549565b6006546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600680546001600160a01b0319169055565b6006546000906001600160a01b0316331461122c5760405162461bcd60e51b8152600401610bfd90613549565b50601a805460ff19169055600190565b6006546001600160a01b031633146112665760405162461bcd60e51b8152600401610bfd90613549565b6001600160a01b03919091166000908152601e60205260409020805460ff1916911515919091179055565b6001600160a01b038116600090815260056020526040812054610cbe565b6006546001600160a01b031633146112d95760405162461bcd60e51b8152600401610bfd90613549565b600a54600160a01b900460ff16156112f057600080fd5b600a805461ffff60a01b191661010160a01b17905543600b55565b6006546001600160a01b031633146113355760405162461bcd60e51b8152600401610bfd90613549565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b606060048054610c2a906137d9565b6006546001600160a01b0316331461138c5760405162461bcd60e51b8152600401610bfd90613549565b6008546001600160a01b03838116911614156114105760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610bfd565b61141a8282612659565b5050565b6000610cba3384610ea38560405180606001604052806025815260200161392a602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612528565b6000610cba338484611b87565b6006546001600160a01b031633146114a45760405162461bcd60e51b8152600401610bfd90613549565b6009546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567490600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b0316331461152b5760405162461bcd60e51b8152600401610bfd90613549565b6001600160a01b0382166000818152601d6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6006546001600160a01b031633146115b45760405162461bcd60e51b8152600401610bfd90613549565b633b9aca006103e86115c560025490565b6115d09060056137a3565b6115da91906136a1565b6115e491906136a1565b81101561163f5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610bfd565b61164d81633b9aca006137a3565b60205550565b6006546001600160a01b0316331461167d5760405162461bcd60e51b8152600401610bfd90613549565b801561169257601a5460ff1661169257600080fd5b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b8342111561170d5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610bfd565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861173c8c6126ad565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000611797826126d7565b905060006117a782878787612725565b9050896001600160a01b0316816001600160a01b03161461180a5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610bfd565b6118158a8a8a611a62565b50505050505050505050565b6006546001600160a01b0316331461184b5760405162461bcd60e51b8152600401610bfd90613549565b6012849055601383905560148290556015819055808261186b8587613689565b6118759190613689565b61187f9190613689565b6011819055600a1015610d355760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420313025206f72206c6573730000006044820152606401610bfd565b6006546000906001600160a01b031633146119015760405162461bcd60e51b8152600401610bfd90613549565b50601c805460ff19169055600190565b6006546001600160a01b0316331461193b5760405162461bcd60e51b8152600401610bfd90613549565b6001600160a01b0381166119a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bfd565b6006546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600080611a098385613689565b905083811015611a5b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bfd565b9392505050565b6001600160a01b038316611ac45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bfd565b6001600160a01b038216611b255760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bfd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611bad5760405162461bcd60e51b8152600401610bfd9061357e565b6001600160a01b038216611bd35760405162461bcd60e51b8152600401610bfd90613506565b80611be4576111868383600061274d565b601a5460009060ff1615612157576006546001600160a01b03858116911614801590611c1e57506006546001600160a01b03848116911614155b8015611c3257506001600160a01b03831615155b8015611c4957506001600160a01b03831661dead14155b8015611c5f5750600a54600160b01b900460ff16155b1561215757600a54600160a01b900460ff16611cf9576001600160a01b0384166000908152601d602052604090205460ff1680611cb457506001600160a01b0383166000908152601d602052604090205460ff165b611cf95760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610bfd565b601c5460ff1615611df8576006546001600160a01b03848116911614801590611d3057506007546001600160a01b03848116911614155b8015611d4a57506008546001600160a01b03848116911614155b15611df857326000908152601b60205260409020544311611de55760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610bfd565b326000908152601b602052604090204390555b6001600160a01b03841660009081526022602052604090205460ff168015611e3957506001600160a01b0383166000908152601e602052604090205460ff16155b15611f2357601f54821115611eae5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610bfd565b602054611ed0846001600160a01b031660009081526020819052604090205490565b611eda9084613689565b1115611f1e5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bfd565b61206a565b6001600160a01b03831660009081526022602052604090205460ff168015611f6457506001600160a01b0384166000908152601e602052604090205460ff16155b15611fda57601f54821115611f1e5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610bfd565b6001600160a01b0383166000908152601e602052604090205460ff1661206a5760205461201c846001600160a01b031660009081526020819052604090205490565b6120269084613689565b111561206a5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610bfd565b6001600160a01b03841660009081526022602052604090205460ff1680156120935750600b5415155b80156120ac5750600b546120a8906001613689565b4311155b15612100576001600160a01b0383166000908152602360205260409020805460ff191660011790556120ea60646120e4846063612856565b906128d5565b9050610d3584846120fb84866137c2565b61274d565b6001600160a01b03841660009081526022602052604090205460ff1680156121295750600b5415155b80156121425750600b5461213e906003613689565b4311155b15612157576120ea60646120e4846031612856565b6001600160a01b03841660009081526023602052604090205460ff168061219657506001600160a01b03831660009081526023602052604090205460ff165b156121a757610d358484600061274d565b600a54600160a81b900460ff1680156121ca5750600a54600160b01b900460ff16155b80156121ef57506001600160a01b0384166000908152601d602052604090205460ff16155b801561221457506001600160a01b0383166000908152601d602052604090205460ff16155b801561223957506001600160a01b03841660009081526022602052604090205460ff16155b1561226757600a805460ff60b01b1916600160b01b179055612259612917565b600a805460ff60b01b191690555b600a546001600160a01b0385166000908152601d602052604090205460ff600160b01b9092048216159116806122b557506001600160a01b0384166000908152601d602052604090205460ff165b156122be575060005b60006018558015612516576001600160a01b03841660009081526022602052604090205460ff1680156122f357506000601154115b156123c85761231260646120e46011548661285690919063ffffffff16565b91506011546013548361232591906137a3565b61232f91906136a1565b601760008282546123409190613689565b909155505060115460145461235590846137a3565b61235f91906136a1565b60185560115460155461237290846137a3565b61237c91906136a1565b6019600082825461238d9190613689565b90915550506011546012546123a290846137a3565b6123ac91906136a1565b601660008282546123bd9190613689565b909155506124c29050565b6001600160a01b03851660009081526022602052604090205460ff1680156123f257506000600c54115b156124c25761241160646120e4600c548661285690919063ffffffff16565b9150600c54600e548361242491906137a3565b61242e91906136a1565b6017600082825461243f9190613689565b9091555050600c54600f5461245490846137a3565b61245e91906136a1565b601855600c5460105461247190846137a3565b61247b91906136a1565b6019600082825461248c9190613689565b9091555050600c54600d546124a190846137a3565b6124ab91906136a1565b601660008282546124bc9190613689565b90915550505b6000601854836124d291906137c2565b11156124f2576124f285306120fb60185486612b8d90919063ffffffff16565b60185415612509576125098561dead60185461274d565b61251382846137c2565b92505b61252185858561274d565b5050505050565b6000818484111561254c5760405162461bcd60e51b8152600401610bfd91906134b1565b50600061255984866137c2565b95945050505050565b6000467f00000000000000000000000000000000000000000000000000000000000000018114156125b4577f81cdd9d40b2294de555fc1aa4239e11b38293fae4c8827c46e7dedfa153a717191505090565b5050604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f0f8ffbd85489cb94ffce4ed2a16246e0bcd51fc5631c8943b1af17be15e3f37e828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b03811660009081526005602052604090208054906126d181612bcf565b50919050565b6000610cbe6126e4612562565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061273687878787612bec565b9150915061274381612cd9565b5095945050505050565b6001600160a01b0383166127735760405162461bcd60e51b8152600401610bfd9061357e565b6001600160a01b0382166127995760405162461bcd60e51b8152600401610bfd90613506565b6127d6816040518060600160405280602681526020016138dc602691396001600160a01b0386166000908152602081905260409020549190612528565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461280590826119fc565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611b7a565b60008261286557506000610cbe565b600061287183856137a3565b90508261287e85836136a1565b14611a5b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610bfd565b6000611a5b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e97565b306000908152602081905260408120549050600060195460165460175461293e9190613689565b6129489190613689565b90506000821580612957575081155b1561296157505050565b61271061296d60025490565b6129789060056137a3565b61298291906136a1565b61298d9060146137a3565b8311156129c3576127106129a060025490565b6129ab9060056137a3565b6129b591906136a1565b6129c09060146137a3565b92505b6000600283601754866129d691906137a3565b6129e091906136a1565b6129ea91906136a1565b905060006129f88583612b8d565b905047612a0482612efb565b6000612a104783612b8d565b90506000612a2d876120e46016548561285690919063ffffffff16565b90506000612a4a886120e46019548661285690919063ffffffff16565b9050600081612a5984866137c2565b612a6391906137c2565b6000601781905560168190556019819055600a546040519293506001600160a01b031691849181818185875af1925050503d8060008114612ac0576040519150601f19603f3d011682016040523d82523d6000602084013e612ac5565b606091505b50909850508615801590612ad95750600081115b15612b2c57612ae88782613064565b601754604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b03909116904790600081818185875af1925050503d8060008114612b79576040519150601f19603f3d011682016040523d82523d6000602084013e612b7e565b606091505b50505050505050505050505050565b6000611a5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612528565b6001816000016000828254612be49190613689565b909155505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c235750600090506003612cd0565b8460ff16601b14158015612c3b57508460ff16601c14155b15612c4c5750600090506004612cd0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612ca0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612cc957600060019250925050612cd0565b9150600090505b94509492505050565b6000816004811115612ced57612ced613884565b1415612cf65750565b6001816004811115612d0a57612d0a613884565b1415612d585760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610bfd565b6002816004811115612d6c57612d6c613884565b1415612dba5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610bfd565b6003816004811115612dce57612dce613884565b1415612e275760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610bfd565b6004816004811115612e3b57612e3b613884565b1415612e945760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610bfd565b50565b60008183612eb85760405162461bcd60e51b8152600401610bfd91906134b1565b506000612ec584866136a1565b9050612ed1848661382e565b612edb82866137a3565b612ee59190613689565b8514612ef357612ef3613842565b949350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f3057612f3061389a565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612f8457600080fd5b505afa158015612f98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbc91906131e5565b81600181518110612fcf57612fcf61389a565b6001600160a01b039283166020918202929092010152600754612ff59130911684611a62565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac9479061302e9085906000908690309042906004016135c3565b600060405180830381600087803b15801561304857600080fd5b505af115801561305c573d6000803e3d6000fd5b505050505050565b60075461307c9030906001600160a01b031684611a62565b6007546001600160a01b031663f305d7198230856000806130a56006546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561310857600080fd5b505af115801561311c573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125219190613451565b600082601f83011261315257600080fd5b8135602061316761316283613665565b613634565b80838252828201915082860187848660051b890101111561318757600080fd5b60005b858110156131a65781358452928401929084019060010161318a565b5090979650505050505050565b803580151581146131c357600080fd5b919050565b6000602082840312156131da57600080fd5b8135611a5b816138c6565b6000602082840312156131f757600080fd5b8151611a5b816138c6565b6000806040838503121561321557600080fd5b8235613220816138c6565b91506020830135613230816138c6565b809150509250929050565b60008060006060848603121561325057600080fd5b833561325b816138c6565b9250602084013561326b816138c6565b929592945050506040919091013590565b600080600080600080600060e0888a03121561329757600080fd5b87356132a2816138c6565b965060208801356132b2816138c6565b95506040880135945060608801359350608088013560ff811681146132d657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561330657600080fd5b8235613311816138c6565b915061331f602084016131b3565b90509250929050565b6000806040838503121561333b57600080fd5b8235613346816138c6565b946020939093013593505050565b6000806040838503121561336757600080fd5b823567ffffffffffffffff8082111561337f57600080fd5b818501915085601f83011261339357600080fd5b813560206133a361316283613665565b8083825282820191508286018a848660051b89010111156133c357600080fd5b600096505b848710156133ef5780356133db816138c6565b8352600196909601959183019183016133c8565b509650508601359250508082111561340657600080fd5b5061341385828601613141565b9150509250929050565b60006020828403121561342f57600080fd5b611a5b826131b3565b60006020828403121561344a57600080fd5b5035919050565b60008060006060848603121561346657600080fd5b8351925060208401519150604084015190509250925092565b6000806000806080858703121561349557600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b818110156134de578581018301518582016040015282016134c2565b818111156134f0576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156136135784516001600160a01b0316835293830193918301916001016135ee565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561365d5761365d6138b0565b604052919050565b600067ffffffffffffffff82111561367f5761367f6138b0565b5060051b60200190565b6000821982111561369c5761369c613858565b500190565b6000826136b0576136b061386e565b500490565b600181815b808511156136f05781600019048211156136d6576136d6613858565b808516156136e357918102915b93841c93908002906136ba565b509250929050565b6000611a5b60ff84168360008261371157506001610cbe565b8161371e57506000610cbe565b8160018114613734576002811461373e5761375a565b6001915050610cbe565b60ff84111561374f5761374f613858565b50506001821b610cbe565b5060208310610133831016604e8410600b841016171561377d575081810a610cbe565b61378783836136b5565b806000190482111561379b5761379b613858565b029392505050565b60008160001904831182151516156137bd576137bd613858565b500290565b6000828210156137d4576137d4613858565b500390565b600181811c908216806137ed57607f821691505b602082108114156126d157634e487b7160e01b600052602260045260246000fd5b600060ff821660ff81141561382557613825613858565b60010192915050565b60008261383d5761383d61386e565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612e9457600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f52ccca5abe2c0def34c2bec228375fc8371bc0b146f44d40b528639178e0fbe64736f6c63430008070033

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

0000000000000000000000006e5e1fc96434cdc69a6f449eb1fb61fc014f8de50000000000000000000000000b603ae79524c0b70bcdd281692cf3054893f1e1

-----Decoded View---------------
Arg [0] : _marketingWallet (address): 0x6E5e1fc96434cDc69A6f449Eb1FB61fC014f8de5
Arg [1] : _treasuryWallet (address): 0x0b603AE79524C0B70bCDD281692Cf3054893F1e1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006e5e1fc96434cdc69a6f449eb1fb61fc014f8de5
Arg [1] : 0000000000000000000000000b603ae79524c0b70bcdd281692cf3054893f1e1


Deployed Bytecode Sourcemap

40503:16808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46840:83;;;;;;;;;;;;;:::i;:::-;;30900;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31768:167;;;;;;;;;;-1:-1:-1;31768:167:0;;;;;:::i;:::-;;:::i;:::-;;;7587:14:1;;7580:22;7562:41;;7550:2;7535:18;31768:167:0;7422:187:1;57145:161:0;;;;;;;;;;;;;:::i;46462:134::-;;;;;;;;;;;;;:::i;41854:64::-;;;;;;;;;;-1:-1:-1;41854:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40588:41;;;;;;;;;;-1:-1:-1;40588:41:0;;;;-1:-1:-1;;;;;40588:41:0;;;;;;-1:-1:-1;;;;;6766:32:1;;;6748:51;;6736:2;6721:18;40588:41:0;6602:203:1;31185:100:0;;;;;;;;;;-1:-1:-1;31265:12:0;;31185:100;;;7760:25:1;;;7748:2;7733:18;31185:100:0;7614:177:1;41358:33:0;;;;;;;;;;;;;;;;41398:28;;;;;;;;;;;;;;;;41318:33;;;;;;;;;;;;;;;;45409:232;;;;;;;;;;-1:-1:-1;45409:232:0;;;;;:::i;:::-;;:::i;31943:317::-;;;;;;;;;;-1:-1:-1;31943:317:0;;;;;:::i;:::-;;:::i;40671:53::-;;;;;;;;;;;;40717:6;40671:53;;48919:201;;;;;;;;;;-1:-1:-1;48919:201:0;;;;;:::i;:::-;;:::i;47768:452::-;;;;;;;;;;-1:-1:-1;47768:452:0;;;;;:::i;:::-;;:::i;31086:91::-;;;;;;;;;;-1:-1:-1;31086:91:0;;21150:4:1;31160:9:0;21138:17:1;21120:36;;21108:2;21093:18;31086:91:0;20978:184:1;36868:115:0;;;;;;;;;;;;;:::i;41998:28::-;;;;;;;;;;;;;;;;32268:214;;;;;;;;;;-1:-1:-1;32268:214:0;;;;;:::i;:::-;;:::i;40770:29::-;;;;;;;;;;-1:-1:-1;40770:29:0;;;;-1:-1:-1;;;;;40770:29:0;;;40636:28;;;;;;;;;;-1:-1:-1;40636:28:0;;;;-1:-1:-1;;;;;40636:28:0;;;41474:33;;;;;;;;;;-1:-1:-1;41474:33:0;;;;;;;;49128:125;;;;;;;;;;-1:-1:-1;49128:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;49217:28:0;49193:4;49217:28;;;:19;:28;;;;;;;;;49128:125;41093:29;;;;;;;;;;;;;;;;41135:28;;;;;;;;;;;;;;;;41279:30;;;;;;;;;;;;;;;;40848:31;;;;;;;;;;-1:-1:-1;40848:31:0;;;;-1:-1:-1;;;40848:31:0;;;;;;44847:380;;;;;;;;;;-1:-1:-1;44847:380:0;;;;;:::i;:::-;;:::i;31293:127::-;;;;;;;;;;-1:-1:-1;31293:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;31394:18:0;31367:7;31394:18;;;;;;;;;;;;31293:127;29661:148;;;;;;;;;;;;;:::i;45279:120::-;;;;;;;;;;;;;:::i;45870:144::-;;;;;;;;;;-1:-1:-1;45870:144:0;;;;;:::i;:::-;;:::i;40733:30::-;;;;;;;;;;-1:-1:-1;40733:30:0;;;;-1:-1:-1;;;;;40733:30:0;;;40987;;;;;;;;;;;;;;;;36610:128;;;;;;;;;;-1:-1:-1;36610:128:0;;;;;:::i;:::-;;:::i;46271:183::-;;;;;;;;;;;;;:::i;29019:79::-;;;;;;;;;;-1:-1:-1;29084:6:0;;-1:-1:-1;;;;;29084:6:0;29019:79;;41170:31;;;;;;;;;;;;;;;;47661:99;;;;;;;;;;-1:-1:-1;47661:99:0;;;;;:::i;:::-;;:::i;30991:87::-;;;;;;;;;;;;;:::i;46933:244::-;;;;;;;;;;-1:-1:-1;46933:244:0;;;;;:::i;:::-;;:::i;32490:265::-;;;;;;;;;;-1:-1:-1;32490:265:0;;;;;:::i;:::-;;:::i;31428:173::-;;;;;;;;;;-1:-1:-1;31428:173:0;;;;;:::i;:::-;;:::i;48703:208::-;;;;;;;;;;-1:-1:-1;48703:208:0;;;;;:::i;:::-;;:::i;41246:26::-;;;;;;;;;;;;;;;;42182:58;;;;;;;;;;-1:-1:-1;42182:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40808:33;;;;;;;;;;-1:-1:-1;40808:33:0;;;;-1:-1:-1;;;40808:33:0;;;;;;47383:182;;;;;;;;;;-1:-1:-1;47383:182:0;;;;;:::i;:::-;;:::i;45649:213::-;;;;;;;;;;-1:-1:-1;45649:213:0;;;;;:::i;:::-;;:::i;46604:228::-;;;;;;;;;;-1:-1:-1;46604:228:0;;;;;:::i;:::-;;:::i;41692:39::-;;;;;;;;;;-1:-1:-1;41692:39:0;;;;;;;;41925:35;;;;;;;;;;;;;;;;41433:32;;;;;;;;;;;;;;;;40914:30;;;;;;;;;;;;;;;;35899:645;;;;;;;;;;-1:-1:-1;35899:645:0;;;;;:::i;:::-;;:::i;42247:50::-;;;;;;;;;;-1:-1:-1;42247:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40953:27;;;;;;;;;;;;;;;;31609:151;;;;;;;;;;-1:-1:-1;31609:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;31725:18:0;;;31698:7;31725:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;31609:151;41061:25;;;;;;;;;;;;;;;;48232:463;;;;;;;;;;-1:-1:-1;48232:463:0;;;;;:::i;:::-;;:::i;46079:134::-;;;;;;;;;;;;;:::i;41024:30::-;;;;;;;;;;;;;;;;29964:244;;;;;;;;;;-1:-1:-1;29964:244:0;;;;;:::i;:::-;;:::i;41208:31::-;;;;;;;;;;;;;;;;41967:24;;;;;;;;;;;;;;;;46840:83;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;;;;;;;;;46895:13:::1;:20:::0;;-1:-1:-1;;;;46895:20:0::1;-1:-1:-1::0;;;46895:20:0::1;::::0;;46840:83::o;30900:::-;30937:13;30970:5;30963:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30900:83;:::o;31768:167::-;31851:4;31868:37;31877:10;31889:7;31898:6;31868:8;:37::i;:::-;-1:-1:-1;31923:4:0;31768:167;;;;;:::o;57145:161::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;57240:58:::1;::::0;57204:12:::1;::::0;57248:10:::1;::::0;57272:21:::1;::::0;57204:12;57240:58;57204:12;57240:58;57272:21;57248:10;57240:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;57145:161:0:o;46462:134::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;46567:13:::1;:21:::0;;-1:-1:-1;;;;46567:21:0::1;::::0;;46462:134::o;45409:232::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;45528:3:::1;45522:4;45502:13;31265:12:::0;;;31185:100;45502:13:::1;:17;::::0;45518:1:::1;45502:17;:::i;:::-;:24;;;;:::i;:::-;45501:30;;;;:::i;:::-;45491:6;:40;;45483:100;;;::::0;-1:-1:-1;;;45483:100:0;;19273:2:1;45483:100:0::1;::::0;::::1;19255:21:1::0;19312:2;19292:18;;;19285:30;19351:34;19331:18;;;19324:62;-1:-1:-1;;;19402:18:1;;;19395:45;19457:19;;45483:100:0::1;19071:411:1::0;45483:100:0::1;45617:16;:6:::0;45627:5:::1;45617:16;:::i;:::-;45594:20;:39:::0;-1:-1:-1;45409:232:0:o;31943:317::-;32049:4;32066:36;32076:6;32084:9;32095:6;32066:9;:36::i;:::-;32113:117;32122:6;32130:10;32142:87;32178:6;32142:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32142:19:0;;;;;;:11;:19;;;;;;;;32162:10;32142:31;;;;;;;;;:87;:35;:87::i;:::-;32113:8;:117::i;:::-;-1:-1:-1;32248:4:0;31943:317;;;;;:::o;48919:201::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;49052:14:::1;::::0;49011:56:::1;::::0;-1:-1:-1;;;;;49052:14:0;;::::1;::::0;49011:56;::::1;::::0;::::1;::::0;49052:14:::1;::::0;49011:56:::1;49078:14;:34:::0;;-1:-1:-1;;;;;;49078:34:0::1;-1:-1:-1::0;;;;;49078:34:0;;;::::1;::::0;;;::::1;::::0;;48919:201::o;47768:452::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;47907:15:::1;:31:::0;;;47949:15:::1;:31:::0;;;47991:10:::1;:21:::0;;;48023:14:::1;:29:::0;;;48040:12;48004:8;48078:33:::1;47967:13:::0;47925;48078:33:::1;:::i;:::-;:46;;;;:::i;:::-;:63;;;;:::i;:::-;48063:12;:78:::0;;;48176:2:::1;-1:-1:-1::0;48160:18:0::1;48152:60;;;::::0;-1:-1:-1;;;48152:60:0;;11085:2:1;48152:60:0::1;::::0;::::1;11067:21:1::0;11124:2;11104:18;;;11097:30;11163:31;11143:18;;;11136:59;11212:18;;48152:60:0::1;10883:353:1::0;36868:115:0;36928:7;36955:20;:18;:20::i;:::-;36948:27;;36868:115;:::o;32268:214::-;32382:10;32356:4;32403:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32403:32:0;;;;;;;;;;32356:4;;32373:79;;32394:7;;32403:48;;32440:10;32403:36;:48::i;44847:380::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;44979:7:::1;:14;44960:8;:15;:33;44952:67;;;::::0;-1:-1:-1;;;44952:67:0;;17764:2:1;44952:67:0::1;::::0;::::1;17746:21:1::0;17803:2;17783:18;;;17776:30;-1:-1:-1;;;17822:18:1;;;17815:51;17883:18;;44952:67:0::1;17562:345:1::0;44952:67:0::1;45035:7;45030:190;45052:8;:15;45048:1;:19;;;45030:190;;;45122:7;45130:1;45122:10;;;;;;;;;;:::i;:::-;;;;;;;45097:21;45107:10;-1:-1:-1::0;;;;;31394:18:0;31367:7;31394:18;;;;;;;;;;;;31293:127;45097:21:::1;:35;;45089:44;;;::::0;::::1;;45148:60;45158:10;45170:8;45179:1;45170:11;;;;;;;;;;:::i;:::-;;;;;;;45198:9;45194:2;:13;;;;:::i;:::-;45183:7;45191:1;45183:10;;;;;;;;;;:::i;:::-;;;;;;;:24;;;;:::i;:::-;45148:9;:60::i;:::-;45069:3:::0;::::1;::::0;::::1;:::i;:::-;;;;45030:190;;;;44847:380:::0;;:::o;29661:148::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;29752:6:::1;::::0;29731:40:::1;::::0;29768:1:::1;::::0;-1:-1:-1;;;;;29752:6:0::1;::::0;29731:40:::1;::::0;29768:1;;29731:40:::1;29782:6;:19:::0;;-1:-1:-1;;;;;;29782:19:0::1;::::0;;29661:148::o;45279:120::-;29231:6;;45331:4;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;-1:-1:-1;45347:14:0::1;:22:::0;;-1:-1:-1;;45347:22:0::1;::::0;;;45279:120;:::o;45870:144::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45960:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;45960:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45870:144::o;36610:128::-;-1:-1:-1;;;;;36706:14:0;;36679:7;36706:14;;;:7;:14;;;;;27718;36706:24;27626:114;46271:183;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;46335:13:::1;::::0;-1:-1:-1;;;46335:13:0;::::1;;;46334:14;46326:23;;;::::0;::::1;;46360:13;:20:::0;;-1:-1:-1;;;;46391:18:0;-1:-1:-1;;;46391:18:0;;;46434:12:::1;46420:11;:26:::0;46271:183::o;47661:99::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;47731:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;47731:21:0::1;-1:-1:-1::0;;;;47731:21:0;;::::1;::::0;;;::::1;::::0;;47661:99::o;30991:87::-;31030:13;31063:7;31056:14;;;;;:::i;46933:244::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;47040:13:::1;::::0;-1:-1:-1;;;;;47032:21:0;;::::1;47040:13:::0;::::1;47032:21;;47024:91;;;::::0;-1:-1:-1;;;47024:91:0;;13725:2:1;47024:91:0::1;::::0;::::1;13707:21:1::0;13764:2;13744:18;;;13737:30;13803:34;13783:18;;;13776:62;13874:27;13854:18;;;13847:55;13919:19;;47024:91:0::1;13523:421:1::0;47024:91:0::1;47128:41;47157:4;47163:5;47128:28;:41::i;:::-;46933:244:::0;;:::o;32490:265::-;32583:4;32600:125;32609:10;32621:7;32630:94;32667:15;32630:94;;;;;;;;;;;;;;;;;32642:10;32630:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;32630:32:0;;;;;;;;;;;:94;:36;:94::i;31428:173::-;31514:4;31531:40;31541:10;31553:9;31564:6;31531:9;:40::i;48703:208::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;48840:15:::1;::::0;48797:59:::1;::::0;-1:-1:-1;;;;;48840:15:0;;::::1;::::0;48797:59;::::1;::::0;::::1;::::0;48840:15:::1;::::0;48797:59:::1;48867:15;:36:::0;;-1:-1:-1;;;;;;48867:36:0::1;-1:-1:-1::0;;;;;48867:36:0;;;::::1;::::0;;;::::1;::::0;;48703:208::o;47383:182::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47468:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;47468:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;47523:34;;7562:41:1;;;47523:34:0::1;::::0;7535:18:1;47523:34:0::1;;;;;;;47383:182:::0;;:::o;45649:213::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;45771:3:::1;45765:4;45745:13;31265:12:::0;;;31185:100;45745:13:::1;:17;::::0;45761:1:::1;45745:17;:::i;:::-;:24;;;;:::i;:::-;45744:30;;;;:::i;:::-;45734:6;:40;;45726:89;;;::::0;-1:-1:-1;;;45726:89:0;;13320:2:1;45726:89:0::1;::::0;::::1;13302:21:1::0;13359:2;13339:18;;;13332:30;13398:34;13378:18;;;13371:62;-1:-1:-1;;;13449:18:1;;;13442:34;13493:19;;45726:89:0::1;13118:400:1::0;45726:89:0::1;45838:16;:6:::0;45848:5:::1;45838:16;:::i;:::-;45826:9;:28:::0;-1:-1:-1;45649:213:0:o;46604:228::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;46692:7:::1;46688:93;;;46761:14;::::0;::::1;;46753:23;;;::::0;::::1;;-1:-1:-1::0;;;;;46791:23:0;;;::::1;;::::0;;;:17:::1;:23;::::0;;;;:33;;-1:-1:-1;;46791:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46604:228::o;35899:645::-;36143:8;36124:15;:27;;36116:69;;;;-1:-1:-1;;;36116:69:0;;14151:2:1;36116:69:0;;;14133:21:1;14190:2;14170:18;;;14163:30;14229:31;14209:18;;;14202:59;14278:18;;36116:69:0;13949:353:1;36116:69:0;36198:18;36240:16;36258:5;36265:7;36274:5;36281:16;36291:5;36281:9;:16::i;:::-;36229:79;;;;;;8083:25:1;;;;-1:-1:-1;;;;;8182:15:1;;;8162:18;;;8155:43;8234:15;;;;8214:18;;;8207:43;8266:18;;;8259:34;8309:19;;;8302:35;8353:19;;;8346:35;;;8055:19;;36229:79:0;;;;;;;;;;;;36219:90;;;;;;36198:111;;36322:12;36337:28;36354:10;36337:16;:28::i;:::-;36322:43;;36378:14;36395:28;36409:4;36415:1;36418;36421;36395:13;:28::i;:::-;36378:45;;36452:5;-1:-1:-1;;;;;36442:15:0;:6;-1:-1:-1;;;;;36442:15:0;;36434:58;;;;-1:-1:-1;;;36434:58:0;;17044:2:1;36434:58:0;;;17026:21:1;17083:2;17063:18;;;17056:30;17122:32;17102:18;;;17095:60;17172:18;;36434:58:0;16842:354:1;36434:58:0;36505:31;36514:5;36521:7;36530:5;36505:8;:31::i;:::-;36105:439;;;35899:645;;;;;;;:::o;48232:463::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;48372:16:::1;:32:::0;;;48415:16:::1;:32:::0;;;48458:11:::1;:22:::0;;;48491:15:::1;:30:::0;;;48509:12;48472:8;48548:35:::1;48434:13:::0;48391;48548:35:::1;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;48532:13;:83:::0;;;48651:2:::1;-1:-1:-1::0;48634:19:0::1;48626:61;;;::::0;-1:-1:-1;;;48626:61:0;;11085:2:1;48626:61:0::1;::::0;::::1;11067:21:1::0;11124:2;11104:18;;;11097:30;11163:31;11143:18;;;11136:59;11212:18;;48626:61:0::1;10883:353:1::0;46079:134:0;29231:6;;46139:4;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;-1:-1:-1;46155:20:0::1;:28:::0;;-1:-1:-1;;46155:28:0::1;::::0;;;46079:134;:::o;29964:244::-;29231:6;;-1:-1:-1;;;;;29231:6:0;28225:10;29231:22;29223:67;;;;-1:-1:-1;;;29223:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30053:22:0;::::1;30045:73;;;::::0;-1:-1:-1;;;30045:73:0;;12154:2:1;30045:73:0::1;::::0;::::1;12136:21:1::0;12193:2;12173:18;;;12166:30;12232:34;12212:18;;;12205:62;-1:-1:-1;;;12283:18:1;;;12276:36;12329:19;;30045:73:0::1;11952:402:1::0;30045:73:0::1;30155:6;::::0;30134:38:::1;::::0;-1:-1:-1;;;;;30134:38:0;;::::1;::::0;30155:6:::1;::::0;30134:38:::1;::::0;30155:6:::1;::::0;30134:38:::1;30183:6;:17:::0;;-1:-1:-1;;;;;;30183:17:0::1;-1:-1:-1::0;;;;;30183:17:0;;;::::1;::::0;;;::::1;::::0;;29964:244::o;18692:181::-;18750:7;;18782:5;18786:1;18782;:5;:::i;:::-;18770:17;;18811:1;18806;:6;;18798:46;;;;-1:-1:-1;;;18798:46:0;;12964:2:1;18798:46:0;;;12946:21:1;13003:2;12983:18;;;12976:30;13042:29;13022:18;;;13015:57;13089:18;;18798:46:0;12762:351:1;18798:46:0;18864:1;18692:181;-1:-1:-1;;;18692:181:0:o;34118:346::-;-1:-1:-1;;;;;34220:19:0;;34212:68;;;;-1:-1:-1;;;34212:68:0;;18520:2:1;34212:68:0;;;18502:21:1;18559:2;18539:18;;;18532:30;18598:34;18578:18;;;18571:62;-1:-1:-1;;;18649:18:1;;;18642:34;18693:19;;34212:68:0;18318:400:1;34212:68:0;-1:-1:-1;;;;;34299:21:0;;34291:68;;;;-1:-1:-1;;;34291:68:0;;12561:2:1;34291:68:0;;;12543:21:1;12600:2;12580:18;;;12573:30;12639:34;12619:18;;;12612:62;-1:-1:-1;;;12690:18:1;;;12683:32;12732:19;;34291:68:0;12359:398:1;34291:68:0;-1:-1:-1;;;;;34372:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;34424:32;;7760:25:1;;;34424:32:0;;7733:18:1;34424:32:0;;;;;;;;34118:346;;;:::o;49261:5035::-;-1:-1:-1;;;;;49393:18:0;;49385:68;;;;-1:-1:-1;;;49385:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49472:16:0;;49464:64;;;;-1:-1:-1;;;49464:64:0;;;;;;;:::i;:::-;49553:11;49550:92;;49581:28;49597:4;49603:2;49607:1;49581:15;:28::i;49550:92::-;49684:14;;49652:12;;49684:14;;49681:2452;;;29084:6;;-1:-1:-1;;;;;49736:15:0;;;29084:6;;49736:15;;;;:49;;-1:-1:-1;29084:6:0;;-1:-1:-1;;;;;49772:13:0;;;29084:6;;49772:13;;49736:49;:86;;;;-1:-1:-1;;;;;;49806:16:0;;;;49736:86;:128;;;;-1:-1:-1;;;;;;49843:21:0;;49857:6;49843:21;;49736:128;:158;;;;-1:-1:-1;49886:8:0;;-1:-1:-1;;;49886:8:0;;;;49885:9;49736:158;49714:2408;;;49932:13;;-1:-1:-1;;;49932:13:0;;;;49928:148;;-1:-1:-1;;;;;49977:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;50006:23:0;;;;;;:19;:23;;;;;;;;49977:52;49969:87;;;;-1:-1:-1;;;49969:87:0;;11803:2:1;49969:87:0;;;11785:21:1;11842:2;11822:18;;;11815:30;-1:-1:-1;;;11861:18:1;;;11854:52;11923:18;;49969:87:0;11601:346:1;49969:87:0;50234:20;;;;50230:423;;;29084:6;;-1:-1:-1;;;;;50282:13:0;;;29084:6;;50282:13;;;;:47;;-1:-1:-1;50313:15:0;;-1:-1:-1;;;;;50299:30:0;;;50313:15;;50299:30;;50282:47;:79;;;;-1:-1:-1;50347:13:0;;-1:-1:-1;;;;;50333:28:0;;;50347:13;;50333:28;;50282:79;50278:356;;;50426:9;50397:39;;;;:28;:39;;;;;;50439:12;-1:-1:-1;50389:140:0;;;;-1:-1:-1;;;50389:140:0;;15757:2:1;50389:140:0;;;15739:21:1;15796:2;15776:18;;;15769:30;15835:34;15815:18;;;15808:62;15906:34;15886:18;;;15879:62;-1:-1:-1;;;15957:19:1;;;15950:40;16007:19;;50389:140:0;15555:477:1;50389:140:0;50585:9;50556:39;;;;:28;:39;;;;;50598:12;50556:54;;50278:356;-1:-1:-1;;;;;50707:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;50743:35:0;;;;;;:31;:35;;;;;;;;50742:36;50707:71;50703:762;;;50825:20;;50815:6;:30;;50807:96;;;;-1:-1:-1;;;50807:96:0;;15335:2:1;50807:96:0;;;15317:21:1;15374:2;15354:18;;;15347:30;15413:34;15393:18;;;15386:62;-1:-1:-1;;;15464:18:1;;;15457:51;15525:19;;50807:96:0;15133:417:1;50807:96:0;50964:9;;50947:13;50957:2;-1:-1:-1;;;;;31394:18:0;31367:7;31394:18;;;;;;;;;;;;31293:127;50947:13;50938:22;;:6;:22;:::i;:::-;:35;;50930:67;;;;-1:-1:-1;;;50930:67:0;;18925:2:1;50930:67:0;;;18907:21:1;18964:2;18944:18;;;18937:30;-1:-1:-1;;;18983:18:1;;;18976:49;19042:18;;50930:67:0;18723:343:1;50930:67:0;50703:762;;;-1:-1:-1;;;;;51075:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;51109:37:0;;;;;;:31;:37;;;;;;;;51108:38;51075:71;51071:394;;;51193:20;;51183:6;:30;;51175:97;;;;-1:-1:-1;;;51175:97:0;;14509:2:1;51175:97:0;;;14491:21:1;14548:2;14528:18;;;14521:30;14587:34;14567:18;;;14560:62;-1:-1:-1;;;14638:18:1;;;14631:52;14700:19;;51175:97:0;14307:418:1;51071:394:0;-1:-1:-1;;;;;51319:35:0;;;;;;:31;:35;;;;;;;;51315:150;;51412:9;;51395:13;51405:2;-1:-1:-1;;;;;31394:18:0;31367:7;31394:18;;;;;;;;;;;;31293:127;51395:13;51386:22;;:6;:22;:::i;:::-;:35;;51378:67;;;;-1:-1:-1;;;51378:67:0;;18925:2:1;51378:67:0;;;18907:21:1;18964:2;18944:18;;;18937:30;-1:-1:-1;;;18983:18:1;;;18976:49;19042:18;;51378:67:0;18723:343:1;51378:67:0;-1:-1:-1;;;;;51538:31:0;;;;;;:25;:31;;;;;;;;:51;;;;-1:-1:-1;51573:11:0;;:16;;51538:51;:84;;;;-1:-1:-1;51609:11:0;;:13;;51621:1;51609:13;:::i;:::-;51593:12;:29;;51538:84;51534:303;;;-1:-1:-1;;;;;51646:21:0;;;;;;:17;:21;;;;;:28;;-1:-1:-1;;51646:28:0;51670:4;51646:28;;;51704:23;51723:3;51704:14;:6;51715:2;51704:10;:14::i;:::-;:18;;:23::i;:::-;51697:30;-1:-1:-1;51750:38:0;51766:4;51772:2;51776:11;51697:30;51776:6;:11;:::i;:::-;51750:15;:38::i;51534:303::-;-1:-1:-1;;;;;51859:31:0;;;;;;:25;:31;;;;;;;;:51;;;;-1:-1:-1;51894:11:0;;:16;;51859:51;:84;;;;-1:-1:-1;51930:11:0;;:13;;51942:1;51930:13;:::i;:::-;51914:12;:29;;51859:84;51855:252;;;51974:23;51993:3;51974:14;:6;51985:2;51974:10;:14::i;51855:252::-;-1:-1:-1;;;;;52149:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;52176:21:0;;;;;;:17;:21;;;;;;;;52149:48;52145:129;;;52213:28;52229:4;52235:2;52239:1;52213:15;:28::i;52145:129::-;52306:11;;-1:-1:-1;;;52306:11:0;;;;:37;;;;-1:-1:-1;52335:8:0;;-1:-1:-1;;;52335:8:0;;;;52334:9;52306:37;:80;;;;-1:-1:-1;;;;;;52361:25:0;;;;;;:19;:25;;;;;;;;52360:26;52306:80;:121;;;;-1:-1:-1;;;;;;52404:23:0;;;;;;:19;:23;;;;;;;;52403:24;52306:121;:170;;;;-1:-1:-1;;;;;;52445:31:0;;;;;;:25;:31;;;;;;;;52444:32;52306:170;52288:314;;;52503:8;:15;;-1:-1:-1;;;;52503:15:0;-1:-1:-1;;;52503:15:0;;;52547:10;:8;:10::i;:::-;52574:8;:16;;-1:-1:-1;;;;52574:16:0;;;52288:314;52640:8;;-1:-1:-1;;;;;52749:25:0;;52624:12;52749:25;;;:19;:25;;;;;;52640:8;-1:-1:-1;;;52640:8:0;;;;;52639:9;;52749:25;;:52;;-1:-1:-1;;;;;;52778:23:0;;;;;;:19;:23;;;;;;;;52749:52;52746:99;;;-1:-1:-1;52828:5:0;52746:99;52881:1;52865:13;:17;52967:1276;;;;-1:-1:-1;;;;;53021:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;53070:1;53054:13;;:17;53021:50;53017:904;;;53098:34;53128:3;53098:25;53109:13;;53098:6;:10;;:25;;;;:::i;:34::-;53091:41;;53199:13;;53180:16;;53173:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;53151:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;53268:13:0;;53254:11;;53247:18;;:4;:18;:::i;:::-;:34;;;;:::i;:::-;53231:13;:50;53346:13;;53328:15;;53321:22;;:4;:22;:::i;:::-;:38;;;;:::i;:::-;53300:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53426:13:0;;53407:16;;53400:23;;:4;:23;:::i;:::-;:39;;;;:::i;:::-;53378:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;53017:904:0;;-1:-1:-1;53017:904:0;;-1:-1:-1;;;;;53500:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;53550:1;53535:12;;:16;53500:51;53497:424;;;53576:33;53605:3;53576:24;53587:12;;53576:6;:10;;:24;;;;:::i;:33::-;53569:40;;53672:12;;53654:15;;53647:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;53625:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53739:12:0;;53726:10;;53719:17;;:4;:17;:::i;:::-;:32;;;;:::i;:::-;53703:13;:48;53815:12;;53798:14;;53791:21;;:4;:21;:::i;:::-;:36;;;;:::i;:::-;53770:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;53893:12:0;;53875:15;;53868:22;;:4;:22;:::i;:::-;:37;;;;:::i;:::-;53846:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;53497:424:0;53973:1;53957:13;;53952:4;:18;;;;:::i;:::-;:22;53949:126;;;53998:61;54014:4;54028;54035:23;54044:13;;54035:4;:8;;:23;;;;:::i;53998:61::-;54093:13;;:17;54089:106;;54130:49;54146:4;40717:6;54165:13;;54130:15;:49::i;:::-;54217:14;54227:4;54217:14;;:::i;:::-;;;52967:1276;54255:33;54271:4;54277:2;54281:6;54255:15;:33::i;:::-;49374:4922;;49261:5035;;;:::o;19025:192::-;19111:7;19147:12;19139:6;;;;19131:29;;;;-1:-1:-1;;;19131:29:0;;;;;;;;:::i;:::-;-1:-1:-1;19171:9:0;19183:5;19187:1;19183;:5;:::i;:::-;19171:17;19025:192;-1:-1:-1;;;;;19025:192:0:o;3163:370::-;3216:7;3299:9;3346:16;3335:27;;3331:195;;;3386:24;3379:31;;;3163:370;:::o;3331:195::-;-1:-1:-1;;3815:67:0;;;3472:10;3815:67;;;;8651:25:1;;;;3484:12:0;8692:18:1;;;8685:34;3498:15:0;8735:18:1;;;8728:34;3766:9:0;8778:18:1;;;8771:34;3876:4:0;8821:19:1;;;;8814:61;;;;3815:67:0;;;;;;;;;;8623:19:1;;;;3815:67:0;;;3805:78;;;;;;3163:370::o;47185:188::-;-1:-1:-1;;;;;47268:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;47268:39:0;;;;;;;;;;47325:40;;47268:39;;:31;47325:40;;;47185:188;;:::o;37121:207::-;-1:-1:-1;;;;;37242:14:0;;37181:15;37242:14;;;:7;:14;;;;;27718;;;37303:17;37242:14;37303:15;:17::i;:::-;37198:130;37121:207;;;:::o;4533:167::-;4610:7;4637:55;4659:20;:18;:20::i;:::-;4681:10;18457:57;;-1:-1:-1;;;18457:57:0;;;6253:27:1;6296:11;;;6289:27;;;6332:12;;;6325:28;;;18420:7:0;;6369:12:1;;18457:57:0;;;;;;;;;;;;18447:68;;;;;;18440:75;;18327:196;;;;;17129:279;17257:7;17278:17;17297:18;17319:25;17330:4;17336:1;17339;17342;17319:10;:25::i;:::-;17277:67;;;;17355:18;17367:5;17355:11;:18::i;:::-;-1:-1:-1;17391:9:0;17129:279;-1:-1:-1;;;;;17129:279:0:o;32763:539::-;-1:-1:-1;;;;;32869:20:0;;32861:70;;;;-1:-1:-1;;;32861:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32950:23:0;;32942:71;;;;-1:-1:-1;;;32942:71:0;;;;;;;:::i;:::-;33106;33128:6;33106:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33106:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;33086:17:0;;;:9;:17;;;;;;;;;;;:91;;;;33211:20;;;;;;;:32;;33236:6;33211:24;:32::i;:::-;-1:-1:-1;;;;;33188:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;33259:35;7760:25:1;;;33188:20:0;;33259:35;;;;;;7733:18:1;33259:35:0;7614:177:1;19225:250:0;19283:7;19307:6;19303:47;;-1:-1:-1;19337:1:0;19330:8;;19303:47;19362:9;19374:5;19378:1;19374;:5;:::i;:::-;19362:17;-1:-1:-1;19407:1:0;19398:5;19402:1;19362:17;19398:5;:::i;:::-;:10;19390:56;;;;-1:-1:-1;;;19390:56:0;;16642:2:1;19390:56:0;;;16624:21:1;16681:2;16661:18;;;16654:30;16720:34;16700:18;;;16693:62;-1:-1:-1;;;16771:18:1;;;16764:31;16812:19;;19390:56:0;16440:397:1;19483:132:0;19541:7;19568:39;19572:1;19575;19568:39;;;;;;;;;;;;;;;;;:3;:39::i;55438:1699::-;55521:4;55477:23;31394:18;;;;;;;;;;;55477:50;;55538:25;55608:17;;55587:18;;55566;;:39;;;;:::i;:::-;:59;;;;:::i;:::-;55538:87;-1:-1:-1;55636:12:0;55672:20;;;:46;;-1:-1:-1;55696:22:0;;55672:46;55669:60;;;55721:7;;;55438:1699::o;55669:60::-;55790:5;55770:13;31265:12;;;31185:100;55770:13;:17;;55786:1;55770:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55798:2;55770:30;:::i;:::-;55752:15;:48;55749:125;;;55852:5;55832:13;31265:12;;;31185:100;55832:13;:17;;55848:1;55832:17;:::i;:::-;:25;;;;:::i;:::-;:30;;55860:2;55832:30;:::i;:::-;55814:48;;55749:125;55933:23;56018:1;55998:17;55977:18;;55959:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;55933:86;-1:-1:-1;56030:26:0;56059:36;:15;55933:86;56059:19;:36::i;:::-;56030:65;-1:-1:-1;56144:21:0;56178:36;56030:65;56178:16;:36::i;:::-;56238:18;56259:44;:21;56285:17;56259:25;:44::i;:::-;56238:65;;56326:23;56352:57;56391:17;56352:34;56367:18;;56352:10;:14;;:34;;;;:::i;:57::-;56326:83;;56420:22;56445:56;56483:17;56445:33;56460:17;;56445:10;:14;;:33;;;;:::i;:56::-;56420:81;-1:-1:-1;56522:23:0;56420:81;56548:28;56561:15;56548:10;:28;:::i;:::-;:45;;;;:::i;:::-;56637:1;56616:18;:22;;;56649:18;:22;;;56682:17;:21;;;56745:14;;56737:55;;56522:71;;-1:-1:-1;;;;;;56745:14:0;;56773;;56737:55;56637:1;56737:55;56773:14;56745;56737:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56724:68:0;;-1:-1:-1;;56816:19:0;;;;;:42;;;56857:1;56839:15;:19;56816:42;56813:210;;;56874:46;56887:15;56904;56874:12;:46::i;:::-;56992:18;;56940:71;;;20856:25:1;;;20912:2;20897:18;;20890:34;;;20940:18;;;20933:34;;;;56940:71:0;;;;;;20844:2:1;56940:71:0;;;56813:210;57074:15;;57066:63;;-1:-1:-1;;;;;57074:15:0;;;;57103:21;;57066:63;;;;57103:21;57074:15;57066:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;55438:1699:0:o;18881:136::-;18939:7;18966:43;18970:1;18973;18966:43;;;;;;;;;;;;;;;;;:3;:43::i;27748:181::-;27920:1;27902:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;27748:181:0:o;15358:1632::-;15489:7;;16423:66;16410:79;;16406:163;;;-1:-1:-1;16522:1:0;;-1:-1:-1;16526:30:0;16506:51;;16406:163;16583:1;:7;;16588:2;16583:7;;:18;;;;;16594:1;:7;;16599:2;16594:7;;16583:18;16579:102;;;-1:-1:-1;16634:1:0;;-1:-1:-1;16638:30:0;16618:51;;16579:102;16795:24;;;16778:14;16795:24;;;;;;;;;9113:25:1;;;9186:4;9174:17;;9154:18;;;9147:45;;;;9208:18;;;9201:34;;;9251:18;;;9244:34;;;16795:24:0;;9085:19:1;;16795:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16795:24:0;;-1:-1:-1;;16795:24:0;;;-1:-1:-1;;;;;;;16834:20:0;;16830:103;;16887:1;16891:29;16871:50;;;;;;;16830:103;16953:6;-1:-1:-1;16961:20:0;;-1:-1:-1;15358:1632:0;;;;;;;;:::o;10020:643::-;10098:20;10089:5;:29;;;;;;;;:::i;:::-;;10085:571;;;10020:643;:::o;10085:571::-;10196:29;10187:5;:38;;;;;;;;:::i;:::-;;10183:473;;;10242:34;;-1:-1:-1;;;10242:34:0;;10328:2:1;10242:34:0;;;10310:21:1;10367:2;10347:18;;;10340:30;10406:26;10386:18;;;10379:54;10450:18;;10242:34:0;10126:348:1;10183:473:0;10307:35;10298:5;:44;;;;;;;;:::i;:::-;;10294:362;;;10359:41;;-1:-1:-1;;;10359:41:0;;11443:2:1;10359:41:0;;;11425:21:1;11482:2;11462:18;;;11455:30;11521:33;11501:18;;;11494:61;11572:18;;10359:41:0;11241:355:1;10294:362:0;10431:30;10422:5;:39;;;;;;;;:::i;:::-;;10418:238;;;10478:44;;-1:-1:-1;;;10478:44:0;;14932:2:1;10478:44:0;;;14914:21:1;14971:2;14951:18;;;14944:30;15010:34;14990:18;;;14983:62;-1:-1:-1;;;15061:18:1;;;15054:32;15103:19;;10478:44:0;14730:398:1;10418:238:0;10553:30;10544:5;:39;;;;;;;;:::i;:::-;;10540:116;;;10600:44;;-1:-1:-1;;;10600:44:0;;16239:2:1;10600:44:0;;;16221:21:1;16278:2;16258:18;;;16251:30;16317:34;16297:18;;;16290:62;-1:-1:-1;;;16368:18:1;;;16361:32;16410:19;;10600:44:0;16037:398:1;10540:116:0;10020:643;:::o;19623:275::-;19709:7;19744:12;19737:5;19729:28;;;;-1:-1:-1;;;19729:28:0;;;;;;;;:::i;:::-;-1:-1:-1;19768:9:0;19780:5;19784:1;19780;:5;:::i;:::-;19768:17;-1:-1:-1;19816:5:0;19820:1;19816;:5;:::i;:::-;19808;19812:1;19808;:5;:::i;:::-;:13;;;;:::i;:::-;19803:1;:18;19796:26;;;;:::i;:::-;19889:1;19623:275;-1:-1:-1;;;;19623:275:0:o;54304:601::-;54456:16;;;54470:1;54456:16;;;;;;;;54432:21;;54456:16;;;;;;;;;;-1:-1:-1;54456:16:0;54432:40;;54501:4;54483;54488:1;54483:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54483:23:0;;;:7;;;;;;;;;;:23;;;;54527:15;;:22;;;-1:-1:-1;;;54527:22:0;;;;:15;;;;;:20;;:22;;;;;54483:7;;54527:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54517:4;54522:1;54517:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54517:32:0;;;:7;;;;;;;;;:32;54594:15;;54562:62;;54579:4;;54594:15;54612:11;54562:8;:62::i;:::-;54663:15;;:224;;-1:-1:-1;;;54663:224:0;;-1:-1:-1;;;;;54663:15:0;;;;:66;;:224;;54744:11;;54663:15;;54814:4;;54841;;54861:15;;54663:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54359:546;54304:601;:::o;54915:513::-;55095:15;;55063:62;;55080:4;;-1:-1:-1;;;;;55095:15:0;55113:11;55063:8;:62::i;:::-;55168:15;;-1:-1:-1;;;;;55168:15:0;:31;55207:9;55240:4;55260:11;55168:15;;55372:7;29084:6;;-1:-1:-1;;;;;29084:6:0;;29019:79;55372:7;55168:252;;;;;;-1:-1:-1;;;;;;55168:252:0;;;-1:-1:-1;;;;;7169:15:1;;;55168:252:0;;;7151:34:1;7201:18;;;7194:34;;;;7244:18;;;7237:34;;;;7287:18;;;7280:34;7351:15;;;7330:19;;;7323:44;55394:15:0;7383:19:1;;;7376:35;7085:19;;55168:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:673:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:163;509:2;506:1;503:9;495:163;;;566:17;;554:30;;604:12;;;;636;;;;527:1;520:9;495:163;;;-1:-1:-1;676:5:1;;14:673;-1:-1:-1;;;;;;;14:673:1:o;692:160::-;757:20;;813:13;;806:21;796:32;;786:60;;842:1;839;832:12;786:60;692:160;;;:::o;857:247::-;916:6;969:2;957:9;948:7;944:23;940:32;937:52;;;985:1;982;975:12;937:52;1024:9;1011:23;1043:31;1068:5;1043:31;:::i;1109:251::-;1179:6;1232:2;1220:9;1211:7;1207:23;1203:32;1200:52;;;1248:1;1245;1238:12;1200:52;1280:9;1274:16;1299:31;1324:5;1299:31;:::i;1365:388::-;1433:6;1441;1494:2;1482:9;1473:7;1469:23;1465:32;1462:52;;;1510:1;1507;1500:12;1462:52;1549:9;1536:23;1568:31;1593:5;1568:31;:::i;:::-;1618:5;-1:-1:-1;1675:2:1;1660:18;;1647:32;1688:33;1647:32;1688:33;:::i;:::-;1740:7;1730:17;;;1365:388;;;;;:::o;1758:456::-;1835:6;1843;1851;1904:2;1892:9;1883:7;1879:23;1875:32;1872:52;;;1920:1;1917;1910:12;1872:52;1959:9;1946:23;1978:31;2003:5;1978:31;:::i;:::-;2028:5;-1:-1:-1;2085:2:1;2070:18;;2057:32;2098:33;2057:32;2098:33;:::i;:::-;1758:456;;2150:7;;-1:-1:-1;;;2204:2:1;2189:18;;;;2176:32;;1758:456::o;2219:829::-;2330:6;2338;2346;2354;2362;2370;2378;2431:3;2419:9;2410:7;2406:23;2402:33;2399:53;;;2448:1;2445;2438:12;2399:53;2487:9;2474:23;2506:31;2531:5;2506:31;:::i;:::-;2556:5;-1:-1:-1;2613:2:1;2598:18;;2585:32;2626:33;2585:32;2626:33;:::i;:::-;2678:7;-1:-1:-1;2732:2:1;2717:18;;2704:32;;-1:-1:-1;2783:2:1;2768:18;;2755:32;;-1:-1:-1;2839:3:1;2824:19;;2811:33;2888:4;2875:18;;2863:31;;2853:59;;2908:1;2905;2898:12;2853:59;2219:829;;;;-1:-1:-1;2219:829:1;;;;2931:7;2985:3;2970:19;;2957:33;;-1:-1:-1;3037:3:1;3022:19;;;3009:33;;2219:829;-1:-1:-1;;2219:829:1:o;3053:315::-;3118:6;3126;3179:2;3167:9;3158:7;3154:23;3150:32;3147:52;;;3195:1;3192;3185:12;3147:52;3234:9;3221:23;3253:31;3278:5;3253:31;:::i;:::-;3303:5;-1:-1:-1;3327:35:1;3358:2;3343:18;;3327:35;:::i;:::-;3317:45;;3053:315;;;;;:::o;3373:::-;3441:6;3449;3502:2;3490:9;3481:7;3477:23;3473:32;3470:52;;;3518:1;3515;3508:12;3470:52;3557:9;3544:23;3576:31;3601:5;3576:31;:::i;:::-;3626:5;3678:2;3663:18;;;;3650:32;;-1:-1:-1;;;3373:315:1:o;3693:1226::-;3811:6;3819;3872:2;3860:9;3851:7;3847:23;3843:32;3840:52;;;3888:1;3885;3878:12;3840:52;3928:9;3915:23;3957:18;3998:2;3990:6;3987:14;3984:34;;;4014:1;4011;4004:12;3984:34;4052:6;4041:9;4037:22;4027:32;;4097:7;4090:4;4086:2;4082:13;4078:27;4068:55;;4119:1;4116;4109:12;4068:55;4155:2;4142:16;4177:4;4201:60;4217:43;4257:2;4217:43;:::i;4201:60::-;4283:3;4307:2;4302:3;4295:15;4335:2;4330:3;4326:12;4319:19;;4366:2;4362;4358:11;4414:7;4409:2;4403;4400:1;4396:10;4392:2;4388:19;4384:28;4381:41;4378:61;;;4435:1;4432;4425:12;4378:61;4457:1;4448:10;;4467:238;4481:2;4478:1;4475:9;4467:238;;;4552:3;4539:17;4569:31;4594:5;4569:31;:::i;:::-;4613:18;;4499:1;4492:9;;;;;4651:12;;;;4683;;4467:238;;;-1:-1:-1;4724:5:1;-1:-1:-1;;4767:18:1;;4754:32;;-1:-1:-1;;4798:16:1;;;4795:36;;;4827:1;4824;4817:12;4795:36;;4850:63;4905:7;4894:8;4883:9;4879:24;4850:63;:::i;:::-;4840:73;;;3693:1226;;;;;:::o;4924:180::-;4980:6;5033:2;5021:9;5012:7;5008:23;5004:32;5001:52;;;5049:1;5046;5039:12;5001:52;5072:26;5088:9;5072:26;:::i;5109:180::-;5168:6;5221:2;5209:9;5200:7;5196:23;5192:32;5189:52;;;5237:1;5234;5227:12;5189:52;-1:-1:-1;5260:23:1;;5109:180;-1:-1:-1;5109:180:1:o;5294:306::-;5382:6;5390;5398;5451:2;5439:9;5430:7;5426:23;5422:32;5419:52;;;5467:1;5464;5457:12;5419:52;5496:9;5490:16;5480:26;;5546:2;5535:9;5531:18;5525:25;5515:35;;5590:2;5579:9;5575:18;5569:25;5559:35;;5294:306;;;;;:::o;5605:385::-;5691:6;5699;5707;5715;5768:3;5756:9;5747:7;5743:23;5739:33;5736:53;;;5785:1;5782;5775:12;5736:53;-1:-1:-1;;5808:23:1;;;5878:2;5863:18;;5850:32;;-1:-1:-1;5929:2:1;5914:18;;5901:32;;5980:2;5965:18;5952:32;;-1:-1:-1;5605:385:1;-1:-1:-1;5605:385:1:o;9524:597::-;9636:4;9665:2;9694;9683:9;9676:21;9726:6;9720:13;9769:6;9764:2;9753:9;9749:18;9742:34;9794:1;9804:140;9818:6;9815:1;9812:13;9804:140;;;9913:14;;;9909:23;;9903:30;9879:17;;;9898:2;9875:26;9868:66;9833:10;;9804:140;;;9962:6;9959:1;9956:13;9953:91;;;10032:1;10027:2;10018:6;10007:9;10003:22;9999:31;9992:42;9953:91;-1:-1:-1;10105:2:1;10084:15;-1:-1:-1;;10080:29:1;10065:45;;;;10112:2;10061:54;;9524:597;-1:-1:-1;;;9524:597:1:o;10479:399::-;10681:2;10663:21;;;10720:2;10700:18;;;10693:30;10759:34;10754:2;10739:18;;10732:62;-1:-1:-1;;;10825:2:1;10810:18;;10803:33;10868:3;10853:19;;10479:399::o;17201:356::-;17403:2;17385:21;;;17422:18;;;17415:30;17481:34;17476:2;17461:18;;17454:62;17548:2;17533:18;;17201:356::o;17912:401::-;18114:2;18096:21;;;18153:2;18133:18;;;18126:30;18192:34;18187:2;18172:18;;18165:62;-1:-1:-1;;;18258:2:1;18243:18;;18236:35;18303:3;18288:19;;17912:401::o;19669:980::-;19931:4;19979:3;19968:9;19964:19;20010:6;19999:9;19992:25;20036:2;20074:6;20069:2;20058:9;20054:18;20047:34;20117:3;20112:2;20101:9;20097:18;20090:31;20141:6;20176;20170:13;20207:6;20199;20192:22;20245:3;20234:9;20230:19;20223:26;;20284:2;20276:6;20272:15;20258:29;;20305:1;20315:195;20329:6;20326:1;20323:13;20315:195;;;20394:13;;-1:-1:-1;;;;;20390:39:1;20378:52;;20485:15;;;;20450:12;;;;20426:1;20344:9;20315:195;;;-1:-1:-1;;;;;;;20566:32:1;;;;20561:2;20546:18;;20539:60;-1:-1:-1;;;20630:3:1;20615:19;20608:35;20527:3;19669:980;-1:-1:-1;;;19669:980:1:o;21167:275::-;21238:2;21232:9;21303:2;21284:13;;-1:-1:-1;;21280:27:1;21268:40;;21338:18;21323:34;;21359:22;;;21320:62;21317:88;;;21385:18;;:::i;:::-;21421:2;21414:22;21167:275;;-1:-1:-1;21167:275:1:o;21447:183::-;21507:4;21540:18;21532:6;21529:30;21526:56;;;21562:18;;:::i;:::-;-1:-1:-1;21607:1:1;21603:14;21619:4;21599:25;;21447:183::o;21635:128::-;21675:3;21706:1;21702:6;21699:1;21696:13;21693:39;;;21712:18;;:::i;:::-;-1:-1:-1;21748:9:1;;21635:128::o;21768:120::-;21808:1;21834;21824:35;;21839:18;;:::i;:::-;-1:-1:-1;21873:9:1;;21768:120::o;21893:422::-;21982:1;22025:5;21982:1;22039:270;22060:7;22050:8;22047:21;22039:270;;;22119:4;22115:1;22111:6;22107:17;22101:4;22098:27;22095:53;;;22128:18;;:::i;:::-;22178:7;22168:8;22164:22;22161:55;;;22198:16;;;;22161:55;22277:22;;;;22237:15;;;;22039:270;;;22043:3;21893:422;;;;;:::o;22320:140::-;22378:5;22407:47;22448:4;22438:8;22434:19;22428:4;22514:5;22544:8;22534:80;;-1:-1:-1;22585:1:1;22599:5;;22534:80;22633:4;22623:76;;-1:-1:-1;22670:1:1;22684:5;;22623:76;22715:4;22733:1;22728:59;;;;22801:1;22796:130;;;;22708:218;;22728:59;22758:1;22749:10;;22772:5;;;22796:130;22833:3;22823:8;22820:17;22817:43;;;22840:18;;:::i;:::-;-1:-1:-1;;22896:1:1;22882:16;;22911:5;;22708:218;;23010:2;23000:8;22997:16;22991:3;22985:4;22982:13;22978:36;22972:2;22962:8;22959:16;22954:2;22948:4;22945:12;22941:35;22938:77;22935:159;;;-1:-1:-1;23047:19:1;;;23079:5;;22935:159;23126:34;23151:8;23145:4;23126:34;:::i;:::-;23196:6;23192:1;23188:6;23184:19;23175:7;23172:32;23169:58;;;23207:18;;:::i;:::-;23245:20;;22465:806;-1:-1:-1;;;22465:806:1:o;23276:168::-;23316:7;23382:1;23378;23374:6;23370:14;23367:1;23364:21;23359:1;23352:9;23345:17;23341:45;23338:71;;;23389:18;;:::i;:::-;-1:-1:-1;23429:9:1;;23276:168::o;23449:125::-;23489:4;23517:1;23514;23511:8;23508:34;;;23522:18;;:::i;:::-;-1:-1:-1;23559:9:1;;23449:125::o;23579:380::-;23658:1;23654:12;;;;23701;;;23722:61;;23776:4;23768:6;23764:17;23754:27;;23722:61;23829:2;23821:6;23818:14;23798:18;23795:38;23792:161;;;23875:10;23870:3;23866:20;23863:1;23856:31;23910:4;23907:1;23900:15;23938:4;23935:1;23928:15;23964:175;24001:3;24045:4;24038:5;24034:16;24074:4;24065:7;24062:17;24059:43;;;24082:18;;:::i;:::-;24131:1;24118:15;;23964:175;-1:-1:-1;;23964:175:1:o;24144:112::-;24176:1;24202;24192:35;;24207:18;;:::i;:::-;-1:-1:-1;24241:9:1;;24144:112::o;24261:127::-;24322:10;24317:3;24313:20;24310:1;24303:31;24353:4;24350:1;24343:15;24377:4;24374:1;24367:15;24393:127;24454:10;24449:3;24445:20;24442:1;24435:31;24485:4;24482:1;24475:15;24509:4;24506:1;24499:15;24525:127;24586:10;24581:3;24577:20;24574:1;24567:31;24617:4;24614:1;24607:15;24641:4;24638:1;24631:15;24657:127;24718:10;24713:3;24709:20;24706:1;24699:31;24749:4;24746:1;24739:15;24773:4;24770:1;24763:15;24789:127;24850:10;24845:3;24841:20;24838:1;24831:31;24881:4;24878:1;24871:15;24905:4;24902:1;24895:15;24921:127;24982:10;24977:3;24973:20;24970:1;24963:31;25013:4;25010:1;25003:15;25037:4;25034:1;25027:15;25053:131;-1:-1:-1;;;;;25128:31:1;;25118:42;;25108:70;;25174:1;25171;25164:12

Swarm Source

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