ETH Price: $3,189.88 (+1.07%)
 

Overview

Max Total Supply

420,690,000,000,000 MAD

Holders

139

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.91030749063441685 MAD

Value
$0.00
0x15bcc486701b63417d47fda2703590164becd5ca
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:
MAD

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-01
*/

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

pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

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

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

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

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

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

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

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

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

//Import from Openzeppelin Context, IERC20, IERC20Metadata, Address and Ownable.

// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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



// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)



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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)





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

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

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

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

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

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

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

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

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


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

interface IRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
}



/**
 * @dev This is the main part of the smart contract..
 * You need to define variables like initial status, wallets and percentages.     
 *
 * Tokens usually opt for a value of 18 decimals, imitating the relationship between
 * Ether and Wei. This is the value this {ERC20} uses, unless this value is overwritten.
 *
 * ABOUT PERCENTAGES: 
 * For the params of MaxHold, MaxBuy, MaxSell or MaxTx we use the following formula:
 * 
 * MaxHold = 1% = 1000     
 * MaxHold = 0.1% = 100
 * MaxHold = 0.01% = 10
 * MaxHold = 0.001% = 1
 * 
 * So, this is formula is an example to set a 1% of total supply as MaxHold.
 * totalSupply * MaxHold / 100000 = 1% of total supply
 * totalSupply * MaxHold / 100000 = 0.1% of total supply
 * 
 * NOTE: The Max's cant be higher than 1% and the Min's cant be lower than 0.001%.
 */
