ETH Price: $3,385.99 (+0.86%)

Token

Women Empowerment Token (WEMP)
 

Overview

Max Total Supply

586,445,378,073,858.821607791467808015 WEMP

Holders

1,861

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,518,356,253.132858119363316808 WEMP

Value
$0.00
0x6e4b9008382a18a3474f9808f0225a1ad58d01e3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Women Empowerment Token (WEMP) is a Community-Driven & Decentralized Luxury DeFi / Social Cause ERC20 Token with Automatic Rewards for Holders. The mission of WEMP is to Support & Empower Women Globally, while providing a platform to expose more Women to Crypto.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WempToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-07
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

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

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

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

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

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

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

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

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

/**
 * @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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of 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 WempToken is Context, IERC20, IERC20Metadata, Ownable, Pausable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private pausedAddress;
    mapping (address => bool) private _isExcluded;
    mapping (address => bool) private _isExcludedFromDexFee;
    mapping (address => bool) private _isIncludedInFee; // Tax Flag
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant initialSupply = 1000000 * 10**9 * 10**18;   // initial supply
    uint256 private _tTotal = initialSupply - (initialSupply * 40 / 100);   // supply after deflation
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private constant _name = "Women Empowerment Token";
    string private constant _symbol = "WEMP";
    uint8 private constant _decimals = 18;
    
    uint256 public taxFee = 2;
    uint256 private previousTaxFee = taxFee;

    uint256 public liquidityFee = 1;
    uint256 private previousLiquidityFee = liquidityFee;
    
    uint256 public transactionBurn = 1;
    uint256 private previousTransactionBurn = transactionBurn;

    uint256 public charityFee = 1;
    uint256 private previousCharityFee = charityFee;

    uint256 public womenWelfareFee = 1;
    uint256 private previousWomenWelfareFee = womenWelfareFee;

    bool public enableFee = true;
    bool private inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
 
    uint256 private _amount_burnt;
    uint256 public liquidityFeeBalance;
    uint256 public constant liquidityFeeToSell = 10000 * 10**18;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address private constant UNISWAPV2ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public uniswapV2Pair;
    address public charityWallet;
    address public welfareWallet;

    event FeeEnable(bool enableFee);
    event SetMaxTxPercent(uint256 maxPercent);
    event SetCharityAddress(address indexed charityAddress);
    event SetCharityFeePercent(uint256 chartyFeePercent);
    event SetBurnPercent(uint256 burnPercent);
    event SetTaxFeePercent(uint256 taxFeePercent);
    event SetLiquidityFeePercent(uint256 liquidityFeePercent);
    event ExcludeFromFee(address indexed account, bool includeInFee);
    event IncludeInFee(address indexed account, bool includeInFee);
    event ExcludeFromDexFee(address indexed account, bool includeInDexFee);
    event IncludeInDexFee(address indexed account, bool includeInDexFee);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event ExternalTokenTransfered(address indexed externalAddress,address indexed toAddress, uint amount);
    event EthFromContractTransferred(uint amount);
    event LiquidityAddedFromSwap(uint amountToken,uint amountEth,uint liquidity);

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

    constructor (address _charityWallet, address _welfareWallet) {
        require ( _charityWallet != address ( 0 ) , "WempToken: _charityWallet is a zero address") ;
        require ( _welfareWallet != address ( 0 ) , "WempToken: _welfareWallet is a zero address") ;

        _rOwned[_msgSender()] = _rTotal;
        charityWallet = _charityWallet;
        welfareWallet = _welfareWallet;
        emit Transfer(address(0), _msgSender(), initialSupply);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPV2ROUTER);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        tokenDeflation();       
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external 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() external view virtual override returns (uint8) {
        return _decimals;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) external virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - 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) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) external virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Pause `contract` - pause events.
     *
     * See {ERC20Pausable-_pause}.
     */
    function pauseContract() external virtual onlyOwner {
        _pause();
    }
    
    /**
     * @dev Pause `contract` - pause events.
     *
     * See {ERC20Pausable-_pause}.
     */
    function unPauseContract() external virtual onlyOwner {
        _unpause();
    }

    /**
     * @dev Pause `contract` - pause events.
     *
     * See {ERC20Pausable-_pause}.
     */
    function pauseAddress(address account) external virtual onlyOwner {
        excludeFromReward(account);
        pausedAddress[account] = true;
    }
    
    /**
     * @dev Pause `contract` - pause events.
     *
     * See {ERC20Pausable-_pause}.
     */
    function unPauseAddress(address account) external virtual onlyOwner {
        includeInReward(account);
        pausedAddress[account] = false;
    }
    
    /**
     * @dev Returns true if the address is paused, and false otherwise.
     */
    function isAddressPaused(address account) external view virtual returns (bool) {
        return pausedAddress[account];
    }

    function tokenDeflation() internal {
        uint256 deflationAmount = initialSupply * 40 / 100;
        emit Transfer(_msgSender(), address(0), deflationAmount);
    }

    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) public onlyOwner {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcluded[account];
    }
    
    function excludeFromDexFee(address account) external onlyOwner {
        _isExcludedFromDexFee[account] = true;
        emit ExcludeFromDexFee(account, true);
    }
    
    function includeInDexFee(address account) external onlyOwner {
        _isExcludedFromDexFee[account] = false;
        emit IncludeInDexFee(account, false);
    }

    function isExcludedFromDexFee(address account) external view returns(bool) {
        return _isExcludedFromDexFee[account];
    }

    function excludeFromFee(address account) external onlyOwner {
        _isIncludedInFee[account] = false;
        emit ExcludeFromFee(account, false);
    }
    
    function includeInFee(address account) external onlyOwner {
        _isIncludedInFee[account] = true;
        emit IncludeInFee(account, true);
    }

    function isIncludedInFee(address account) external view returns(bool) {
        return _isIncludedInFee[account];
    }
    
    function setTaxFeePercent(uint256 fee) external onlyOwner {
        require((fee + liquidityFee + transactionBurn + charityFee + womenWelfareFee) < 100, "Total fees should be less than 100%");
        taxFee = fee;
        emit SetTaxFeePercent(taxFee);
    }

    function setLiquidityFeePercent(uint256 fee) external onlyOwner {
        require((taxFee + fee + transactionBurn + charityFee + womenWelfareFee) < 100, "Total fees should be less than 100%");
        liquidityFee = fee;
        emit SetLiquidityFeePercent(liquidityFee);
    }

    function setBurnPercent(uint256 burn_percentage) external onlyOwner {
        require((taxFee + liquidityFee + burn_percentage + charityFee + womenWelfareFee) < 100, "Total fees should be less than 100%");
        transactionBurn = burn_percentage;
        emit SetBurnPercent(burn_percentage);
    }

    function setCharityFeePercent(uint256 fee) external onlyOwner {
        require((taxFee + liquidityFee + transactionBurn + fee + womenWelfareFee) < 100, "Total fees should be less than 100%");
        charityFee = fee;
        emit SetCharityFeePercent(charityFee);
    }

    function setWomenWelfareFeePercent(uint256 fee) external onlyOwner {
        require((taxFee + liquidityFee + transactionBurn + charityFee + fee) < 100, "Total fees should be less than 100%");
        womenWelfareFee = fee;
        emit SetCharityFeePercent(womenWelfareFee);
    }

    function updateCharityWallet(address _charityWallet) external onlyOwner {
        require(_charityWallet != address(0), "ERC20: Charity address cannot be a zero address");
        charityWallet = _charityWallet;
        emit SetCharityAddress(_charityWallet);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function setEnableFee(bool enableTax) external onlyOwner {
        enableFee = enableTax;
        emit FeeEnable(enableTax);
    }

    function takeReflectionFee(uint256 rFee, uint256 tFee) internal {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function getTValues(uint256 amount) internal view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        uint256 tAmount = amount;
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tCharityFee = calculateCharityFee(tAmount);
        uint256 tWelfareFee = calculateWomenWelfareFee(tAmount);
        uint256 tBurn = calculateTransactionBurn(tAmount);
        {
            uint256 amt = tAmount;
            uint256 tTransferAmount = amt.sub(tFee).sub(tLiquidity).sub(tBurn).sub(tCharityFee).sub(tWelfareFee);
            return (tTransferAmount, tFee, tLiquidity, tBurn, tCharityFee, tWelfareFee);
        }
    }

    function getRValues(uint256 amount, uint256 tFee, uint256 tLiquidity, uint256 tBurn, uint256 tCharityFee, uint256 tWelfareFee) internal view returns (uint256, uint256, uint256) {
        uint256 currentRate = getRate();
        uint256 tAmount = amount;
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rliquidity = tLiquidity.mul(currentRate);
        uint256 rCharityFee = tCharityFee.mul(currentRate);
        uint256 rWelfareFee = tWelfareFee.mul(currentRate);
        uint256 rBurn = tBurn.mul(currentRate);
        {
            uint256 amt = rAmount;
            uint256 rTransferAmount = amt.sub(rFee).sub(rliquidity).sub(rBurn).sub(rCharityFee).sub(rWelfareFee);
            return (rAmount, rTransferAmount, rFee);
        }
    }

    function getRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function takeCharityFee(address sender, uint256 tCharityFee) internal {
        uint256 currentRate =  getRate();
        uint256 rCharityFee = tCharityFee.mul(currentRate);
        _rOwned[charityWallet] = _rOwned[charityWallet].add(rCharityFee);
        if(_isExcluded[charityWallet])
            _tOwned[charityWallet] = _tOwned[charityWallet].add(tCharityFee);
        
        if(tCharityFee > 0) emit Transfer(sender, charityWallet, tCharityFee);
    }

    function takeWomenWelfareFee(address sender, uint256 tWelfareFee) internal {
        uint256 currentRate =  getRate();
        uint256 rWelfareFee = tWelfareFee.mul(currentRate);
        _rOwned[welfareWallet] = _rOwned[welfareWallet].add(rWelfareFee);
        if(_isExcluded[welfareWallet])
            _tOwned[welfareWallet] = _tOwned[welfareWallet].add(tWelfareFee);
        
        if(tWelfareFee > 0) emit Transfer(sender, welfareWallet, tWelfareFee);
    }

    function takeLiquidityFee(address sender, uint256 tLiquidity) internal {
        uint256 currentRate =  getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        liquidityFeeBalance += tLiquidity;
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
        
        if(tLiquidity > 0) emit Transfer(sender, address(this), tLiquidity);
    }
    
    function calculateTaxFee(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(taxFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(liquidityFee).div(
            10**2
        );
    }

    function calculateTransactionBurn(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(transactionBurn).div(
            10**2
        );
    }

    function calculateCharityFee(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(charityFee).div(
            10**2
        );
    }

    function calculateWomenWelfareFee(uint256 _amount) internal view returns (uint256) {
        return _amount.mul(womenWelfareFee).div(
            10**2
        );
    }
    
    function removeAllFee() internal {
        if(taxFee == 0 && liquidityFee == 0 && transactionBurn == 0 && charityFee == 0 && womenWelfareFee == 0) return;
        
        previousTaxFee = taxFee;
        previousLiquidityFee = liquidityFee;
        previousTransactionBurn = transactionBurn;
        previousCharityFee = charityFee;
        previousWomenWelfareFee = womenWelfareFee;
        
        taxFee = 0;
        liquidityFee = 0;
        transactionBurn = 0;
        charityFee = 0;
        womenWelfareFee = 0;
    }
 
    function restoreAllFee() internal {
        taxFee = previousTaxFee;
        liquidityFee = previousLiquidityFee;
        transactionBurn = previousTransactionBurn;
        charityFee = previousCharityFee;
        womenWelfareFee = previousWomenWelfareFee;
    }

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

    /**
     * @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 Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        _beforeTokenTransfer(from, to);
        
        uint256 senderBalance = balanceOf(from);
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");

        //indicates if fee should be deducted from transfer
        bool takeFee = false;
        
        //if any account belongs to _isIncludedInFee account then take fee
        //else remove fee
        if(enableFee && (_isIncludedInFee[from] || _isIncludedInFee[to])){
            if((from == uniswapV2Pair && _isExcludedFromDexFee[to]) || (to == uniswapV2Pair && _isExcludedFromDexFee[from])) takeFee = false;
            else takeFee = true;
        }
        if(takeFee) _swapAndLiquify(from);
         
         //transfer amount, it will take tax, burn and charity amount
        _tokenTransfer(from,to,amount,takeFee);
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) internal {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }
  
    function _transferStandard(address sender, address recipient, uint256 tAmount) internal {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tBurn, uint256 tCharityFee, uint256 tWelfareFee) = getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = getRValues(tAmount, tFee, tLiquidity, tBurn, tCharityFee, tWelfareFee);

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        takeReflectionFee(rFee, tFee);
        takeLiquidityFee(sender, tLiquidity);
        takeCharityFee(sender, tCharityFee);
        takeWomenWelfareFee(sender, tWelfareFee);
        if(tBurn > 0) {
            _amount_burnt += tBurn;
            emit Transfer(sender, address(0), tBurn);
        }
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tBurn, uint256 tCharityFee, uint256 tWelfareFee) = getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = getRValues(tAmount, tFee, tLiquidity, tBurn, tCharityFee, tWelfareFee);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        takeReflectionFee(rFee, tFee);
        takeLiquidityFee(sender, tLiquidity);
        takeCharityFee(sender, tCharityFee);
        takeWomenWelfareFee(sender, tWelfareFee);
        if(tBurn > 0) {
            _amount_burnt += tBurn;
            emit Transfer(sender, address(0), tBurn);
        }
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tBurn, uint256 tCharityFee, uint256 tWelfareFee) = getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = getRValues(tAmount, tFee, tLiquidity, tBurn, tCharityFee, tWelfareFee);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        takeReflectionFee(rFee, tFee);
        takeLiquidityFee(sender, tLiquidity);
        takeCharityFee(sender, tCharityFee);
        takeWomenWelfareFee(sender, tWelfareFee);
        if(tBurn > 0) {
            _amount_burnt += tBurn;
            emit Transfer(sender, address(0), tBurn);
        }
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) internal {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tBurn, uint256 tCharityFee, uint256 tWelfareFee) = getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = getRValues(tAmount, tFee, tLiquidity, tBurn, tCharityFee, tWelfareFee);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        takeReflectionFee(rFee, tFee);
        takeLiquidityFee(sender, tLiquidity);
        takeCharityFee(sender, tCharityFee);
        takeWomenWelfareFee(sender, tWelfareFee);
        if(tBurn > 0) {
            _amount_burnt += tBurn;
            emit Transfer(sender, address(0), tBurn);
        }
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _swapAndLiquify(address from) internal {
        if(from != uniswapV2Pair && liquidityFeeBalance >= liquidityFeeToSell) {
            bool initialFeeState = enableFee;
            // remove fee if initialFeeState was true
            if(initialFeeState) enableFee = false;

            // is the token balance of this contract address over the min number of
            // tokens that we need to initiate a swap + liquidity lock?
            // also, don't get caught in a circular liquidity event.
            // also, don't swap & liquify if sender is uniswap pair.
            if(!inSwapAndLiquify && swapAndLiquifyEnabled && liquidityFeeBalance >= liquidityFeeToSell) {
                uint256 fee = liquidityFeeBalance;
                liquidityFeeBalance = 0;
                //add liquidity
                swapAndLiquify(fee, owner());
            }

            // enable fee if initialFeeState was true
            if(initialFeeState) enableFee = true;
        }
    }

    function swapAndLiquify(uint256 contractTokenBalance, address account) internal lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half, address(this)); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance, account);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

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

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

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

        // add the liquidity
        (uint amountToken, uint amountETH, uint liquidity) = uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            account,
            block.timestamp
        );
        emit LiquidityAddedFromSwap(amountToken,amountETH,liquidity);
    }

    function withdrawToken(address _tokenContract, uint256 _amount) external onlyOwner {
        require(_tokenContract != address(0), "Address cant be zero address");
        IERC20 tokenContract = IERC20(_tokenContract);
        tokenContract.transfer(msg.sender, _amount);
        emit ExternalTokenTransfered(_tokenContract, msg.sender, _amount);
    }

    function getBalance() public view returns (uint256) {
        return address(this).balance;
    }

    function withdrawEthFromContract(uint256 amount) public onlyOwner {
        require(amount <= getBalance());
        address payable _owner = payable(owner());
        _owner.transfer(amount);
        emit EthFromContractTransferred(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 to 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) internal virtual { 
        require(!paused(), "ERC20Pausable: token transfer while contract paused");
        require(!pausedAddress[from], "ERC20Pausable: token transfer while from-address paused");
        require(!pausedAddress[to], "ERC20Pausable: token transfer while to-address paused");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_charityWallet","type":"address"},{"internalType":"address","name":"_welfareWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthFromContractTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"includeInDexFee","type":"bool"}],"name":"ExcludeFromDexFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"includeInFee","type":"bool"}],"name":"ExcludeFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"externalAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExternalTokenTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enableFee","type":"bool"}],"name":"FeeEnable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"includeInDexFee","type":"bool"}],"name":"IncludeInDexFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"includeInFee","type":"bool"}],"name":"IncludeInFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"LiquidityAddedFromSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burnPercent","type":"uint256"}],"name":"SetBurnPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"charityAddress","type":"address"}],"name":"SetCharityAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chartyFeePercent","type":"uint256"}],"name":"SetCharityFeePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityFeePercent","type":"uint256"}],"name":"SetLiquidityFeePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPercent","type":"uint256"}],"name":"SetMaxTxPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taxFeePercent","type":"uint256"}],"name":"SetTaxFeePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","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":[],"name":"charityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityWallet","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":"enableFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDexFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDexFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAddressPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDexFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isIncludedInFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeToSell","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":[{"internalType":"address","name":"account","type":"address"}],"name":"pauseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"burn_percentage","type":"uint256"}],"name":"setBurnPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setCharityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableTax","type":"bool"}],"name":"setEnableFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setWomenWelfareFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"transactionBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"account","type":"address"}],"name":"unPauseAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_charityWallet","type":"address"}],"name":"updateCharityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"welfareWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEthFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"womenWelfareFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526064620000216d314dc6448d9338c15b0a000000006028620005da565b6200002d9190620005c3565b62000047906d314dc6448d9338c15b0a00000000620005fc565b60098190556200005a9060001962000616565b6200006890600019620005fc565b600a556002600c819055600d556001600e819055600f8190556010819055601181905560128190556013819055601481905560158190556016805462ff00001960ff199091169092179190911662010000179055348015620000c957600080fd5b506040516200413338038062004133833981016040819052620000ec91620004d3565b6000620000f862000421565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b191690556001600160a01b038216620001815760405162461bcd60e51b815260040162000178906200056f565b60405180910390fd5b6001600160a01b038116620001aa5760405162461bcd60e51b8152600401620001789062000524565b600a5460016000620001bb62000421565b6001600160a01b039081168252602082019290925260400160002091909155601a80546001600160a01b031990811685841617909155601b80549091169183169190911790556200020b62000421565b6001600160a01b031660006001600160a01b0316600080516020620041138339815191526d314dc6448d9338c15b0a000000006040516200024d9190620005ba565b60405180910390a36000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a857600080fd5b505afa158015620002bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e39190620004af565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200032c57600080fd5b505afa15801562000341573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003679190620004af565b6040518363ffffffff1660e01b8152600401620003869291906200050a565b602060405180830381600087803b158015620003a157600080fd5b505af1158015620003b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003dc9190620004af565b601980546001600160a01b0319166001600160a01b0392909216919091179055606081901b6001600160601b0319166080526200041862000425565b50505062000659565b3390565b60006064620004446d314dc6448d9338c15b0a000000006028620005da565b620004509190620005c3565b905060006200045e62000421565b6001600160a01b03166000805160206200411383398151915283604051620004879190620005ba565b60405180910390a350565b80516001600160a01b0381168114620004aa57600080fd5b919050565b600060208284031215620004c1578081fd5b620004cc8262000492565b9392505050565b60008060408385031215620004e6578081fd5b620004f18362000492565b9150620005016020840162000492565b90509250929050565b6001600160a01b0392831681529116602082015260400190565b6020808252602b908201527f57656d70546f6b656e3a205f77656c6661726557616c6c65742069732061207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252602b908201527f57656d70546f6b656e3a205f6368617269747957616c6c65742069732061207a60408201526a65726f206164647265737360a81b606082015260800190565b90815260200190565b600082620005d557620005d562000643565b500490565b6000816000190483118215151615620005f757620005f76200062d565b500290565b6000828210156200061157620006116200062d565b500390565b60008262000628576200062862000643565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b60805160601c613a786200069b60003960008181610ac0015281816129ad01528181612a8301528181612abf01528181612b3a0152612b660152613a786000f3fe6080604052600436106103545760003560e01c80638ee88c53116101c6578063c9668ce2116100f7578063ecfca89911610095578063f80edba51161006f578063f80edba51461091a578063fbac48371461092f578063fd7eedf51461094f578063ffb1a8cf1461096f5761035b565b8063ecfca899146108c5578063f072eac1146108da578063f2fde38b146108fa5761035b565b8063dd62ed3e116100d1578063dd62ed3e14610850578063e644d34e14610870578063e7b50a8e14610885578063ea2f0b37146108a55761035b565b8063c9668ce2146107fb578063ca9f2ee214610810578063d8e00271146108305761035b565b8063a9059cbb11610164578063bb1570da1161013e578063bb1570da1461077b578063bdb8dd471461079b578063c49b9a80146107bb578063c4ff9cb7146107db5761035b565b8063a9059cbb14610726578063af41063b14610746578063bac15203146107665761035b565b806399b579c6116101a057806399b579c6146106bc5780639e281a98146106d1578063a071dcf4146106f1578063a457c2d7146107065761035b565b80638ee88c531461067257806395d89b411461069257806398118cb4146106a75761035b565b80633e65d4aa116102a057806360ba1c3e1161023e57806377df472c1161021857806377df472c146106085780637b2087691461062857806388f820201461063d5780638da5cb5b1461065d5761035b565b806360ba1c3e146105b357806370a08231146105d3578063715018a6146105f35761035b565b806349bd5a5e1161027a57806349bd5a5e146105545780634a74bb021461056957806352390c021461057e5780635c975abb1461059e5761035b565b80633e65d4aa146104ff578063437823ec1461051f578063439766ce1461053f5761035b565b806318160ddd1161030d57806330d2091d116102e757806330d2091d14610488578063313ce5671461049d5780633685d419146104bf57806339509351146104df5761035b565b806318160ddd1461043357806323b872dd146104485780632d838119146104685761035b565b8063061c82d01461036057806306fdde0314610382578063095ea7b3146103ad57806312065fe0146103da57806313114a9d146103fc5780631694505e146104115761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b366004613235565b610984565b005b34801561038e57600080fd5b50610397610a60565b6040516103a491906132ed565b60405180910390f35b3480156103b957600080fd5b506103cd6103c83660046131d2565b610a97565b6040516103a491906132e2565b3480156103e657600080fd5b506103ef610ab4565b6040516103a491906138c3565b34801561040857600080fd5b506103ef610ab8565b34801561041d57600080fd5b50610426610abe565b6040516103a4919061327a565b34801561043f57600080fd5b506103ef610ae2565b34801561045457600080fd5b506103cd610463366004613192565b610af9565b34801561047457600080fd5b506103ef610483366004613235565b610b90565b34801561049457600080fd5b506103cd610bd3565b3480156104a957600080fd5b506104b2610bdc565b6040516103a49190613952565b3480156104cb57600080fd5b506103806104da366004613122565b610be1565b3480156104eb57600080fd5b506103cd6104fa3660046131d2565b610db6565b34801561050b57600080fd5b5061038061051a366004613122565b610e05565b34801561052b57600080fd5b5061038061053a366004613122565b610eb4565b34801561054b57600080fd5b50610380610f4b565b34801561056057600080fd5b50610426610f94565b34801561057557600080fd5b506103cd610fa3565b34801561058a57600080fd5b50610380610599366004613122565b610fb2565b3480156105aa57600080fd5b506103cd6110ea565b3480156105bf57600080fd5b506103cd6105ce366004613122565b6110fa565b3480156105df57600080fd5b506103ef6105ee366004613122565b611118565b3480156105ff57600080fd5b50610380611180565b34801561061457600080fd5b50610380610623366004613122565b611209565b34801561063457600080fd5b50610426611275565b34801561064957600080fd5b506103cd610658366004613122565b611284565b34801561066957600080fd5b506104266112a2565b34801561067e57600080fd5b5061038061068d366004613235565b6112b1565b34801561069e57600080fd5b50610397611379565b3480156106b357600080fd5b506103ef611397565b3480156106c857600080fd5b506103ef61139d565b3480156106dd57600080fd5b506103806106ec3660046131d2565b6113a3565b3480156106fd57600080fd5b506103ef6114db565b34801561071257600080fd5b506103cd6107213660046131d2565b6114e1565b34801561073257600080fd5b506103cd6107413660046131d2565b61155a565b34801561075257600080fd5b50610380610761366004613235565b61156e565b34801561077257600080fd5b50610380611636565b34801561078757600080fd5b50610380610796366004613235565b61167d565b3480156107a757600080fd5b506103806107b6366004613122565b611745565b3480156107c757600080fd5b506103806107d63660046131fd565b6117d9565b3480156107e757600080fd5b506103cd6107f6366004613122565b61185d565b34801561080757600080fd5b506103ef61187b565b34801561081c57600080fd5b5061038061082b366004613122565b611881565b34801561083c57600080fd5b5061038061084b3660046131fd565b6118ea565b34801561085c57600080fd5b506103ef61086b36600461315a565b611967565b34801561087c57600080fd5b506103ef611992565b34801561089157600080fd5b506103806108a0366004613235565b6119a0565b3480156108b157600080fd5b506103806108c0366004613122565b611a72565b3480156108d157600080fd5b506103ef611b06565b3480156108e657600080fd5b506103806108f5366004613235565b611b0c565b34801561090657600080fd5b50610380610915366004613122565b611bd4565b34801561092657600080fd5b50610426611c94565b34801561093b57600080fd5b506103cd61094a366004613122565b611ca3565b34801561095b57600080fd5b5061038061096a366004613122565b611cc1565b34801561097b57600080fd5b506103ef611d4d565b61098c611d53565b6001600160a01b031661099d6112a2565b6001600160a01b0316146109cc5760405162461bcd60e51b81526004016109c390613698565b60405180910390fd5b6064601454601254601054600e54856109e59190613960565b6109ef9190613960565b6109f99190613960565b610a039190613960565b10610a205760405162461bcd60e51b81526004016109c3906135be565b600c8190556040517f19da908cae03512cf29c19a5842b2904a06fd24ef9982759c78f9379831ed70f90610a559083906138c3565b60405180910390a150565b60408051808201909152601781527f576f6d656e20456d706f7765726d656e7420546f6b656e000000000000000000602082015290565b6000610aab610aa4611d53565b8484611d57565b50600192915050565b4790565b600b5490565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000601754600954610af491906139b7565b905090565b6000610b06848484611dfe565b6001600160a01b038416600090815260036020526040812081610b27611d53565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610b6a5760405162461bcd60e51b81526004016109c390613650565b610b8585610b76611d53565b610b8086856139b7565b611d57565b506001949350505050565b6000600a54821115610bb45760405162461bcd60e51b81526004016109c3906133b1565b6000610bbe611f98565b9050610bca8382611fbb565b9150505b919050565b60165460ff1681565b601290565b610be9611d53565b6001600160a01b0316610bfa6112a2565b6001600160a01b031614610c205760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660009081526005602052604090205460ff16610c585760405162461bcd60e51b81526004016109c39061355d565b60005b600854811015610db257816001600160a01b031660088281548110610c9057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610da05760088054610cbb906001906139b7565b81548110610cd957634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600880546001600160a01b039092169183908110610d1357634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556008805480610d7957634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610db2565b80610daa816139ce565b915050610c5b565b5050565b6000610aab610dc3611d53565b848460036000610dd1611d53565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610b809190613960565b610e0d611d53565b6001600160a01b0316610e1e6112a2565b6001600160a01b031614610e445760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116610e6a5760405162461bcd60e51b81526004016109c390613601565b601a80546001600160a01b0319166001600160a01b0383169081179091556040517fa3de4742668f41ee43041a21d2a1cdd8348a6b4ae41987eaf3402a5ae21c8cd690600090a250565b610ebc611d53565b6001600160a01b0316610ecd6112a2565b6001600160a01b031614610ef35760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fd5144d2a6c8ff9b87b7a40852df5102cab2ce561c06b56cc6fe7ccf1fa7f8c2d91610f40916132e2565b60405180910390a250565b610f53611d53565b6001600160a01b0316610f646112a2565b6001600160a01b031614610f8a5760405162461bcd60e51b81526004016109c390613698565b610f92611fce565b565b6019546001600160a01b031681565b60165462010000900460ff1681565b610fba611d53565b6001600160a01b0316610fcb6112a2565b6001600160a01b031614610ff15760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660009081526005602052604090205460ff161561102a5760405162461bcd60e51b81526004016109c3906134e0565b6001600160a01b03811660009081526001602052604090205415611084576001600160a01b03811660009081526001602052604090205461106a90610b90565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b600054600160a01b900460ff1690565b6001600160a01b031660009081526006602052604090205460ff1690565b6001600160a01b03811660009081526005602052604081205460ff161561115857506001600160a01b038116600090815260026020526040902054610bce565b6001600160a01b03821660009081526001602052604090205461117a90610b90565b92915050565b611188611d53565b6001600160a01b03166111996112a2565b6001600160a01b0316146111bf5760405162461bcd60e51b81526004016109c390613698565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611211611d53565b6001600160a01b03166112226112a2565b6001600160a01b0316146112485760405162461bcd60e51b81526004016109c390613698565b61125181610fb2565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b601a546001600160a01b031681565b6001600160a01b031660009081526005602052604090205460ff1690565b6000546001600160a01b031690565b6112b9611d53565b6001600160a01b03166112ca6112a2565b6001600160a01b0316146112f05760405162461bcd60e51b81526004016109c390613698565b606460145460125460105484600c546113099190613960565b6113139190613960565b61131d9190613960565b6113279190613960565b106113445760405162461bcd60e51b81526004016109c3906135be565b600e8190556040517fa080f06a1e9c2a432b1d35cf0a54ebca051cf5dce7433c3d8e94948436f1035690610a559083906138c3565b604080518082019091526004815263057454d560e41b602082015290565b600e5481565b60145481565b6113ab611d53565b6001600160a01b03166113bc6112a2565b6001600160a01b0316146113e25760405162461bcd60e51b81526004016109c390613698565b6001600160a01b0382166114085760405162461bcd60e51b81526004016109c390613716565b60405163a9059cbb60e01b815282906001600160a01b0382169063a9059cbb90611438903390869060040161328e565b602060405180830381600087803b15801561145257600080fd5b505af1158015611466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148a9190613219565b50336001600160a01b0316836001600160a01b03167f5c5578c78fc9b87943279247ef36abf638b9551372bb769b5d87d1ae6a31be64846040516114ce91906138c3565b60405180910390a3505050565b600c5481565b600080600360006114f0611d53565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561153c5760405162461bcd60e51b81526004016109c39061387e565b611550611547611d53565b85858403611d57565b5060019392505050565b6000610aab611567611d53565b8484611dfe565b611576611d53565b6001600160a01b03166115876112a2565b6001600160a01b0316146115ad5760405162461bcd60e51b81526004016109c390613698565b606460145482601054600e54600c546115c69190613960565b6115d09190613960565b6115da9190613960565b6115e49190613960565b106116015760405162461bcd60e51b81526004016109c3906135be565b60128190556040517fcafec6c6f7ac33c8f506524db5237627cd7b6ed6cd3f70ab8c328f28723af90590610a559083906138c3565b61163e611d53565b6001600160a01b031661164f6112a2565b6001600160a01b0316146116755760405162461bcd60e51b81526004016109c390613698565b610f92612046565b611685611d53565b6001600160a01b03166116966112a2565b6001600160a01b0316146116bc5760405162461bcd60e51b81526004016109c390613698565b606460145460125483600e54600c546116d59190613960565b6116df9190613960565b6116e99190613960565b6116f39190613960565b106117105760405162461bcd60e51b81526004016109c3906135be565b60108190556040517fb64665af7475b2ea1233de2eba0b9b01cbda71e9df43a5639f4b29f0e00fe3bb90610a559083906138c3565b61174d611d53565b6001600160a01b031661175e6112a2565b6001600160a01b0316146117845760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660008181526006602052604090819020805460ff1916600190811790915590517ff44a59efbd6ab6f398c5d0f3f91e84add55ec9e218d1bde42d7b9900c45269d691610f40916132e2565b6117e1611d53565b6001600160a01b03166117f26112a2565b6001600160a01b0316146118185760405162461bcd60e51b81526004016109c390613698565b6016805462ff0000191662010000831515021790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610a559083906132e2565b6001600160a01b031660009081526004602052604090205460ff1690565b60185481565b611889611d53565b6001600160a01b031661189a6112a2565b6001600160a01b0316146118c05760405162461bcd60e51b81526004016109c390613698565b6118c981610be1565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6118f2611d53565b6001600160a01b03166119036112a2565b6001600160a01b0316146119295760405162461bcd60e51b81526004016109c390613698565b6016805460ff19168215151790556040517fd93972947b6f619cc048053ab8874f9f4fc05ac3e2e41a2c689a1e520066750f90610a559083906132e2565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b69021e19e0c9bab240000081565b6119a8611d53565b6001600160a01b03166119b96112a2565b6001600160a01b0316146119df5760405162461bcd60e51b81526004016109c390613698565b6119e7610ab4565b8111156119f357600080fd5b60006119fd6112a2565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611a36573d6000803e3d6000fd5b507f069cf19f46ceed82ba5e8920c2bd549f700f29db62167f02b7762842f1fc3e9182604051611a6691906138c3565b60405180910390a15050565b611a7a611d53565b6001600160a01b0316611a8b6112a2565b6001600160a01b031614611ab15760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660008181526007602052604090819020805460ff1916600190811790915590517f6c72613740de4fb19ba7c9292d5d1d22a973fbb4d6ff9548154bf47111129e5891610f40916132e2565b60125481565b611b14611d53565b6001600160a01b0316611b256112a2565b6001600160a01b031614611b4b5760405162461bcd60e51b81526004016109c390613698565b606481601254601054600e54600c54611b649190613960565b611b6e9190613960565b611b789190613960565b611b829190613960565b10611b9f5760405162461bcd60e51b81526004016109c3906135be565b60148190556040517fcafec6c6f7ac33c8f506524db5237627cd7b6ed6cd3f70ab8c328f28723af90590610a559083906138c3565b611bdc611d53565b6001600160a01b0316611bed6112a2565b6001600160a01b031614611c135760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116611c395760405162461bcd60e51b81526004016109c3906133fb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b601b546001600160a01b031681565b6001600160a01b031660009081526007602052604090205460ff1690565b611cc9611d53565b6001600160a01b0316611cda6112a2565b6001600160a01b031614611d005760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116600081815260066020526040808220805460ff19169055517f61f74985e01a4f9e8c4625f5a9bf01c17a9919217022c0ac8e2ca2fa9cca565891610f40916132e2565b60105481565b3390565b6001600160a01b038316611d7d5760405162461bcd60e51b81526004016109c3906137e7565b6001600160a01b038216611da35760405162461bcd60e51b81526004016109c390613441565b6001600160a01b0380841660008181526003602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906114ce9085906138c3565b6001600160a01b038316611e245760405162461bcd60e51b81526004016109c3906137a2565b6001600160a01b038216611e4a5760405162461bcd60e51b81526004016109c390613340565b60008111611e6a5760405162461bcd60e51b81526004016109c3906136cd565b611e7483836120a0565b6000611e7f84611118565b905081811015611ea15760405162461bcd60e51b81526004016109c390613517565b60165460009060ff168015611ef057506001600160a01b03851660009081526007602052604090205460ff1680611ef057506001600160a01b03841660009081526007602052604090205460ff165b15611f76576019546001600160a01b038681169116148015611f2a57506001600160a01b03841660009081526006602052604090205460ff165b80611f6557506019546001600160a01b038581169116148015611f6557506001600160a01b03851660009081526006602052604090205460ff165b15611f7257506000611f76565b5060015b8015611f8557611f8585612137565b611f91858585846121ee565b5050505050565b6000806000611fa5612310565b9092509050611fb48282611fbb565b9250505090565b6000611fc78284613978565b9392505050565b611fd66110ea565b15611ff35760405162461bcd60e51b81526004016109c390613594565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861202f611d53565b60405161203c919061327a565b60405180910390a1565b61204e6110ea565b61206a5760405162461bcd60e51b81526004016109c390613383565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61202f611d53565b6120a86110ea565b156120c55760405162461bcd60e51b81526004016109c39061382b565b6001600160a01b03821660009081526004602052604090205460ff16156120fe5760405162461bcd60e51b81526004016109c390613483565b6001600160a01b03811660009081526004602052604090205460ff1615610db25760405162461bcd60e51b81526004016109c39061374d565b6019546001600160a01b03828116911614801590612161575069021e19e0c9bab240000060185410155b156121eb5760165460ff16801561217d576016805460ff191690555b601654610100900460ff1615801561219d575060165462010000900460ff165b80156121b5575069021e19e0c9bab240000060185410155b156121d6576018805460009091556121d4816121cf6112a2565b6124cd565b505b8015610db2576016805460ff19166001179055505b50565b806121fb576121fb61256b565b6001600160a01b03841660009081526005602052604090205460ff16801561223c57506001600160a01b03831660009081526005602052604090205460ff16155b156122515761224c8484846125e0565b6122fd565b6001600160a01b03841660009081526005602052604090205460ff1615801561229257506001600160a01b03831660009081526005602052604090205460ff165b156122a25761224c848484612774565b6001600160a01b03841660009081526005602052604090205460ff1680156122e257506001600160a01b03831660009081526005602052604090205460ff165b156122f25761224c848484612835565b6122fd8484846128c0565b8061230a5761230a61291c565b50505050565b600a546009546000918291825b60085481101561249b5782600160006008848154811061234d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806123c6575081600260006008848154811061239f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156123dd57600a54600954945094505050506124c9565b612431600160006008848154811061240557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061293c565b9250612487600260006008848154811061245b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061293c565b915080612493816139ce565b91505061231d565b50600954600a546124ab91611fbb565b8210156124c357600a546009549350935050506124c9565b90925090505b9091565b6016805461ff00191661010017905560006124e9836002611fbb565b905060006124f7848361293c565b9050476125048330612948565b6000612510478361293c565b905061251d838287612b34565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516125509392919061393c565b60405180910390a150506016805461ff001916905550505050565b600c5415801561257b5750600e54155b80156125875750601054155b80156125935750601254155b801561259f5750601454155b156125a957610f92565b600c8054600d55600e8054600f55601080546011556012805460135560148054601555600094859055928490559083905582905555565b6000806000806000806125f287612c57565b95509550955095509550955060008060006126118a8989898989612ce7565b6001600160a01b038f16600090815260026020526040902054929550909350915061263c908b61293c565b6001600160a01b038d1660009081526002602090815260408083209390935560019052205461266b908461293c565b6001600160a01b03808e1660009081526001602052604080822093909355908d168152205461269a9083612d93565b6001600160a01b038c166000908152600160205260409020556126bd8189612d9f565b6126c78c88612dc3565b6126d18c86612ea2565b6126db8c85612f93565b851561272d5785601760008282546126f39190613960565b90915550506040516000906001600160a01b038e1690600080516020613a2383398151915290612724908a906138c3565b60405180910390a35b8a6001600160a01b03168c6001600160a01b0316600080516020613a238339815191528b60405161275e91906138c3565b60405180910390a3505050505050505050505050565b60008060008060008061278687612c57565b95509550955095509550955060008060006127a58a8989898989612ce7565b6001600160a01b038f1660009081526001602052604090205492955090935091506127d0908461293c565b6001600160a01b03808e16600090815260016020908152604080832094909455918e16815260029091522054612806908a612d93565b6001600160a01b038c1660009081526002602090815260408083209390935560019052205461269a9083612d93565b60008060008060008061284787612c57565b95509550955095509550955060008060006128668a8989898989612ce7565b6001600160a01b038f166000908152600260205260409020549295509093509150612891908b61293c565b6001600160a01b038d166000908152600260209081526040808320939093556001905220546127d0908461293c565b6000806000806000806128d287612c57565b95509550955095509550955060008060006128f18a8989898989612ce7565b6001600160a01b038f16600090815260016020526040902054929550909350915061266b908461293c565b600d54600c55600f54600e55601154601055601354601255601554601455565b6000611fc782846139b7565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061298b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612a0457600080fd5b505afa158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c919061313e565b81600181518110612a5d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612aa8307f000000000000000000000000000000000000000000000000000000000000000085611d57565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612afd9086906000908690889042906004016138cc565b600060405180830381600087803b158015612b1757600080fd5b505af1158015612b2b573d6000803e3d6000fd5b50505050505050565b612b5f307f000000000000000000000000000000000000000000000000000000000000000085611d57565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198630896000808a426040518863ffffffff1660e01b8152600401612bbc969594939291906132a7565b6060604051808303818588803b158015612bd557600080fd5b505af1158015612be9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c0e919061324d565b9250925092507f4a35275dd02382eddd0165ab693d7307dc00057c9776ef28313b9536be1f0d07838383604051612c479392919061393c565b60405180910390a1505050505050565b600080808080808681612c6982613084565b90506000612c76836130a6565b90506000612c83846130c2565b90506000612c90856130de565b90506000612c9d866130fa565b905060008690506000612ccf84612cc987612cc987612cc98c612cc98f8b61293c90919063ffffffff16565b9061293c565b9f969e50949c50909a50919850965091945050505050565b600080600080612cf5611f98565b9050896000612d048284613116565b90506000612d128c85613116565b90506000612d208c86613116565b90506000612d2e8b87613116565b90506000612d3c8b88613116565b90506000612d4a8e89613116565b905060008690506000612d7684612cc987612cc987612cc98c612cc98f8b61293c90919063ffffffff16565b979c50969a50949850505050505050505096509650969350505050565b6000611fc78284613960565b600a54612dac908361293c565b600a55600b54612dbc9082612d93565b600b555050565b6000612dcd611f98565b90506000612ddb8383613116565b90508260186000828254612def9190613960565b909155505030600090815260016020526040902054612e0e9082612d93565b3060009081526001602090815260408083209390935560059052205460ff1615612e5d5730600090815260026020526040902054612e4c9084612d93565b306000908152600260205260409020555b821561230a57306001600160a01b0316846001600160a01b0316600080516020613a2383398151915285604051612e9491906138c3565b60405180910390a350505050565b6000612eac611f98565b90506000612eba8383613116565b601a546001600160a01b0316600090815260016020526040902054909150612ee29082612d93565b601a80546001600160a01b03908116600090815260016020908152604080832095909555925490911681526005909152205460ff1615612f5d57601a546001600160a01b0316600090815260026020526040902054612f419084612d93565b601a546001600160a01b03166000908152600260205260409020555b821561230a57601a546040516001600160a01b0391821691861690600080516020613a2383398151915290612e949087906138c3565b6000612f9d611f98565b90506000612fab8383613116565b601b546001600160a01b0316600090815260016020526040902054909150612fd39082612d93565b601b80546001600160a01b03908116600090815260016020908152604080832095909555925490911681526005909152205460ff161561304e57601b546001600160a01b03166000908152600260205260409020546130329084612d93565b601b546001600160a01b03166000908152600260205260409020555b821561230a57601b546040516001600160a01b0391821691861690600080516020613a2383398151915290612e949087906138c3565b600061117a60646130a0600c548561311690919063ffffffff16565b90611fbb565b600061117a60646130a0600e548561311690919063ffffffff16565b600061117a60646130a06012548561311690919063ffffffff16565b600061117a60646130a06014548561311690919063ffffffff16565b600061117a60646130a06010548561311690919063ffffffff16565b6000611fc78284613998565b600060208284031215613133578081fd5b8135611fc7816139ff565b60006020828403121561314f578081fd5b8151611fc7816139ff565b6000806040838503121561316c578081fd5b8235613177816139ff565b91506020830135613187816139ff565b809150509250929050565b6000806000606084860312156131a6578081fd5b83356131b1816139ff565b925060208401356131c1816139ff565b929592945050506040919091013590565b600080604083850312156131e4578182fd5b82356131ef816139ff565b946020939093013593505050565b60006020828403121561320e578081fd5b8135611fc781613a14565b60006020828403121561322a578081fd5b8151611fc781613a14565b600060208284031215613246578081fd5b5035919050565b600080600060608486031215613261578283fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b81811015613319578581018301518582016040015282016132fd565b8181111561332a5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602a908201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260408201526965666c656374696f6e7360b01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526037908201527f45524332305061757361626c653a20746f6b656e207472616e7366657220776860408201527f696c652066726f6d2d6164647265737320706175736564000000000000000000606082015260800190565b6020808252601b908201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526017908201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526023908201527f546f74616c20666565732073686f756c64206265206c657373207468616e203160408201526230302560e81b606082015260800190565b6020808252602f908201527f45524332303a204368617269747920616464726573732063616e6e6f7420626560408201526e2061207a65726f206164647265737360881b606082015260800190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b6020808252601c908201527f416464726573732063616e74206265207a65726f206164647265737300000000604082015260600190565b60208082526035908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152741a5b19481d1bcb5859191c995cdcc81c185d5cd959605a1b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526033908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152721a5b194818dbdb9d1c9858dd081c185d5cd959606a1b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561391b5784516001600160a01b0316835293830193918301916001016138f6565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60008219821115613973576139736139e9565b500190565b60008261399357634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156139b2576139b26139e9565b500290565b6000828210156139c9576139c96139e9565b500390565b60006000198214156139e2576139e26139e9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146121eb57600080fd5b80151581146121eb57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bae02b6fff06e96029e722b739daf11f0cba03ec3bb838c69a1998be18ca54d064736f6c63430008000033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000042403961f493b65d82c6a14594bb7668fcc132aa0000000000000000000000001e6bc8e06746227fdd7517932965085c2a1df15a

Deployed Bytecode

0x6080604052600436106103545760003560e01c80638ee88c53116101c6578063c9668ce2116100f7578063ecfca89911610095578063f80edba51161006f578063f80edba51461091a578063fbac48371461092f578063fd7eedf51461094f578063ffb1a8cf1461096f5761035b565b8063ecfca899146108c5578063f072eac1146108da578063f2fde38b146108fa5761035b565b8063dd62ed3e116100d1578063dd62ed3e14610850578063e644d34e14610870578063e7b50a8e14610885578063ea2f0b37146108a55761035b565b8063c9668ce2146107fb578063ca9f2ee214610810578063d8e00271146108305761035b565b8063a9059cbb11610164578063bb1570da1161013e578063bb1570da1461077b578063bdb8dd471461079b578063c49b9a80146107bb578063c4ff9cb7146107db5761035b565b8063a9059cbb14610726578063af41063b14610746578063bac15203146107665761035b565b806399b579c6116101a057806399b579c6146106bc5780639e281a98146106d1578063a071dcf4146106f1578063a457c2d7146107065761035b565b80638ee88c531461067257806395d89b411461069257806398118cb4146106a75761035b565b80633e65d4aa116102a057806360ba1c3e1161023e57806377df472c1161021857806377df472c146106085780637b2087691461062857806388f820201461063d5780638da5cb5b1461065d5761035b565b806360ba1c3e146105b357806370a08231146105d3578063715018a6146105f35761035b565b806349bd5a5e1161027a57806349bd5a5e146105545780634a74bb021461056957806352390c021461057e5780635c975abb1461059e5761035b565b80633e65d4aa146104ff578063437823ec1461051f578063439766ce1461053f5761035b565b806318160ddd1161030d57806330d2091d116102e757806330d2091d14610488578063313ce5671461049d5780633685d419146104bf57806339509351146104df5761035b565b806318160ddd1461043357806323b872dd146104485780632d838119146104685761035b565b8063061c82d01461036057806306fdde0314610382578063095ea7b3146103ad57806312065fe0146103da57806313114a9d146103fc5780631694505e146104115761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061038061037b366004613235565b610984565b005b34801561038e57600080fd5b50610397610a60565b6040516103a491906132ed565b60405180910390f35b3480156103b957600080fd5b506103cd6103c83660046131d2565b610a97565b6040516103a491906132e2565b3480156103e657600080fd5b506103ef610ab4565b6040516103a491906138c3565b34801561040857600080fd5b506103ef610ab8565b34801561041d57600080fd5b50610426610abe565b6040516103a4919061327a565b34801561043f57600080fd5b506103ef610ae2565b34801561045457600080fd5b506103cd610463366004613192565b610af9565b34801561047457600080fd5b506103ef610483366004613235565b610b90565b34801561049457600080fd5b506103cd610bd3565b3480156104a957600080fd5b506104b2610bdc565b6040516103a49190613952565b3480156104cb57600080fd5b506103806104da366004613122565b610be1565b3480156104eb57600080fd5b506103cd6104fa3660046131d2565b610db6565b34801561050b57600080fd5b5061038061051a366004613122565b610e05565b34801561052b57600080fd5b5061038061053a366004613122565b610eb4565b34801561054b57600080fd5b50610380610f4b565b34801561056057600080fd5b50610426610f94565b34801561057557600080fd5b506103cd610fa3565b34801561058a57600080fd5b50610380610599366004613122565b610fb2565b3480156105aa57600080fd5b506103cd6110ea565b3480156105bf57600080fd5b506103cd6105ce366004613122565b6110fa565b3480156105df57600080fd5b506103ef6105ee366004613122565b611118565b3480156105ff57600080fd5b50610380611180565b34801561061457600080fd5b50610380610623366004613122565b611209565b34801561063457600080fd5b50610426611275565b34801561064957600080fd5b506103cd610658366004613122565b611284565b34801561066957600080fd5b506104266112a2565b34801561067e57600080fd5b5061038061068d366004613235565b6112b1565b34801561069e57600080fd5b50610397611379565b3480156106b357600080fd5b506103ef611397565b3480156106c857600080fd5b506103ef61139d565b3480156106dd57600080fd5b506103806106ec3660046131d2565b6113a3565b3480156106fd57600080fd5b506103ef6114db565b34801561071257600080fd5b506103cd6107213660046131d2565b6114e1565b34801561073257600080fd5b506103cd6107413660046131d2565b61155a565b34801561075257600080fd5b50610380610761366004613235565b61156e565b34801561077257600080fd5b50610380611636565b34801561078757600080fd5b50610380610796366004613235565b61167d565b3480156107a757600080fd5b506103806107b6366004613122565b611745565b3480156107c757600080fd5b506103806107d63660046131fd565b6117d9565b3480156107e757600080fd5b506103cd6107f6366004613122565b61185d565b34801561080757600080fd5b506103ef61187b565b34801561081c57600080fd5b5061038061082b366004613122565b611881565b34801561083c57600080fd5b5061038061084b3660046131fd565b6118ea565b34801561085c57600080fd5b506103ef61086b36600461315a565b611967565b34801561087c57600080fd5b506103ef611992565b34801561089157600080fd5b506103806108a0366004613235565b6119a0565b3480156108b157600080fd5b506103806108c0366004613122565b611a72565b3480156108d157600080fd5b506103ef611b06565b3480156108e657600080fd5b506103806108f5366004613235565b611b0c565b34801561090657600080fd5b50610380610915366004613122565b611bd4565b34801561092657600080fd5b50610426611c94565b34801561093b57600080fd5b506103cd61094a366004613122565b611ca3565b34801561095b57600080fd5b5061038061096a366004613122565b611cc1565b34801561097b57600080fd5b506103ef611d4d565b61098c611d53565b6001600160a01b031661099d6112a2565b6001600160a01b0316146109cc5760405162461bcd60e51b81526004016109c390613698565b60405180910390fd5b6064601454601254601054600e54856109e59190613960565b6109ef9190613960565b6109f99190613960565b610a039190613960565b10610a205760405162461bcd60e51b81526004016109c3906135be565b600c8190556040517f19da908cae03512cf29c19a5842b2904a06fd24ef9982759c78f9379831ed70f90610a559083906138c3565b60405180910390a150565b60408051808201909152601781527f576f6d656e20456d706f7765726d656e7420546f6b656e000000000000000000602082015290565b6000610aab610aa4611d53565b8484611d57565b50600192915050565b4790565b600b5490565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000601754600954610af491906139b7565b905090565b6000610b06848484611dfe565b6001600160a01b038416600090815260036020526040812081610b27611d53565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811015610b6a5760405162461bcd60e51b81526004016109c390613650565b610b8585610b76611d53565b610b8086856139b7565b611d57565b506001949350505050565b6000600a54821115610bb45760405162461bcd60e51b81526004016109c3906133b1565b6000610bbe611f98565b9050610bca8382611fbb565b9150505b919050565b60165460ff1681565b601290565b610be9611d53565b6001600160a01b0316610bfa6112a2565b6001600160a01b031614610c205760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660009081526005602052604090205460ff16610c585760405162461bcd60e51b81526004016109c39061355d565b60005b600854811015610db257816001600160a01b031660088281548110610c9057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03161415610da05760088054610cbb906001906139b7565b81548110610cd957634e487b7160e01b600052603260045260246000fd5b600091825260209091200154600880546001600160a01b039092169183908110610d1357634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556008805480610d7957634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b0319169055019055610db2565b80610daa816139ce565b915050610c5b565b5050565b6000610aab610dc3611d53565b848460036000610dd1611d53565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610b809190613960565b610e0d611d53565b6001600160a01b0316610e1e6112a2565b6001600160a01b031614610e445760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116610e6a5760405162461bcd60e51b81526004016109c390613601565b601a80546001600160a01b0319166001600160a01b0383169081179091556040517fa3de4742668f41ee43041a21d2a1cdd8348a6b4ae41987eaf3402a5ae21c8cd690600090a250565b610ebc611d53565b6001600160a01b0316610ecd6112a2565b6001600160a01b031614610ef35760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fd5144d2a6c8ff9b87b7a40852df5102cab2ce561c06b56cc6fe7ccf1fa7f8c2d91610f40916132e2565b60405180910390a250565b610f53611d53565b6001600160a01b0316610f646112a2565b6001600160a01b031614610f8a5760405162461bcd60e51b81526004016109c390613698565b610f92611fce565b565b6019546001600160a01b031681565b60165462010000900460ff1681565b610fba611d53565b6001600160a01b0316610fcb6112a2565b6001600160a01b031614610ff15760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660009081526005602052604090205460ff161561102a5760405162461bcd60e51b81526004016109c3906134e0565b6001600160a01b03811660009081526001602052604090205415611084576001600160a01b03811660009081526001602052604090205461106a90610b90565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b600054600160a01b900460ff1690565b6001600160a01b031660009081526006602052604090205460ff1690565b6001600160a01b03811660009081526005602052604081205460ff161561115857506001600160a01b038116600090815260026020526040902054610bce565b6001600160a01b03821660009081526001602052604090205461117a90610b90565b92915050565b611188611d53565b6001600160a01b03166111996112a2565b6001600160a01b0316146111bf5760405162461bcd60e51b81526004016109c390613698565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611211611d53565b6001600160a01b03166112226112a2565b6001600160a01b0316146112485760405162461bcd60e51b81526004016109c390613698565b61125181610fb2565b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b601a546001600160a01b031681565b6001600160a01b031660009081526005602052604090205460ff1690565b6000546001600160a01b031690565b6112b9611d53565b6001600160a01b03166112ca6112a2565b6001600160a01b0316146112f05760405162461bcd60e51b81526004016109c390613698565b606460145460125460105484600c546113099190613960565b6113139190613960565b61131d9190613960565b6113279190613960565b106113445760405162461bcd60e51b81526004016109c3906135be565b600e8190556040517fa080f06a1e9c2a432b1d35cf0a54ebca051cf5dce7433c3d8e94948436f1035690610a559083906138c3565b604080518082019091526004815263057454d560e41b602082015290565b600e5481565b60145481565b6113ab611d53565b6001600160a01b03166113bc6112a2565b6001600160a01b0316146113e25760405162461bcd60e51b81526004016109c390613698565b6001600160a01b0382166114085760405162461bcd60e51b81526004016109c390613716565b60405163a9059cbb60e01b815282906001600160a01b0382169063a9059cbb90611438903390869060040161328e565b602060405180830381600087803b15801561145257600080fd5b505af1158015611466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148a9190613219565b50336001600160a01b0316836001600160a01b03167f5c5578c78fc9b87943279247ef36abf638b9551372bb769b5d87d1ae6a31be64846040516114ce91906138c3565b60405180910390a3505050565b600c5481565b600080600360006114f0611d53565b6001600160a01b039081168252602080830193909352604091820160009081209188168152925290205490508281101561153c5760405162461bcd60e51b81526004016109c39061387e565b611550611547611d53565b85858403611d57565b5060019392505050565b6000610aab611567611d53565b8484611dfe565b611576611d53565b6001600160a01b03166115876112a2565b6001600160a01b0316146115ad5760405162461bcd60e51b81526004016109c390613698565b606460145482601054600e54600c546115c69190613960565b6115d09190613960565b6115da9190613960565b6115e49190613960565b106116015760405162461bcd60e51b81526004016109c3906135be565b60128190556040517fcafec6c6f7ac33c8f506524db5237627cd7b6ed6cd3f70ab8c328f28723af90590610a559083906138c3565b61163e611d53565b6001600160a01b031661164f6112a2565b6001600160a01b0316146116755760405162461bcd60e51b81526004016109c390613698565b610f92612046565b611685611d53565b6001600160a01b03166116966112a2565b6001600160a01b0316146116bc5760405162461bcd60e51b81526004016109c390613698565b606460145460125483600e54600c546116d59190613960565b6116df9190613960565b6116e99190613960565b6116f39190613960565b106117105760405162461bcd60e51b81526004016109c3906135be565b60108190556040517fb64665af7475b2ea1233de2eba0b9b01cbda71e9df43a5639f4b29f0e00fe3bb90610a559083906138c3565b61174d611d53565b6001600160a01b031661175e6112a2565b6001600160a01b0316146117845760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660008181526006602052604090819020805460ff1916600190811790915590517ff44a59efbd6ab6f398c5d0f3f91e84add55ec9e218d1bde42d7b9900c45269d691610f40916132e2565b6117e1611d53565b6001600160a01b03166117f26112a2565b6001600160a01b0316146118185760405162461bcd60e51b81526004016109c390613698565b6016805462ff0000191662010000831515021790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610a559083906132e2565b6001600160a01b031660009081526004602052604090205460ff1690565b60185481565b611889611d53565b6001600160a01b031661189a6112a2565b6001600160a01b0316146118c05760405162461bcd60e51b81526004016109c390613698565b6118c981610be1565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6118f2611d53565b6001600160a01b03166119036112a2565b6001600160a01b0316146119295760405162461bcd60e51b81526004016109c390613698565b6016805460ff19168215151790556040517fd93972947b6f619cc048053ab8874f9f4fc05ac3e2e41a2c689a1e520066750f90610a559083906132e2565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b69021e19e0c9bab240000081565b6119a8611d53565b6001600160a01b03166119b96112a2565b6001600160a01b0316146119df5760405162461bcd60e51b81526004016109c390613698565b6119e7610ab4565b8111156119f357600080fd5b60006119fd6112a2565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611a36573d6000803e3d6000fd5b507f069cf19f46ceed82ba5e8920c2bd549f700f29db62167f02b7762842f1fc3e9182604051611a6691906138c3565b60405180910390a15050565b611a7a611d53565b6001600160a01b0316611a8b6112a2565b6001600160a01b031614611ab15760405162461bcd60e51b81526004016109c390613698565b6001600160a01b03811660008181526007602052604090819020805460ff1916600190811790915590517f6c72613740de4fb19ba7c9292d5d1d22a973fbb4d6ff9548154bf47111129e5891610f40916132e2565b60125481565b611b14611d53565b6001600160a01b0316611b256112a2565b6001600160a01b031614611b4b5760405162461bcd60e51b81526004016109c390613698565b606481601254601054600e54600c54611b649190613960565b611b6e9190613960565b611b789190613960565b611b829190613960565b10611b9f5760405162461bcd60e51b81526004016109c3906135be565b60148190556040517fcafec6c6f7ac33c8f506524db5237627cd7b6ed6cd3f70ab8c328f28723af90590610a559083906138c3565b611bdc611d53565b6001600160a01b0316611bed6112a2565b6001600160a01b031614611c135760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116611c395760405162461bcd60e51b81526004016109c3906133fb565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b601b546001600160a01b031681565b6001600160a01b031660009081526007602052604090205460ff1690565b611cc9611d53565b6001600160a01b0316611cda6112a2565b6001600160a01b031614611d005760405162461bcd60e51b81526004016109c390613698565b6001600160a01b038116600081815260066020526040808220805460ff19169055517f61f74985e01a4f9e8c4625f5a9bf01c17a9919217022c0ac8e2ca2fa9cca565891610f40916132e2565b60105481565b3390565b6001600160a01b038316611d7d5760405162461bcd60e51b81526004016109c3906137e7565b6001600160a01b038216611da35760405162461bcd60e51b81526004016109c390613441565b6001600160a01b0380841660008181526003602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906114ce9085906138c3565b6001600160a01b038316611e245760405162461bcd60e51b81526004016109c3906137a2565b6001600160a01b038216611e4a5760405162461bcd60e51b81526004016109c390613340565b60008111611e6a5760405162461bcd60e51b81526004016109c3906136cd565b611e7483836120a0565b6000611e7f84611118565b905081811015611ea15760405162461bcd60e51b81526004016109c390613517565b60165460009060ff168015611ef057506001600160a01b03851660009081526007602052604090205460ff1680611ef057506001600160a01b03841660009081526007602052604090205460ff165b15611f76576019546001600160a01b038681169116148015611f2a57506001600160a01b03841660009081526006602052604090205460ff165b80611f6557506019546001600160a01b038581169116148015611f6557506001600160a01b03851660009081526006602052604090205460ff165b15611f7257506000611f76565b5060015b8015611f8557611f8585612137565b611f91858585846121ee565b5050505050565b6000806000611fa5612310565b9092509050611fb48282611fbb565b9250505090565b6000611fc78284613978565b9392505050565b611fd66110ea565b15611ff35760405162461bcd60e51b81526004016109c390613594565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861202f611d53565b60405161203c919061327a565b60405180910390a1565b61204e6110ea565b61206a5760405162461bcd60e51b81526004016109c390613383565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61202f611d53565b6120a86110ea565b156120c55760405162461bcd60e51b81526004016109c39061382b565b6001600160a01b03821660009081526004602052604090205460ff16156120fe5760405162461bcd60e51b81526004016109c390613483565b6001600160a01b03811660009081526004602052604090205460ff1615610db25760405162461bcd60e51b81526004016109c39061374d565b6019546001600160a01b03828116911614801590612161575069021e19e0c9bab240000060185410155b156121eb5760165460ff16801561217d576016805460ff191690555b601654610100900460ff1615801561219d575060165462010000900460ff165b80156121b5575069021e19e0c9bab240000060185410155b156121d6576018805460009091556121d4816121cf6112a2565b6124cd565b505b8015610db2576016805460ff19166001179055505b50565b806121fb576121fb61256b565b6001600160a01b03841660009081526005602052604090205460ff16801561223c57506001600160a01b03831660009081526005602052604090205460ff16155b156122515761224c8484846125e0565b6122fd565b6001600160a01b03841660009081526005602052604090205460ff1615801561229257506001600160a01b03831660009081526005602052604090205460ff165b156122a25761224c848484612774565b6001600160a01b03841660009081526005602052604090205460ff1680156122e257506001600160a01b03831660009081526005602052604090205460ff165b156122f25761224c848484612835565b6122fd8484846128c0565b8061230a5761230a61291c565b50505050565b600a546009546000918291825b60085481101561249b5782600160006008848154811061234d57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806123c6575081600260006008848154811061239f57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156123dd57600a54600954945094505050506124c9565b612431600160006008848154811061240557634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061293c565b9250612487600260006008848154811061245b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061293c565b915080612493816139ce565b91505061231d565b50600954600a546124ab91611fbb565b8210156124c357600a546009549350935050506124c9565b90925090505b9091565b6016805461ff00191661010017905560006124e9836002611fbb565b905060006124f7848361293c565b9050476125048330612948565b6000612510478361293c565b905061251d838287612b34565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516125509392919061393c565b60405180910390a150506016805461ff001916905550505050565b600c5415801561257b5750600e54155b80156125875750601054155b80156125935750601254155b801561259f5750601454155b156125a957610f92565b600c8054600d55600e8054600f55601080546011556012805460135560148054601555600094859055928490559083905582905555565b6000806000806000806125f287612c57565b95509550955095509550955060008060006126118a8989898989612ce7565b6001600160a01b038f16600090815260026020526040902054929550909350915061263c908b61293c565b6001600160a01b038d1660009081526002602090815260408083209390935560019052205461266b908461293c565b6001600160a01b03808e1660009081526001602052604080822093909355908d168152205461269a9083612d93565b6001600160a01b038c166000908152600160205260409020556126bd8189612d9f565b6126c78c88612dc3565b6126d18c86612ea2565b6126db8c85612f93565b851561272d5785601760008282546126f39190613960565b90915550506040516000906001600160a01b038e1690600080516020613a2383398151915290612724908a906138c3565b60405180910390a35b8a6001600160a01b03168c6001600160a01b0316600080516020613a238339815191528b60405161275e91906138c3565b60405180910390a3505050505050505050505050565b60008060008060008061278687612c57565b95509550955095509550955060008060006127a58a8989898989612ce7565b6001600160a01b038f1660009081526001602052604090205492955090935091506127d0908461293c565b6001600160a01b03808e16600090815260016020908152604080832094909455918e16815260029091522054612806908a612d93565b6001600160a01b038c1660009081526002602090815260408083209390935560019052205461269a9083612d93565b60008060008060008061284787612c57565b95509550955095509550955060008060006128668a8989898989612ce7565b6001600160a01b038f166000908152600260205260409020549295509093509150612891908b61293c565b6001600160a01b038d166000908152600260209081526040808320939093556001905220546127d0908461293c565b6000806000806000806128d287612c57565b95509550955095509550955060008060006128f18a8989898989612ce7565b6001600160a01b038f16600090815260016020526040902054929550909350915061266b908461293c565b600d54600c55600f54600e55601154601055601354601255601554601455565b6000611fc782846139b7565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061298b57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015612a0457600080fd5b505afa158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c919061313e565b81600181518110612a5d57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612aa8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d85611d57565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612afd9086906000908690889042906004016138cc565b600060405180830381600087803b158015612b1757600080fd5b505af1158015612b2b573d6000803e3d6000fd5b50505050505050565b612b5f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d85611d57565b60008060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198630896000808a426040518863ffffffff1660e01b8152600401612bbc969594939291906132a7565b6060604051808303818588803b158015612bd557600080fd5b505af1158015612be9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612c0e919061324d565b9250925092507f4a35275dd02382eddd0165ab693d7307dc00057c9776ef28313b9536be1f0d07838383604051612c479392919061393c565b60405180910390a1505050505050565b600080808080808681612c6982613084565b90506000612c76836130a6565b90506000612c83846130c2565b90506000612c90856130de565b90506000612c9d866130fa565b905060008690506000612ccf84612cc987612cc987612cc98c612cc98f8b61293c90919063ffffffff16565b9061293c565b9f969e50949c50909a50919850965091945050505050565b600080600080612cf5611f98565b9050896000612d048284613116565b90506000612d128c85613116565b90506000612d208c86613116565b90506000612d2e8b87613116565b90506000612d3c8b88613116565b90506000612d4a8e89613116565b905060008690506000612d7684612cc987612cc987612cc98c612cc98f8b61293c90919063ffffffff16565b979c50969a50949850505050505050505096509650969350505050565b6000611fc78284613960565b600a54612dac908361293c565b600a55600b54612dbc9082612d93565b600b555050565b6000612dcd611f98565b90506000612ddb8383613116565b90508260186000828254612def9190613960565b909155505030600090815260016020526040902054612e0e9082612d93565b3060009081526001602090815260408083209390935560059052205460ff1615612e5d5730600090815260026020526040902054612e4c9084612d93565b306000908152600260205260409020555b821561230a57306001600160a01b0316846001600160a01b0316600080516020613a2383398151915285604051612e9491906138c3565b60405180910390a350505050565b6000612eac611f98565b90506000612eba8383613116565b601a546001600160a01b0316600090815260016020526040902054909150612ee29082612d93565b601a80546001600160a01b03908116600090815260016020908152604080832095909555925490911681526005909152205460ff1615612f5d57601a546001600160a01b0316600090815260026020526040902054612f419084612d93565b601a546001600160a01b03166000908152600260205260409020555b821561230a57601a546040516001600160a01b0391821691861690600080516020613a2383398151915290612e949087906138c3565b6000612f9d611f98565b90506000612fab8383613116565b601b546001600160a01b0316600090815260016020526040902054909150612fd39082612d93565b601b80546001600160a01b03908116600090815260016020908152604080832095909555925490911681526005909152205460ff161561304e57601b546001600160a01b03166000908152600260205260409020546130329084612d93565b601b546001600160a01b03166000908152600260205260409020555b821561230a57601b546040516001600160a01b0391821691861690600080516020613a2383398151915290612e949087906138c3565b600061117a60646130a0600c548561311690919063ffffffff16565b90611fbb565b600061117a60646130a0600e548561311690919063ffffffff16565b600061117a60646130a06012548561311690919063ffffffff16565b600061117a60646130a06014548561311690919063ffffffff16565b600061117a60646130a06010548561311690919063ffffffff16565b6000611fc78284613998565b600060208284031215613133578081fd5b8135611fc7816139ff565b60006020828403121561314f578081fd5b8151611fc7816139ff565b6000806040838503121561316c578081fd5b8235613177816139ff565b91506020830135613187816139ff565b809150509250929050565b6000806000606084860312156131a6578081fd5b83356131b1816139ff565b925060208401356131c1816139ff565b929592945050506040919091013590565b600080604083850312156131e4578182fd5b82356131ef816139ff565b946020939093013593505050565b60006020828403121561320e578081fd5b8135611fc781613a14565b60006020828403121561322a578081fd5b8151611fc781613a14565b600060208284031215613246578081fd5b5035919050565b600080600060608486031215613261578283fd5b8351925060208401519150604084015190509250925092565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b81811015613319578581018301518582016040015282016132fd565b8181111561332a5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602a908201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260408201526965666c656374696f6e7360b01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526037908201527f45524332305061757361626c653a20746f6b656e207472616e7366657220776860408201527f696c652066726f6d2d6164647265737320706175736564000000000000000000606082015260800190565b6020808252601b908201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526017908201527f4163636f756e74206973206e6f74206578636c75646564000000000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526023908201527f546f74616c20666565732073686f756c64206265206c657373207468616e203160408201526230302560e81b606082015260800190565b6020808252602f908201527f45524332303a204368617269747920616464726573732063616e6e6f7420626560408201526e2061207a65726f206164647265737360881b606082015260800190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b6020808252601c908201527f416464726573732063616e74206265207a65726f206164647265737300000000604082015260600190565b60208082526035908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152741a5b19481d1bcb5859191c995cdcc81c185d5cd959605a1b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526033908201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686040820152721a5b194818dbdb9d1c9858dd081c185d5cd959606a1b606082015260800190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561391b5784516001600160a01b0316835293830193918301916001016138f6565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60008219821115613973576139736139e9565b500190565b60008261399357634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156139b2576139b26139e9565b500290565b6000828210156139c9576139c96139e9565b500390565b60006000198214156139e2576139e26139e9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146121eb57600080fd5b80151581146121eb57600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220bae02b6fff06e96029e722b739daf11f0cba03ec3bb838c69a1998be18ca54d064736f6c63430008000033

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

00000000000000000000000042403961f493b65d82c6a14594bb7668fcc132aa0000000000000000000000001e6bc8e06746227fdd7517932965085c2a1df15a

-----Decoded View---------------
Arg [0] : _charityWallet (address): 0x42403961F493b65d82C6A14594Bb7668fcC132aa
Arg [1] : _welfareWallet (address): 0x1E6BC8e06746227FDd7517932965085c2a1df15A

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000042403961f493b65d82c6a14594bb7668fcc132aa
Arg [1] : 0000000000000000000000001e6bc8e06746227fdd7517932965085c2a1df15a


Deployed Bytecode Sourcemap

29810:32677:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42588:263;;;;;;;;;;-1:-1:-1;42588:263:0;;;;;:::i;:::-;;:::i;:::-;;34074:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36350:171;;;;;;;;;;-1:-1:-1;36350:171:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61158:99::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40325:89::-;;;;;;;;;;;;;:::i;31661:51::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35207:121::-;;;;;;;;;;;;;:::i;37003:424::-;;;;;;;;;;-1:-1:-1;37003:424:0;;;;;:::i;:::-;;:::i;40422:252::-;;;;;;;;;;-1:-1:-1;40422:252:0;;;;;:::i;:::-;;:::i;31395:28::-;;;;;;;;;;;;;:::i;35040:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41021:471::-;;;;;;;;;;-1:-1:-1;41021:471:0;;;;;:::i;:::-;;:::i;37836:217::-;;;;;;;;;;-1:-1:-1;37836:217:0;;;;;:::i;:::-;;:::i;44036:269::-;;;;;;;;;;-1:-1:-1;44036:269:0;;;;;:::i;:::-;;:::i;42125:158::-;;;;;;;;;;-1:-1:-1;42125:158:0;;;;;:::i;:::-;;:::i;39087:79::-;;;;;;;;;;;;;:::i;31811:28::-;;;;;;;;;;;;;:::i;31466:40::-;;;;;;;;;;;;;:::i;40682:331::-;;;;;;;;;;-1:-1:-1;40682:331:0;;;;;:::i;:::-;;:::i;7377:86::-;;;;;;;;;;;;;:::i;41986:131::-;;;;;;;;;;-1:-1:-1;41986:131:0;;;;;:::i;:::-;;:::i;35391:206::-;;;;;;;;;;-1:-1:-1;35391:206:0;;;;;:::i;:::-;;:::i;5839:148::-;;;;;;;;;;;;;:::i;39485:151::-;;;;;;;;;;-1:-1:-1;39485:151:0;;;;;:::i;:::-;;:::i;31846:28::-;;;;;;;;;;;;;:::i;41500:122::-;;;;;;;;;;-1:-1:-1;41500:122:0;;;;;:::i;:::-;;:::i;5188:87::-;;;;;;;;;;;;;:::i;42859:281::-;;;;;;;;;;-1:-1:-1;42859:281:0;;;;;:::i;:::-;;:::i;34295:106::-;;;;;;;;;;;;;:::i;30987:31::-;;;;;;;;;;;;;:::i;31288:34::-;;;;;;;;;;;;;:::i;60793:357::-;;;;;;;;;;-1:-1:-1;60793:357:0;;;;;:::i;:::-;;:::i;30907:25::-;;;;;;;;;;;;;:::i;38556:415::-;;;;;;;;;;-1:-1:-1;38556:415:0;;;;;:::i;:::-;;:::i;35810:177::-;;;;;;;;;;-1:-1:-1;35810:177:0;;;;;:::i;:::-;;:::i;43460:275::-;;;;;;;;;;-1:-1:-1;43460:275:0;;;;;:::i;:::-;;:::i;39286:83::-;;;;;;;;;;;;;:::i;43148:304::-;;;;;;;;;;-1:-1:-1;43148:304:0;;;;;:::i;:::-;;:::i;41634:167::-;;;;;;;;;;-1:-1:-1;41634:167:0;;;;;:::i;:::-;;:::i;44313:173::-;;;;;;;;;;-1:-1:-1;44313:173:0;;;;;:::i;:::-;;:::i;40011:127::-;;;;;;;;;;-1:-1:-1;40011:127:0;;;;;:::i;:::-;;:::i;31552:34::-;;;;;;;;;;;;;:::i;39756:152::-;;;;;;;;;;-1:-1:-1;39756:152:0;;;;;:::i;:::-;;:::i;44494:133::-;;;;;;;;;;-1:-1:-1;44494:133:0;;;;;:::i;:::-;;:::i;36050:153::-;;;;;;;;;;-1:-1:-1;36050:153:0;;;;;:::i;:::-;;:::i;31593:59::-;;;;;;;;;;;;;:::i;61265:252::-;;;;;;;;;;-1:-1:-1;61265:252:0;;;;;:::i;:::-;;:::i;42295:152::-;;;;;;;;;;-1:-1:-1;42295:152:0;;;;;:::i;:::-;;:::i;31196:29::-;;;;;;;;;;;;;:::i;43743:285::-;;;;;;;;;;-1:-1:-1;43743:285:0;;;;;:::i;:::-;;:::i;6142:244::-;;;;;;;;;;-1:-1:-1;6142:244:0;;;;;:::i;:::-;;:::i;31881:28::-;;;;;;;;;;;;;:::i;42455:121::-;;;;;;;;;;-1:-1:-1;42455:121:0;;;;;:::i;:::-;;:::i;41813:165::-;;;;;;;;;;-1:-1:-1;41813:165:0;;;;;:::i;:::-;;:::i;31089:34::-;;;;;;;;;;;;;:::i;42588:263::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;;;;;;;;;42737:3:::1;42718:15;;42705:10;;42687:15;;42672:12;;42666:3;:18;;;;:::i;:::-;:36;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;42665:75;42657:123;;;;-1:-1:-1::0;;;42657:123:0::1;;;;;;;:::i;:::-;42791:6;:12:::0;;;42819:24:::1;::::0;::::1;::::0;::::1;::::0;42800:3;;42819:24:::1;:::i;:::-;;;;;;;;42588:263:::0;:::o;34074:102::-;34163:5;;;;;;;;;;;;;;;;;34074:102;:::o;36350:171::-;36435:4;36452:39;36461:12;:10;:12::i;:::-;36475:7;36484:6;36452:8;:39::i;:::-;-1:-1:-1;36509:4:0;36350:171;;;;:::o;61158:99::-;61228:21;61158:99;:::o;40325:89::-;40396:10;;40325:89;:::o;31661:51::-;;;:::o;35207:121::-;35270:7;35307:13;;35297:7;;:23;;;;:::i;:::-;35290:30;;35207:121;:::o;37003:424::-;37111:4;37128:36;37138:6;37146:9;37157:6;37128:9;:36::i;:::-;-1:-1:-1;;;;;37204:19:0;;37177:24;37204:19;;;:11;:19;;;;;37177:24;37224:12;:10;:12::i;:::-;-1:-1:-1;;;;;37204:33:0;-1:-1:-1;;;;;37204:33:0;;;;;;;;;;;;;37177:60;;37276:6;37256:16;:26;;37248:79;;;;-1:-1:-1;;;37248:79:0;;;;;;;:::i;:::-;37338:57;37347:6;37355:12;:10;:12::i;:::-;37369:25;37388:6;37369:16;:25;:::i;:::-;37338:8;:57::i;:::-;-1:-1:-1;37415:4:0;;37003:424;-1:-1:-1;;;;37003:424:0:o;40422:252::-;40488:7;40527;;40516;:18;;40508:73;;;;-1:-1:-1;;;40508:73:0;;;;;;;:::i;:::-;40592:19;40615:9;:7;:9::i;:::-;40592:32;-1:-1:-1;40642:24:0;:7;40592:32;40642:11;:24::i;:::-;40635:31;;;40422:252;;;;:::o;31395:28::-;;;;;;:::o;35040:102::-;30892:2;35040:102;:::o;41021:471::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41099:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;41091:56;;;;-1:-1:-1::0;;;41091:56:0::1;;;;;;;:::i;:::-;41163:9;41158:327;41182:9;:16:::0;41178:20;::::1;41158:327;;;41240:7;-1:-1:-1::0;;;;;41224:23:0::1;:9;41234:1;41224:12;;;;;;-1:-1:-1::0;;;41224:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41224:12:0::1;:23;41220:254;;;41283:9;41293:16:::0;;:20:::1;::::0;41312:1:::1;::::0;41293:20:::1;:::i;:::-;41283:31;;;;;;-1:-1:-1::0;;;41283:31:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;41268:9:::1;:12:::0;;-1:-1:-1;;;;;41283:31:0;;::::1;::::0;41278:1;;41268:12;::::1;;;-1:-1:-1::0;;;41268:12:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;41268:46:0::1;-1:-1:-1::0;;;;;41268:46:0;;::::1;;::::0;;41333:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;41372:11:::1;:20:::0;;;;:28;;-1:-1:-1;;41372:28:0::1;::::0;;41419:9:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;41419:15:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;41419:15:0;;;;;-1:-1:-1;;;;;;41419:15:0::1;::::0;;;;;41453:5:::1;;41220:254;41200:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41158:327;;;;41021:471:::0;:::o;37836:217::-;37926:4;37943:80;37952:12;:10;:12::i;:::-;37966:7;38012:10;37975:11;:25;37987:12;:10;:12::i;:::-;-1:-1:-1;;;;;37975:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;37975:25:0;;;:34;;;;;;;;;;:47;;;;:::i;44036:269::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44127:28:0;::::1;44119:88;;;;-1:-1:-1::0;;;44119:88:0::1;;;;;;;:::i;:::-;44218:13;:30:::0;;-1:-1:-1;;;;;;44218:30:0::1;-1:-1:-1::0;;;;;44218:30:0;::::1;::::0;;::::1;::::0;;;44264:33:::1;::::0;::::1;::::0;-1:-1:-1;;44264:33:0::1;44036:269:::0;:::o;42125:158::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42196:25:0;::::1;42224:5;42196:25:::0;;;:16:::1;:25;::::0;;;;;:33;;-1:-1:-1;;42196:33:0::1;::::0;;42245:30;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;42125:158:::0;:::o;39087:79::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;39150:8:::1;:6;:8::i;:::-;39087:79::o:0;31811:28::-;;;-1:-1:-1;;;;;31811:28:0;;:::o;31466:40::-;;;;;;;;;:::o;40682:331::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40763:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;40762:21;40754:61;;;;-1:-1:-1::0;;;40754:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40829:16:0;::::1;40848:1;40829:16:::0;;;:7:::1;:16;::::0;;;;;:20;40826:108:::1;;-1:-1:-1::0;;;;;40905:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;40885:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;40866:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;40826:108:::1;-1:-1:-1::0;;;;;40944:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;40944:27:0::1;40967:4;40944:27:::0;;::::1;::::0;;;40982:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;40982:23:0::1;::::0;;::::1;::::0;;40682:331::o;7377:86::-;7424:4;7448:7;-1:-1:-1;;;7448:7:0;;;;;7377:86::o;41986:131::-;-1:-1:-1;;;;;42079:30:0;42055:4;42079:30;;;:21;:30;;;;;;;;;41986:131::o;35391:206::-;-1:-1:-1;;;;;35489:20:0;;35465:7;35489:20;;;:11;:20;;;;;;;;35485:49;;;-1:-1:-1;;;;;;35518:16:0;;;;;;:7;:16;;;;;;35511:23;;35485:49;-1:-1:-1;;;;;35572:16:0;;;;;;:7;:16;;;;;;35552:37;;:19;:37::i;:::-;35545:44;35391:206;-1:-1:-1;;35391:206:0:o;5839:148::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;5946:1:::1;5930:6:::0;;5909:40:::1;::::0;-1:-1:-1;;;;;5930:6:0;;::::1;::::0;5909:40:::1;::::0;5946:1;;5909:40:::1;5977:1;5960:19:::0;;-1:-1:-1;;;;;;5960:19:0::1;::::0;;5839:148::o;39485:151::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;39562:26:::1;39580:7;39562:17;:26::i;:::-;-1:-1:-1::0;;;;;39599:22:0::1;;::::0;;;:13:::1;:22;::::0;;;;:29;;-1:-1:-1;;39599:29:0::1;39624:4;39599:29;::::0;;39485:151::o;31846:28::-;;;-1:-1:-1;;;;;31846:28:0;;:::o;41500:122::-;-1:-1:-1;;;;;41594:20:0;41570:4;41594:20;;;:11;:20;;;;;;;;;41500:122::o;5188:87::-;5234:7;5261:6;-1:-1:-1;;;;;5261:6:0;5188:87;:::o;42859:281::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;43008:3:::1;42989:15;;42976:10;;42958:15;;42952:3;42943:6;;:12;;;;:::i;:::-;:30;;;;:::i;:::-;:43;;;;:::i;:::-;:61;;;;:::i;:::-;42942:69;42934:117;;;;-1:-1:-1::0;;;42934:117:0::1;;;;;;;:::i;:::-;43062:12;:18:::0;;;43096:36:::1;::::0;::::1;::::0;::::1;::::0;43077:3;;43096:36:::1;:::i;34295:106::-:0;34386:7;;;;;;;;;;;;-1:-1:-1;;;34386:7:0;;;;34295:106;:::o;30987:31::-;;;;:::o;31288:34::-;;;;:::o;60793:357::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60895:28:0;::::1;60887:69;;;;-1:-1:-1::0;;;60887:69:0::1;;;;;;;:::i;:::-;61023:43;::::0;-1:-1:-1;;;61023:43:0;;60997:14;;-1:-1:-1;;;;;61023:22:0;::::1;::::0;::::1;::::0;:43:::1;::::0;61046:10:::1;::::0;61058:7;;61023:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61122:10;-1:-1:-1::0;;;;;61082:60:0::1;61106:14;-1:-1:-1::0;;;;;61082:60:0::1;;61134:7;61082:60;;;;;;:::i;:::-;;;;;;;;5479:1;60793:357:::0;;:::o;30907:25::-;;;;:::o;38556:415::-;38651:4;38668:24;38695:11;:25;38707:12;:10;:12::i;:::-;-1:-1:-1;;;;;38695:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;38695:25:0;;;:34;;;;;;;;;;;-1:-1:-1;38748:35:0;;;;38740:85;;;;-1:-1:-1;;;38740:85:0;;;;;;;:::i;:::-;38861:67;38870:12;:10;:12::i;:::-;38884:7;38912:15;38893:16;:34;38861:8;:67::i;:::-;-1:-1:-1;38959:4:0;;38556:415;-1:-1:-1;;;38556:415:0:o;35810:177::-;35898:4;35915:42;35925:12;:10;:12::i;:::-;35939:9;35950:6;35915:9;:42::i;43460:275::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;43609:3:::1;43590:15;;43584:3;43566:15;;43551:12;;43542:6;;:21;;;;:::i;:::-;:39;;;;:::i;:::-;:45;;;;:::i;:::-;:63;;;;:::i;:::-;43541:71;43533:119;;;;-1:-1:-1::0;;;43533:119:0::1;;;;;;;:::i;:::-;43663:10;:16:::0;;;43695:32:::1;::::0;::::1;::::0;::::1;::::0;43676:3;;43695:32:::1;:::i;39286:83::-:0;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;39351:10:::1;:8;:10::i;43148:304::-:0;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;43310:3:::1;43291:15;;43278:10;;43260:15;43245:12;;43236:6;;:21;;;;:::i;:::-;:39;;;;:::i;:::-;:52;;;;:::i;:::-;:70;;;;:::i;:::-;43235:78;43227:126;;;;-1:-1:-1::0;;;43227:126:0::1;;;;;;;:::i;:::-;43364:15;:33:::0;;;43413:31:::1;::::0;::::1;::::0;::::1;::::0;43382:15;;43413:31:::1;:::i;41634:167::-:0;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41708:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;;:37;;-1:-1:-1;;41708:37:0::1;41741:4;41708:37:::0;;::::1;::::0;;;41761:32;;::::1;::::0;::::1;::::0;::::1;:::i;44313:173::-:0;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;44392:21:::1;:32:::0;;-1:-1:-1;;44392:32:0::1;::::0;;::::1;;;;::::0;;44440:38:::1;::::0;::::1;::::0;::::1;::::0;44392:32;;44440:38:::1;:::i;40011:127::-:0;-1:-1:-1;;;;;40108:22:0;40084:4;40108:22;;;:13;:22;;;;;;;;;40011:127::o;31552:34::-;;;;:::o;39756:152::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;39835:24:::1;39851:7;39835:15;:24::i;:::-;-1:-1:-1::0;;;;;39870:22:0::1;39895:5;39870:22:::0;;;:13:::1;:22;::::0;;;;:30;;-1:-1:-1;;39870:30:0::1;::::0;;39756:152::o;44494:133::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;44562:9:::1;:21:::0;;-1:-1:-1;;44562:21:0::1;::::0;::::1;;;::::0;;44599:20:::1;::::0;::::1;::::0;::::1;::::0;44562:21;;44599:20:::1;:::i;36050:153::-:0;-1:-1:-1;;;;;36168:18:0;;;36141:7;36168:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;36050:153::o;31593:59::-;31638:14;31593:59;:::o;61265:252::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;61360:12:::1;:10;:12::i;:::-;61350:6;:22;;61342:31;;;::::0;::::1;;61384:22;61417:7;:5;:7::i;:::-;61436:23;::::0;61384:41;;-1:-1:-1;;;;;;61436:15:0;::::1;::::0;:23;::::1;;;::::0;61452:6;;61436:23:::1;::::0;;;61452:6;61436:15;:23;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;61475:34;61502:6;61475:34;;;;;;:::i;:::-;;;;;;;;5479:1;61265:252:::0;:::o;42295:152::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42364:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;;:32;;-1:-1:-1;;42364:32:0::1;42392:4;42364:32:::0;;::::1;::::0;;;42412:27;;::::1;::::0;::::1;::::0;::::1;:::i;31196:29::-:0;;;;:::o;43743:285::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;43892:3:::1;43885;43872:10;;43854:15;;43839:12;;43830:6;;:21;;;;:::i;:::-;:39;;;;:::i;:::-;:52;;;;:::i;:::-;:58;;;;:::i;:::-;43829:66;43821:114;;;;-1:-1:-1::0;;;43821:114:0::1;;;;;;;:::i;:::-;43946:15;:21:::0;;;43983:37:::1;::::0;::::1;::::0;::::1;::::0;43964:3;;43983:37:::1;:::i;6142:244::-:0;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6231:22:0;::::1;6223:73;;;;-1:-1:-1::0;;;6223:73:0::1;;;;;;;:::i;:::-;6333:6;::::0;;6312:38:::1;::::0;-1:-1:-1;;;;;6312:38:0;;::::1;::::0;6333:6;::::1;::::0;6312:38:::1;::::0;::::1;6361:6;:17:::0;;-1:-1:-1;;;;;;6361:17:0::1;-1:-1:-1::0;;;;;6361:17:0;;;::::1;::::0;;;::::1;::::0;;6142:244::o;31881:28::-;;;-1:-1:-1;;;;;31881:28:0;;:::o;42455:121::-;-1:-1:-1;;;;;42543:25:0;42519:4;42543:25;;;:16;:25;;;;;;;;;42455:121::o;41813:165::-;5419:12;:10;:12::i;:::-;-1:-1:-1;;;;;5408:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5408:23:0;;5400:68;;;;-1:-1:-1;;;5400:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41885:30:0;::::1;41918:5;41885:30:::0;;;:21:::1;:30;::::0;;;;;:38;;-1:-1:-1;;41885:38:0::1;::::0;;41939:31;::::1;::::0;::::1;::::0;::::1;:::i;31089:34::-:0;;;;:::o;3832:98::-;3912:10;3832:98;:::o;50778:346::-;-1:-1:-1;;;;;50880:19:0;;50872:68;;;;-1:-1:-1;;;50872:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50959:21:0;;50951:68;;;;-1:-1:-1;;;50951:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51032:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;51084:32;;;;;51062:6;;51084:32;:::i;51614:1183::-;-1:-1:-1;;;;;51737:18:0;;51729:68;;;;-1:-1:-1;;;51729:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51816:16:0;;51808:64;;;;-1:-1:-1;;;51808:64:0;;;;;;;:::i;:::-;51900:1;51891:6;:10;51883:64;;;;-1:-1:-1;;;51883:64:0;;;;;;;:::i;:::-;51968:30;51989:4;51995:2;51968:20;:30::i;:::-;52019:21;52043:15;52053:4;52043:9;:15::i;:::-;52019:39;;52094:6;52077:13;:23;;52069:74;;;;-1:-1:-1;;;52069:74:0;;;;;;;:::i;:::-;52364:9;;52217:12;;52364:9;;:61;;;;-1:-1:-1;;;;;;52378:22:0;;;;;;:16;:22;;;;;;;;;:46;;-1:-1:-1;;;;;;52404:20:0;;;;;;:16;:20;;;;;;;;52378:46;52361:254;;;52453:13;;-1:-1:-1;;;;;52445:21:0;;;52453:13;;52445:21;:50;;;;-1:-1:-1;;;;;;52470:25:0;;;;;;:21;:25;;;;;;;;52445:50;52444:108;;;-1:-1:-1;52507:13:0;;-1:-1:-1;;;;;52501:19:0;;;52507:13;;52501:19;:50;;;;-1:-1:-1;;;;;;52524:27:0;;;;;;:21;:27;;;;;;;;52501:50;52441:162;;;-1:-1:-1;52564:5:0;52441:162;;;-1:-1:-1;52599:4:0;52441:162;52628:7;52625:33;;;52637:21;52653:4;52637:15;:21::i;:::-;52751:38;52766:4;52771:2;52774:6;52781:7;52751:14;:38::i;:::-;51614:1183;;;;;:::o;46350:162::-;46391:7;46412:15;46429;46448:18;:16;:18::i;:::-;46411:55;;-1:-1:-1;46411:55:0;-1:-1:-1;46484:20:0;46411:55;;46484:11;:20::i;:::-;46477:27;;;;46350:162;:::o;12244:98::-;12302:7;12329:5;12333:1;12329;:5;:::i;:::-;12322:12;12244:98;-1:-1:-1;;;12244:98:0:o;8177:118::-;7703:8;:6;:8::i;:::-;7702:9;7694:38;;;;-1:-1:-1;;;7694:38:0;;;;;;;:::i;:::-;8237:7:::1;:14:::0;;-1:-1:-1;;;;8237:14:0::1;-1:-1:-1::0;;;8237:14:0::1;::::0;;8267:20:::1;8274:12;:10;:12::i;:::-;8267:20;;;;;;:::i;:::-;;;;;;;;8177:118::o:0;8436:120::-;7980:8;:6;:8::i;:::-;7972:41;;;;-1:-1:-1;;;7972:41:0;;;;;;;:::i;:::-;8505:5:::1;8495:15:::0;;-1:-1:-1;;;;8495:15:0::1;::::0;;8526:22:::1;8535:12;:10;:12::i;62124:360::-:0;62218:8;:6;:8::i;:::-;62217:9;62209:73;;;;-1:-1:-1;;;62209:73:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62302:19:0;;;;;;:13;:19;;;;;;;;62301:20;62293:88;;;;-1:-1:-1;;;62293:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;62401:17:0;;;;;;:13;:17;;;;;;;;62400:18;62392:84;;;;-1:-1:-1;;;62392:84:0;;;;;;;:::i;57463:1007::-;57533:13;;-1:-1:-1;;;;;57525:21:0;;;57533:13;;57525:21;;;;:66;;;31638:14;57550:19;;:41;;57525:66;57522:941;;;57631:9;;;;57710:37;;;;57730:9;:17;;-1:-1:-1;;57730:17:0;;;57710:37;58066:16;;;;;;;58065:17;:42;;;;-1:-1:-1;58086:21:0;;;;;;;58065:42;:87;;;;;31638:14;58111:19;;:41;;58065:87;58062:282;;;58187:19;;;58173:11;58225:23;;;58300:28;58187:19;58320:7;:5;:7::i;:::-;58300:14;:28::i;:::-;58062:282;;58418:15;58415:36;;;58435:9;:16;;-1:-1:-1;;58435:16:0;58447:4;58435:16;;;57522:941;;57463:1007;:::o;52878:705::-;52990:7;52986:40;;53012:14;:12;:14::i;:::-;-1:-1:-1;;;;;53051:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;53075:22:0;;;;;;:11;:22;;;;;;;;53074:23;53051:46;53047:467;;;53114:48;53136:6;53144:9;53155:6;53114:21;:48::i;:::-;53047:467;;;-1:-1:-1;;;;;53185:19:0;;;;;;:11;:19;;;;;;;;53184:20;:46;;;;-1:-1:-1;;;;;;53208:22:0;;;;;;:11;:22;;;;;;;;53184:46;53180:334;;;53247:46;53267:6;53275:9;53286:6;53247:19;:46::i;53180:334::-;-1:-1:-1;;;;;53315:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;53338:22:0;;;;;;:11;:22;;;;;;;;53315:45;53311:203;;;53377:48;53399:6;53407:9;53418:6;53377:21;:48::i;53311:203::-;53458:44;53476:6;53484:9;53495:6;53458:17;:44::i;:::-;53538:7;53534:41;;53560:15;:13;:15::i;:::-;52878:705;;;;:::o;46520:561::-;46617:7;;46653;;46570;;;;;46677:289;46701:9;:16;46697:20;;46677:289;;;46767:7;46743;:21;46751:9;46761:1;46751:12;;;;;;-1:-1:-1;;;46751:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46751:12:0;46743:21;;;;;;;;;;;;;:31;;:66;;;46802:7;46778;:21;46786:9;46796:1;46786:12;;;;;;-1:-1:-1;;;46786:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46786:12:0;46778:21;;;;;;;;;;;;;:31;46743:66;46739:97;;;46819:7;;46828;;46811:25;;;;;;;;;46739:97;46861:34;46873:7;:21;46881:9;46891:1;46881:12;;;;;;-1:-1:-1;;;46881:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46881:12:0;46873:21;;;;;;;;;;;;;46861:7;;:11;:34::i;:::-;46851:44;;46920:34;46932:7;:21;46940:9;46950:1;46940:12;;;;;;-1:-1:-1;;;46940:12:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46940:12:0;46932:21;;;;;;;;;;;;;46920:7;;:11;:34::i;:::-;46910:44;-1:-1:-1;46719:3:0;;;;:::i;:::-;;;;46677:289;;;-1:-1:-1;47002:7:0;;46990;;:20;;:11;:20::i;:::-;46980:7;:30;46976:61;;;47020:7;;47029;;47012:25;;;;;;;;46976:61;47056:7;;-1:-1:-1;47065:7:0;-1:-1:-1;46520:561:0;;;:::o;58478:1027::-;33046:16;:23;;-1:-1:-1;;33046:23:0;;;;;;58647:27:::1;:20:::0;58672:1:::1;58647:24;:27::i;:::-;58632:42:::0;-1:-1:-1;58685:17:0::1;58705:30;:20:::0;58632:42;58705:24:::1;:30::i;:::-;58685:50:::0;-1:-1:-1;59038:21:0::1;59104:37;59121:4:::0;59135::::1;59104:16;:37::i;:::-;59272:18;59293:41;:21;59319:14:::0;59293:25:::1;:41::i;:::-;59272:62;;59384:44;59397:9;59408:10;59420:7;59384:12;:44::i;:::-;59454:43;59469:4;59475:10;59487:9;59454:43;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;33092:16:0;:24;;-1:-1:-1;;33092:24:0;;;-1:-1:-1;;;;58478:1027:0:o;49429:541::-;49476:6;;:11;:32;;;;-1:-1:-1;49491:12:0;;:17;49476:32;:56;;;;-1:-1:-1;49512:15:0;;:20;49476:56;:75;;;;-1:-1:-1;49536:10:0;;:15;49476:75;:99;;;;-1:-1:-1;49555:15:0;;:20;49476:99;49473:111;;;49577:7;;49473:111;49621:6;;;49604:14;:23;49661:12;;;49638:20;:35;49710:15;;;49684:23;:41;49757:10;;;49736:18;:31;49804:15;;;49778:23;:41;-1:-1:-1;49840:10:0;;;;49861:16;;;;49888:19;;;;49918:14;;;49943:19;49429:541::o;56506:949::-;56610:23;56635:12;56649:18;56669:13;56684:19;56705;56728;56739:7;56728:10;:19::i;:::-;56609:138;;;;;;;;;;;;56759:15;56776:23;56801:12;56817:70;56828:7;56837:4;56843:10;56855:5;56862:11;56875;56817:10;:70::i;:::-;-1:-1:-1;;;;;56916:15:0;;;;;;:7;:15;;;;;;56758:129;;-1:-1:-1;56758:129:0;;-1:-1:-1;56758:129:0;-1:-1:-1;56916:28:0;;56936:7;56916:19;:28::i;:::-;-1:-1:-1;;;;;56898:15:0;;;;;;:7;:15;;;;;;;;:46;;;;56973:7;:15;;;;:28;;56993:7;56973:19;:28::i;:::-;-1:-1:-1;;;;;56955:15:0;;;;;;;:7;:15;;;;;;:46;;;;57033:18;;;;;;;:39;;57056:15;57033:22;:39::i;:::-;-1:-1:-1;;;;;57012:18:0;;;;;;:7;:18;;;;;:60;57086:29;57104:4;57110;57086:17;:29::i;:::-;57126:36;57143:6;57151:10;57126:16;:36::i;:::-;57173:35;57188:6;57196:11;57173:14;:35::i;:::-;57219:40;57239:6;57247:11;57219:19;:40::i;:::-;57273:9;;57270:118;;57316:5;57299:13;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;57341:35:0;;57366:1;;-1:-1:-1;;;;;57341:35:0;;;-1:-1:-1;;;;;;;;;;;57341:35:0;;;57370:5;;57341:35;:::i;:::-;;;;;;;;57270:118;57420:9;-1:-1:-1;;;;;57403:44:0;57412:6;-1:-1:-1;;;;;57403:44:0;-1:-1:-1;;;;;;;;;;;57431:15:0;57403:44;;;;;;:::i;:::-;;;;;;;;56506:949;;;;;;;;;;;;:::o;55529:969::-;55631:23;55656:12;55670:18;55690:13;55705:19;55726;55749;55760:7;55749:10;:19::i;:::-;55630:138;;;;;;;;;;;;55780:15;55797:23;55822:12;55838:70;55849:7;55858:4;55864:10;55876:5;55883:11;55896;55838:10;:70::i;:::-;-1:-1:-1;;;;;55937:15:0;;;;;;:7;:15;;;;;;55779:129;;-1:-1:-1;55779:129:0;;-1:-1:-1;55779:129:0;-1:-1:-1;55937:28:0;;55779:129;55937:19;:28::i;:::-;-1:-1:-1;;;;;55919:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;55997:18;;;;;:7;:18;;;;;:39;;56020:15;55997:22;:39::i;:::-;-1:-1:-1;;;;;55976:18:0;;;;;;:7;:18;;;;;;;;:60;;;;56068:7;:18;;;;:39;;56091:15;56068:22;:39::i;54492:1025::-;54596:23;54621:12;54635:18;54655:13;54670:19;54691;54714;54725:7;54714:10;:19::i;:::-;54595:138;;;;;;;;;;;;54745:15;54762:23;54787:12;54803:70;54814:7;54823:4;54829:10;54841:5;54848:11;54861;54803:10;:70::i;:::-;-1:-1:-1;;;;;54902:15:0;;;;;;:7;:15;;;;;;54744:129;;-1:-1:-1;54744:129:0;;-1:-1:-1;54744:129:0;-1:-1:-1;54902:28:0;;54922:7;54902:19;:28::i;:::-;-1:-1:-1;;;;;54884:15:0;;;;;;:7;:15;;;;;;;;:46;;;;54959:7;:15;;;;:28;;54979:7;54959:19;:28::i;53593:887::-;53693:23;53718:12;53732:18;53752:13;53767:19;53788;53811;53822:7;53811:10;:19::i;:::-;53692:138;;;;;;;;;;;;53842:15;53859:23;53884:12;53900:70;53911:7;53920:4;53926:10;53938:5;53945:11;53958;53900:10;:70::i;:::-;-1:-1:-1;;;;;54001:15:0;;;;;;:7;:15;;;;;;53841:129;;-1:-1:-1;53841:129:0;;-1:-1:-1;53841:129:0;-1:-1:-1;54001:28:0;;53841:129;54001:19;:28::i;49979:268::-;50033:14;;50024:6;:23;50073:20;;50058:12;:35;50122:23;;50104:15;:41;50169:18;;50156:10;:31;50216:23;;50198:15;:41;49979:268::o;11488:98::-;11546:7;11573:5;11577:1;11573;:5;:::i;59513:609::-;59685:16;;;59699:1;59685:16;;;;;;;;59661:21;;59685:16;;;;;;;;;;-1:-1:-1;59685:16:0;59661:40;;59730:4;59712;59717:1;59712:7;;;;;;-1:-1:-1;;;59712:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;59712:23:0;;;-1:-1:-1;;;;;59712:23:0;;;;;59756:15;-1:-1:-1;;;;;59756:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59746:4;59751:1;59746:7;;;;;;-1:-1:-1;;;59746:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;59746:32:0;;;-1:-1:-1;;;;;59746:32:0;;;;;59791:62;59808:4;59823:15;59841:11;59791:8;:62::i;:::-;59892:222;;-1:-1:-1;;;59892:222:0;;-1:-1:-1;;;;;59892:15:0;:66;;;;:222;;59973:11;;59999:1;;60043:4;;60062:11;;60088:15;;59892:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59513:609;;;:::o;60130:655::-;60296:62;60313:4;60328:15;60346:11;60296:8;:62::i;:::-;60402:16;60420:14;60436;60454:15;-1:-1:-1;;;;;60454:31:0;;60493:9;60526:4;60546:11;60572:1;60615;60658:7;60680:15;60454:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60401:305;;;;;;60722:55;60745:11;60757:9;60767;60722:55;;;;;;;;:::i;:::-;;;;;;;;60130:655;;;;;;:::o;44797:718::-;44856:7;;;;;;44939:6;44856:7;44971:24;44939:6;44971:15;:24::i;:::-;44956:39;;45006:18;45027:30;45049:7;45027:21;:30::i;:::-;45006:51;;45068:19;45090:28;45110:7;45090:19;:28::i;:::-;45068:50;;45129:19;45151:33;45176:7;45151:24;:33::i;:::-;45129:55;;45195:13;45211:33;45236:7;45211:24;:33::i;:::-;45195:49;;45270:11;45284:7;45270:21;;45306:23;45332:74;45394:11;45332:57;45377:11;45332:40;45366:5;45332:29;45350:10;45332:13;45340:4;45332:3;:7;;:13;;;;:::i;:::-;:17;;:29::i;:74::-;45306:100;45446:4;;-1:-1:-1;45452:10:0;;-1:-1:-1;45464:5:0;;-1:-1:-1;45471:11:0;;-1:-1:-1;45471:11:0;-1:-1:-1;44797:718:0;;-1:-1:-1;;;;;44797:718:0:o;45523:819::-;45673:7;45682;45691;45711:19;45733:9;:7;:9::i;:::-;45711:31;-1:-1:-1;45771:6:0;45753:15;45806:24;45771:6;45711:31;45806:11;:24::i;:::-;45788:42;-1:-1:-1;45841:12:0;45856:21;:4;45865:11;45856:8;:21::i;:::-;45841:36;-1:-1:-1;45888:18:0;45909:27;:10;45924:11;45909:14;:27::i;:::-;45888:48;-1:-1:-1;45947:19:0;45969:28;:11;45985;45969:15;:28::i;:::-;45947:50;-1:-1:-1;46008:19:0;46030:28;:11;46046;46030:15;:28::i;:::-;46008:50;-1:-1:-1;46069:13:0;46085:22;:5;46095:11;46085:9;:22::i;:::-;46069:38;;46133:11;46147:7;46133:21;;46169:23;46195:74;46257:11;46195:57;46240:11;46195:40;46229:5;46195:29;46213:10;46195:13;46203:4;46195:3;:7;;:13;;;;:::i;:74::-;46292:7;;-1:-1:-1;46169:100:0;;-1:-1:-1;46318:4:0;;-1:-1:-1;;;;;;;;;45523:819:0;;;;;;;;;;:::o;11107:98::-;11165:7;11192:5;11196:1;11192;:5;:::i;44635:154::-;44720:7;;:17;;44732:4;44720:11;:17::i;:::-;44710:7;:27;44761:10;;:20;;44776:4;44761:14;:20::i;:::-;44748:10;:33;-1:-1:-1;;44635:154:0:o;48042:505::-;48124:19;48147:9;:7;:9::i;:::-;48124:32;-1:-1:-1;48167:18:0;48188:27;:10;48124:32;48188:14;:27::i;:::-;48167:48;;48249:10;48226:19;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;48311:4:0;48295:22;;;;:7;:22;;;;;;:38;;48322:10;48295:26;:38::i;:::-;48286:4;48270:22;;;;:7;:22;;;;;;;;:63;;;;48347:11;:26;;;;;;48344:107;;;48429:4;48413:22;;;;:7;:22;;;;;;:38;;48440:10;48413:26;:38::i;:::-;48404:4;48388:22;;;;:7;:22;;;;;:63;48344:107;48475:14;;48472:67;;48521:4;-1:-1:-1;;;;;48496:43:0;48505:6;-1:-1:-1;;;;;48496:43:0;-1:-1:-1;;;;;;;;;;;48528:10:0;48496:43;;;;;;:::i;:::-;;;;;;;;48042:505;;;;:::o;47089:466::-;47170:19;47193:9;:7;:9::i;:::-;47170:32;-1:-1:-1;47213:19:0;47235:28;:11;47170:32;47235:15;:28::i;:::-;47307:13;;-1:-1:-1;;;;;47307:13:0;47299:22;;;;:7;:22;;;;;;47213:50;;-1:-1:-1;47299:39:0;;47213:50;47299:26;:39::i;:::-;47282:13;;;-1:-1:-1;;;;;47282:13:0;;;47274:22;;;;:7;:22;;;;;;;;:64;;;;47364:13;;;;;47352:26;;:11;:26;;;;;;;47349:108;;;47426:13;;-1:-1:-1;;;;;47426:13:0;47418:22;;;;:7;:22;;;;;;:39;;47445:11;47418:26;:39::i;:::-;47401:13;;-1:-1:-1;;;;;47401:13:0;47393:22;;;;:7;:22;;;;;:64;47349:108;47481:15;;47478:69;;47520:13;;47503:44;;-1:-1:-1;;;;;47520:13:0;;;;47503:44;;;-1:-1:-1;;;;;;;;;;;47503:44:0;;;47535:11;;47503:44;:::i;47563:471::-;47649:19;47672:9;:7;:9::i;:::-;47649:32;-1:-1:-1;47692:19:0;47714:28;:11;47649:32;47714:15;:28::i;:::-;47786:13;;-1:-1:-1;;;;;47786:13:0;47778:22;;;;:7;:22;;;;;;47692:50;;-1:-1:-1;47778:39:0;;47692:50;47778:26;:39::i;:::-;47761:13;;;-1:-1:-1;;;;;47761:13:0;;;47753:22;;;;:7;:22;;;;;;;;:64;;;;47843:13;;;;;47831:26;;:11;:26;;;;;;;47828:108;;;47905:13;;-1:-1:-1;;;;;47905:13:0;47897:22;;;;:7;:22;;;;;;:39;;47924:11;47897:26;:39::i;:::-;47880:13;;-1:-1:-1;;;;;47880:13:0;47872:22;;;;:7;:22;;;;;:64;47828:108;47960:15;;47957:69;;47999:13;;47982:44;;-1:-1:-1;;;;;47999:13:0;;;;47982:44;;;-1:-1:-1;;;;;;;;;;;47982:44:0;;;48014:11;;47982:44;:::i;48559:154::-;48624:7;48651:54;48689:5;48651:19;48663:6;;48651:7;:11;;:19;;;;:::i;:::-;:23;;:54::i;48721:166::-;48792:7;48819:60;48863:5;48819:25;48831:12;;48819:7;:11;;:25;;;;:::i;49075:162::-;49144:7;49171:58;49213:5;49171:23;49183:10;;49171:7;:11;;:23;;;;:::i;49245:172::-;49319:7;49346:63;49393:5;49346:28;49358:15;;49346:7;:11;;:28;;;;:::i;48895:172::-;48969:7;48996:63;49043:5;48996:28;49008:15;;48996:7;:11;;:28;;;;:::i;11845:98::-;11903:7;11930:5;11934:1;11930;:5;:::i;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:1;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:1;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:1;1398:18;;;;1385:32;;1057:366::o;1428:327::-;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1578:6;1570;1563:22;1525:2;1622:9;1609:23;1641:33;1668:5;1641:33;:::i;:::-;1693:5;1745:2;1730:18;;;;1717:32;;-1:-1:-1;;;1515:240:1:o;1760:253::-;;1869:2;1857:9;1848:7;1844:23;1840:32;1837:2;;;1890:6;1882;1875:22;1837:2;1934:9;1921:23;1953:30;1977:5;1953:30;:::i;2018:257::-;;2138:2;2126:9;2117:7;2113:23;2109:32;2106:2;;;2159:6;2151;2144:22;2106:2;2196:9;2190:16;2215:30;2239:5;2215:30;:::i;2280:190::-;;2392:2;2380:9;2371:7;2367:23;2363:32;2360:2;;;2413:6;2405;2398:22;2360:2;-1:-1:-1;2441:23:1;;2350:120;-1:-1:-1;2350:120:1:o;2475:316::-;;;;2632:2;2620:9;2611:7;2607:23;2603:32;2600:2;;;2653:6;2645;2638:22;2600:2;2687:9;2681:16;2671:26;;2737:2;2726:9;2722:18;2716:25;2706:35;;2781:2;2770:9;2766:18;2760:25;2750:35;;2590:201;;;;;:::o;2796:203::-;-1:-1:-1;;;;;2960:32:1;;;;2942:51;;2930:2;2915:18;;2897:102::o;3004:274::-;-1:-1:-1;;;;;3196:32:1;;;;3178:51;;3260:2;3245:18;;3238:34;3166:2;3151:18;;3133:145::o;3283:607::-;-1:-1:-1;;;;;3642:15:1;;;3624:34;;3689:2;3674:18;;3667:34;;;;3732:2;3717:18;;3710:34;;;;3775:2;3760:18;;3753:34;;;;3824:15;;;3818:3;3803:19;;3796:44;3604:3;3856:19;;3849:35;;;;3573:3;3558:19;;3540:350::o;3895:187::-;4060:14;;4053:22;4035:41;;4023:2;4008:18;;3990:92::o;4322:603::-;;4463:2;4492;4481:9;4474:21;4524:6;4518:13;4567:6;4562:2;4551:9;4547:18;4540:34;4592:4;4605:140;4619:6;4616:1;4613:13;4605:140;;;4714:14;;;4710:23;;4704:30;4680:17;;;4699:2;4676:26;4669:66;4634:10;;4605:140;;;4763:6;4760:1;4757:13;4754:2;;;4833:4;4828:2;4819:6;4808:9;4804:22;4800:31;4793:45;4754:2;-1:-1:-1;4909:2:1;4888:15;-1:-1:-1;;4884:29:1;4869:45;;;;4916:2;4865:54;;4443:482;-1:-1:-1;;;4443:482:1:o;4930:399::-;5132:2;5114:21;;;5171:2;5151:18;;;5144:30;5210:34;5205:2;5190:18;;5183:62;-1:-1:-1;;;5276:2:1;5261:18;;5254:33;5319:3;5304:19;;5104:225::o;5334:344::-;5536:2;5518:21;;;5575:2;5555:18;;;5548:30;-1:-1:-1;;;5609:2:1;5594:18;;5587:50;5669:2;5654:18;;5508:170::o;5683:406::-;5885:2;5867:21;;;5924:2;5904:18;;;5897:30;5963:34;5958:2;5943:18;;5936:62;-1:-1:-1;;;6029:2:1;6014:18;;6007:40;6079:3;6064:19;;5857:232::o;6094:402::-;6296:2;6278:21;;;6335:2;6315:18;;;6308:30;6374:34;6369:2;6354:18;;6347:62;-1:-1:-1;;;6440:2:1;6425:18;;6418:36;6486:3;6471:19;;6268:228::o;6501:398::-;6703:2;6685:21;;;6742:2;6722:18;;;6715:30;6781:34;6776:2;6761:18;;6754:62;-1:-1:-1;;;6847:2:1;6832:18;;6825:32;6889:3;6874:19;;6675:224::o;6904:419::-;7106:2;7088:21;;;7145:2;7125:18;;;7118:30;7184:34;7179:2;7164:18;;7157:62;7255:25;7250:2;7235:18;;7228:53;7313:3;7298:19;;7078:245::o;7328:351::-;7530:2;7512:21;;;7569:2;7549:18;;;7542:30;7608:29;7603:2;7588:18;;7581:57;7670:2;7655:18;;7502:177::o;7684:402::-;7886:2;7868:21;;;7925:2;7905:18;;;7898:30;7964:34;7959:2;7944:18;;7937:62;-1:-1:-1;;;8030:2:1;8015:18;;8008:36;8076:3;8061:19;;7858:228::o;8091:347::-;8293:2;8275:21;;;8332:2;8312:18;;;8305:30;8371:25;8366:2;8351:18;;8344:53;8429:2;8414:18;;8265:173::o;8443:340::-;8645:2;8627:21;;;8684:2;8664:18;;;8657:30;-1:-1:-1;;;8718:2:1;8703:18;;8696:46;8774:2;8759:18;;8617:166::o;8788:399::-;8990:2;8972:21;;;9029:2;9009:18;;;9002:30;9068:34;9063:2;9048:18;;9041:62;-1:-1:-1;;;9134:2:1;9119:18;;9112:33;9177:3;9162:19;;8962:225::o;9192:411::-;9394:2;9376:21;;;9433:2;9413:18;;;9406:30;9472:34;9467:2;9452:18;;9445:62;-1:-1:-1;;;9538:2:1;9523:18;;9516:45;9593:3;9578:19;;9366:237::o;9608:404::-;9810:2;9792:21;;;9849:2;9829:18;;;9822:30;9888:34;9883:2;9868:18;;9861:62;-1:-1:-1;;;9954:2:1;9939:18;;9932:38;10002:3;9987:19;;9782:230::o;10017:356::-;10219:2;10201:21;;;10238:18;;;10231:30;10297:34;10292:2;10277:18;;10270:62;10364:2;10349:18;;10191:182::o;10378:405::-;10580:2;10562:21;;;10619:2;10599:18;;;10592:30;10658:34;10653:2;10638:18;;10631:62;-1:-1:-1;;;10724:2:1;10709:18;;10702:39;10773:3;10758:19;;10552:231::o;10788:352::-;10990:2;10972:21;;;11029:2;11009:18;;;11002:30;11068;11063:2;11048:18;;11041:58;11131:2;11116:18;;10962:178::o;11145:417::-;11347:2;11329:21;;;11386:2;11366:18;;;11359:30;11425:34;11420:2;11405:18;;11398:62;-1:-1:-1;;;11491:2:1;11476:18;;11469:51;11552:3;11537:19;;11319:243::o;11567:401::-;11769:2;11751:21;;;11808:2;11788:18;;;11781:30;11847:34;11842:2;11827:18;;11820:62;-1:-1:-1;;;11913:2:1;11898:18;;11891:35;11958:3;11943:19;;11741:227::o;11973:400::-;12175:2;12157:21;;;12214:2;12194:18;;;12187:30;12253:34;12248:2;12233:18;;12226:62;-1:-1:-1;;;12319:2:1;12304:18;;12297:34;12363:3;12348:19;;12147:226::o;12378:415::-;12580:2;12562:21;;;12619:2;12599:18;;;12592:30;12658:34;12653:2;12638:18;;12631:62;-1:-1:-1;;;12724:2:1;12709:18;;12702:49;12783:3;12768:19;;12552:241::o;12798:401::-;13000:2;12982:21;;;13039:2;13019:18;;;13012:30;13078:34;13073:2;13058:18;;13051:62;-1:-1:-1;;;13144:2:1;13129:18;;13122:35;13189:3;13174:19;;12972:227::o;13204:177::-;13350:25;;;13338:2;13323:18;;13305:76::o;13386:983::-;;13696:3;13685:9;13681:19;13727:6;13716:9;13709:25;13753:2;13791:6;13786:2;13775:9;13771:18;13764:34;13834:3;13829:2;13818:9;13814:18;13807:31;13858:6;13893;13887:13;13924:6;13916;13909:22;13962:3;13951:9;13947:19;13940:26;;14001:2;13993:6;13989:15;13975:29;;14022:4;14035:195;14049:6;14046:1;14043:13;14035:195;;;14114:13;;-1:-1:-1;;;;;14110:39:1;14098:52;;14205:15;;;;14170:12;;;;14146:1;14064:9;14035:195;;;-1:-1:-1;;;;;;;14286:32:1;;;;14281:2;14266:18;;14259:60;-1:-1:-1;;;14350:3:1;14335:19;14328:35;14247:3;13657:712;-1:-1:-1;;;13657:712:1:o;14374:319::-;14576:25;;;14632:2;14617:18;;14610:34;;;;14675:2;14660:18;;14653:34;14564:2;14549:18;;14531:162::o;14698:184::-;14870:4;14858:17;;;;14840:36;;14828:2;14813:18;;14795:87::o;14887:128::-;;14958:1;14954:6;14951:1;14948:13;14945:2;;;14964:18;;:::i;:::-;-1:-1:-1;15000:9:1;;14935:80::o;15020:217::-;;15086:1;15076:2;;-1:-1:-1;;;15111:31:1;;15165:4;15162:1;15155:15;15193:4;15118:1;15183:15;15076:2;-1:-1:-1;15222:9:1;;15066:171::o;15242:168::-;;15348:1;15344;15340:6;15336:14;15333:1;15330:21;15325:1;15318:9;15311:17;15307:45;15304:2;;;15355:18;;:::i;:::-;-1:-1:-1;15395:9:1;;15294:116::o;15415:125::-;;15483:1;15480;15477:8;15474:2;;;15488:18;;:::i;:::-;-1:-1:-1;15525:9:1;;15464:76::o;15545:135::-;;-1:-1:-1;;15605:17:1;;15602:2;;;15625:18;;:::i;:::-;-1:-1:-1;15672:1:1;15661:13;;15592:88::o;15685:127::-;15746:10;15741:3;15737:20;15734:1;15727:31;15777:4;15774:1;15767:15;15801:4;15798:1;15791:15;15817:133;-1:-1:-1;;;;;15894:31:1;;15884:42;;15874:2;;15940:1;15937;15930:12;15955:120;16043:5;16036:13;16029:21;16022:5;16019:32;16009:2;;16065:1;16062;16055:12

Swarm Source

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