contract MAD is ERC20, Ownable {
    
    using Address for address payable;

    IRouter public router;
    address public pair;

    /** Trading **/
    bool private _liquidityMutex = false;
    bool public providingLiquidity = false;
    bool public tradingEnabled = false;    
    uint256 public genesisBlock;
    uint256 private deadline = 3;    
    
    /** Liquidity **/
    uint256 public tokenLiquidityThreshold;     

    /** Antibots & Antiwhale **/            
    uint256 public maxHold = 2000;  // 2% of total supply
    uint256 public maxBuy = 1000; // 1% of total supply
    uint256 public maxSell = 1000; // 1% of total supply
    uint256 public maxTx = 1000; // 1% of total supply

    /** Wallets **/
    address public marketingWallet = 0x0464048Cdd7C3d6e3E52CDe0Cf8953080e7604B7;    
	address public constant deadWallet = 0x000000000000000000000000000000000000dEaD;

    /** Taxes **/
    struct Taxes {
        uint256 marketing;
        uint256 liquidity;
        uint256 denominator;        
    }

    Taxes public taxes = Taxes(50, 0, 10);
    Taxes public sellTaxes = Taxes(400, 0, 10);

    uint256 private launchtax = 980;

    /** Exemptions **/
    mapping(address => bool) public exemptFee;

    mapping(address => bool) public isBlackListed;

    /** Modifiers **/
    modifier mutexLock() {
        if (!_liquidityMutex) {
            _liquidityMutex = true;
            _;
            _liquidityMutex = false;
        }
    }

    constructor(address _routerAddress, uint256 _initialSupply, string memory _name, string memory _symbol) ERC20(_name, _symbol) {

        _mint(msg.sender, _initialSupply * 1e18);
                        
        router = IRouter(_routerAddress);      
        pair = IFactory(router.factory()).createPair(address(this), router.WETH());

        /** Exemptions */
        exemptFee[msg.sender] = true; 
        exemptFee[address(this)] = true;
        exemptFee[marketingWallet] = true;
        exemptFee[deadWallet] = true;   

        /** Liquidity */
        tokenLiquidityThreshold = totalSupply() * 1 / 10000; // 0.01% of total supply

    }

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = allowance(sender, _msgSender());
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

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

    function _transfer(address sender, address recipient, uint256 amount) internal override {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            !isBlackListed[sender] && !isBlackListed[recipient],
            "You can't transfer tokens"
        );


        if (!exemptFee[sender] && !exemptFee[recipient]) {
            require(tradingEnabled, "Trading not enabled.");     

            // Check amount is not exceeding MaxTx
            uint256 maxTxAmount = totalSupply() * maxTx / 100000;
            require(amount <= maxTxAmount, "Transfer amount exceeds the maxTx.");                                                   

            // Check amount is not exceeding MaxHold
            if(recipient != pair) {
                uint256 maxHoldAmount = totalSupply() * maxHold / 100000;
                require(balanceOf(recipient) + amount <= maxHoldAmount, "Transfer amount exceeds the maxHold.");
        }     
        }                          

        // Calculate Fees
        uint256 feeSwap;
        uint256 feeSum;
        uint256 fee;
        uint256 _taxDenominator = sellTaxes.denominator;
        Taxes memory currentTaxes;

        bool useLaunchFee = !exemptFee[sender] &&
            !exemptFee[recipient] &&
            block.number < genesisBlock + deadline;
        
        if (_liquidityMutex || exemptFee[sender] || exemptFee[recipient])
            fee = 0;     
        //Sell                   
        else if (recipient == pair && !useLaunchFee) {
            // Check amount is not exceeding MaxSell
            uint256 maxSellAmount = totalSupply() * maxSell / 100000;
            require(amount <= maxSellAmount, "Transfer amount exceeds the maxSell.");
            // Calculate fees
            feeSwap = sellTaxes.marketing;
            feeSum = feeSwap;
            currentTaxes = sellTaxes;   
        
        //Buy
        } else if (sender == pair && !useLaunchFee) {             
            // Check amount is not exceeding MaxBuy
            uint256 maxBuyAmount = totalSupply() * maxBuy / 100000;
            require(amount <= maxBuyAmount, "Transfer amount exceeds the maxBuy.");
            // Calculate fees  
            feeSwap = taxes.marketing;
            feeSum = feeSwap;
            currentTaxes = taxes;
            _taxDenominator = taxes.denominator;      
            
        //All        
        } else if (!useLaunchFee) {             
            // Check amount is not exceeding MaxBuy
            uint256 maxTxAmount = totalSupply() * maxTx / 100000;
            require(amount <= maxTxAmount, "Transfer amount exceeds the maxTx.");
            // Calculate fees  
            feeSwap = taxes.marketing;
            feeSum = feeSwap;
            currentTaxes = taxes;
            _taxDenominator = taxes.denominator;                  
             
        //Launch
        } else if (useLaunchFee) {
            feeSwap = launchtax;
            feeSum = launchtax;
            isBlackListed[recipient] = true;
        }

        fee = ((amount * feeSum) / 100) / _taxDenominator;

        // Send fees if threshold has been reached
        // don't do this on buys, breaks swap
        if (providingLiquidity && sender != pair) handleFees(feeSwap, currentTaxes);

        //rest to recipient
        super._transfer(sender, recipient, amount - fee);
        if (fee > 0) {
            //send the fee to the contract
            if (feeSwap > 0) {
                uint256 feeAmount = ((amount * feeSwap) / 100)/_taxDenominator;
                super._transfer(sender, address(this), feeAmount);
            }

        }
    }

    function handleFees(uint256 feeswap, Taxes memory swapTaxes) private mutexLock {

        if(feeswap == 0){
            return;
        }	

        uint256 contractBalance = balanceOf(address(this));
        if (contractBalance >= tokenLiquidityThreshold) {
            if (tokenLiquidityThreshold > 1) {
                contractBalance = tokenLiquidityThreshold;
            }

            // Split the contract balance into halves
            uint256 denominator = feeswap * 2;
            uint256 tokensToAddLiquidityWith = (contractBalance * swapTaxes.liquidity) / denominator;
            uint256 toSwap = contractBalance - tokensToAddLiquidityWith;
            uint256 initialBalance = address(this).balance;

            swapTokensForETH(toSwap);

            uint256 deltaBalance = address(this).balance - initialBalance;
            uint256 unitBalance = deltaBalance / ((denominator - swapTaxes.liquidity) / swapTaxes.denominator);
            uint256 nativeCoinToAddLiquidityWith = (unitBalance * swapTaxes.liquidity) / swapTaxes.denominator;

            if (nativeCoinToAddLiquidityWith > 0) {                
                addLiquidity(tokensToAddLiquidityWith, nativeCoinToAddLiquidityWith);
            }

            uint256 marketingAmount = (unitBalance * 2 * swapTaxes.marketing) / swapTaxes.denominator;
            if (marketingAmount > 0) {
                payable(marketingWallet).sendValue(marketingAmount);
            }

        }
    }

    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] = router.WETH();

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

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

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

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

    function updateLiquidityProvide(bool state) external onlyOwner {
        //update liquidity providing state
        providingLiquidity = state;
    }

    function updateLiquidityTreshhold(uint256 new_amount) external onlyOwner {
        //update the treshhold
        tokenLiquidityThreshold = new_amount * 10**decimals();
    }

    function setBuyTaxes(
        uint256 _marketing,
        uint256 _liquidity
    ) external onlyOwner {
        require((_marketing + _liquidity ) <= 25 * taxes.denominator, "Must keep fees at 25% or less");
        taxes.marketing = _marketing;
        taxes.liquidity = _liquidity;
    }

    function setSellTaxes(
        uint256 _marketing,
        uint256 _liquidity
    ) external onlyOwner {
        require((_marketing + _liquidity ) <= 35 * sellTaxes.denominator, "Must keep fees at 35% or less");
        sellTaxes.marketing = _marketing;
        sellTaxes.liquidity = _liquidity;
    }

    function setMaxTx(uint256 _maxTx) external onlyOwner {                
        require(_maxTx <= 2000, "Max Tx must be at most 2% of total supply");
        require(_maxTx >= 1,  "Max Tx must be at less 0.001% of total supply");
        maxTx = _maxTx;
    }
    
    function setMaxHold(uint256 _maxHold) external onlyOwner {                
        require(_maxHold <= 2000, "Max hold must be at most 2% of total supply");
        require(_maxHold >= 1,  "Max hold must be at less 0.001% of total supply");
        maxHold = _maxHold;
    }

    function setMaxBuy(uint256 _maxBuy) external onlyOwner {                
        require(_maxBuy <= 2000, "Max buy must be at most 2% of total supply");
        require(_maxBuy >= 1,  "Max buy must be at less 0.001% of total supply");
        maxBuy = _maxBuy;
    }

    function setMaxSell(uint256 _maxSell) external onlyOwner {                
        require(_maxSell <= 2000, "Max sell must be at most 2% of total supply");
        require(_maxSell >= 1,  "Max sell must be at less 0.001% of total supply");
        maxSell = _maxSell;
    }

    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "Trading is already enabled");
        tradingEnabled = true;
        providingLiquidity = true;
        genesisBlock = block.number;
    }

    function updatedeadline(uint256 _deadline) external onlyOwner {
        require(!tradingEnabled, "Can't change when trading has started");
        require (_deadline < 5,"Deadline should be less than 5");
        deadline = _deadline;
    }

    function updateMarketingWallet(address _wallet) external onlyOwner {
        marketingWallet = _wallet;
    }

    function updateIsBlackListed(address account, bool state) external onlyOwner {
        isBlackListed[account] = state;
    }

    function bulkIsBlackListed(address[] memory accounts, bool state) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            isBlackListed[accounts[i]] = state;
        }
    }

    function updateExemptFee(address _address, bool state) external onlyOwner {
        exemptFee[_address] = state;
    }

    function bulkExemptFee(address[] memory accounts, bool state) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            exemptFee[accounts[i]] = state;
        }
    }

    function rescueETH(uint256 weiAmount) external onlyOwner {
        payable(msg.sender).transfer(weiAmount);
    }

    function rescueIERC20(address tokenAdd, uint256 amount) external onlyOwner {
        IERC20(tokenAdd).transfer(msg.sender, amount);
    }

    // fallbacks
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"bulkExemptFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"bulkIsBlackListed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"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":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlackListed","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":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providingLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAdd","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueIERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxHold","type":"uint256"}],"name":"setMaxHold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSell","type":"uint256"}],"name":"setMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTx","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxes","outputs":[{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLiquidityThreshold","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":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"updateExemptFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"updateIsBlackListed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"updateLiquidityProvide","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"new_amount","type":"uint256"}],"name":"updateLiquidityTreshhold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"updatedeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600760146101000a81548160ff0219169083151502179055506000600760156101000a81548160ff0219169083151502179055506000600760166101000a81548160ff02191690831515021790555060036009556107d0600b556103e8600c556103e8600d556103e8600e55730464048cdd7c3d6e3e52cde0cf8953080e7604b7600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180606001604052806032815260200160008152602001600a815250601060008201518160000155602082015181600101556040820151816002015550506040518060600160405280610190815260200160008152602001600a815250601360008201518160000155602082015181600101556040820151816002015550506103d46016553480156200015b57600080fd5b5060405162005b9038038062005b90833981810160405281019062000181919062000a5d565b8181816003908162000194919062000d4e565b508060049081620001a6919062000d4e565b505050620001c9620001bd620005db60201b60201c565b620005e360201b60201c565b620001f033670de0b6b3a764000085620001e4919062000e64565b620006a960201b60201c565b83600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200029f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c5919062000eaf565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200034f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000375919062000eaf565b6040518363ffffffff1660e01b81526004016200039492919062000ef2565b6020604051808303816000875af1158015620003b4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003da919062000eaf565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160176000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016017600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506127106001620005b36200081660201b60201c565b620005bf919062000e64565b620005cb919062000f4e565b600a819055505050505062001072565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200071b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007129062000fe7565b60405180910390fd5b6200072f600083836200082060201b60201c565b806002600082825462000743919062001009565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620007f6919062001055565b60405180910390a362000812600083836200082560201b60201c565b5050565b6000600254905090565b505050565b505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200086b826200083e565b9050919050565b6200087d816200085e565b81146200088957600080fd5b50565b6000815190506200089d8162000872565b92915050565b6000819050919050565b620008b881620008a3565b8114620008c457600080fd5b50565b600081519050620008d881620008ad565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200093382620008e8565b810181811067ffffffffffffffff82111715620009555762000954620008f9565b5b80604052505050565b60006200096a6200082a565b905062000978828262000928565b919050565b600067ffffffffffffffff8211156200099b576200099a620008f9565b5b620009a682620008e8565b9050602081019050919050565b60005b83811015620009d3578082015181840152602081019050620009b6565b60008484015250505050565b6000620009f6620009f0846200097d565b6200095e565b90508281526020810184848401111562000a155762000a14620008e3565b5b62000a22848285620009b3565b509392505050565b600082601f83011262000a425762000a41620008de565b5b815162000a54848260208601620009df565b91505092915050565b6000806000806080858703121562000a7a5762000a7962000834565b5b600062000a8a878288016200088c565b945050602062000a9d87828801620008c7565b935050604085015167ffffffffffffffff81111562000ac15762000ac062000839565b5b62000acf8782880162000a2a565b925050606085015167ffffffffffffffff81111562000af35762000af262000839565b5b62000b018782880162000a2a565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b6057607f821691505b60208210810362000b765762000b7562000b18565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000be07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ba1565b62000bec868362000ba1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000c2f62000c2962000c2384620008a3565b62000c04565b620008a3565b9050919050565b6000819050919050565b62000c4b8362000c0e565b62000c6362000c5a8262000c36565b84845462000bae565b825550505050565b600090565b62000c7a62000c6b565b62000c8781848462000c40565b505050565b5b8181101562000caf5762000ca360008262000c70565b60018101905062000c8d565b5050565b601f82111562000cfe5762000cc88162000b7c565b62000cd38462000b91565b8101602085101562000ce3578190505b62000cfb62000cf28562000b91565b83018262000c8c565b50505b505050565b600082821c905092915050565b600062000d236000198460080262000d03565b1980831691505092915050565b600062000d3e838362000d10565b9150826002028217905092915050565b62000d598262000b0d565b67ffffffffffffffff81111562000d755762000d74620008f9565b5b62000d81825462000b47565b62000d8e82828562000cb3565b600060209050601f83116001811462000dc6576000841562000db1578287015190505b62000dbd858262000d30565b86555062000e2d565b601f19841662000dd68662000b7c565b60005b8281101562000e005784890151825560018201915060208501945060208101905062000dd9565b8683101562000e20578489015162000e1c601f89168262000d10565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e7182620008a3565b915062000e7e83620008a3565b925082820262000e8e81620008a3565b9150828204841483151762000ea85762000ea762000e35565b5b5092915050565b60006020828403121562000ec85762000ec762000834565b5b600062000ed8848285016200088c565b91505092915050565b62000eec816200085e565b82525050565b600060408201905062000f09600083018562000ee1565b62000f18602083018462000ee1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062000f5b82620008a3565b915062000f6883620008a3565b92508262000f7b5762000f7a62000f1f565b5b828204905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000fcf601f8362000f86565b915062000fdc8262000f97565b602082019050919050565b60006020820190508181036000830152620010028162000fc0565b9050919050565b60006200101682620008a3565b91506200102383620008a3565b92508282019050808211156200103e576200103d62000e35565b5b92915050565b6200104f81620008a3565b82525050565b60006020820190506200106c600083018462001044565b92915050565b614b0e80620010826000396000f3fe60806040526004361061028c5760003560e01c80638da5cb5b1161015a578063bc337182116100c1578063ef998cf01161007a578063ef998cf0146109db578063f2fde38b14610a04578063f53bc83514610a2d578063f66895a314610a56578063f887ea4014610a83578063fbe6324e14610aae57610293565b8063bc337182146108a9578063c5d32bb2146108d2578063db97cf431461090f578063dd62ed3e14610938578063e47d606014610975578063edaa1168146109b257610293565b8063a457c2d711610113578063a457c2d714610787578063a8aa1b31146107c4578063a9059cbb146107ef578063aa35822c1461082c578063aacebbe314610855578063b8eb35461461087e57610293565b80638da5cb5b1461068b57806395d89b41146106b65780639a6c614e146106e15780639e252f001461070c578063a0aaaf7614610735578063a11a16821461075e57610293565b806339509351116101fe578063715018a6116101b7578063715018a6146105af578063728f8eea146105c65780637437681e146105f357806375f0a8741461061e57806385141a77146106495780638a8c523c1461067457610293565b8063395093511461048b57806342b6fa11146104c85780634ada218b146104f15780634cdc9c631461051c57806370a082311461054757806370db69d61461058457610293565b806318160ddd1161025057806318160ddd1461037d57806323b872dd146103a8578063313ce567146103e557806331cda5f514610410578063355496ca1461043957806336e635fb1461046257610293565b806306fdde0314610298578063095ea7b3146102c35780630e375a5c146103005780631340538f146103295780631675d8021461035257610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610ad9565b6040516102ba9190612dd7565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612ea1565b610b6b565b6040516102f79190612efc565b60405180910390f35b34801561030c57600080fd5b506103276004803603810190610322919061308b565b610b89565b005b34801561033557600080fd5b50610350600480360381019061034b91906130e7565b610c26565b005b34801561035e57600080fd5b50610367610c4b565b6040516103749190613123565b60405180910390f35b34801561038957600080fd5b50610392610c51565b60405161039f9190613123565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061313e565b610c5b565b6040516103dc9190612efc565b60405180910390f35b3480156103f157600080fd5b506103fa610ce9565b60405161040791906131ad565b60405180910390f35b34801561041c57600080fd5b506104376004803603810190610432919061308b565b610cf2565b005b34801561044557600080fd5b50610460600480360381019061045b91906131c8565b610d8f565b005b34801561046e57600080fd5b50610489600480360381019061048491906131c8565b610df2565b005b34801561049757600080fd5b506104b260048036038101906104ad9190612ea1565b610e55565b6040516104bf9190612efc565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190613208565b610e8c565b005b3480156104fd57600080fd5b50610506610ebc565b6040516105139190612efc565b60405180910390f35b34801561052857600080fd5b50610531610ecf565b60405161053e9190613123565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613235565b610ed5565b60405161057b9190613123565b60405180910390f35b34801561059057600080fd5b50610599610f1d565b6040516105a69190613123565b60405180910390f35b3480156105bb57600080fd5b506105c4610f23565b005b3480156105d257600080fd5b506105db610f37565b6040516105ea93929190613262565b60405180910390f35b3480156105ff57600080fd5b50610608610f4f565b6040516106159190613123565b60405180910390f35b34801561062a57600080fd5b50610633610f55565b60405161064091906132a8565b60405180910390f35b34801561065557600080fd5b5061065e610f7b565b60405161066b91906132a8565b60405180910390f35b34801561068057600080fd5b50610689610f81565b005b34801561069757600080fd5b506106a0611018565b6040516106ad91906132a8565b60405180910390f35b3480156106c257600080fd5b506106cb611042565b6040516106d89190612dd7565b60405180910390f35b3480156106ed57600080fd5b506106f66110d4565b6040516107039190613123565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613208565b6110da565b005b34801561074157600080fd5b5061075c60048036038101906107579190613208565b61112c565b005b34801561076a57600080fd5b50610785600480360381019061078091906132c3565b6111c7565b005b34801561079357600080fd5b506107ae60048036038101906107a99190612ea1565b611246565b6040516107bb9190612efc565b60405180910390f35b3480156107d057600080fd5b506107d96112bd565b6040516107e691906132a8565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190612ea1565b6112e3565b6040516108239190612efc565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e91906132c3565b6112fa565b005b34801561086157600080fd5b5061087c60048036038101906108779190613235565b611379565b005b34801561088a57600080fd5b506108936113c5565b6040516108a09190613123565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190613208565b6113cb565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613235565b611466565b6040516109069190612efc565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190612ea1565b611486565b005b34801561094457600080fd5b5061095f600480360381019061095a9190613303565b611511565b60405161096c9190613123565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613235565b611598565b6040516109a99190612efc565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d49190613208565b6115b8565b005b3480156109e757600080fd5b50610a0260048036038101906109fd9190613208565b61165d565b005b348015610a1057600080fd5b50610a2b6004803603810190610a269190613235565b6116f8565b005b348015610a3957600080fd5b50610a546004803603810190610a4f9190613208565b61177b565b005b348015610a6257600080fd5b50610a6b611816565b604051610a7a93929190613262565b60405180910390f35b348015610a8f57600080fd5b50610a9861182e565b604051610aa591906133a2565b60405180910390f35b348015610aba57600080fd5b50610ac3611854565b604051610ad09190612efc565b60405180910390f35b606060038054610ae8906133ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610b14906133ec565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b6000610b7f610b78611867565b848461186f565b6001905092915050565b610b91611a38565b60005b8251811015610c21578160176000858481518110610bb557610bb461341d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c199061347b565b915050610b94565b505050565b610c2e611a38565b80600760156101000a81548160ff02191690831515021790555050565b600a5481565b6000600254905090565b6000610c68848484611ab6565b6000610c7b85610c76611867565b611511565b905082811015610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790613535565b60405180910390fd5b610cdd85610ccc611867565b8584610cd89190613555565b61186f565b60019150509392505050565b60006012905090565b610cfa611a38565b60005b8251811015610d8a578160186000858481518110610d1e57610d1d61341d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d829061347b565b915050610cfd565b505050565b610d97611a38565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610dfa611a38565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080610e60611867565b9050610e81818585610e728589611511565b610e7c9190613589565b61186f565b600191505092915050565b610e94611a38565b610e9c610ce9565b600a610ea891906136f0565b81610eb3919061373b565b600a8190555050565b600760169054906101000a900460ff1681565b60085481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c5481565b610f2b611a38565b610f3560006123f3565b565b60108060000154908060010154908060020154905083565b600e5481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61dead81565b610f89611a38565b600760169054906101000a900460ff1615610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd0906137c9565b60405180910390fd5b6001600760166101000a81548160ff0219169083151502179055506001600760156101000a81548160ff02191690831515021790555043600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611051906133ec565b80601f016020809104026020016040519081016040528092919081815260200182805461107d906133ec565b80156110ca5780601f1061109f576101008083540402835291602001916110ca565b820191906000526020600020905b8154815290600101906020018083116110ad57829003601f168201915b5050505050905090565b600b5481565b6110e2611a38565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611128573d6000803e3d6000fd5b5050565b611134611a38565b6107d0811115611179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111709061385b565b60405180910390fd5b60018110156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b4906138ed565b60405180910390fd5b80600b8190555050565b6111cf611a38565b60136002015460236111e1919061373b565b81836111ed9190613589565b111561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590613959565b60405180910390fd5b81601360000181905550806013600101819055505050565b600080611251611867565b9050600061125f8286611511565b9050838110156112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b906139eb565b60405180910390fd5b6112b1828686840361186f565b60019250505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006112f0338484611ab6565b6001905092915050565b611302611a38565b6010600201546019611314919061373b565b81836113209190613589565b1115611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613a57565b60405180910390fd5b81601060000181905550806010600101819055505050565b611381611a38565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6113d3611a38565b6107d0811115611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90613ae9565b60405180910390fd5b600181101561145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613b7b565b60405180910390fd5b80600e8190555050565b60176020528060005260406000206000915054906101000a900460ff1681565b61148e611a38565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114c9929190613b9b565b6020604051808303816000875af11580156114e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150c9190613bd9565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60186020528060005260406000206000915054906101000a900460ff1681565b6115c0611a38565b600760169054906101000a900460ff1615611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790613c78565b60405180910390fd5b60058110611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613ce4565b60405180910390fd5b8060098190555050565b611665611a38565b6107d08111156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613d76565b60405180910390fd5b60018110156116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613e08565b60405180910390fd5b80600d8190555050565b611700611a38565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690613e9a565b60405180910390fd5b611778816123f3565b50565b611783611a38565b6107d08111156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90613f2c565b60405180910390fd5b600181101561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613fbe565b60405180910390fd5b80600c8190555050565b60138060000154908060010154908060020154905083565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760159054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614050565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611944906140e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a2b9190613123565b60405180910390a3505050565b611a40611867565b73ffffffffffffffffffffffffffffffffffffffff16611a5e611018565b73ffffffffffffffffffffffffffffffffffffffff1614611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab9061414e565b60405180910390fd5b565b60008111611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af0906141e0565b60405180910390fd5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611b9d5750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd39061424c565b60405180910390fd5b601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611c805750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e1457600760169054906101000a900460ff16611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb906142b8565b60405180910390fd5b6000620186a0600e54611ce5610c51565b611cef919061373b565b611cf99190614307565b905080821115611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d35906143aa565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e12576000620186a0600b54611da4610c51565b611dae919061373b565b611db89190614307565b90508083611dc586610ed5565b611dcf9190613589565b1115611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e079061443c565b60405180910390fd5b505b505b6000806000806013600201549050611e2a612d26565b6000601760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611ed05750601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611eea5750600954600854611ee79190613589565b43105b9050600760149054906101000a900460ff1680611f505750601760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80611fa45750601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611fb257600093506122ec565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614801561200d575080155b156120ba576000620186a0600d54612023610c51565b61202d919061373b565b6120379190614307565b90508088111561207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906144ce565b60405180910390fd5b6013600001549650869550601360405180606001604052908160008201548152602001600182015481526020016002820154815250509250506122eb565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16148015612115575080155b156121ca576000620186a0600c5461212b610c51565b612135919061373b565b61213f9190614307565b905080881115612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90614560565b60405180910390fd5b60106000015496508695506010604051806060016040529081600082015481526020016001820154815260200160028201548152505092506010600201549350506122ea565b8061227f576000620186a0600e546121e0610c51565b6121ea919061373b565b6121f49190614307565b905080881115612239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612230906143aa565b60405180910390fd5b60106000015496508695506010604051806060016040529081600082015481526020016001820154815260200160028201548152505092506010600201549350506122e9565b80156122e857601654955060165494506001601860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5b5b5b82606486896122fb919061373b565b6123059190614307565b61230f9190614307565b9350600760159054906101000a900460ff16801561237b5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b1561238b5761238a86836124b9565b5b6123a18989868a61239c9190613555565b61268a565b60008411156123e85760008611156123e7576000836064888a6123c4919061373b565b6123ce9190614307565b6123d89190614307565b90506123e58a308361268a565b505b5b505050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600760149054906101000a900460ff16612686576001600760146101000a81548160ff021916908315150217905550600082031561266a5760006124fc30610ed5565b9050600a548110612668576001600a54111561251857600a5490505b6000600284612527919061373b565b905060008184602001518461253c919061373b565b6125469190614307565b9050600081846125569190613555565b9050600047905061256682612900565b600081476125749190613555565b90506000876040015188602001518761258d9190613555565b6125979190614307565b826125a29190614307565b9050600088604001518960200151836125bb919061373b565b6125c59190614307565b905060008111156125db576125da8682612b43565b5b600089604001518a600001516002856125f4919061373b565b6125fe919061373b565b6126089190614307565b9050600081111561265f5761265e81600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c2890919063ffffffff16565b5b50505050505050505b505b6000600760146101000a81548160ff0219169083151502179055505b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f0906145f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275f90614684565b60405180910390fd5b612773838383612d1c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090614716565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128e79190613123565b60405180910390a36128fa848484612d21565b50505050565b6000600267ffffffffffffffff81111561291d5761291c612f1c565b5b60405190808252806020026020018201604052801561294b5781602001602082028036833780820191505090505b50905030816000815181106129635761296261341d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e919061474b565b81600181518110612a4257612a4161341d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612aa930600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461186f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612b0d959493929190614871565b600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b505050505050565b612b7030600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461186f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612bbc611018565b426040518863ffffffff1660e01b8152600401612bde969594939291906148cb565b60606040518083038185885af1158015612bfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c219190614941565b5050505050565b80471015612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906149e0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c9190614a31565b60006040518083038185875af1925050503d8060008114612cce576040519150601f19603f3d011682016040523d82523d6000602084013e612cd3565b606091505b5050905080612d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0e90614ab8565b60405180910390fd5b505050565b505050565b505050565b60405180606001604052806000815260200160008152602001600081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d81578082015181840152602081019050612d66565b60008484015250505050565b6000601f19601f8301169050919050565b6000612da982612d47565b612db38185612d52565b9350612dc3818560208601612d63565b612dcc81612d8d565b840191505092915050565b60006020820190508181036000830152612df18184612d9e565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3882612e0d565b9050919050565b612e4881612e2d565b8114612e5357600080fd5b50565b600081359050612e6581612e3f565b92915050565b6000819050919050565b612e7e81612e6b565b8114612e8957600080fd5b50565b600081359050612e9b81612e75565b92915050565b60008060408385031215612eb857612eb7612e03565b5b6000612ec685828601612e56565b9250506020612ed785828601612e8c565b9150509250929050565b60008115159050919050565b612ef681612ee1565b82525050565b6000602082019050612f116000830184612eed565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f5482612d8d565b810181811067ffffffffffffffff82111715612f7357612f72612f1c565b5b80604052505050565b6000612f86612df9565b9050612f928282612f4b565b919050565b600067ffffffffffffffff821115612fb257612fb1612f1c565b5b602082029050602081019050919050565b600080fd5b6000612fdb612fd684612f97565b612f7c565b90508083825260208201905060208402830185811115612ffe57612ffd612fc3565b5b835b8181101561302757806130138882612e56565b845260208401935050602081019050613000565b5050509392505050565b600082601f83011261304657613045612f17565b5b8135613056848260208601612fc8565b91505092915050565b61306881612ee1565b811461307357600080fd5b50565b6000813590506130858161305f565b92915050565b600080604083850312156130a2576130a1612e03565b5b600083013567ffffffffffffffff8111156130c0576130bf612e08565b5b6130cc85828601613031565b92505060206130dd85828601613076565b9150509250929050565b6000602082840312156130fd576130fc612e03565b5b600061310b84828501613076565b91505092915050565b61311d81612e6b565b82525050565b60006020820190506131386000830184613114565b92915050565b60008060006060848603121561315757613156612e03565b5b600061316586828701612e56565b935050602061317686828701612e56565b925050604061318786828701612e8c565b9150509250925092565b600060ff82169050919050565b6131a781613191565b82525050565b60006020820190506131c2600083018461319e565b92915050565b600080604083850312156131df576131de612e03565b5b60006131ed85828601612e56565b92505060206131fe85828601613076565b9150509250929050565b60006020828403121561321e5761321d612e03565b5b600061322c84828501612e8c565b91505092915050565b60006020828403121561324b5761324a612e03565b5b600061325984828501612e56565b91505092915050565b60006060820190506132776000830186613114565b6132846020830185613114565b6132916040830184613114565b949350505050565b6132a281612e2d565b82525050565b60006020820190506132bd6000830184613299565b92915050565b600080604083850312156132da576132d9612e03565b5b60006132e885828601612e8c565b92505060206132f985828601612e8c565b9150509250929050565b6000806040838503121561331a57613319612e03565b5b600061332885828601612e56565b925050602061333985828601612e56565b9150509250929050565b6000819050919050565b600061336861336361335e84612e0d565b613343565b612e0d565b9050919050565b600061337a8261334d565b9050919050565b600061338c8261336f565b9050919050565b61339c81613381565b82525050565b60006020820190506133b76000830184613393565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340457607f821691505b602082108103613417576134166133bd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061348682612e6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134b8576134b761344c565b5b600182019050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061351f602883612d52565b915061352a826134c3565b604082019050919050565b6000602082019050818103600083015261354e81613512565b9050919050565b600061356082612e6b565b915061356b83612e6b565b92508282039050818111156135835761358261344c565b5b92915050565b600061359482612e6b565b915061359f83612e6b565b92508282019050808211156135b7576135b661344c565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115613614578086048111156135f0576135ef61344c565b5b60018516156135ff5780820291505b808102905061360d856135bd565b94506135d4565b94509492505050565b60008261362d57600190506136e9565b8161363b57600090506136e9565b8160018114613651576002811461365b5761368a565b60019150506136e9565b60ff84111561366d5761366c61344c565b5b8360020a9150848211156136845761368361344c565b5b506136e9565b5060208310610133831016604e8410600b84101617156136bf5782820a9050838111156136ba576136b961344c565b5b6136e9565b6136cc84848460016135ca565b925090508184048111156136e3576136e261344c565b5b81810290505b9392505050565b60006136fb82612e6b565b915061370683613191565b92506137337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461361d565b905092915050565b600061374682612e6b565b915061375183612e6b565b925082820261375f81612e6b565b915082820484148315176137765761377561344c565b5b5092915050565b7f54726164696e6720697320616c726561647920656e61626c6564000000000000600082015250565b60006137b3601a83612d52565b91506137be8261377d565b602082019050919050565b600060208201905081810360008301526137e2816137a6565b9050919050565b7f4d617820686f6c64206d757374206265206174206d6f7374203225206f66207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b6000613845602b83612d52565b9150613850826137e9565b604082019050919050565b6000602082019050818103600083015261387481613838565b9050919050565b7f4d617820686f6c64206d757374206265206174206c65737320302e303031252060008201527f6f6620746f74616c20737570706c790000000000000000000000000000000000602082015250565b60006138d7602f83612d52565b91506138e28261387b565b604082019050919050565b60006020820190508181036000830152613906816138ca565b9050919050565b7f4d757374206b656570206665657320617420333525206f72206c657373000000600082015250565b6000613943601d83612d52565b915061394e8261390d565b602082019050919050565b6000602082019050818103600083015261397281613936565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006139d5602583612d52565b91506139e082613979565b604082019050919050565b60006020820190508181036000830152613a04816139c8565b9050919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000613a41601d83612d52565b9150613a4c82613a0b565b602082019050919050565b60006020820190508181036000830152613a7081613a34565b9050919050565b7f4d6178205478206d757374206265206174206d6f7374203225206f6620746f7460008201527f616c20737570706c790000000000000000000000000000000000000000000000602082015250565b6000613ad3602983612d52565b9150613ade82613a77565b604082019050919050565b60006020820190508181036000830152613b0281613ac6565b9050919050565b7f4d6178205478206d757374206265206174206c65737320302e30303125206f6660008201527f20746f74616c20737570706c7900000000000000000000000000000000000000602082015250565b6000613b65602d83612d52565b9150613b7082613b09565b604082019050919050565b60006020820190508181036000830152613b9481613b58565b9050919050565b6000604082019050613bb06000830185613299565b613bbd6020830184613114565b9392505050565b600081519050613bd38161305f565b92915050565b600060208284031215613bef57613bee612e03565b5b6000613bfd84828501613bc4565b91505092915050565b7f43616e2774206368616e6765207768656e2074726164696e672068617320737460008201527f6172746564000000000000000000000000000000000000000000000000000000602082015250565b6000613c62602583612d52565b9150613c6d82613c06565b604082019050919050565b60006020820190508181036000830152613c9181613c55565b9050919050565b7f446561646c696e652073686f756c64206265206c657373207468616e20350000600082015250565b6000613cce601e83612d52565b9150613cd982613c98565b602082019050919050565b60006020820190508181036000830152613cfd81613cc1565b9050919050565b7f4d61782073656c6c206d757374206265206174206d6f7374203225206f66207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b6000613d60602b83612d52565b9150613d6b82613d04565b604082019050919050565b60006020820190508181036000830152613d8f81613d53565b9050919050565b7f4d61782073656c6c206d757374206265206174206c65737320302e303031252060008201527f6f6620746f74616c20737570706c790000000000000000000000000000000000602082015250565b6000613df2602f83612d52565b9150613dfd82613d96565b604082019050919050565b60006020820190508181036000830152613e2181613de5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e84602683612d52565b9150613e8f82613e28565b604082019050919050565b60006020820190508181036000830152613eb381613e77565b9050919050565b7f4d617820627579206d757374206265206174206d6f7374203225206f6620746f60008201527f74616c20737570706c7900000000000000000000000000000000000000000000602082015250565b6000613f16602a83612d52565b9150613f2182613eba565b604082019050919050565b60006020820190508181036000830152613f4581613f09565b9050919050565b7f4d617820627579206d757374206265206174206c65737320302e30303125206f60008201527f6620746f74616c20737570706c79000000000000000000000000000000000000602082015250565b6000613fa8602e83612d52565b9150613fb382613f4c565b604082019050919050565b60006020820190508181036000830152613fd781613f9b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061403a602483612d52565b915061404582613fde565b604082019050919050565b600060208201905081810360008301526140698161402d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006140cc602283612d52565b91506140d782614070565b604082019050919050565b600060208201905081810360008301526140fb816140bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614138602083612d52565b915061414382614102565b602082019050919050565b600060208201905081810360008301526141678161412b565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006141ca602983612d52565b91506141d58261416e565b604082019050919050565b600060208201905081810360008301526141f9816141bd565b9050919050565b7f596f752063616e2774207472616e7366657220746f6b656e7300000000000000600082015250565b6000614236601983612d52565b915061424182614200565b602082019050919050565b6000602082019050818103600083015261426581614229565b9050919050565b7f54726164696e67206e6f7420656e61626c65642e000000000000000000000000600082015250565b60006142a2601483612d52565b91506142ad8261426c565b602082019050919050565b600060208201905081810360008301526142d181614295565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061431282612e6b565b915061431d83612e6b565b92508261432d5761432c6142d8565b5b828204905092915050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f782e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614394602283612d52565b915061439f82614338565b604082019050919050565b600060208201905081810360008301526143c381614387565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61784860008201527f6f6c642e00000000000000000000000000000000000000000000000000000000602082015250565b6000614426602483612d52565b9150614431826143ca565b604082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785360008201527f656c6c2e00000000000000000000000000000000000000000000000000000000602082015250565b60006144b8602483612d52565b91506144c38261445c565b604082019050919050565b600060208201905081810360008301526144e7816144ab565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61784260008201527f75792e0000000000000000000000000000000000000000000000000000000000602082015250565b600061454a602383612d52565b9150614555826144ee565b604082019050919050565b600060208201905081810360008301526145798161453d565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006145dc602583612d52565b91506145e782614580565b604082019050919050565b6000602082019050818103600083015261460b816145cf565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061466e602383612d52565b915061467982614612565b604082019050919050565b6000602082019050818103600083015261469d81614661565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614700602683612d52565b915061470b826146a4565b604082019050919050565b6000602082019050818103600083015261472f816146f3565b9050919050565b60008151905061474581612e3f565b92915050565b60006020828403121561476157614760612e03565b5b600061476f84828501614736565b91505092915050565b6000819050919050565b600061479d61479861479384614778565b613343565b612e6b565b9050919050565b6147ad81614782565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147e881612e2d565b82525050565b60006147fa83836147df565b60208301905092915050565b6000602082019050919050565b600061481e826147b3565b61482881856147be565b9350614833836147cf565b8060005b8381101561486457815161484b88826147ee565b975061485683614806565b925050600181019050614837565b5085935050505092915050565b600060a0820190506148866000830188613114565b61489360208301876147a4565b81810360408301526148a58186614813565b90506148b46060830185613299565b6148c16080830184613114565b9695505050505050565b600060c0820190506148e06000830189613299565b6148ed6020830188613114565b6148fa60408301876147a4565b61490760608301866147a4565b6149146080830185613299565b61492160a0830184613114565b979650505050505050565b60008151905061493b81612e75565b92915050565b60008060006060848603121561495a57614959612e03565b5b60006149688682870161492c565b93505060206149798682870161492c565b925050604061498a8682870161492c565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006149ca601d83612d52565b91506149d582614994565b602082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b600081905092915050565b50565b6000614a1b600083614a00565b9150614a2682614a0b565b600082019050919050565b6000614a3c82614a0e565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614aa2603a83612d52565b9150614aad82614a46565b604082019050919050565b60006020820190508181036000830152614ad181614a95565b905091905056fea26469706673582212207c44413345392e5c7f0eb0b448a247f77bd304d0617c53998a0b05d7c947a92e64736f6c634300081200330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000017e9d8602b400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000034d4144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d41440000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80638da5cb5b1161015a578063bc337182116100c1578063ef998cf01161007a578063ef998cf0146109db578063f2fde38b14610a04578063f53bc83514610a2d578063f66895a314610a56578063f887ea4014610a83578063fbe6324e14610aae57610293565b8063bc337182146108a9578063c5d32bb2146108d2578063db97cf431461090f578063dd62ed3e14610938578063e47d606014610975578063edaa1168146109b257610293565b8063a457c2d711610113578063a457c2d714610787578063a8aa1b31146107c4578063a9059cbb146107ef578063aa35822c1461082c578063aacebbe314610855578063b8eb35461461087e57610293565b80638da5cb5b1461068b57806395d89b41146106b65780639a6c614e146106e15780639e252f001461070c578063a0aaaf7614610735578063a11a16821461075e57610293565b806339509351116101fe578063715018a6116101b7578063715018a6146105af578063728f8eea146105c65780637437681e146105f357806375f0a8741461061e57806385141a77146106495780638a8c523c1461067457610293565b8063395093511461048b57806342b6fa11146104c85780634ada218b146104f15780634cdc9c631461051c57806370a082311461054757806370db69d61461058457610293565b806318160ddd1161025057806318160ddd1461037d57806323b872dd146103a8578063313ce567146103e557806331cda5f514610410578063355496ca1461043957806336e635fb1461046257610293565b806306fdde0314610298578063095ea7b3146102c35780630e375a5c146103005780631340538f146103295780631675d8021461035257610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610ad9565b6040516102ba9190612dd7565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190612ea1565b610b6b565b6040516102f79190612efc565b60405180910390f35b34801561030c57600080fd5b506103276004803603810190610322919061308b565b610b89565b005b34801561033557600080fd5b50610350600480360381019061034b91906130e7565b610c26565b005b34801561035e57600080fd5b50610367610c4b565b6040516103749190613123565b60405180910390f35b34801561038957600080fd5b50610392610c51565b60405161039f9190613123565b60405180910390f35b3480156103b457600080fd5b506103cf60048036038101906103ca919061313e565b610c5b565b6040516103dc9190612efc565b60405180910390f35b3480156103f157600080fd5b506103fa610ce9565b60405161040791906131ad565b60405180910390f35b34801561041c57600080fd5b506104376004803603810190610432919061308b565b610cf2565b005b34801561044557600080fd5b50610460600480360381019061045b91906131c8565b610d8f565b005b34801561046e57600080fd5b50610489600480360381019061048491906131c8565b610df2565b005b34801561049757600080fd5b506104b260048036038101906104ad9190612ea1565b610e55565b6040516104bf9190612efc565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190613208565b610e8c565b005b3480156104fd57600080fd5b50610506610ebc565b6040516105139190612efc565b60405180910390f35b34801561052857600080fd5b50610531610ecf565b60405161053e9190613123565b60405180910390f35b34801561055357600080fd5b5061056e60048036038101906105699190613235565b610ed5565b60405161057b9190613123565b60405180910390f35b34801561059057600080fd5b50610599610f1d565b6040516105a69190613123565b60405180910390f35b3480156105bb57600080fd5b506105c4610f23565b005b3480156105d257600080fd5b506105db610f37565b6040516105ea93929190613262565b60405180910390f35b3480156105ff57600080fd5b50610608610f4f565b6040516106159190613123565b60405180910390f35b34801561062a57600080fd5b50610633610f55565b60405161064091906132a8565b60405180910390f35b34801561065557600080fd5b5061065e610f7b565b60405161066b91906132a8565b60405180910390f35b34801561068057600080fd5b50610689610f81565b005b34801561069757600080fd5b506106a0611018565b6040516106ad91906132a8565b60405180910390f35b3480156106c257600080fd5b506106cb611042565b6040516106d89190612dd7565b60405180910390f35b3480156106ed57600080fd5b506106f66110d4565b6040516107039190613123565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613208565b6110da565b005b34801561074157600080fd5b5061075c60048036038101906107579190613208565b61112c565b005b34801561076a57600080fd5b50610785600480360381019061078091906132c3565b6111c7565b005b34801561079357600080fd5b506107ae60048036038101906107a99190612ea1565b611246565b6040516107bb9190612efc565b60405180910390f35b3480156107d057600080fd5b506107d96112bd565b6040516107e691906132a8565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190612ea1565b6112e3565b6040516108239190612efc565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e91906132c3565b6112fa565b005b34801561086157600080fd5b5061087c60048036038101906108779190613235565b611379565b005b34801561088a57600080fd5b506108936113c5565b6040516108a09190613123565b60405180910390f35b3480156108b557600080fd5b506108d060048036038101906108cb9190613208565b6113cb565b005b3480156108de57600080fd5b506108f960048036038101906108f49190613235565b611466565b6040516109069190612efc565b60405180910390f35b34801561091b57600080fd5b5061093660048036038101906109319190612ea1565b611486565b005b34801561094457600080fd5b5061095f600480360381019061095a9190613303565b611511565b60405161096c9190613123565b60405180910390f35b34801561098157600080fd5b5061099c60048036038101906109979190613235565b611598565b6040516109a99190612efc565b60405180910390f35b3480156109be57600080fd5b506109d960048036038101906109d49190613208565b6115b8565b005b3480156109e757600080fd5b50610a0260048036038101906109fd9190613208565b61165d565b005b348015610a1057600080fd5b50610a2b6004803603810190610a269190613235565b6116f8565b005b348015610a3957600080fd5b50610a546004803603810190610a4f9190613208565b61177b565b005b348015610a6257600080fd5b50610a6b611816565b604051610a7a93929190613262565b60405180910390f35b348015610a8f57600080fd5b50610a9861182e565b604051610aa591906133a2565b60405180910390f35b348015610aba57600080fd5b50610ac3611854565b604051610ad09190612efc565b60405180910390f35b606060038054610ae8906133ec565b80601f0160208091040260200160405190810160405280929190818152602001828054610b14906133ec565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b6000610b7f610b78611867565b848461186f565b6001905092915050565b610b91611a38565b60005b8251811015610c21578160176000858481518110610bb557610bb461341d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610c199061347b565b915050610b94565b505050565b610c2e611a38565b80600760156101000a81548160ff02191690831515021790555050565b600a5481565b6000600254905090565b6000610c68848484611ab6565b6000610c7b85610c76611867565b611511565b905082811015610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790613535565b60405180910390fd5b610cdd85610ccc611867565b8584610cd89190613555565b61186f565b60019150509392505050565b60006012905090565b610cfa611a38565b60005b8251811015610d8a578160186000858481518110610d1e57610d1d61341d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d829061347b565b915050610cfd565b505050565b610d97611a38565b80601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b610dfa611a38565b80601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600080610e60611867565b9050610e81818585610e728589611511565b610e7c9190613589565b61186f565b600191505092915050565b610e94611a38565b610e9c610ce9565b600a610ea891906136f0565b81610eb3919061373b565b600a8190555050565b600760169054906101000a900460ff1681565b60085481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c5481565b610f2b611a38565b610f3560006123f3565b565b60108060000154908060010154908060020154905083565b600e5481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61dead81565b610f89611a38565b600760169054906101000a900460ff1615610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd0906137c9565b60405180910390fd5b6001600760166101000a81548160ff0219169083151502179055506001600760156101000a81548160ff02191690831515021790555043600881905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611051906133ec565b80601f016020809104026020016040519081016040528092919081815260200182805461107d906133ec565b80156110ca5780601f1061109f576101008083540402835291602001916110ca565b820191906000526020600020905b8154815290600101906020018083116110ad57829003601f168201915b5050505050905090565b600b5481565b6110e2611a38565b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611128573d6000803e3d6000fd5b5050565b611134611a38565b6107d0811115611179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111709061385b565b60405180910390fd5b60018110156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b4906138ed565b60405180910390fd5b80600b8190555050565b6111cf611a38565b60136002015460236111e1919061373b565b81836111ed9190613589565b111561122e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122590613959565b60405180910390fd5b81601360000181905550806013600101819055505050565b600080611251611867565b9050600061125f8286611511565b9050838110156112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b906139eb565b60405180910390fd5b6112b1828686840361186f565b60019250505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006112f0338484611ab6565b6001905092915050565b611302611a38565b6010600201546019611314919061373b565b81836113209190613589565b1115611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613a57565b60405180910390fd5b81601060000181905550806010600101819055505050565b611381611a38565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d5481565b6113d3611a38565b6107d0811115611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90613ae9565b60405180910390fd5b600181101561145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613b7b565b60405180910390fd5b80600e8190555050565b60176020528060005260406000206000915054906101000a900460ff1681565b61148e611a38565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016114c9929190613b9b565b6020604051808303816000875af11580156114e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150c9190613bd9565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60186020528060005260406000206000915054906101000a900460ff1681565b6115c0611a38565b600760169054906101000a900460ff1615611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790613c78565b60405180910390fd5b60058110611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613ce4565b60405180910390fd5b8060098190555050565b611665611a38565b6107d08111156116aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a190613d76565b60405180910390fd5b60018110156116ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e590613e08565b60405180910390fd5b80600d8190555050565b611700611a38565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690613e9a565b60405180910390fd5b611778816123f3565b50565b611783611a38565b6107d08111156117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90613f2c565b60405180910390fd5b600181101561180c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180390613fbe565b60405180910390fd5b80600c8190555050565b60138060000154908060010154908060020154905083565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760159054906101000a900460ff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614050565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361194d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611944906140e2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a2b9190613123565b60405180910390a3505050565b611a40611867565b73ffffffffffffffffffffffffffffffffffffffff16611a5e611018565b73ffffffffffffffffffffffffffffffffffffffff1614611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab9061414e565b60405180910390fd5b565b60008111611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af0906141e0565b60405180910390fd5b601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611b9d5750601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b611bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd39061424c565b60405180910390fd5b601760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611c805750601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611e1457600760169054906101000a900460ff16611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb906142b8565b60405180910390fd5b6000620186a0600e54611ce5610c51565b611cef919061373b565b611cf99190614307565b905080821115611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d35906143aa565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e12576000620186a0600b54611da4610c51565b611dae919061373b565b611db89190614307565b90508083611dc586610ed5565b611dcf9190613589565b1115611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e079061443c565b60405180910390fd5b505b505b6000806000806013600201549050611e2a612d26565b6000601760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015611ed05750601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015611eea5750600954600854611ee79190613589565b43105b9050600760149054906101000a900460ff1680611f505750601760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80611fa45750601760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611fb257600093506122ec565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614801561200d575080155b156120ba576000620186a0600d54612023610c51565b61202d919061373b565b6120379190614307565b90508088111561207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612073906144ce565b60405180910390fd5b6013600001549650869550601360405180606001604052908160008201548152602001600182015481526020016002820154815250509250506122eb565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16148015612115575080155b156121ca576000620186a0600c5461212b610c51565b612135919061373b565b61213f9190614307565b905080881115612184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217b90614560565b60405180910390fd5b60106000015496508695506010604051806060016040529081600082015481526020016001820154815260200160028201548152505092506010600201549350506122ea565b8061227f576000620186a0600e546121e0610c51565b6121ea919061373b565b6121f49190614307565b905080881115612239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612230906143aa565b60405180910390fd5b60106000015496508695506010604051806060016040529081600082015481526020016001820154815260200160028201548152505092506010600201549350506122e9565b80156122e857601654955060165494506001601860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b5b5b5b82606486896122fb919061373b565b6123059190614307565b61230f9190614307565b9350600760159054906101000a900460ff16801561237b5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b1561238b5761238a86836124b9565b5b6123a18989868a61239c9190613555565b61268a565b60008411156123e85760008611156123e7576000836064888a6123c4919061373b565b6123ce9190614307565b6123d89190614307565b90506123e58a308361268a565b505b5b505050505050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600760149054906101000a900460ff16612686576001600760146101000a81548160ff021916908315150217905550600082031561266a5760006124fc30610ed5565b9050600a548110612668576001600a54111561251857600a5490505b6000600284612527919061373b565b905060008184602001518461253c919061373b565b6125469190614307565b9050600081846125569190613555565b9050600047905061256682612900565b600081476125749190613555565b90506000876040015188602001518761258d9190613555565b6125979190614307565b826125a29190614307565b9050600088604001518960200151836125bb919061373b565b6125c59190614307565b905060008111156125db576125da8682612b43565b5b600089604001518a600001516002856125f4919061373b565b6125fe919061373b565b6126089190614307565b9050600081111561265f5761265e81600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c2890919063ffffffff16565b5b50505050505050505b505b6000600760146101000a81548160ff0219169083151502179055505b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f0906145f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275f90614684565b60405180910390fd5b612773838383612d1c565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090614716565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128e79190613123565b60405180910390a36128fa848484612d21565b50505050565b6000600267ffffffffffffffff81111561291d5761291c612f1c565b5b60405190808252806020026020018201604052801561294b5781602001602082028036833780820191505090505b50905030816000815181106129635761296261341d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e919061474b565b81600181518110612a4257612a4161341d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612aa930600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461186f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612b0d959493929190614871565b600060405180830381600087803b158015612b2757600080fd5b505af1158015612b3b573d6000803e3d6000fd5b505050505050565b612b7030600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461186f565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080612bbc611018565b426040518863ffffffff1660e01b8152600401612bde969594939291906148cb565b60606040518083038185885af1158015612bfc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c219190614941565b5050505050565b80471015612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906149e0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612c9190614a31565b60006040518083038185875af1925050503d8060008114612cce576040519150601f19603f3d011682016040523d82523d6000602084013e612cd3565b606091505b5050905080612d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0e90614ab8565b60405180910390fd5b505050565b505050565b505050565b60405180606001604052806000815260200160008152602001600081525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d81578082015181840152602081019050612d66565b60008484015250505050565b6000601f19601f8301169050919050565b6000612da982612d47565b612db38185612d52565b9350612dc3818560208601612d63565b612dcc81612d8d565b840191505092915050565b60006020820190508181036000830152612df18184612d9e565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3882612e0d565b9050919050565b612e4881612e2d565b8114612e5357600080fd5b50565b600081359050612e6581612e3f565b92915050565b6000819050919050565b612e7e81612e6b565b8114612e8957600080fd5b50565b600081359050612e9b81612e75565b92915050565b60008060408385031215612eb857612eb7612e03565b5b6000612ec685828601612e56565b9250506020612ed785828601612e8c565b9150509250929050565b60008115159050919050565b612ef681612ee1565b82525050565b6000602082019050612f116000830184612eed565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f5482612d8d565b810181811067ffffffffffffffff82111715612f7357612f72612f1c565b5b80604052505050565b6000612f86612df9565b9050612f928282612f4b565b919050565b600067ffffffffffffffff821115612fb257612fb1612f1c565b5b602082029050602081019050919050565b600080fd5b6000612fdb612fd684612f97565b612f7c565b90508083825260208201905060208402830185811115612ffe57612ffd612fc3565b5b835b8181101561302757806130138882612e56565b845260208401935050602081019050613000565b5050509392505050565b600082601f83011261304657613045612f17565b5b8135613056848260208601612fc8565b91505092915050565b61306881612ee1565b811461307357600080fd5b50565b6000813590506130858161305f565b92915050565b600080604083850312156130a2576130a1612e03565b5b600083013567ffffffffffffffff8111156130c0576130bf612e08565b5b6130cc85828601613031565b92505060206130dd85828601613076565b9150509250929050565b6000602082840312156130fd576130fc612e03565b5b600061310b84828501613076565b91505092915050565b61311d81612e6b565b82525050565b60006020820190506131386000830184613114565b92915050565b60008060006060848603121561315757613156612e03565b5b600061316586828701612e56565b935050602061317686828701612e56565b925050604061318786828701612e8c565b9150509250925092565b600060ff82169050919050565b6131a781613191565b82525050565b60006020820190506131c2600083018461319e565b92915050565b600080604083850312156131df576131de612e03565b5b60006131ed85828601612e56565b92505060206131fe85828601613076565b9150509250929050565b60006020828403121561321e5761321d612e03565b5b600061322c84828501612e8c565b91505092915050565b60006020828403121561324b5761324a612e03565b5b600061325984828501612e56565b91505092915050565b60006060820190506132776000830186613114565b6132846020830185613114565b6132916040830184613114565b949350505050565b6132a281612e2d565b82525050565b60006020820190506132bd6000830184613299565b92915050565b600080604083850312156132da576132d9612e03565b5b60006132e885828601612e8c565b92505060206132f985828601612e8c565b9150509250929050565b6000806040838503121561331a57613319612e03565b5b600061332885828601612e56565b925050602061333985828601612e56565b9150509250929050565b6000819050919050565b600061336861336361335e84612e0d565b613343565b612e0d565b9050919050565b600061337a8261334d565b9050919050565b600061338c8261336f565b9050919050565b61339c81613381565b82525050565b60006020820190506133b76000830184613393565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340457607f821691505b602082108103613417576134166133bd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061348682612e6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134b8576134b761344c565b5b600182019050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061351f602883612d52565b915061352a826134c3565b604082019050919050565b6000602082019050818103600083015261354e81613512565b9050919050565b600061356082612e6b565b915061356b83612e6b565b92508282039050818111156135835761358261344c565b5b92915050565b600061359482612e6b565b915061359f83612e6b565b92508282019050808211156135b7576135b661344c565b5b92915050565b60008160011c9050919050565b6000808291508390505b6001851115613614578086048111156135f0576135ef61344c565b5b60018516156135ff5780820291505b808102905061360d856135bd565b94506135d4565b94509492505050565b60008261362d57600190506136e9565b8161363b57600090506136e9565b8160018114613651576002811461365b5761368a565b60019150506136e9565b60ff84111561366d5761366c61344c565b5b8360020a9150848211156136845761368361344c565b5b506136e9565b5060208310610133831016604e8410600b84101617156136bf5782820a9050838111156136ba576136b961344c565b5b6136e9565b6136cc84848460016135ca565b925090508184048111156136e3576136e261344c565b5b81810290505b9392505050565b60006136fb82612e6b565b915061370683613191565b92506137337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461361d565b905092915050565b600061374682612e6b565b915061375183612e6b565b925082820261375f81612e6b565b915082820484148315176137765761377561344c565b5b5092915050565b7f54726164696e6720697320616c726561647920656e61626c6564000000000000600082015250565b60006137b3601a83612d52565b91506137be8261377d565b602082019050919050565b600060208201905081810360008301526137e2816137a6565b9050919050565b7f4d617820686f6c64206d757374206265206174206d6f7374203225206f66207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b6000613845602b83612d52565b9150613850826137e9565b604082019050919050565b6000602082019050818103600083015261387481613838565b9050919050565b7f4d617820686f6c64206d757374206265206174206c65737320302e303031252060008201527f6f6620746f74616c20737570706c790000000000000000000000000000000000602082015250565b60006138d7602f83612d52565b91506138e28261387b565b604082019050919050565b60006020820190508181036000830152613906816138ca565b9050919050565b7f4d757374206b656570206665657320617420333525206f72206c657373000000600082015250565b6000613943601d83612d52565b915061394e8261390d565b602082019050919050565b6000602082019050818103600083015261397281613936565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006139d5602583612d52565b91506139e082613979565b604082019050919050565b60006020820190508181036000830152613a04816139c8565b9050919050565b7f4d757374206b656570206665657320617420323525206f72206c657373000000600082015250565b6000613a41601d83612d52565b9150613a4c82613a0b565b602082019050919050565b60006020820190508181036000830152613a7081613a34565b9050919050565b7f4d6178205478206d757374206265206174206d6f7374203225206f6620746f7460008201527f616c20737570706c790000000000000000000000000000000000000000000000602082015250565b6000613ad3602983612d52565b9150613ade82613a77565b604082019050919050565b60006020820190508181036000830152613b0281613ac6565b9050919050565b7f4d6178205478206d757374206265206174206c65737320302e30303125206f6660008201527f20746f74616c20737570706c7900000000000000000000000000000000000000602082015250565b6000613b65602d83612d52565b9150613b7082613b09565b604082019050919050565b60006020820190508181036000830152613b9481613b58565b9050919050565b6000604082019050613bb06000830185613299565b613bbd6020830184613114565b9392505050565b600081519050613bd38161305f565b92915050565b600060208284031215613bef57613bee612e03565b5b6000613bfd84828501613bc4565b91505092915050565b7f43616e2774206368616e6765207768656e2074726164696e672068617320737460008201527f6172746564000000000000000000000000000000000000000000000000000000602082015250565b6000613c62602583612d52565b9150613c6d82613c06565b604082019050919050565b60006020820190508181036000830152613c9181613c55565b9050919050565b7f446561646c696e652073686f756c64206265206c657373207468616e20350000600082015250565b6000613cce601e83612d52565b9150613cd982613c98565b602082019050919050565b60006020820190508181036000830152613cfd81613cc1565b9050919050565b7f4d61782073656c6c206d757374206265206174206d6f7374203225206f66207460008201527f6f74616c20737570706c79000000000000000000000000000000000000000000602082015250565b6000613d60602b83612d52565b9150613d6b82613d04565b604082019050919050565b60006020820190508181036000830152613d8f81613d53565b9050919050565b7f4d61782073656c6c206d757374206265206174206c65737320302e303031252060008201527f6f6620746f74616c20737570706c790000000000000000000000000000000000602082015250565b6000613df2602f83612d52565b9150613dfd82613d96565b604082019050919050565b60006020820190508181036000830152613e2181613de5565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e84602683612d52565b9150613e8f82613e28565b604082019050919050565b60006020820190508181036000830152613eb381613e77565b9050919050565b7f4d617820627579206d757374206265206174206d6f7374203225206f6620746f60008201527f74616c20737570706c7900000000000000000000000000000000000000000000602082015250565b6000613f16602a83612d52565b9150613f2182613eba565b604082019050919050565b60006020820190508181036000830152613f4581613f09565b9050919050565b7f4d617820627579206d757374206265206174206c65737320302e30303125206f60008201527f6620746f74616c20737570706c79000000000000000000000000000000000000602082015250565b6000613fa8602e83612d52565b9150613fb382613f4c565b604082019050919050565b60006020820190508181036000830152613fd781613f9b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061403a602483612d52565b915061404582613fde565b604082019050919050565b600060208201905081810360008301526140698161402d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006140cc602283612d52565b91506140d782614070565b604082019050919050565b600060208201905081810360008301526140fb816140bf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614138602083612d52565b915061414382614102565b602082019050919050565b600060208201905081810360008301526141678161412b565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b60006141ca602983612d52565b91506141d58261416e565b604082019050919050565b600060208201905081810360008301526141f9816141bd565b9050919050565b7f596f752063616e2774207472616e7366657220746f6b656e7300000000000000600082015250565b6000614236601983612d52565b915061424182614200565b602082019050919050565b6000602082019050818103600083015261426581614229565b9050919050565b7f54726164696e67206e6f7420656e61626c65642e000000000000000000000000600082015250565b60006142a2601483612d52565b91506142ad8261426c565b602082019050919050565b600060208201905081810360008301526142d181614295565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061431282612e6b565b915061431d83612e6b565b92508261432d5761432c6142d8565b5b828204905092915050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f782e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614394602283612d52565b915061439f82614338565b604082019050919050565b600060208201905081810360008301526143c381614387565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61784860008201527f6f6c642e00000000000000000000000000000000000000000000000000000000602082015250565b6000614426602483612d52565b9150614431826143ca565b604082019050919050565b6000602082019050818103600083015261445581614419565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785360008201527f656c6c2e00000000000000000000000000000000000000000000000000000000602082015250565b60006144b8602483612d52565b91506144c38261445c565b604082019050919050565b600060208201905081810360008301526144e7816144ab565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61784260008201527f75792e0000000000000000000000000000000000000000000000000000000000602082015250565b600061454a602383612d52565b9150614555826144ee565b604082019050919050565b600060208201905081810360008301526145798161453d565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006145dc602583612d52565b91506145e782614580565b604082019050919050565b6000602082019050818103600083015261460b816145cf565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061466e602383612d52565b915061467982614612565b604082019050919050565b6000602082019050818103600083015261469d81614661565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614700602683612d52565b915061470b826146a4565b604082019050919050565b6000602082019050818103600083015261472f816146f3565b9050919050565b60008151905061474581612e3f565b92915050565b60006020828403121561476157614760612e03565b5b600061476f84828501614736565b91505092915050565b6000819050919050565b600061479d61479861479384614778565b613343565b612e6b565b9050919050565b6147ad81614782565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147e881612e2d565b82525050565b60006147fa83836147df565b60208301905092915050565b6000602082019050919050565b600061481e826147b3565b61482881856147be565b9350614833836147cf565b8060005b8381101561486457815161484b88826147ee565b975061485683614806565b925050600181019050614837565b5085935050505092915050565b600060a0820190506148866000830188613114565b61489360208301876147a4565b81810360408301526148a58186614813565b90506148b46060830185613299565b6148c16080830184613114565b9695505050505050565b600060c0820190506148e06000830189613299565b6148ed6020830188613114565b6148fa60408301876147a4565b61490760608301866147a4565b6149146080830185613299565b61492160a0830184613114565b979650505050505050565b60008151905061493b81612e75565b92915050565b60008060006060848603121561495a57614959612e03565b5b60006149688682870161492c565b93505060206149798682870161492c565b925050604061498a8682870161492c565b9150509250925092565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006149ca601d83612d52565b91506149d582614994565b602082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b600081905092915050565b50565b6000614a1b600083614a00565b9150614a2682614a0b565b600082019050919050565b6000614a3c82614a0e565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000614aa2603a83612d52565b9150614aad82614a46565b604082019050919050565b60006020820190508181036000830152614ad181614a95565b905091905056fea26469706673582212207c44413345392e5c7f0eb0b448a247f77bd304d0617c53998a0b05d7c947a92e64736f6c63430008120033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000017e9d8602b400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000034d4144000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d41440000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _initialSupply (uint256): 420690000000000
Arg [2] : _name (string): MAD
Arg [3] : _symbol (string): MAD

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 00000000000000000000000000000000000000000000000000017e9d8602b400
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4d41440000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4d41440000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

31090:12946:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6422:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33279:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43506:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40334:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31488:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7542:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33448:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7384:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43160:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43378:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43026:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10258:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40494:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31341:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31386:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7713:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31645:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28770:103;;;;;;;;;;;;;:::i;:::-;;32152:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;31760:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31839:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31922:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42424:223;;;;;;;;;;;;;:::i;:::-;;28122:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6641:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31586:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43716:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41574:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40983:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10999:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31204:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33866:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40679:296;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42907:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31702:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41300:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32311:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43839:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8302:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32361:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42655:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42138:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29028:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41860:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32196:42;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;31176:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31296:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6422:100;6476:13;6509:5;6502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6422:100;:::o;33279:161::-;33354:4;33371:39;33380:12;:10;:12::i;:::-;33394:7;33403:6;33371:8;:39::i;:::-;33428:4;33421:11;;33279:161;;;;:::o;43506:202::-;28008:13;:11;:13::i;:::-;43603:9:::1;43598:103;43622:8;:15;43618:1;:19;43598:103;;;43684:5;43659:9;:22;43669:8;43678:1;43669:11;;;;;;;;:::i;:::-;;;;;;;;43659:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;43639:3;;;;;:::i;:::-;;;;43598:103;;;;43506:202:::0;;:::o;40334:152::-;28008:13;:11;:13::i;:::-;40473:5:::1;40452:18;;:26;;;;;;;;;;;;;;;;;;40334:152:::0;:::o;31488:38::-;;;;:::o;7542:108::-;7603:7;7630:12;;7623:19;;7542:108;:::o;33448:410::-;33546:4;33563:36;33573:6;33581:9;33592:6;33563:9;:36::i;:::-;33612:24;33639:31;33649:6;33657:12;:10;:12::i;:::-;33639:9;:31::i;:::-;33612:58;;33709:6;33689:16;:26;;33681:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;33771:57;33780:6;33788:12;:10;:12::i;:::-;33821:6;33802:16;:25;;;;:::i;:::-;33771:8;:57::i;:::-;33846:4;33839:11;;;33448:410;;;;;:::o;7384:93::-;7442:5;7467:2;7460:9;;7384:93;:::o;43160:210::-;28008:13;:11;:13::i;:::-;43261:9:::1;43256:107;43280:8;:15;43276:1;:19;43256:107;;;43346:5;43317:13;:26;43331:8;43340:1;43331:11;;;;;;;;:::i;:::-;;;;;;;;43317:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;43297:3;;;;;:::i;:::-;;;;43256:107;;;;43160:210:::0;;:::o;43378:120::-;28008:13;:11;:13::i;:::-;43485:5:::1;43463:9;:19;43473:8;43463:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;43378:120:::0;;:::o;43026:126::-;28008:13;:11;:13::i;:::-;43139:5:::1;43114:13;:22;43128:7;43114:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;43026:126:::0;;:::o;10258:238::-;10346:4;10363:13;10379:12;:10;:12::i;:::-;10363:28;;10402:64;10411:5;10418:7;10455:10;10427:25;10437:5;10444:7;10427:9;:25::i;:::-;:38;;;;:::i;:::-;10402:8;:64::i;:::-;10484:4;10477:11;;;10258:238;;;;:::o;40494:177::-;28008:13;:11;:13::i;:::-;40653:10:::1;:8;:10::i;:::-;40649:2;:14;;;;:::i;:::-;40636:10;:27;;;;:::i;:::-;40610:23;:53;;;;40494:177:::0;:::o;31341:34::-;;;;;;;;;;;;;:::o;31386:27::-;;;;:::o;7713:127::-;7787:7;7814:9;:18;7824:7;7814:18;;;;;;;;;;;;;;;;7807:25;;7713:127;;;:::o;31645:28::-;;;;:::o;28770:103::-;28008:13;:11;:13::i;:::-;28835:30:::1;28862:1;28835:18;:30::i;:::-;28770:103::o:0;32152:37::-;;;;;;;;;;;;;;;;;;;:::o;31760:27::-;;;;:::o;31839:75::-;;;;;;;;;;;;;:::o;31922:79::-;31959:42;31922:79;:::o;42424:223::-;28008:13;:11;:13::i;:::-;42488:14:::1;;;;;;;;;;;42487:15;42479:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;42561:4;42544:14;;:21;;;;;;;;;;;;;;;;;;42597:4;42576:18;;:25;;;;;;;;;;;;;;;;;;42627:12;42612;:27;;;;42424:223::o:0;28122:87::-;28168:7;28195:6;;;;;;;;;;;28188:13;;28122:87;:::o;6641:104::-;6697:13;6730:7;6723:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6641:104;:::o;31586:29::-;;;;:::o;43716:115::-;28008:13;:11;:13::i;:::-;43792:10:::1;43784:28;;:39;43813:9;43784:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;43716:115:::0;:::o;41574:278::-;28008:13;:11;:13::i;:::-;41678:4:::1;41666:8;:16;;41658:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;41761:1;41749:8;:13;;41741:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;41836:8;41826:7;:18;;;;41574:278:::0;:::o;40983:309::-;28008:13;:11;:13::i;:::-;41143:9:::1;:21;;;41138:2;:26;;;;:::i;:::-;41122:10;41109;:23;;;;:::i;:::-;41108:56;;41100:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;41231:10;41209:9;:19;;:32;;;;41274:10;41252:9;:19;;:32;;;;40983:309:::0;;:::o;10999:436::-;11092:4;11109:13;11125:12;:10;:12::i;:::-;11109:28;;11148:24;11175:25;11185:5;11192:7;11175:9;:25::i;:::-;11148:52;;11239:15;11219:16;:35;;11211:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11332:60;11341:5;11348:7;11376:15;11357:16;:34;11332:8;:60::i;:::-;11423:4;11416:11;;;;10999:436;;;;:::o;31204:19::-;;;;;;;;;;;;;:::o;33866:165::-;33944:4;33961:40;33971:10;33983:9;33994:6;33961:9;:40::i;:::-;34019:4;34012:11;;33866:165;;;;:::o;40679:296::-;28008:13;:11;:13::i;:::-;40838:5:::1;:17;;;40833:2;:22;;;;:::i;:::-;40817:10;40804;:23;;;;:::i;:::-;40803:52;;40795:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;40918:10;40900:5;:15;;:28;;;;40957:10;40939:5;:15;;:28;;;;40679:296:::0;;:::o;42907:111::-;28008:13;:11;:13::i;:::-;43003:7:::1;42985:15;;:25;;;;;;;;;;;;;;;;;;42907:111:::0;:::o;31702:29::-;;;;:::o;41300:262::-;28008:13;:11;:13::i;:::-;41398:4:::1;41388:6;:14;;41380:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41477:1;41467:6;:11;;41459:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41548:6;41540:5;:14;;;;41300:262:::0;:::o;32311:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;43839:139::-;28008:13;:11;:13::i;:::-;43932:8:::1;43925:25;;;43951:10;43963:6;43925:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43839:139:::0;;:::o;8302:151::-;8391:7;8418:11;:18;8430:5;8418:18;;;;;;;;;;;;;;;:27;8437:7;8418:27;;;;;;;;;;;;;;;;8411:34;;8302:151;;;;:::o;32361:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;42655:244::-;28008:13;:11;:13::i;:::-;42737:14:::1;;;;;;;;;;;42736:15;42728:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;42825:1;42813:9;:13;42804:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;42882:9;42871:8;:20;;;;42655:244:::0;:::o;42138:278::-;28008:13;:11;:13::i;:::-;42242:4:::1;42230:8;:16;;42222:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42325:1;42313:8;:13;;42305:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42400:8;42390:7;:18;;;;42138:278:::0;:::o;29028:201::-;28008:13;:11;:13::i;:::-;29137:1:::1;29117:22;;:8;:22;;::::0;29109:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29193:28;29212:8;29193:18;:28::i;:::-;29028:201:::0;:::o;41860:270::-;28008:13;:11;:13::i;:::-;41961:4:::1;41950:7;:15;;41942:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;42042:1;42031:7;:12;;42023:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42115:7;42106:6;:16;;;;41860:270:::0;:::o;32196:42::-;;;;;;;;;;;;;;;;;;;:::o;31176:21::-;;;;;;;;;;;;;:::o;31296:38::-;;;;;;;;;;;;;:::o;656:98::-;709:7;736:10;729:17;;656:98;:::o;15026:380::-;15179:1;15162:19;;:5;:19;;;15154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15260:1;15241:21;;:7;:21;;;15233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15344:6;15314:11;:18;15326:5;15314:18;;;;;;;;;;;;;;;:27;15333:7;15314:27;;;;;;;;;;;;;;;:36;;;;15382:7;15366:32;;15375:5;15366:32;;;15391:6;15366:32;;;;;;:::i;:::-;;;;;;;;15026:380;;;:::o;28287:132::-;28362:12;:10;:12::i;:::-;28351:23;;:7;:5;:7::i;:::-;:23;;;28343:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28287:132::o;34039:3733::-;34155:1;34146:6;:10;34138:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34236:13;:21;34250:6;34236:21;;;;;;;;;;;;;;;;;;;;;;;;;34235:22;:51;;;;;34262:13;:24;34276:9;34262:24;;;;;;;;;;;;;;;;;;;;;;;;;34261:25;34235:51;34213:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;34359:9;:17;34369:6;34359:17;;;;;;;;;;;;;;;;;;;;;;;;;34358:18;:43;;;;;34381:9;:20;34391:9;34381:20;;;;;;;;;;;;;;;;;;;;;;;;;34380:21;34358:43;34354:681;;;34426:14;;;;;;;;;;;34418:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;34539:19;34585:6;34577:5;;34561:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:30;;;;:::i;:::-;34539:52;;34624:11;34614:6;:21;;34606:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34812:4;;;;;;;;;;;34799:17;;:9;:17;;;34796:223;;34837:21;34887:6;34877:7;;34861:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:32;;;;:::i;:::-;34837:56;;34953:13;34943:6;34920:20;34930:9;34920;:20::i;:::-;:29;;;;:::i;:::-;:46;;34912:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34818:201;34796:223;34403:632;34354:681;35100:15;35126:14;35151:11;35173:23;35199:9;:21;;;35173:47;;35231:25;;:::i;:::-;35269:17;35290:9;:17;35300:6;35290:17;;;;;;;;;;;;;;;;;;;;;;;;;35289:18;:56;;;;;35325:9;:20;35335:9;35325:20;;;;;;;;;;;;;;;;;;;;;;;;;35324:21;35289:56;:111;;;;;35392:8;;35377:12;;:23;;;;:::i;:::-;35362:12;:38;35289:111;35269:131;;35425:15;;;;;;;;;;;:36;;;;35444:9;:17;35454:6;35444:17;;;;;;;;;;;;;;;;;;;;;;;;;35425:36;:60;;;;35465:9;:20;35475:9;35465:20;;;;;;;;;;;;;;;;;;;;;;;;;35425:60;35421:1728;;;35506:1;35500:7;;35421:1728;;;35580:4;;;;;;;;;;;35567:17;;:9;:17;;;:34;;;;;35589:12;35588:13;35567:34;35563:1586;;;35672:21;35722:6;35712:7;;35696:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:32;;;;:::i;:::-;35672:56;;35761:13;35751:6;:23;;35743:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35871:9;:19;;;35861:29;;35914:7;35905:16;;35951:9;35936:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35603:397;35563:1586;;;36020:4;;;;;;;;;;;36010:14;;:6;:14;;;:31;;;;;36029:12;36028:13;36010:31;36006:1143;;;36124:20;36172:6;36163;;36147:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:31;;;;:::i;:::-;36124:54;;36211:12;36201:6;:22;;36193:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;36321:5;:15;;;36311:25;;36360:7;36351:16;;36397:5;36382:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36435:5;:17;;;36417:35;;36043:464;36006:1143;;;36518:12;36513:636;;36613:19;36659:6;36651:5;;36635:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:30;;;;:::i;:::-;36613:52;;36698:11;36688:6;:21;;36680:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36806:5;:15;;;36796:25;;36845:7;36836:16;;36882:5;36867:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36920:5;:17;;;36902:35;;36532:468;36513:636;;;37010:12;37006:143;;;37049:9;;37039:19;;37082:9;;37073:18;;37133:4;37106:13;:24;37120:9;37106:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;37006:143;36513:636;36006:1143;35563:1586;35421:1728;37195:15;37188:3;37178:6;37169;:15;;;;:::i;:::-;37168:23;;;;:::i;:::-;37167:43;;;;:::i;:::-;37161:49;;37326:18;;;;;;;;;;;:36;;;;;37358:4;;;;;;;;;;;37348:14;;:6;:14;;;;37326:36;37322:75;;;37364:33;37375:7;37384:12;37364:10;:33::i;:::-;37322:75;37439:48;37455:6;37463:9;37483:3;37474:6;:12;;;;:::i;:::-;37439:15;:48::i;:::-;37508:1;37502:3;:7;37498:267;;;37584:1;37574:7;:11;37570:182;;;37606:17;37653:15;37648:3;37637:7;37628:6;:16;;;;:::i;:::-;37627:24;;;;:::i;:::-;37626:42;;;;:::i;:::-;37606:62;;37687:49;37703:6;37719:4;37726:9;37687:15;:49::i;:::-;37587:165;37570:182;37498:267;34127:3645;;;;;;34039:3733;;;:::o;29389:191::-;29463:16;29482:6;;;;;;;;;;;29463:25;;29508:8;29499:6;;:17;;;;;;;;;;;;;;;;;;29563:8;29532:40;;29553:8;29532:40;;;;;;;;;;;;29452:128;29389:191;:::o;37780:1499::-;32475:15;;;;;;;;;;;32470:125;;32525:4;32507:15;;:22;;;;;;;;;;;;;;;;;;37886:1:::1;37875:7;:12:::0;37872:49;37903:7:::1;37872:49;37934:23;37960:24;37978:4;37960:9;:24::i;:::-;37934:50;;38018:23;;37999:15;:42;37995:1277;;38088:1;38062:23;;:27;38058:109;;;38128:23;;38110:41;;38058:109;38238:19;38270:1;38260:7;:11;;;;:::i;:::-;38238:33;;38286:32;38363:11;38340:9;:19;;;38322:15;:37;;;;:::i;:::-;38321:53;;;;:::i;:::-;38286:88;;38389:14;38424:24;38406:15;:42;;;;:::i;:::-;38389:59;;38463:22;38488:21;38463:46;;38526:24;38543:6;38526:16;:24::i;:::-;38567:20;38614:14;38590:21;:38;;;;:::i;:::-;38567:61;;38643:19;38719:9;:21;;;38696:9;:19;;;38682:11;:33;;;;:::i;:::-;38681:59;;;;:::i;:::-;38665:12;:76;;;;:::i;:::-;38643:98;;38756:36;38833:9;:21;;;38810:9;:19;;;38796:11;:33;;;;:::i;:::-;38795:59;;;;:::i;:::-;38756:98;;38906:1;38875:28;:32;38871:157;;;38944:68;38957:24;38983:28;38944:12;:68::i;:::-;38871:157;39044:23;39112:9;:21;;;39089:9;:19;;;39085:1;39071:11;:15;;;;:::i;:::-;:37;;;;:::i;:::-;39070:63;;;;:::i;:::-;39044:89;;39170:1;39152:15;:19;39148:111;;;39192:51;39227:15;39200;;;;;;;;;;;39192:34;;;;:51;;;;:::i;:::-;39148:111;38043:1229;;;;;;;;37995:1277;37859:1420;32544:1;32578:5:::0;32560:15;;:23;;;;;;;;;;;;;;;;;;32470:125;37780:1499;;:::o;11905:840::-;12052:1;12036:18;;:4;:18;;;12028:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12129:1;12115:16;;:2;:16;;;12107:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12184:38;12205:4;12211:2;12215:6;12184:20;:38::i;:::-;12235:19;12257:9;:15;12267:4;12257:15;;;;;;;;;;;;;;;;12235:37;;12306:6;12291:11;:21;;12283:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12423:6;12409:11;:20;12391:9;:15;12401:4;12391:15;;;;;;;;;;;;;;;:38;;;;12626:6;12609:9;:13;12619:2;12609:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;12676:2;12661:26;;12670:4;12661:26;;;12680:6;12661:26;;;;;;:::i;:::-;;;;;;;;12700:37;12720:4;12726:2;12730:6;12700:19;:37::i;:::-;12017:728;11905:840;;;:::o;39287:534::-;39413:21;39451:1;39437:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39413:40;;39482:4;39464;39469:1;39464:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;39508:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39498:4;39503:1;39498:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;39534:53;39551:4;39566:6;;;;;;;;;;;39575:11;39534:8;:53::i;:::-;39626:6;;;;;;;;;;;:57;;;39698:11;39724:1;39740:4;39767;39787:15;39626:187;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39342:479;39287:534;:::o;39829:497::-;39977:53;39994:4;40009:6;;;;;;;;;;;40018:11;39977:8;:53::i;:::-;40073:6;;;;;;;;;;;:22;;;40104:9;40138:4;40158:11;40184:1;40227;40270:7;:5;:7::i;:::-;40292:15;40073:245;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;39829:497;;:::o;20029:317::-;20144:6;20119:21;:31;;20111:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20198:12;20216:9;:14;;20238:6;20216:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20197:52;;;20268:7;20260:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;20100:246;20029:317;;:::o;16750:125::-;;;;:::o;17479:124::-;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:117::-;3555:1;3552;3545:12;3569:180;3617:77;3614:1;3607:88;3714:4;3711:1;3704:15;3738:4;3735:1;3728:15;3755:281;3838:27;3860:4;3838:27;:::i;:::-;3830:6;3826:40;3968:6;3956:10;3953:22;3932:18;3920:10;3917:34;3914:62;3911:88;;;3979:18;;:::i;:::-;3911:88;4019:10;4015:2;4008:22;3798:238;3755:281;;:::o;4042:129::-;4076:6;4103:20;;:::i;:::-;4093:30;;4132:33;4160:4;4152:6;4132:33;:::i;:::-;4042:129;;;:::o;4177:311::-;4254:4;4344:18;4336:6;4333:30;4330:56;;;4366:18;;:::i;:::-;4330:56;4416:4;4408:6;4404:17;4396:25;;4476:4;4470;4466:15;4458:23;;4177:311;;;:::o;4494:117::-;4603:1;4600;4593:12;4634:710;4730:5;4755:81;4771:64;4828:6;4771:64;:::i;:::-;4755:81;:::i;:::-;4746:90;;4856:5;4885:6;4878:5;4871:21;4919:4;4912:5;4908:16;4901:23;;4972:4;4964:6;4960:17;4952:6;4948:30;5001:3;4993:6;4990:15;4987:122;;;5020:79;;:::i;:::-;4987:122;5135:6;5118:220;5152:6;5147:3;5144:15;5118:220;;;5227:3;5256:37;5289:3;5277:10;5256:37;:::i;:::-;5251:3;5244:50;5323:4;5318:3;5314:14;5307:21;;5194:144;5178:4;5173:3;5169:14;5162:21;;5118:220;;;5122:21;4736:608;;4634:710;;;;;:::o;5367:370::-;5438:5;5487:3;5480:4;5472:6;5468:17;5464:27;5454:122;;5495:79;;:::i;:::-;5454:122;5612:6;5599:20;5637:94;5727:3;5719:6;5712:4;5704:6;5700:17;5637:94;:::i;:::-;5628:103;;5444:293;5367:370;;;;:::o;5743:116::-;5813:21;5828:5;5813:21;:::i;:::-;5806:5;5803:32;5793:60;;5849:1;5846;5839:12;5793:60;5743:116;:::o;5865:133::-;5908:5;5946:6;5933:20;5924:29;;5962:30;5986:5;5962:30;:::i;:::-;5865:133;;;;:::o;6004:678::-;6094:6;6102;6151:2;6139:9;6130:7;6126:23;6122:32;6119:119;;;6157:79;;:::i;:::-;6119:119;6305:1;6294:9;6290:17;6277:31;6335:18;6327:6;6324:30;6321:117;;;6357:79;;:::i;:::-;6321:117;6462:78;6532:7;6523:6;6512:9;6508:22;6462:78;:::i;:::-;6452:88;;6248:302;6589:2;6615:50;6657:7;6648:6;6637:9;6633:22;6615:50;:::i;:::-;6605:60;;6560:115;6004:678;;;;;:::o;6688:323::-;6744:6;6793:2;6781:9;6772:7;6768:23;6764:32;6761:119;;;6799:79;;:::i;:::-;6761:119;6919:1;6944:50;6986:7;6977:6;6966:9;6962:22;6944:50;:::i;:::-;6934:60;;6890:114;6688:323;;;;:::o;7017:118::-;7104:24;7122:5;7104:24;:::i;:::-;7099:3;7092:37;7017:118;;:::o;7141:222::-;7234:4;7272:2;7261:9;7257:18;7249:26;;7285:71;7353:1;7342:9;7338:17;7329:6;7285:71;:::i;:::-;7141:222;;;;:::o;7369:619::-;7446:6;7454;7462;7511:2;7499:9;7490:7;7486:23;7482:32;7479:119;;;7517:79;;:::i;:::-;7479:119;7637:1;7662:53;7707:7;7698:6;7687:9;7683:22;7662:53;:::i;:::-;7652:63;;7608:117;7764:2;7790:53;7835:7;7826:6;7815:9;7811:22;7790:53;:::i;:::-;7780:63;;7735:118;7892:2;7918:53;7963:7;7954:6;7943:9;7939:22;7918:53;:::i;:::-;7908:63;;7863:118;7369:619;;;;;:::o;7994:86::-;8029:7;8069:4;8062:5;8058:16;8047:27;;7994:86;;;:::o;8086:112::-;8169:22;8185:5;8169:22;:::i;:::-;8164:3;8157:35;8086:112;;:::o;8204:214::-;8293:4;8331:2;8320:9;8316:18;8308:26;;8344:67;8408:1;8397:9;8393:17;8384:6;8344:67;:::i;:::-;8204:214;;;;:::o;8424:468::-;8489:6;8497;8546:2;8534:9;8525:7;8521:23;8517:32;8514:119;;;8552:79;;:::i;:::-;8514:119;8672:1;8697:53;8742:7;8733:6;8722:9;8718:22;8697:53;:::i;:::-;8687:63;;8643:117;8799:2;8825:50;8867:7;8858:6;8847:9;8843:22;8825:50;:::i;:::-;8815:60;;8770:115;8424:468;;;;;:::o;8898:329::-;8957:6;9006:2;8994:9;8985:7;8981:23;8977:32;8974:119;;;9012:79;;:::i;:::-;8974:119;9132:1;9157:53;9202:7;9193:6;9182:9;9178:22;9157:53;:::i;:::-;9147:63;;9103:117;8898:329;;;;:::o;9233:::-;9292:6;9341:2;9329:9;9320:7;9316:23;9312:32;9309:119;;;9347:79;;:::i;:::-;9309:119;9467:1;9492:53;9537:7;9528:6;9517:9;9513:22;9492:53;:::i;:::-;9482:63;;9438:117;9233:329;;;;:::o;9568:442::-;9717:4;9755:2;9744:9;9740:18;9732:26;;9768:71;9836:1;9825:9;9821:17;9812:6;9768:71;:::i;:::-;9849:72;9917:2;9906:9;9902:18;9893:6;9849:72;:::i;:::-;9931;9999:2;9988:9;9984:18;9975:6;9931:72;:::i;:::-;9568:442;;;;;;:::o;10016:118::-;10103:24;10121:5;10103:24;:::i;:::-;10098:3;10091:37;10016:118;;:::o;10140:222::-;10233:4;10271:2;10260:9;10256:18;10248:26;;10284:71;10352:1;10341:9;10337:17;10328:6;10284:71;:::i;:::-;10140:222;;;;:::o;10368:474::-;10436:6;10444;10493:2;10481:9;10472:7;10468:23;10464:32;10461:119;;;10499:79;;:::i;:::-;10461:119;10619:1;10644:53;10689:7;10680:6;10669:9;10665:22;10644:53;:::i;:::-;10634:63;;10590:117;10746:2;10772:53;10817:7;10808:6;10797:9;10793:22;10772:53;:::i;:::-;10762:63;;10717:118;10368:474;;;;;:::o;10848:::-;10916:6;10924;10973:2;10961:9;10952:7;10948:23;10944:32;10941:119;;;10979:79;;:::i;:::-;10941:119;11099:1;11124:53;11169:7;11160:6;11149:9;11145:22;11124:53;:::i;:::-;11114:63;;11070:117;11226:2;11252:53;11297:7;11288:6;11277:9;11273:22;11252:53;:::i;:::-;11242:63;;11197:118;10848:474;;;;;:::o;11328:60::-;11356:3;11377:5;11370:12;;11328:60;;;:::o;11394:142::-;11444:9;11477:53;11495:34;11504:24;11522:5;11504:24;:::i;:::-;11495:34;:::i;:::-;11477:53;:::i;:::-;11464:66;;11394:142;;;:::o;11542:126::-;11592:9;11625:37;11656:5;11625:37;:::i;:::-;11612:50;;11542:126;;;:::o;11674:142::-;11740:9;11773:37;11804:5;11773:37;:::i;:::-;11760:50;;11674:142;;;:::o;11822:163::-;11925:53;11972:5;11925:53;:::i;:::-;11920:3;11913:66;11822:163;;:::o;11991:254::-;12100:4;12138:2;12127:9;12123:18;12115:26;;12151:87;12235:1;12224:9;12220:17;12211:6;12151:87;:::i;:::-;11991:254;;;;:::o;12251:180::-;12299:77;12296:1;12289:88;12396:4;12393:1;12386:15;12420:4;12417:1;12410:15;12437:320;12481:6;12518:1;12512:4;12508:12;12498:22;;12565:1;12559:4;12555:12;12586:18;12576:81;;12642:4;12634:6;12630:17;12620:27;;12576:81;12704:2;12696:6;12693:14;12673:18;12670:38;12667:84;;12723:18;;:::i;:::-;12667:84;12488:269;12437:320;;;:::o;12763:180::-;12811:77;12808:1;12801:88;12908:4;12905:1;12898:15;12932:4;12929:1;12922:15;12949:180;12997:77;12994:1;12987:88;13094:4;13091:1;13084:15;13118:4;13115:1;13108:15;13135:233;13174:3;13197:24;13215:5;13197:24;:::i;:::-;13188:33;;13243:66;13236:5;13233:77;13230:103;;13313:18;;:::i;:::-;13230:103;13360:1;13353:5;13349:13;13342:20;;13135:233;;;:::o;13374:227::-;13514:34;13510:1;13502:6;13498:14;13491:58;13583:10;13578:2;13570:6;13566:15;13559:35;13374:227;:::o;13607:366::-;13749:3;13770:67;13834:2;13829:3;13770:67;:::i;:::-;13763:74;;13846:93;13935:3;13846:93;:::i;:::-;13964:2;13959:3;13955:12;13948:19;;13607:366;;;:::o;13979:419::-;14145:4;14183:2;14172:9;14168:18;14160:26;;14232:9;14226:4;14222:20;14218:1;14207:9;14203:17;14196:47;14260:131;14386:4;14260:131;:::i;:::-;14252:139;;13979:419;;;:::o;14404:194::-;14444:4;14464:20;14482:1;14464:20;:::i;:::-;14459:25;;14498:20;14516:1;14498:20;:::i;:::-;14493:25;;14542:1;14539;14535:9;14527:17;;14566:1;14560:4;14557:11;14554:37;;;14571:18;;:::i;:::-;14554:37;14404:194;;;;:::o;14604:191::-;14644:3;14663:20;14681:1;14663:20;:::i;:::-;14658:25;;14697:20;14715:1;14697:20;:::i;:::-;14692:25;;14740:1;14737;14733:9;14726:16;;14761:3;14758:1;14755:10;14752:36;;;14768:18;;:::i;:::-;14752:36;14604:191;;;;:::o;14801:102::-;14843:8;14890:5;14887:1;14883:13;14862:34;;14801:102;;;:::o;14909:848::-;14970:5;14977:4;15001:6;14992:15;;15025:5;15016:14;;15039:712;15060:1;15050:8;15047:15;15039:712;;;15155:4;15150:3;15146:14;15140:4;15137:24;15134:50;;;15164:18;;:::i;:::-;15134:50;15214:1;15204:8;15200:16;15197:451;;;15629:4;15622:5;15618:16;15609:25;;15197:451;15679:4;15673;15669:15;15661:23;;15709:32;15732:8;15709:32;:::i;:::-;15697:44;;15039:712;;;14909:848;;;;;;;:::o;15763:1073::-;15817:5;16008:8;15998:40;;16029:1;16020:10;;16031:5;;15998:40;16057:4;16047:36;;16074:1;16065:10;;16076:5;;16047:36;16143:4;16191:1;16186:27;;;;16227:1;16222:191;;;;16136:277;;16186:27;16204:1;16195:10;;16206:5;;;16222:191;16267:3;16257:8;16254:17;16251:43;;;16274:18;;:::i;:::-;16251:43;16323:8;16320:1;16316:16;16307:25;;16358:3;16351:5;16348:14;16345:40;;;16365:18;;:::i;:::-;16345:40;16398:5;;;16136:277;;16522:2;16512:8;16509:16;16503:3;16497:4;16494:13;16490:36;16472:2;16462:8;16459:16;16454:2;16448:4;16445:12;16441:35;16425:111;16422:246;;;16578:8;16572:4;16568:19;16559:28;;16613:3;16606:5;16603:14;16600:40;;;16620:18;;:::i;:::-;16600:40;16653:5;;16422:246;16693:42;16731:3;16721:8;16715:4;16712:1;16693:42;:::i;:::-;16678:57;;;;16767:4;16762:3;16758:14;16751:5;16748:25;16745:51;;;16776:18;;:::i;:::-;16745:51;16825:4;16818:5;16814:16;16805:25;;15763:1073;;;;;;:::o;16842:281::-;16900:5;16924:23;16942:4;16924:23;:::i;:::-;16916:31;;16968:25;16984:8;16968:25;:::i;:::-;16956:37;;17012:104;17049:66;17039:8;17033:4;17012:104;:::i;:::-;17003:113;;16842:281;;;;:::o;17129:410::-;17169:7;17192:20;17210:1;17192:20;:::i;:::-;17187:25;;17226:20;17244:1;17226:20;:::i;:::-;17221:25;;17281:1;17278;17274:9;17303:30;17321:11;17303:30;:::i;:::-;17292:41;;17482:1;17473:7;17469:15;17466:1;17463:22;17443:1;17436:9;17416:83;17393:139;;17512:18;;:::i;:::-;17393:139;17177:362;17129:410;;;;:::o;17545:176::-;17685:28;17681:1;17673:6;17669:14;17662:52;17545:176;:::o;17727:366::-;17869:3;17890:67;17954:2;17949:3;17890:67;:::i;:::-;17883:74;;17966:93;18055:3;17966:93;:::i;:::-;18084:2;18079:3;18075:12;18068:19;;17727:366;;;:::o;18099:419::-;18265:4;18303:2;18292:9;18288:18;18280:26;;18352:9;18346:4;18342:20;18338:1;18327:9;18323:17;18316:47;18380:131;18506:4;18380:131;:::i;:::-;18372:139;;18099:419;;;:::o;18524:230::-;18664:34;18660:1;18652:6;18648:14;18641:58;18733:13;18728:2;18720:6;18716:15;18709:38;18524:230;:::o;18760:366::-;18902:3;18923:67;18987:2;18982:3;18923:67;:::i;:::-;18916:74;;18999:93;19088:3;18999:93;:::i;:::-;19117:2;19112:3;19108:12;19101:19;;18760:366;;;:::o;19132:419::-;19298:4;19336:2;19325:9;19321:18;19313:26;;19385:9;19379:4;19375:20;19371:1;19360:9;19356:17;19349:47;19413:131;19539:4;19413:131;:::i;:::-;19405:139;;19132:419;;;:::o;19557:234::-;19697:34;19693:1;19685:6;19681:14;19674:58;19766:17;19761:2;19753:6;19749:15;19742:42;19557:234;:::o;19797:366::-;19939:3;19960:67;20024:2;20019:3;19960:67;:::i;:::-;19953:74;;20036:93;20125:3;20036:93;:::i;:::-;20154:2;20149:3;20145:12;20138:19;;19797:366;;;:::o;20169:419::-;20335:4;20373:2;20362:9;20358:18;20350:26;;20422:9;20416:4;20412:20;20408:1;20397:9;20393:17;20386:47;20450:131;20576:4;20450:131;:::i;:::-;20442:139;;20169:419;;;:::o;20594:179::-;20734:31;20730:1;20722:6;20718:14;20711:55;20594:179;:::o;20779:366::-;20921:3;20942:67;21006:2;21001:3;20942:67;:::i;:::-;20935:74;;21018:93;21107:3;21018:93;:::i;:::-;21136:2;21131:3;21127:12;21120:19;;20779:366;;;:::o;21151:419::-;21317:4;21355:2;21344:9;21340:18;21332:26;;21404:9;21398:4;21394:20;21390:1;21379:9;21375:17;21368:47;21432:131;21558:4;21432:131;:::i;:::-;21424:139;;21151:419;;;:::o;21576:224::-;21716:34;21712:1;21704:6;21700:14;21693:58;21785:7;21780:2;21772:6;21768:15;21761:32;21576:224;:::o;21806:366::-;21948:3;21969:67;22033:2;22028:3;21969:67;:::i;:::-;21962:74;;22045:93;22134:3;22045:93;:::i;:::-;22163:2;22158:3;22154:12;22147:19;;21806:366;;;:::o;22178:419::-;22344:4;22382:2;22371:9;22367:18;22359:26;;22431:9;22425:4;22421:20;22417:1;22406:9;22402:17;22395:47;22459:131;22585:4;22459:131;:::i;:::-;22451:139;;22178:419;;;:::o;22603:179::-;22743:31;22739:1;22731:6;22727:14;22720:55;22603:179;:::o;22788:366::-;22930:3;22951:67;23015:2;23010:3;22951:67;:::i;:::-;22944:74;;23027:93;23116:3;23027:93;:::i;:::-;23145:2;23140:3;23136:12;23129:19;;22788:366;;;:::o;23160:419::-;23326:4;23364:2;23353:9;23349:18;23341:26;;23413:9;23407:4;23403:20;23399:1;23388:9;23384:17;23377:47;23441:131;23567:4;23441:131;:::i;:::-;23433:139;;23160:419;;;:::o;23585:228::-;23725:34;23721:1;23713:6;23709:14;23702:58;23794:11;23789:2;23781:6;23777:15;23770:36;23585:228;:::o;23819:366::-;23961:3;23982:67;24046:2;24041:3;23982:67;:::i;:::-;23975:74;;24058:93;24147:3;24058:93;:::i;:::-;24176:2;24171:3;24167:12;24160:19;;23819:366;;;:::o;24191:419::-;24357:4;24395:2;24384:9;24380:18;24372:26;;24444:9;24438:4;24434:20;24430:1;24419:9;24415:17;24408:47;24472:131;24598:4;24472:131;:::i;:::-;24464:139;;24191:419;;;:::o;24616:232::-;24756:34;24752:1;24744:6;24740:14;24733:58;24825:15;24820:2;24812:6;24808:15;24801:40;24616:232;:::o;24854:366::-;24996:3;25017:67;25081:2;25076:3;25017:67;:::i;:::-;25010:74;;25093:93;25182:3;25093:93;:::i;:::-;25211:2;25206:3;25202:12;25195:19;;24854:366;;;:::o;25226:419::-;25392:4;25430:2;25419:9;25415:18;25407:26;;25479:9;25473:4;25469:20;25465:1;25454:9;25450:17;25443:47;25507:131;25633:4;25507:131;:::i;:::-;25499:139;;25226:419;;;:::o;25651:332::-;25772:4;25810:2;25799:9;25795:18;25787:26;;25823:71;25891:1;25880:9;25876:17;25867:6;25823:71;:::i;:::-;25904:72;25972:2;25961:9;25957:18;25948:6;25904:72;:::i;:::-;25651:332;;;;;:::o;25989:137::-;26043:5;26074:6;26068:13;26059:22;;26090:30;26114:5;26090:30;:::i;:::-;25989:137;;;;:::o;26132:345::-;26199:6;26248:2;26236:9;26227:7;26223:23;26219:32;26216:119;;;26254:79;;:::i;:::-;26216:119;26374:1;26399:61;26452:7;26443:6;26432:9;26428:22;26399:61;:::i;:::-;26389:71;;26345:125;26132:345;;;;:::o;26483:224::-;26623:34;26619:1;26611:6;26607:14;26600:58;26692:7;26687:2;26679:6;26675:15;26668:32;26483:224;:::o;26713:366::-;26855:3;26876:67;26940:2;26935:3;26876:67;:::i;:::-;26869:74;;26952:93;27041:3;26952:93;:::i;:::-;27070:2;27065:3;27061:12;27054:19;;26713:366;;;:::o;27085:419::-;27251:4;27289:2;27278:9;27274:18;27266:26;;27338:9;27332:4;27328:20;27324:1;27313:9;27309:17;27302:47;27366:131;27492:4;27366:131;:::i;:::-;27358:139;;27085:419;;;:::o;27510:180::-;27650:32;27646:1;27638:6;27634:14;27627:56;27510:180;:::o;27696:366::-;27838:3;27859:67;27923:2;27918:3;27859:67;:::i;:::-;27852:74;;27935:93;28024:3;27935:93;:::i;:::-;28053:2;28048:3;28044:12;28037:19;;27696:366;;;:::o;28068:419::-;28234:4;28272:2;28261:9;28257:18;28249:26;;28321:9;28315:4;28311:20;28307:1;28296:9;28292:17;28285:47;28349:131;28475:4;28349:131;:::i;:::-;28341:139;;28068:419;;;:::o;28493:230::-;28633:34;28629:1;28621:6;28617:14;28610:58;28702:13;28697:2;28689:6;28685:15;28678:38;28493:230;:::o;28729:366::-;28871:3;28892:67;28956:2;28951:3;28892:67;:::i;:::-;28885:74;;28968:93;29057:3;28968:93;:::i;:::-;29086:2;29081:3;29077:12;29070:19;;28729:366;;;:::o;29101:419::-;29267:4;29305:2;29294:9;29290:18;29282:26;;29354:9;29348:4;29344:20;29340:1;29329:9;29325:17;29318:47;29382:131;29508:4;29382:131;:::i;:::-;29374:139;;29101:419;;;:::o;29526:234::-;29666:34;29662:1;29654:6;29650:14;29643:58;29735:17;29730:2;29722:6;29718:15;29711:42;29526:234;:::o;29766:366::-;29908:3;29929:67;29993:2;29988:3;29929:67;:::i;:::-;29922:74;;30005:93;30094:3;30005:93;:::i;:::-;30123:2;30118:3;30114:12;30107:19;;29766:366;;;:::o;30138:419::-;30304:4;30342:2;30331:9;30327:18;30319:26;;30391:9;30385:4;30381:20;30377:1;30366:9;30362:17;30355:47;30419:131;30545:4;30419:131;:::i;:::-;30411:139;;30138:419;;;:::o;30563:225::-;30703:34;30699:1;30691:6;30687:14;30680:58;30772:8;30767:2;30759:6;30755:15;30748:33;30563:225;:::o;30794:366::-;30936:3;30957:67;31021:2;31016:3;30957:67;:::i;:::-;30950:74;;31033:93;31122:3;31033:93;:::i;:::-;31151:2;31146:3;31142:12;31135:19;;30794:366;;;:::o;31166:419::-;31332:4;31370:2;31359:9;31355:18;31347:26;;31419:9;31413:4;31409:20;31405:1;31394:9;31390:17;31383:47;31447:131;31573:4;31447:131;:::i;:::-;31439:139;;31166:419;;;:::o;31591:229::-;31731:34;31727:1;31719:6;31715:14;31708:58;31800:12;31795:2;31787:6;31783:15;31776:37;31591:229;:::o;31826:366::-;31968:3;31989:67;32053:2;32048:3;31989:67;:::i;:::-;31982:74;;32065:93;32154:3;32065:93;:::i;:::-;32183:2;32178:3;32174:12;32167:19;;31826:366;;;:::o;32198:419::-;32364:4;32402:2;32391:9;32387:18;32379:26;;32451:9;32445:4;32441:20;32437:1;32426:9;32422:17;32415:47;32479:131;32605:4;32479:131;:::i;:::-;32471:139;;32198:419;;;:::o;32623:233::-;32763:34;32759:1;32751:6;32747:14;32740:58;32832:16;32827:2;32819:6;32815:15;32808:41;32623:233;:::o;32862:366::-;33004:3;33025:67;33089:2;33084:3;33025:67;:::i;:::-;33018:74;;33101:93;33190:3;33101:93;:::i;:::-;33219:2;33214:3;33210:12;33203:19;;32862:366;;;:::o;33234:419::-;33400:4;33438:2;33427:9;33423:18;33415:26;;33487:9;33481:4;33477:20;33473:1;33462:9;33458:17;33451:47;33515:131;33641:4;33515:131;:::i;:::-;33507:139;;33234:419;;;:::o;33659:223::-;33799:34;33795:1;33787:6;33783:14;33776:58;33868:6;33863:2;33855:6;33851:15;33844:31;33659:223;:::o;33888:366::-;34030:3;34051:67;34115:2;34110:3;34051:67;:::i;:::-;34044:74;;34127:93;34216:3;34127:93;:::i;:::-;34245:2;34240:3;34236:12;34229:19;;33888:366;;;:::o;34260:419::-;34426:4;34464:2;34453:9;34449:18;34441:26;;34513:9;34507:4;34503:20;34499:1;34488:9;34484:17;34477:47;34541:131;34667:4;34541:131;:::i;:::-;34533:139;;34260:419;;;:::o;34685:221::-;34825:34;34821:1;34813:6;34809:14;34802:58;34894:4;34889:2;34881:6;34877:15;34870:29;34685:221;:::o;34912:366::-;35054:3;35075:67;35139:2;35134:3;35075:67;:::i;:::-;35068:74;;35151:93;35240:3;35151:93;:::i;:::-;35269:2;35264:3;35260:12;35253:19;;34912:366;;;:::o;35284:419::-;35450:4;35488:2;35477:9;35473:18;35465:26;;35537:9;35531:4;35527:20;35523:1;35512:9;35508:17;35501:47;35565:131;35691:4;35565:131;:::i;:::-;35557:139;;35284:419;;;:::o;35709:182::-;35849:34;35845:1;35837:6;35833:14;35826:58;35709:182;:::o;35897:366::-;36039:3;36060:67;36124:2;36119:3;36060:67;:::i;:::-;36053:74;;36136:93;36225:3;36136:93;:::i;:::-;36254:2;36249:3;36245:12;36238:19;;35897:366;;;:::o;36269:419::-;36435:4;36473:2;36462:9;36458:18;36450:26;;36522:9;36516:4;36512:20;36508:1;36497:9;36493:17;36486:47;36550:131;36676:4;36550:131;:::i;:::-;36542:139;;36269:419;;;:::o;36694:228::-;36834:34;36830:1;36822:6;36818:14;36811:58;36903:11;36898:2;36890:6;36886:15;36879:36;36694:228;:::o;36928:366::-;37070:3;37091:67;37155:2;37150:3;37091:67;:::i;:::-;37084:74;;37167:93;37256:3;37167:93;:::i;:::-;37285:2;37280:3;37276:12;37269:19;;36928:366;;;:::o;37300:419::-;37466:4;37504:2;37493:9;37489:18;37481:26;;37553:9;37547:4;37543:20;37539:1;37528:9;37524:17;37517:47;37581:131;37707:4;37581:131;:::i;:::-;37573:139;;37300:419;;;:::o;37725:175::-;37865:27;37861:1;37853:6;37849:14;37842:51;37725:175;:::o;37906:366::-;38048:3;38069:67;38133:2;38128:3;38069:67;:::i;:::-;38062:74;;38145:93;38234:3;38145:93;:::i;:::-;38263:2;38258:3;38254:12;38247:19;;37906:366;;;:::o;38278:419::-;38444:4;38482:2;38471:9;38467:18;38459:26;;38531:9;38525:4;38521:20;38517:1;38506:9;38502:17;38495:47;38559:131;38685:4;38559:131;:::i;:::-;38551:139;;38278:419;;;:::o;38703:170::-;38843:22;38839:1;38831:6;38827:14;38820:46;38703:170;:::o;38879:366::-;39021:3;39042:67;39106:2;39101:3;39042:67;:::i;:::-;39035:74;;39118:93;39207:3;39118:93;:::i;:::-;39236:2;39231:3;39227:12;39220:19;;38879:366;;;:::o;39251:419::-;39417:4;39455:2;39444:9;39440:18;39432:26;;39504:9;39498:4;39494:20;39490:1;39479:9;39475:17;39468:47;39532:131;39658:4;39532:131;:::i;:::-;39524:139;;39251:419;;;:::o;39676:180::-;39724:77;39721:1;39714:88;39821:4;39818:1;39811:15;39845:4;39842:1;39835:15;39862:185;39902:1;39919:20;39937:1;39919:20;:::i;:::-;39914:25;;39953:20;39971:1;39953:20;:::i;:::-;39948:25;;39992:1;39982:35;;39997:18;;:::i;:::-;39982:35;40039:1;40036;40032:9;40027:14;;39862:185;;;;:::o;40053:221::-;40193:34;40189:1;40181:6;40177:14;40170:58;40262:4;40257:2;40249:6;40245:15;40238:29;40053:221;:::o;40280:366::-;40422:3;40443:67;40507:2;40502:3;40443:67;:::i;:::-;40436:74;;40519:93;40608:3;40519:93;:::i;:::-;40637:2;40632:3;40628:12;40621:19;;40280:366;;;:::o;40652:419::-;40818:4;40856:2;40845:9;40841:18;40833:26;;40905:9;40899:4;40895:20;40891:1;40880:9;40876:17;40869:47;40933:131;41059:4;40933:131;:::i;:::-;40925:139;;40652:419;;;:::o;41077:223::-;41217:34;41213:1;41205:6;41201:14;41194:58;41286:6;41281:2;41273:6;41269:15;41262:31;41077:223;:::o;41306:366::-;41448:3;41469:67;41533:2;41528:3;41469:67;:::i;:::-;41462:74;;41545:93;41634:3;41545:93;:::i;:::-;41663:2;41658:3;41654:12;41647:19;;41306:366;;;:::o;41678:419::-;41844:4;41882:2;41871:9;41867:18;41859:26;;41931:9;41925:4;41921:20;41917:1;41906:9;41902:17;41895:47;41959:131;42085:4;41959:131;:::i;:::-;41951:139;;41678:419;;;:::o;42103:223::-;42243:34;42239:1;42231:6;42227:14;42220:58;42312:6;42307:2;42299:6;42295:15;42288:31;42103:223;:::o;42332:366::-;42474:3;42495:67;42559:2;42554:3;42495:67;:::i;:::-;42488:74;;42571:93;42660:3;42571:93;:::i;:::-;42689:2;42684:3;42680:12;42673:19;;42332:366;;;:::o;42704:419::-;42870:4;42908:2;42897:9;42893:18;42885:26;;42957:9;42951:4;42947:20;42943:1;42932:9;42928:17;42921:47;42985:131;43111:4;42985:131;:::i;:::-;42977:139;;42704:419;;;:::o;43129:222::-;43269:34;43265:1;43257:6;43253:14;43246:58;43338:5;43333:2;43325:6;43321:15;43314:30;43129:222;:::o;43357:366::-;43499:3;43520:67;43584:2;43579:3;43520:67;:::i;:::-;43513:74;;43596:93;43685:3;43596:93;:::i;:::-;43714:2;43709:3;43705:12;43698:19;;43357:366;;;:::o;43729:419::-;43895:4;43933:2;43922:9;43918:18;43910:26;;43982:9;43976:4;43972:20;43968:1;43957:9;43953:17;43946:47;44010:131;44136:4;44010:131;:::i;:::-;44002:139;;43729:419;;;:::o;44154:224::-;44294:34;44290:1;44282:6;44278:14;44271:58;44363:7;44358:2;44350:6;44346:15;44339:32;44154:224;:::o;44384:366::-;44526:3;44547:67;44611:2;44606:3;44547:67;:::i;:::-;44540:74;;44623:93;44712:3;44623:93;:::i;:::-;44741:2;44736:3;44732:12;44725:19;;44384:366;;;:::o;44756:419::-;44922:4;44960:2;44949:9;44945:18;44937:26;;45009:9;45003:4;44999:20;44995:1;44984:9;44980:17;44973:47;45037:131;45163:4;45037:131;:::i;:::-;45029:139;;44756:419;;;:::o;45181:222::-;45321:34;45317:1;45309:6;45305:14;45298:58;45390:5;45385:2;45377:6;45373:15;45366:30;45181:222;:::o;45409:366::-;45551:3;45572:67;45636:2;45631:3;45572:67;:::i;:::-;45565:74;;45648:93;45737:3;45648:93;:::i;:::-;45766:2;45761:3;45757:12;45750:19;;45409:366;;;:::o;45781:419::-;45947:4;45985:2;45974:9;45970:18;45962:26;;46034:9;46028:4;46024:20;46020:1;46009:9;46005:17;45998:47;46062:131;46188:4;46062:131;:::i;:::-;46054:139;;45781:419;;;:::o;46206:225::-;46346:34;46342:1;46334:6;46330:14;46323:58;46415:8;46410:2;46402:6;46398:15;46391:33;46206:225;:::o;46437:366::-;46579:3;46600:67;46664:2;46659:3;46600:67;:::i;:::-;46593:74;;46676:93;46765:3;46676:93;:::i;:::-;46794:2;46789:3;46785:12;46778:19;;46437:366;;;:::o;46809:419::-;46975:4;47013:2;47002:9;46998:18;46990:26;;47062:9;47056:4;47052:20;47048:1;47037:9;47033:17;47026:47;47090:131;47216:4;47090:131;:::i;:::-;47082:139;;46809:419;;;:::o;47234:143::-;47291:5;47322:6;47316:13;47307:22;;47338:33;47365:5;47338:33;:::i;:::-;47234:143;;;;:::o;47383:351::-;47453:6;47502:2;47490:9;47481:7;47477:23;47473:32;47470:119;;;47508:79;;:::i;:::-;47470:119;47628:1;47653:64;47709:7;47700:6;47689:9;47685:22;47653:64;:::i;:::-;47643:74;;47599:128;47383:351;;;;:::o;47740:85::-;47785:7;47814:5;47803:16;;47740:85;;;:::o;47831:158::-;47889:9;47922:61;47940:42;47949:32;47975:5;47949:32;:::i;:::-;47940:42;:::i;:::-;47922:61;:::i;:::-;47909:74;;47831:158;;;:::o;47995:147::-;48090:45;48129:5;48090:45;:::i;:::-;48085:3;48078:58;47995:147;;:::o;48148:114::-;48215:6;48249:5;48243:12;48233:22;;48148:114;;;:::o;48268:184::-;48367:11;48401:6;48396:3;48389:19;48441:4;48436:3;48432:14;48417:29;;48268:184;;;;:::o;48458:132::-;48525:4;48548:3;48540:11;;48578:4;48573:3;48569:14;48561:22;;48458:132;;;:::o;48596:108::-;48673:24;48691:5;48673:24;:::i;:::-;48668:3;48661:37;48596:108;;:::o;48710:179::-;48779:10;48800:46;48842:3;48834:6;48800:46;:::i;:::-;48878:4;48873:3;48869:14;48855:28;;48710:179;;;;:::o;48895:113::-;48965:4;48997;48992:3;48988:14;48980:22;;48895:113;;;:::o;49044:732::-;49163:3;49192:54;49240:5;49192:54;:::i;:::-;49262:86;49341:6;49336:3;49262:86;:::i;:::-;49255:93;;49372:56;49422:5;49372:56;:::i;:::-;49451:7;49482:1;49467:284;49492:6;49489:1;49486:13;49467:284;;;49568:6;49562:13;49595:63;49654:3;49639:13;49595:63;:::i;:::-;49588:70;;49681:60;49734:6;49681:60;:::i;:::-;49671:70;;49527:224;49514:1;49511;49507:9;49502:14;;49467:284;;;49471:14;49767:3;49760:10;;49168:608;;;49044:732;;;;:::o;49782:831::-;50045:4;50083:3;50072:9;50068:19;50060:27;;50097:71;50165:1;50154:9;50150:17;50141:6;50097:71;:::i;:::-;50178:80;50254:2;50243:9;50239:18;50230:6;50178:80;:::i;:::-;50305:9;50299:4;50295:20;50290:2;50279:9;50275:18;50268:48;50333:108;50436:4;50427:6;50333:108;:::i;:::-;50325:116;;50451:72;50519:2;50508:9;50504:18;50495:6;50451:72;:::i;:::-;50533:73;50601:3;50590:9;50586:19;50577:6;50533:73;:::i;:::-;49782:831;;;;;;;;:::o;50619:807::-;50868:4;50906:3;50895:9;50891:19;50883:27;;50920:71;50988:1;50977:9;50973:17;50964:6;50920:71;:::i;:::-;51001:72;51069:2;51058:9;51054:18;51045:6;51001:72;:::i;:::-;51083:80;51159:2;51148:9;51144:18;51135:6;51083:80;:::i;:::-;51173;51249:2;51238:9;51234:18;51225:6;51173:80;:::i;:::-;51263:73;51331:3;51320:9;51316:19;51307:6;51263:73;:::i;:::-;51346;51414:3;51403:9;51399:19;51390:6;51346:73;:::i;:::-;50619:807;;;;;;;;;:::o;51432:143::-;51489:5;51520:6;51514:13;51505:22;;51536:33;51563:5;51536:33;:::i;:::-;51432:143;;;;:::o;51581:663::-;51669:6;51677;51685;51734:2;51722:9;51713:7;51709:23;51705:32;51702:119;;;51740:79;;:::i;:::-;51702:119;51860:1;51885:64;51941:7;51932:6;51921:9;51917:22;51885:64;:::i;:::-;51875:74;;51831:128;51998:2;52024:64;52080:7;52071:6;52060:9;52056:22;52024:64;:::i;:::-;52014:74;;51969:129;52137:2;52163:64;52219:7;52210:6;52199:9;52195:22;52163:64;:::i;:::-;52153:74;;52108:129;51581:663;;;;;:::o;52250:179::-;52390:31;52386:1;52378:6;52374:14;52367:55;52250:179;:::o;52435:366::-;52577:3;52598:67;52662:2;52657:3;52598:67;:::i;:::-;52591:74;;52674:93;52763:3;52674:93;:::i;:::-;52792:2;52787:3;52783:12;52776:19;;52435:366;;;:::o;52807:419::-;52973:4;53011:2;53000:9;52996:18;52988:26;;53060:9;53054:4;53050:20;53046:1;53035:9;53031:17;53024:47;53088:131;53214:4;53088:131;:::i;:::-;53080:139;;52807:419;;;:::o;53232:147::-;53333:11;53370:3;53355:18;;53232:147;;;;:::o;53385:114::-;;:::o;53505:398::-;53664:3;53685:83;53766:1;53761:3;53685:83;:::i;:::-;53678:90;;53777:93;53866:3;53777:93;:::i;:::-;53895:1;53890:3;53886:11;53879:18;;53505:398;;;:::o;53909:379::-;54093:3;54115:147;54258:3;54115:147;:::i;:::-;54108:154;;54279:3;54272:10;;53909:379;;;:::o;54294:245::-;54434:34;54430:1;54422:6;54418:14;54411:58;54503:28;54498:2;54490:6;54486:15;54479:53;54294:245;:::o;54545:366::-;54687:3;54708:67;54772:2;54767:3;54708:67;:::i;:::-;54701:74;;54784:93;54873:3;54784:93;:::i;:::-;54902:2;54897:3;54893:12;54886:19;;54545:366;;;:::o;54917:419::-;55083:4;55121:2;55110:9;55106:18;55098:26;;55170:9;55164:4;55160:20;55156:1;55145:9;55141:17;55134:47;55198:131;55324:4;55198:131;:::i;:::-;55190:139;;54917:419;;;:::o

Swarm Source

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