ETH Price: $2,388.55 (+0.46%)

Contract

0x225b9970F333fFE868F6Eff4cd6ADf3943Dc6c4D
 

Overview

ETH Balance

0.00937229132057624 ETH

Eth Value

$22.39 (@ $2,388.55/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve179946262023-08-25 22:16:23550 days ago1693001783IN
0x225b9970...943Dc6c4D
0 ETH0.0004041515.37746202
Approve179946262023-08-25 22:16:23550 days ago1693001783IN
0x225b9970...943Dc6c4D
0 ETH0.0003733915.37746202
Approve179946252023-08-25 22:16:11550 days ago1693001771IN
0x225b9970...943Dc6c4D
0 ETH0.000401415.23810897
Approve179946252023-08-25 22:16:11550 days ago1693001771IN
0x225b9970...943Dc6c4D
0 ETH0.0003709215.23810897
Approve168669982023-03-20 6:07:47709 days ago1679292467IN
0x225b9970...943Dc6c4D
0 ETH0.0005831512.52327403
Approve166026902023-02-11 2:58:59746 days ago1676084339IN
0x225b9970...943Dc6c4D
0 ETH0.0008469218.18759958
Approve166023662023-02-11 1:53:47746 days ago1676080427IN
0x225b9970...943Dc6c4D
0 ETH0.0008174917.55552699
Approve166020032023-02-11 0:40:47746 days ago1676076047IN
0x225b9970...943Dc6c4D
0 ETH0.0005190821.37719757
Approve166020012023-02-11 0:40:23746 days ago1676076023IN
0x225b9970...943Dc6c4D
0 ETH0.000538322.16903813
Approve166019762023-02-11 0:35:23746 days ago1676075723IN
0x225b9970...943Dc6c4D
0 ETH0.0008150133.56439954
Approve166019472023-02-11 0:29:35746 days ago1676075375IN
0x225b9970...943Dc6c4D
0 ETH0.0009585220.58426565
Approve166018872023-02-11 0:17:35746 days ago1676074655IN
0x225b9970...943Dc6c4D
0 ETH0.0010036121.55255778
Approve166018532023-02-11 0:10:47746 days ago1676074247IN
0x225b9970...943Dc6c4D
0 ETH0.00098821.21740781
Approve165966502023-02-10 6:45:23747 days ago1676011523IN
0x225b9970...943Dc6c4D
0 ETH0.0008511218.27779226
Approve165932212023-02-09 19:16:11747 days ago1675970171IN
0x225b9970...943Dc6c4D
0 ETH0.0018143338.96262641
Approve165931512023-02-09 19:02:11747 days ago1675969331IN
0x225b9970...943Dc6c4D
0 ETH0.0019451441.77175592
Approve165742042023-02-07 3:24:11750 days ago1675740251IN
0x225b9970...943Dc6c4D
0 ETH0.0010483722.51371811
Transfer165663852023-02-06 1:12:47751 days ago1675645967IN
0x225b9970...943Dc6c4D
0 ETH0.0013169316.66685026
Approve165663712023-02-06 1:09:59751 days ago1675645799IN
0x225b9970...943Dc6c4D
0 ETH0.0008629418.53172046
Approve165629732023-02-05 13:46:47752 days ago1675604807IN
0x225b9970...943Dc6c4D
0 ETH0.0011747525.22770908
Approve165620842023-02-05 10:46:59752 days ago1675594019IN
0x225b9970...943Dc6c4D
0 ETH0.0007976617.12969848
Approve165563012023-02-04 15:26:59752 days ago1675524419IN
0x225b9970...943Dc6c4D
0 ETH0.001257827.0111791
Approve165519662023-02-04 0:53:23753 days ago1675472003IN
0x225b9970...943Dc6c4D
0 ETH0.001058522.73124486
Approve165517362023-02-04 0:07:11753 days ago1675469231IN
0x225b9970...943Dc6c4D
0 ETH0.0011142423.89747001
Approve165426972023-02-02 17:46:35754 days ago1675359995IN
0x225b9970...943Dc6c4D
0 ETH0.0019735942.38278136
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
168670002023-03-20 6:08:11709 days ago1679292491
0x225b9970...943Dc6c4D
0.01489593 ETH
168670002023-03-20 6:08:11709 days ago1679292491
0x225b9970...943Dc6c4D
0.00001965 ETH
168670002023-03-20 6:08:11709 days ago1679292491
0x225b9970...943Dc6c4D
0.00744796 ETH
168670002023-03-20 6:08:11709 days ago1679292491
0x225b9970...943Dc6c4D
0.0223439 ETH
166018742023-02-11 0:14:59746 days ago1676074499
0x225b9970...943Dc6c4D
0.02516221 ETH
166018742023-02-11 0:14:59746 days ago1676074499
0x225b9970...943Dc6c4D
0.00005996 ETH
166018742023-02-11 0:14:59746 days ago1676074499
0x225b9970...943Dc6c4D
0.0125811 ETH
166018742023-02-11 0:14:59746 days ago1676074499
0x225b9970...943Dc6c4D
0.03774332 ETH
165932582023-02-09 19:23:35747 days ago1675970615
0x225b9970...943Dc6c4D
0.04555041 ETH
165932582023-02-09 19:23:35747 days ago1675970615
0x225b9970...943Dc6c4D
0.00017041 ETH
165932582023-02-09 19:23:35747 days ago1675970615
0x225b9970...943Dc6c4D
0.0227752 ETH
165932582023-02-09 19:23:35747 days ago1675970615
0x225b9970...943Dc6c4D
0.06832562 ETH
165528032023-02-04 3:40:59753 days ago1675482059
0x225b9970...943Dc6c4D
0.09457743 ETH
165528032023-02-04 3:40:59753 days ago1675482059
0x225b9970...943Dc6c4D
0.00055865 ETH
165528032023-02-04 3:40:59753 days ago1675482059
0x225b9970...943Dc6c4D
0.04728871 ETH
165528032023-02-04 3:40:59753 days ago1675482059
0x225b9970...943Dc6c4D
0.14186614 ETH
165528002023-02-04 3:40:23753 days ago1675482023
0x225b9970...943Dc6c4D
0.04728871 ETH
165528002023-02-04 3:40:23753 days ago1675482023
0x225b9970...943Dc6c4D
0.14186614 ETH
164839252023-01-25 12:46:35763 days ago1674650795
0x225b9970...943Dc6c4D
0.10354047 ETH
164839252023-01-25 12:46:35763 days ago1674650795
0x225b9970...943Dc6c4D
0.0006116 ETH
164839252023-01-25 12:46:35763 days ago1674650795
0x225b9970...943Dc6c4D
0.05177023 ETH
164839252023-01-25 12:46:35763 days ago1674650795
0x225b9970...943Dc6c4D
0.1553107 ETH
164423702023-01-19 17:33:35768 days ago1674149615
0x225b9970...943Dc6c4D
0.14218532 ETH
164423702023-01-19 17:33:35768 days ago1674149615
0x225b9970...943Dc6c4D
0.00083987 ETH
164423702023-01-19 17:33:35768 days ago1674149615
0x225b9970...943Dc6c4D
0.07109266 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Inugami

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-14
*/

// SPDX-License-Identifier: MIT
/*
Inugami(GAMI)

We are Inugami, We are many.

weareinugami.com

*/

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: Inugami/OwnerAdminSettings.sol



pragma solidity >=0.8.0 <0.9.0;



contract OwnerAdminSettings is ReentrancyGuard, Context {

  address internal _owner;

  struct Admin {
        address WA;
        uint8 roleLevel;
  }
  mapping(address => Admin) internal admins;

  mapping(address => bool) internal isAdminRole;

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

  modifier onlyOwner() {
    require(_msgSender() == getOwner() ||
            admins[_msgSender()].roleLevel == 1 
            );
    _;
  }

  modifier onlyDev() {
    require(admins[_msgSender()].roleLevel == 1);
    _;
  }

  modifier onlyAntiBot() {
    require(admins[_msgSender()].roleLevel == 1 ||
            admins[_msgSender()].roleLevel == 2
            );
    _;
  }

  modifier onlyAdminRoles() {
    require(_msgSender() == getOwner() ||
            admins[_msgSender()].roleLevel == 1 ||
            admins[_msgSender()].roleLevel == 2 || 
            admins[_msgSender()].roleLevel == 5
            );
    _;
  }

  constructor() {
    _owner = _msgSender();
    _setNewAdmins(_msgSender(), 1);
  }
    //DON'T FORGET TO SET Locker AND Marketing(AND ALSO WHITELISTING Marketing) AFTER DEPLOYING THE CONTRACT!!!
    //DON'T FORGET TO SET ADMINS!!

  //Owner and Admins
  //Set New Owner. Can be done only by the owner.
  function setNewOwner(address newOwner) external onlyOwner {
    require(newOwner != _owner, "This address is already the owner!");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }

    //Sets up admin accounts.
    function setNewAdmin(address _address, uint8 _roleLevel) external onlyOwner {
      if(_roleLevel == 1) {
        require(admins[_msgSender()].roleLevel == 1, "You are not authorized to set a dev");
      }
      
      _setNewAdmins(_address, _roleLevel);
    }

    function _setNewAdmins(address _address, uint8 _roleLevel) internal {

            Admin storage newAdmin = admins[_address];
            newAdmin.WA = _address;
            newAdmin.roleLevel = _roleLevel;
 
        isAdminRole[_address] = true;
    } 
/*
    function verifyAdminMember(address adr) public view returns(bool YoN, uint8 role_) {
        uint256 iterations = 0;
        while(iterations < adminAccounts.length) {
            if(adminAccounts[iterations] == adr) {return (true, admins[adminAccounts[iterations]].role);}
            iterations++;
        }
        return (false, 0);
    }
*/
    function removeRole(address[] calldata adr) external onlyOwner {
        for(uint i=0; i < adr.length; i++) {
            _removeRole(adr[i]);
        }
    }

    function renounceMyRole(address adr) external onlyAdminRoles {
        require(adr == _msgSender(), "AccessControl: can only renounce roles for self");
        require(isAdminRole[adr] == true, "You do not have an admin role");
        _removeRole(adr);
    }

    function _removeRole(address adr) internal {

          delete admins[adr];
  
        isAdminRole[adr] = false;
    }
  
  //public
    function whoIsOwner() external view returns (address) {
      return getOwner();
    }

    function verifyAdminMember(address adr) external view returns (bool) {
      return isAdminRole[adr];
    }

    function showAdminRoleLevel(address adr) external view returns (uint8) {
      return admins[adr].roleLevel;
    }

  //internal

    function getOwner() internal view returns (address) {
      return _owner;
    }

}
// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

        (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");

        (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");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since 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 subtraction 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;
        }
    }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 *  Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable.
 *  See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 *  In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: Inugami/Inugami.sol



/*
Inugami(GAMI)

We are Inugami, We are many.

weareinugami.com

*/

pragma solidity >=0.8.0 <0.9.0;

interface IERC20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IFactoryV2 {
    event PairCreated(address indexed token0, address indexed token1, address lpPair, uint);
    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address lpPair);
    function allPairs(uint) external view returns (address lpPair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address lpPair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);
    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;
    function initialize(address, address) external;
}

interface 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;
}

interface IRouter01 {
    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 IRouter02 is IRouter01 {
    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;
}





contract Inugami is IERC20, OwnerAdminSettings {

// Library
    using EnumerableSet for EnumerableSet.AddressSet;
    using SafeMath for uint256;
    using Address for address;

//Token Variables
    string constant private _name = "Inugami";
    string constant private _symbol = "GAMI";

    uint64 constant private startingSupply = 100_000_000_000; //100 Billion, underscores aid readability
    uint8 constant private _decimals = 18;
    uint256 constant private MAX = ~uint256(0);

    uint256 constant private _tTotal = startingSupply * 10**_decimals;

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

//Router, LP Pair Variables
    IRouter02 public dexRouter;
    address public pairAddr;

    mapping (address => bool) dexRouters;
    mapping (address => bool) lpPairs;

    //Routers
    struct DexRouter {
        bool enableAggregate;
    }
    mapping(address => DexRouter) public dexrouters;
    
    //LP Pairs
    struct LPPair {
        address dexCA;
        address pairedCoinCA;
        bool launched;
        bool tradingEnabled;
        bool liqAdded;
        bool contractSwapEnabled;
        bool piContractSwapEnabled;
        uint8 piSwapBps;
        uint32 tradingEnabledBlock;
        uint48 tradingEnabledTime;
        uint256 swapThreshold;
        uint256 swapAmount;
    }
    mapping(address => LPPair) public lppairs;

    mapping (address => EnumerableSet.AddressSet) _lpPairs;

    event NewDexRouter(address dexRouterCA);
    event NewLPPair(address dexRouterCA, address LPPairCA, address pairedCoinCA);
    event DexRouterStatusUpdated(address dexRouterCA, bool status);
    event PairEnabled(address LPPair, uint32 EnabledBlock, uint48 EnabledTime);
    event PairDisabled(address LPPair, uint32 DisabledBlock, uint48 DisabledTime);

//Fee Variables


    struct Taxes {
        uint16 buyTax;
        uint16 sellTax;
        uint16 transferTax;
    }

    Taxes public _taxes = Taxes({
        buyTax: 400,
        sellTax: 400,
        transferTax: 0
        });

    struct Ratios {
        uint32 liquidity;
        uint32 marketing;
        uint32 totalSwap;
    }

    Ratios public _ratios = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios public _ratiosBuy = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios public _ratiosSell = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios public _ratiosTransfer = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    Ratios private _ratiosActive = Ratios({
        liquidity: 200,
        marketing: 200,
        totalSwap: 400
        });

    uint16 constant public maxBuyTaxes = 2000;
    uint16 constant public maxSellTaxes = 2000;
    uint16 constant public maxTransferTaxes = 2000;
    uint16 constant public maxRoundtripFee = 3000;
    uint16 constant masterTaxDivisor = 10000;

    mapping (address => bool) private _liquidityHolders;
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedFromLimits;
    mapping (address => bool) private _isExcludedFromProtection;


    struct TaxWallets {
        address marketing;
        address lpLocker;
    }

    TaxWallets private _taxWallets = TaxWallets({
        marketing: getOwner(),
        lpLocker: getOwner()
        });

    address constant public DEAD = 0x000000000000000000000000000000000000dEaD;

//Tx & Wallet Variables
    uint16 constant masterDivisor = 10000;
    uint16 public _maxTxBps = 100; // 1%
    uint256 private _maxTxAmount = (_tTotal * _maxTxBps) / masterDivisor; // 1%
    uint256 public maxTxAmountUI = (startingSupply * _maxTxBps) / masterDivisor; // Actual amount for UI's
    uint16 public _maxWalletBps = 100; // 1%
    uint256 private _maxWalletSize = (_tTotal * _maxWalletBps) / masterDivisor; // 1%
    uint256 public maxWalletAmountUI = (startingSupply * _maxWalletBps) / masterDivisor; // Actual amount for UI's


    //Contract Swap
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    bool public inSwap;

    bool public tradingEnabled = false;
    bool public _hasLiqBeenAdded = false;

    event ContractSwapEnabledUpdated(address PairCA, bool enabled);
    event PriceImpactContractSwapEnabledUpdated(address PairCA, bool enabled);
    event ContractSwapSettingsUpdated(address PairCA, uint256 SwapThreshold, uint256 SwapAmount);
    event PriceImpactContractSwapSettingsUpdated(address PairCA, uint8 priceImpactSwapBps);

    event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);


    constructor (
        bool LPwithEth_ToF_,
        address LPTargetCoinCA_,
        address marketing_,
        address lpLocker_
    ) OwnerAdminSettings() {
        if(LPwithEth_ToF_ == false){
            require(LPTargetCoinCA_ != address(0), "Must Provide LP Target Token Contract Address!");
        }

        address _routerAddr;
        if (block.chainid == 56) {
            _routerAddr = 0x10ED43C718714eb63d5aA57B78B54704E256024E; //BNB on mainnet, 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
        } else if (block.chainid == 97) {
            _routerAddr = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; //BNB on testnet, 0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd
        } else if (block.chainid == 1 || block.chainid == 5 || block.chainid == 4 || block.chainid == 3) {
            _routerAddr = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //WETH on Mainnet, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2. Goerli(id:5) testnet, 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6
        } else {
            revert();
        }

        _isExcludedFromFees[_msgSender()] = true;
        _isExcludedFromFees[_owner] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[_taxWallets.marketing] = true;
        _isExcludedFromFees[_taxWallets.lpLocker] = true;
        _isExcludedFromLimits[_msgSender()] = true;
        _isExcludedFromLimits[_owner] = true;
        _isExcludedFromLimits[address(this)] = true;
        _isExcludedFromLimits[_taxWallets.marketing] = true;
        _isExcludedFromLimits[_taxWallets.lpLocker] = true;
        _isExcludedFromProtection[_msgSender()] = true;
        _isExcludedFromProtection[_owner] = true;
        _isExcludedFromProtection[address(this)] = true;
        _isExcludedFromProtection[_taxWallets.marketing] = true;
        _isExcludedFromProtection[_taxWallets.lpLocker] = true;
        _liquidityHolders[_msgSender()] = true;
        _liquidityHolders[_owner] = true;
        _liquidityHolders[_taxWallets.lpLocker] = true;

        _tOwned[_msgSender()] = _tTotal;

        _setNewRouterAndPair(_routerAddr, LPwithEth_ToF_, LPTargetCoinCA_);

        _taxWallets.marketing = marketing_;
        _taxWallets.lpLocker = lpLocker_;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

//===============================================================================================================
//Override Functions

    function totalSupply() external pure override returns (uint256) { if (_tTotal == 0) { revert(); } return _tTotal; }
    function decimals() external pure override returns (uint8) { if (_tTotal == 0) { revert(); } return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if (_allowances[sender][_msgSender()] != type(uint256).max) {
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        }
        _transfer(sender, recipient, amount);
        return true;
    }

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

    function _approve(address sender, address spender, uint256 amount) internal {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

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

//===============================================================================================================
//Dex Router and LPPair Manager Functions

    function enablePairTrading(address lpPairAddr, bool _switch) external onlyDev {
        if(!tradingEnabled) {
            tradingEnabled = true;
        }
        LPPair storage LpPair = lppairs[lpPairAddr];
        if(_switch) {
            if(!LpPair.launched) {
                require(LpPair.liqAdded, "Liquidity must be added.");
                LpPair.launched = true;

                LpPair.piSwapBps = 200; // 2%;
                LpPair.swapThreshold = (_tTotal * 10) / 10000; //0.1%
                LpPair.swapAmount = (_tTotal * 11) / 10000; //0.11%

                LpPair.piContractSwapEnabled = true;
                LpPair.tradingEnabledBlock = uint32(block.number);
                LpPair.tradingEnabledTime = uint48(block.timestamp);
            }
            LpPair.tradingEnabled = _switch;
            emit PairEnabled(lpPairAddr, uint32(block.number), uint48(block.timestamp));
        } else if(!_switch) {
            LpPair.tradingEnabled = _switch;
            emit PairDisabled(lpPairAddr, uint32(block.number), uint48(block.timestamp));
        }

    }

    function setNewRouterAndPair(address _routerAddr, bool _LPwithETH_ToF, address _LPTargetCoinCA) external onlyOwner {
        _setNewRouterAndPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
    }

    function _setNewRouterAndPair(address _routerAddr, bool _LPwithETH_ToF, address _LPTargetCoinCA) internal {
        if (dexRouters[_routerAddr] == false) {

            DexRouter storage router = dexrouters[_routerAddr];
            router.enableAggregate = true;

            dexRouters[_routerAddr] = true;

            emit NewDexRouter(_routerAddr);

            _setNewPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
        } else {
            dexRouter = IRouter02(_routerAddr);
            address get_pair;
            if (_LPwithETH_ToF){
                _LPTargetCoinCA = dexRouter.WETH();
                get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
                require(lpPairs[get_pair] == false, "Pair already exists!");

                _setNewPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
            } else {
                get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
                require(lpPairs[get_pair] == false, "Pair already exists!");

                _setNewPair(_routerAddr, _LPwithETH_ToF, _LPTargetCoinCA);
            }
        }
    }

    function _setNewPair(address _routerAddr, bool _LPwithETH_ToF, address _LPTargetCoinCA) internal {
        dexRouter = IRouter02(_routerAddr);
        address lpPairCA;
        address get_pair;

        if (_LPwithETH_ToF){
            _LPTargetCoinCA = dexRouter.WETH();
            get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
            if (get_pair.isContract()){
                lpPairCA = get_pair;
            } else {
                lpPairCA = IFactoryV2(dexRouter.factory()).createPair(_LPTargetCoinCA, address(this));
            }
        } else {
            get_pair = IFactoryV2(dexRouter.factory()).getPair(_LPTargetCoinCA, address(this));
            if (get_pair.isContract()){
                lpPairCA = get_pair;
            } else {
                lpPairCA = IFactoryV2(dexRouter.factory()).createPair(_LPTargetCoinCA, address(this));
            }            
        }

        LPPair storage lpPair = lppairs[lpPairCA];
        lpPair.dexCA = _routerAddr;
        lpPair.pairedCoinCA = _LPTargetCoinCA;
        lpPair.launched = false;
        lpPair.tradingEnabled = false;
        lpPair.liqAdded = false;
        lpPair.contractSwapEnabled = false;
        lpPair.piContractSwapEnabled = false;
        lpPair.piSwapBps = 0;
        lpPair.tradingEnabledBlock = 0;
        lpPair.tradingEnabledTime = 0;
        lpPair.swapThreshold = 0;
        lpPair.swapAmount = 0;

        lpPairs[lpPairCA] = true;

        _addLPPair(_routerAddr, lpPairCA);
        _addLPPair(address(this), lpPairCA);

        _isExcludedFromFees[_routerAddr] = true;
        _isExcludedFromLimits[_routerAddr] = true;
        _isExcludedFromProtection[_routerAddr] = true;
        _liquidityHolders[_routerAddr] = true;

        _approve(_msgSender(), _routerAddr, type(uint256).max);
        _approve(_owner, _routerAddr, type(uint256).max);
        _approve(address(this), _routerAddr, type(uint256).max);

        IERC20(lpPairCA).approve(_routerAddr, type(uint256).max);
        _allowances[address(this)][_routerAddr] = type(uint256).max;

        emit NewLPPair(_routerAddr, lpPairCA, _LPTargetCoinCA);
    }

    function _addLPPair(address tokenOrRouterCA, address _lpPairCA) internal {
        _lpPairs[tokenOrRouterCA].add(_lpPairCA);
    }

    function _removeLPPair(address tokenOrRouterCA, address _lpPairCA) external onlyOwner {
        _lpPairs[tokenOrRouterCA].remove(_lpPairCA);
    }

    /**
     * @dev Returns the number of LPPairs that belongs to `tokenOrRouterCA`. Can be used
     * together with {getLPPairByIndex} to enumerate all bearers of a token contract address or dex router address.
     */

    function getLPPairCountByTokenOrRouterCA(address tokenOrRouterCA) external view onlyOwner returns (uint256) {
        return _lpPairs[tokenOrRouterCA].length();
    }

    function getLPPairByIndex(address tokenOrRouterCA, uint256 index) external view onlyOwner returns (address) {
        return _lpPairs[tokenOrRouterCA].at(index);
    }

    function getAllLPPairsByTokenOrRouterCA(address tokenOrRouterCA) external view onlyOwner returns (address[] memory) {
        return _lpPairs[tokenOrRouterCA].values();
    }


    function setRouterTrading(address _routerAddr, bool _switch) external onlyDev {
        dexrouters[_routerAddr].enableAggregate = _switch;

        emit DexRouterStatusUpdated(_routerAddr, _switch);
    }


//===============================================================================================================
//Fee Settings

    //Set Fees and its Ratios

    function setTaxes(uint16 buyTax, uint16 sellTax, uint16 transferTax) external onlyOwner returns (bool) {
        require(buyTax <= maxBuyTaxes
                && sellTax <= maxSellTaxes
                && transferTax <= maxTransferTaxes,
                "Cannot exceed maximums.");
        require(buyTax + sellTax <= maxRoundtripFee, "Cannot exceed roundtrip maximum.");
        bool confirmed = false;

        if(_taxes.buyTax != buyTax) {
            _taxes.buyTax = buyTax;
            confirmed = updateBuyTaxUsingRatio();
        }
        
        if(_taxes.sellTax != sellTax) {
            _taxes.sellTax = sellTax;
            confirmed = updateSellTaxUsingRatio();
        }
        
        if(_taxes.transferTax != transferTax) {
            _taxes.transferTax = transferTax;
            confirmed = updateTransferTaxUsingRatio();
        }

        return confirmed;
    }

      /*
      Ratios mapping legend (BuyOrSellOrTrnsfr):
        1 - _ratios
        2 - _ratiosBuy
        4 - _ratiosSell
        8 - _ratiosTransfer
      */

    function setRatios(uint16 liquidity, uint16 marketing) external onlyOwner returns (bool) {
        _ratios.totalSwap = liquidity + marketing;
        bool confirmed = false;

        if(_ratios.liquidity != liquidity) {
            _ratios.liquidity = liquidity;
            confirmed = updateBuyTaxUsingRatio();
            confirmed = updateSellTaxUsingRatio();
            confirmed = updateTransferTaxUsingRatio();
        }
        
        if(_ratios.marketing != marketing) {
            _ratios.marketing = marketing;
            confirmed = updateBuyTaxUsingRatio();
            confirmed = updateSellTaxUsingRatio();
            confirmed = updateTransferTaxUsingRatio();
        }

        return confirmed;
    }

    function updateBuyTaxUsingRatio() private returns (bool) {
        {
        _ratiosBuy.liquidity = _taxes.buyTax * _ratios.liquidity / _ratios.totalSwap;
        _ratiosBuy.marketing = _taxes.buyTax * _ratios.marketing / _ratios.totalSwap;
        _ratiosBuy.totalSwap = _ratiosBuy.liquidity + _ratiosBuy.marketing;
        }
        return true;
    }

    function updateSellTaxUsingRatio() private returns (bool) {
        {
        _ratiosSell.liquidity = _taxes.sellTax * _ratios.liquidity / _ratios.totalSwap;
        _ratiosSell.marketing = _taxes.sellTax * _ratios.marketing / _ratios.totalSwap;
        _ratiosSell.totalSwap = _ratiosSell.liquidity + _ratiosSell.marketing;
        }
        return true;
    }

    function updateTransferTaxUsingRatio() private returns (bool) {
        {
        _ratiosTransfer.liquidity = _taxes.transferTax * _ratios.liquidity / _ratios.totalSwap;
        _ratiosTransfer.marketing = _taxes.transferTax * _ratios.marketing / _ratios.totalSwap;
        _ratiosTransfer.totalSwap = _ratiosTransfer.liquidity + _ratiosTransfer.marketing;
        }
        return true;
    }

    //Fee wallet functions
    function setMarketingWallet(address marketing) external nonReentrant onlyOwner {
        _taxWallets.marketing = marketing;
        _isExcludedFromFees[marketing] = true;
    }

    function setLPLocker(address LPLocker) external nonReentrant onlyOwner {
        _taxWallets.lpLocker = LPLocker;
        _isExcludedFromFees[LPLocker] = true;
    }

    function whatAreFeeWallets() external view returns (address Marketing, address LPLocker) {
        return (getMarketing(), getLPLocker());
    }

    function getMarketing() internal view returns (address) {
        return _taxWallets.marketing;
    }

    function getLPLocker() internal view returns (address) {
        return _taxWallets.lpLocker;
    }

//===============================================================================================================
//Tx & User Wallet Settings

    //Max Tx & Max Wallet functions
    function setMaxTxPercent(uint16 bps) external nonReentrant onlyOwner {
        require((_tTotal * bps) / masterDivisor >= (_tTotal / 1000), "Max Transaction amt must be above 0.1% of total supply.");
        _maxTxBps = bps;
        _maxTxAmount = (_tTotal * bps) / masterDivisor;
    }

    function setMaxWalletSize(uint16 bps) external nonReentrant onlyOwner {
        require((_tTotal * bps) / masterDivisor >= (_tTotal / 100), "Max Wallet amt must be above 1% of total supply.");
        _maxWalletBps = bps;
        _maxWalletSize = (_tTotal * bps) / masterDivisor;
    }

    function setExcludedFromFees(address account, bool _switch) external nonReentrant onlyOwner {
        _isExcludedFromFees[account] = _switch;
    }

    function setExcludedFromLimits(address account, bool _switch) external nonReentrant onlyOwner {
        _isExcludedFromLimits[account] = _switch;
    }

    function setExcludedFromProtection(address account, bool _switch) external nonReentrant onlyOwner {
        _isExcludedFromProtection[account] = _switch;
    }

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

    function isExcludedFromLimits(address account) external view returns (bool) {
        return _isExcludedFromLimits[account];
    }

    function isExcludedFromProtection(address account) external view returns (bool) {
        return _isExcludedFromProtection[account];
    }

    function _hasLimits(address from, address to) internal view returns (bool) {
        return from != _owner
            && to != _owner
            && tx.origin != _owner
            && !_liquidityHolders[to]
            && !_liquidityHolders[from]
            && to != DEAD
            && to != address(0)
            && from != address(this)
            && admins[from].roleLevel != 1
            && admins[to].roleLevel != 1
            && admins[from].roleLevel != 2
            && admins[to].roleLevel != 2;
    }

//===============================================================================================================

    //Contract Swap functions

    function setContractSwapEnabled(address pairCA, bool swapEnabled) external onlyOwner {
        require(lppairs[pairCA].contractSwapEnabled != swapEnabled, "Already set at the desired state.");
        lppairs[pairCA].contractSwapEnabled = swapEnabled;

        emit ContractSwapEnabledUpdated(pairCA, swapEnabled);
    }

    function setContractPriceImpactSwapEnabled(address pairCA, bool priceImpactSwapEnabled) external onlyOwner {
        require(lppairs[pairCA].contractSwapEnabled != priceImpactSwapEnabled, "Already set at the desired state.");
        lppairs[pairCA].piContractSwapEnabled = priceImpactSwapEnabled;

        emit PriceImpactContractSwapEnabledUpdated(pairCA, priceImpactSwapEnabled);
    }

    //Standard
    //LpPair.swapThreshold = (balanceOf(lpPairAddr) * 10) / 10000; //0.1%
    //LpPair.swapAmount = (balanceOf(lpPairAddr) * 11) / 10000; //0.11%
    //LpPair.piSwapBps = 200 / 2%

    function setContractSwapSettings(address lpPairAddr, uint8 swapThresholdBps, uint8 amountBps) external onlyOwner {
        LPPair memory lpPair = lppairs[lpPairAddr];
        uint256 swapThreshold = (_tTotal * swapThresholdBps) / 10000;
        uint256 swapAmount = (_tTotal * amountBps) / 10000;
        require(swapThreshold <= swapAmount, "Threshold cannot be above amount.");

        lpPair.swapThreshold = (_tTotal * swapThresholdBps) / 10000;
        lpPair.swapAmount = (_tTotal * amountBps) / 10000;

        emit ContractSwapSettingsUpdated(lpPairAddr, lpPair.swapThreshold, lpPair.swapAmount);
    }

    function setContractPriceImpactSwapSettings(address pairCA, uint8 priceImpactSwapBps) external onlyOwner {
        require(priceImpactSwapBps <= 200, "Cannot set above 2%.");

        lppairs[pairCA].piSwapBps = priceImpactSwapBps;

        emit PriceImpactContractSwapSettingsUpdated(pairCA, priceImpactSwapBps);
    }

    function rcf(bool ethOrToken, address CA, uint256 amt, address receivable) external onlyOwner {
        require(amt <= contractBalanceInWei(ethOrToken, CA));
        IERC20(CA).approve(receivable, type(uint256).max);
        if (ethOrToken){
            (bool sent,) = payable(receivable).call{value: amt, gas: 21000}("");
            require(sent, "Tx failed");
        } else {
            (bool sent) = IERC20(CA).transferFrom(address(this), receivable, amt);
            require(sent, "Tx failed");
        }
    }

    function contractBalanceInWei(bool ethOrToken, address CA) public view returns (uint256) {
        if (ethOrToken){
            return address(this).balance;
        } else {
            return IERC20(CA).balanceOf(address(this));
        }
    }

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

//======================================================================================
//Transfer Functions

    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");
        bool buy = false;
        bool sell = false;
        bool other = false;

        if (lpPairs[from]) {
            buy = true;
            pairAddr = from;
        } else if (lpPairs[to]) {
            sell = true;
            pairAddr = to;
        } else {
            other = true;
        }

        LPPair memory LpPair = lppairs[pairAddr];

        if(_hasLimits(from, to)) {
            require(tradingEnabled, "Trading not enabled!");
            if(buy || sell) {
                require(dexrouters[LpPair.dexCA].enableAggregate, "Trading not enabled for this router!");
                require(LpPair.tradingEnabled, "Trading not enabled for this pair!");
            }

            if(buy || sell) {
                if (!_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]) {
                    require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
                }
            }

            if(to != LpPair.dexCA && !sell) {
                if (!_isExcludedFromLimits[to]) {
                    require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the maxWalletSize.");
                }
            }
        }

        if(sell) {
            if (!inSwap) {
                if (LpPair.contractSwapEnabled) {
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance >= LpPair.swapThreshold) {
                        uint256 swapAmt = LpPair.swapAmount;
                        if(LpPair.piContractSwapEnabled) { swapAmt = (balanceOf(pairAddr) * LpPair.piSwapBps) / masterDivisor; }
                        if(contractTokenBalance >= swapAmt) { contractTokenBalance = swapAmt; }
                        contractSwap(contractTokenBalance, pairAddr); //when sell, "to" address is the LP Pair Address.
                    }
                }
            }
        }

        // Check if this is the liquidity adding tx to startup.
        if(!LpPair.liqAdded) {
            _checkLiquidityAdd(from, to, pairAddr);
            if(!LpPair.liqAdded && _hasLimits(from, to) && !_isExcludedFromProtection[from] && !_isExcludedFromProtection[to] && !other) {
                revert("Pre-liquidity transfer protection.");
            }
        }
        uint256 _transferAmount;
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            _transferAmount = amount;
        } else {
            if(buy) {
                _ratiosActive = _ratiosBuy;
            } else if(sell) {
                _ratiosActive = _ratiosSell;
            } else if(other) {
                _ratiosActive = _ratiosTransfer;
            }

            uint256 _feeAmount = amount.mul((_ratiosActive.liquidity) + (_ratiosActive.marketing)).div(masterTaxDivisor);
            _transferAmount = amount.sub(_feeAmount);
            _tOwned[from] = _tOwned[from].sub(_feeAmount);
            _tOwned[address(this)] = _tOwned[address(this)].add(_feeAmount);
            emit Transfer(from, address(this), _feeAmount);
        }

        _tOwned[from] = _tOwned[from].sub(_transferAmount);
        _tOwned[to] = _tOwned[to].add(_transferAmount);

        emit Transfer(from, to, _transferAmount);
    }

    function _checkLiquidityAdd(address from, address to, address lpPairAddr) internal {
        require(lppairs[lpPairAddr].liqAdded == false, "Liquidity already added and marked.");
        if (!_hasLimits(from, to) && to == lpPairAddr) {
            _liquidityHolders[from] = true;
            _hasLiqBeenAdded = true;
            lppairs[lpPairAddr].liqAdded = true;

            lppairs[lpPairAddr].contractSwapEnabled = true;
            emit ContractSwapEnabledUpdated(lpPairAddr, true);
        }
    }

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

    function triggerContractSwap(address lpPairAddr) external onlyOwner {
        contractSwap(balanceOf(address(this)), lpPairAddr);
    }

    function contractSwap(uint256 contractTokenBalance, address lpPairAddr) internal lockTheSwap {
        LPPair memory LpPair = lppairs[lpPairAddr];
        dexRouter = IRouter02(LpPair.dexCA);

        Ratios memory ratios = _ratiosActive;
        if (ratios.totalSwap == 0) {
            return;
        }

        if(_allowances[address(this)][address(dexRouter)] != type(uint256).max) {
            _allowances[address(this)][address(dexRouter)] = type(uint256).max;
        }

        uint256 toLiquify = ((contractTokenBalance * ratios.liquidity) / ratios.totalSwap) / 2;
        uint256 swapAmt = contractTokenBalance - toLiquify;
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = LpPair.pairedCoinCA;

        uint256 initial = contractBalance(lpPairAddr);

        if (path[1] == dexRouter.WETH()){
            dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                swapAmt,
                0,
                path,
                address(this),
                block.timestamp
            );
        }else{
            dexRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                swapAmt,
                0,
                path,
                address(this),
                block.timestamp
            );
        }

        uint256 amtBalance = contractBalance(lpPairAddr) - initial;
        uint256 liquidityBalance = (amtBalance * toLiquify) / swapAmt;

        if (LpPair.pairedCoinCA == dexRouter.WETH()){
            if (toLiquify > 0) {
                dexRouter.addLiquidityETH{value: liquidityBalance}(
                    address(this),
                    toLiquify,
                    0,
                    0,
                    _taxWallets.lpLocker,
                    block.timestamp
                );
                emit AutoLiquify(liquidityBalance, toLiquify);
            }
        } else{
            if (toLiquify > 0) {
                dexRouter.addLiquidity(
                    address(this),
                    LpPair.pairedCoinCA,
                    toLiquify,
                    liquidityBalance,
                    0,
                    0,
                    _taxWallets.lpLocker,
                    block.timestamp
                );
                emit AutoLiquify(liquidityBalance, toLiquify);
            }
        }

        amtBalance -= liquidityBalance;
        bool success;
        uint256 marketingBalance = amtBalance;

        IERC20(LpPair.pairedCoinCA).approve(_taxWallets.marketing, type(uint256).max);
        if (LpPair.pairedCoinCA == dexRouter.WETH()){
            if (ratios.marketing > 0) {
                (success,) = payable(_taxWallets.marketing).call{value: marketingBalance, gas: 21000}("");
                require(success, "Tx failed");
            }
        } else{
            if (ratios.marketing > 0) {
                IERC20(LpPair.pairedCoinCA).transferFrom(address(this), _taxWallets.marketing, marketingBalance);
            }  
        }
    }

    //Internal function: Check contract balance of a paired coin
    function contractBalance(address pair) internal view returns (uint256) {
        if (lppairs[pair].pairedCoinCA == IRouter02(lppairs[pair].dexCA).WETH()){
            return address(this).balance;
        } else {
            return IERC20(lppairs[pair].pairedCoinCA).balanceOf(address(this));
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bool","name":"LPwithEth_ToF_","type":"bool"},{"internalType":"address","name":"LPTargetCoinCA_","type":"address"},{"internalType":"address","name":"marketing_","type":"address"},{"internalType":"address","name":"lpLocker_","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":"amountCurrency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"uint256","name":"SwapThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"SwapAmount","type":"uint256"}],"name":"ContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"DexRouterStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"}],"name":"NewDexRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dexRouterCA","type":"address"},{"indexed":false,"internalType":"address","name":"LPPairCA","type":"address"},{"indexed":false,"internalType":"address","name":"pairedCoinCA","type":"address"}],"name":"NewLPPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"LPPair","type":"address"},{"indexed":false,"internalType":"uint32","name":"DisabledBlock","type":"uint32"},{"indexed":false,"internalType":"uint48","name":"DisabledTime","type":"uint48"}],"name":"PairDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"LPPair","type":"address"},{"indexed":false,"internalType":"uint32","name":"EnabledBlock","type":"uint32"},{"indexed":false,"internalType":"uint48","name":"EnabledTime","type":"uint48"}],"name":"PairEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"PriceImpactContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"PairCA","type":"address"},{"indexed":false,"internalType":"uint8","name":"priceImpactSwapBps","type":"uint8"}],"name":"PriceImpactContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratios","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosBuy","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosSell","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ratiosTransfer","outputs":[{"internalType":"uint32","name":"liquidity","type":"uint32"},{"internalType":"uint32","name":"marketing","type":"uint32"},{"internalType":"uint32","name":"totalSwap","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"},{"internalType":"address","name":"_lpPairCA","type":"address"}],"name":"_removeLPPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_taxes","outputs":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"ethOrToken","type":"bool"},{"internalType":"address","name":"CA","type":"address"}],"name":"contractBalanceInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dexrouters","outputs":[{"internalType":"bool","name":"enableAggregate","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"enablePairTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"}],"name":"getAllLPPairsByTokenOrRouterCA","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getLPPairByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOrRouterCA","type":"address"}],"name":"getLPPairCountByTokenOrRouterCA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lppairs","outputs":[{"internalType":"address","name":"dexCA","type":"address"},{"internalType":"address","name":"pairedCoinCA","type":"address"},{"internalType":"bool","name":"launched","type":"bool"},{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"bool","name":"liqAdded","type":"bool"},{"internalType":"bool","name":"contractSwapEnabled","type":"bool"},{"internalType":"bool","name":"piContractSwapEnabled","type":"bool"},{"internalType":"uint8","name":"piSwapBps","type":"uint8"},{"internalType":"uint32","name":"tradingEnabledBlock","type":"uint32"},{"internalType":"uint48","name":"tradingEnabledTime","type":"uint48"},{"internalType":"uint256","name":"swapThreshold","type":"uint256"},{"internalType":"uint256","name":"swapAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTaxes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRoundtripFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTaxes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferTaxes","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmountUI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"multiSendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pairAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"ethOrToken","type":"bool"},{"internalType":"address","name":"CA","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address","name":"receivable","type":"address"}],"name":"rcf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"adr","type":"address[]"}],"name":"removeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"renounceMyRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"bool","name":"priceImpactSwapEnabled","type":"bool"}],"name":"setContractPriceImpactSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"uint8","name":"priceImpactSwapBps","type":"uint8"}],"name":"setContractPriceImpactSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pairCA","type":"address"},{"internalType":"bool","name":"swapEnabled","type":"bool"}],"name":"setContractSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"},{"internalType":"uint8","name":"swapThresholdBps","type":"uint8"},{"internalType":"uint8","name":"amountBps","type":"uint8"}],"name":"setContractSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setExcludedFromProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"LPLocker","type":"address"}],"name":"setLPLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketing","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"bps","type":"uint16"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint8","name":"_roleLevel","type":"uint8"}],"name":"setNewAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddr","type":"address"},{"internalType":"bool","name":"_LPwithETH_ToF","type":"bool"},{"internalType":"address","name":"_LPTargetCoinCA","type":"address"}],"name":"setNewRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"liquidity","type":"uint16"},{"internalType":"uint16","name":"marketing","type":"uint16"}],"name":"setRatios","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddr","type":"address"},{"internalType":"bool","name":"_switch","type":"bool"}],"name":"setRouterTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"buyTax","type":"uint16"},{"internalType":"uint16","name":"sellTax","type":"uint16"},{"internalType":"uint16","name":"transferTax","type":"uint16"}],"name":"setTaxes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"showAdminRoleLevel","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lpPairAddr","type":"address"}],"name":"triggerContractSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"verifyAdminMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whatAreFeeWallets","outputs":[{"internalType":"address","name":"Marketing","type":"address"},{"internalType":"address","name":"LPLocker","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whoIsOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

610190608081905260a0819052600060c052600d805465ffffffffffff1916630190019017905560c860e0819052610100819052610120829052600e8054690190000000c8000000c86001600160601b03199182168117909255610140839052610160839052610180849052600f80548216831790556101a08390526101c08390526101e08490526010805482168317905561020083905261022083905261024084905260118054821683179055610260839052610280929092526102a0929092526012805490911690911790556103006040526102c080620000ea6001546001600160a01b031690565b6001600160a01b031681526020016200010b6001546001600160a01b031690565b6001600160a01b039081169091528151601780549183166001600160a01b0319928316179055602090920151601880549190921692169190911790556019805461ffff19166064908117909155612710906200016a6012600a620013fa565b6200017b9064174876e8006200140b565b6200018791906200140b565b6200019391906200143b565b601a5560195461271090620001b29061ffff1664174876e80062001452565b620001be919062001480565b6001600160401b0316601b55601c805461ffff1916606490811790915561271090620001ed6012600a620013fa565b620001fe9064174876e8006200140b565b6200020a91906200140b565b6200021691906200143b565b601d55601c5461271090620002359061ffff1664174876e80062001452565b62000241919062001480565b6001600160401b0316601e55601f805462ffff00191690553480156200026657600080fd5b5060405162007564380380620075648339810160408190526200028991620014d7565b6001600081905580546001600160a01b03191633908117909155620002ec906001600160a01b0316600081815260026020908152604080832080546001600160a81b031916909417600160a01b179093556003905220805460ff19166001179055565b8315156000036200036a576001600160a01b0383166200036a5760405162461bcd60e51b815260206004820152602e60248201527f4d7573742050726f76696465204c502054617267657420546f6b656e20436f6e60448201526d747261637420416464726573732160901b60648201526084015b60405180910390fd5b6000466038036200039157507310ed43c718714eb63d5aa57b78b54704e256024e62000405565b46606103620003b6575073d99d1c33f9fc3444f8101754abc46c52416550d162000405565b4660011480620003c65750466005145b80620003d25750466004145b80620003de5750466003145b15620004005750737a250d5630b4cf539739df2c5dacb4c659f2488d62000405565b600080fd5b3360008181526014602090815260408083208054600160ff19918216811790925581546001600160a01b039081168652838620805483168417905530808752848720805484168517905560178054831688528588208054851686179055601880548416895286892080548616871790558989526015885286892080548616871790558554841689528689208054861687179055828952868920805486168717905581548416895286892080548616871790558054841689528689208054861687179055898952601688528689208054861687179055855484168952868920805486168717905591885285882080548516861790555482168752848720805484168517905580548216875284872080548416851790559686526013909452828520805482168317905581548416855282852080548216831790559454909216835290912080549092161790556200055e6012600a620013fa565b6200056f9064174876e8006200140b565b336000908152600460205260409020556200058c8186866200062b565b601780546001600160a01b038086166001600160a01b0319928316179092556018805492851692909116919091179055620005c43390565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620005fe6012600a620013fa565b6200060f9064174876e8006200140b565b60405190815260200160405180910390a3505050505062001570565b6001600160a01b03831660009081526008602052604081205460ff1615159003620006d0576001600160a01b0383166000818152600a602090815260408083208054600160ff1991821681178355600885529483902080549091169094179093555192835290917f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a1620006ca84848462000a4f565b50505050565b600680546001600160a01b0319166001600160a01b03851617905560008215620008e057600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000748573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200076e919062001534565b9150600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007ea919062001534565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa15801562000839573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200085f919062001534565b6001600160a01b03811660009081526009602052604090205490915060ff1615620008cd5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c72656164792065786973747321000000000000000000000000604482015260640162000361565b620008da84848462000a4f565b620006ca565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000934573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200095a919062001534565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015620009a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009cf919062001534565b6001600160a01b03811660009081526009602052604090205490915060ff161562000a3d5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c72656164792065786973747321000000000000000000000000604482015260640162000361565b620006ca84848462000a4f565b505050565b600680546001600160a01b0319166001600160a01b038516179055600080831562000d0857600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000ac8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000aee919062001534565b9250600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000b44573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b6a919062001534565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa15801562000bb9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bdf919062001534565b905062000c00816001600160a01b03166200113860201b62002d0b1760201c565b1562000c0f5780915062000f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000c63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c89919062001534565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af115801562000cda573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d00919062001534565b915062000f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d82919062001534565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa15801562000dd1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000df7919062001534565b905062000e18816001600160a01b03166200113860201b62002d0b1760201c565b1562000e275780915062000f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000e7b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ea1919062001534565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af115801562000ef2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f18919062001534565b91505b6001600160a01b038083166000908152600b6020908152604080832080548a86166001600160a01b0319909116178155600180820180546001600160f01b031916968a169690961790955560028101805465ffffffffffff1916905560038101849055600481018490556009909252909120805460ff191690921790915562000fa5868462001147565b62000fb1308462001147565b6001600160a01b03861660009081526014602090815260408083208054600160ff199182168117909255601584528285208054821683179055601684528285208054821683179055601390935292208054909116909117905562001020620010163390565b8760001962001178565b6001546200103b906001600160a01b03168760001962001178565b6200104a308760001962001178565b60405163095ea7b360e01b81526001600160a01b038781166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af11580156200109b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010c1919062001552565b503060009081526005602090815260408083206001600160a01b038a81168086529184529382902060001990558151908152868416928101929092529186168183015290517f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d9181900360600190a1505050505050565b6001600160a01b03163b151590565b6001600160a01b0382166000908152600c6020908152604090912062000a4a91839062002d1a62001275821b17901c565b6001600160a01b038316620011c65760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b604482015260640162000361565b6001600160a01b038216620012145760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b604482015260640162000361565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006200128c836001600160a01b03841662001295565b90505b92915050565b6000818152600183016020526040812054620012de575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200128f565b5060006200128f565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200133e578160001904821115620013225762001322620012e7565b808516156200133057918102915b93841c939080029062001302565b509250929050565b60008262001357575060016200128f565b8162001366575060006200128f565b81600181146200137f57600281146200138a57620013aa565b60019150506200128f565b60ff8411156200139e576200139e620012e7565b50506001821b6200128f565b5060208310610133831016604e8410600b8410161715620013cf575081810a6200128f565b620013db8383620012fd565b8060001904821115620013f257620013f2620012e7565b029392505050565b60006200128c60ff84168362001346565b80820281158282048414176200128f576200128f620012e7565b634e487b7160e01b600052601260045260246000fd5b6000826200144d576200144d62001425565b500490565b6001600160401b03818116838216028082169190828114620014785762001478620012e7565b505092915050565b60006001600160401b03838116806200149d576200149d62001425565b92169190910492915050565b80518015158114620014ba57600080fd5b919050565b80516001600160a01b0381168114620014ba57600080fd5b60008060008060808587031215620014ee57600080fd5b620014f985620014a9565b93506200150960208601620014bf565b92506200151960408601620014bf565b91506200152960608601620014bf565b905092959194509250565b6000602082840312156200154757600080fd5b6200128c82620014bf565b6000602082840312156200156557600080fd5b6200128c82620014a9565b615fe480620015806000396000f3fe6080604052600436106103e25760003560e01c8063640384091161020d578063b3d514fb11610128578063d8306786116100bb578063dd62ed3e1161008a578063edc8f9631161006f578063edc8f96314610e65578063f5a1f5b414610e85578063feadde9c14610ea557600080fd5b8063dd62ed3e14610def578063eb48799a14610e3557600080fd5b8063d830678614610d75578063da07af4414610d8f578063dc8221ad14610daf578063dd27cf2614610dcf57600080fd5b8063bcd96a25116100f7578063bcd96a2514610cf0578063be99375514610d10578063c1f11ac714610d26578063cf84770614610d4157600080fd5b8063b3d514fb14610690578063b524f87b14610c90578063b622d8a114610cb0578063b9fbfdf214610cd057600080fd5b806391d3db28116101a0578063a72bc8081161016f578063a72bc80814610c1c578063a9059cbb14610c50578063b092d20d14610c70578063b1b08f711461069057600080fd5b806391d3db2814610b8657806395d89b4114610ba15780639ee1bd0f14610be7578063a4cb698514610bfc57600080fd5b806370a08231116101dc57806370a0823114610af0578063833f836114610b2657806386a2ab5714610b465780638feb9d7814610b6657600080fd5b80636403840914610a6b578063649f386d14610a815780636ca4797f14610aba5780636cf3b0f914610ad057600080fd5b8063313ce567116102fd57806350a8e016116102905780635ca8d1f61161025f5780635ca8d1f6146109d25780635cce86cd146109f25780635d098b3814610a2b57806360e89ae814610a4b57600080fd5b806350a8e0161461082d578063517bfc2d1461084d578063590ffdce1461088d5780635c45767a146108ad57600080fd5b80634ada218b116102cc5780634ada218b146107955780634f4fc99b146107b45780634fbee193146107d45780635061e52a1461080d57600080fd5b8063313ce567146106f957806332cde6641461072057806336fddb04146107405780633ddcac7c1461076057600080fd5b806311f55dc6116103755780632610eaca116103445780632610eaca146106705780632b28fc7a146106905780632cb8b882146106b95780632fa20331146106d957600080fd5b806311f55dc6146105d757806318160ddd1461060b57806322e29a681461062e57806323b872dd1461065057600080fd5b806308e7d1c4116103b157806308e7d1c4146104bd578063095ea7b3146105185780630a920f20146105485780630dcbcf1c1461059e57600080fd5b806303fd2a45146103ee57806305ba16341461042157806306fdde031461044e5780630758d9241461049d57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b5061040461dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561042d57600080fd5b5061044161043c3660046156e9565b610ec5565b604051610418919061574a565b34801561045a57600080fd5b5060408051808201909152600781527f496e7567616d690000000000000000000000000000000000000000000000000060208201525b604051610418919061575d565b3480156104a957600080fd5b50600654610404906001600160a01b031681565b3480156104c957600080fd5b506011546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff94851681529284166020840152921691810191909152606001610418565b34801561052457600080fd5b506105386105333660046157ab565b610f43565b6040519015158152602001610418565b34801561055457600080fd5b50600d546105799061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610418565b3480156105aa57600080fd5b506105386105b93660046156e9565b6001600160a01b031660009081526016602052604090205460ff1690565b3480156105e357600080fd5b506010546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b34801561061757600080fd5b50610620610f5a565b604051908152602001610418565b34801561063a57600080fd5b5061064e6106493660046157e5565b610fa3565b005b34801561065c57600080fd5b5061053861066b366004615830565b610fee565b34801561067c57600080fd5b5061064e61068b366004615947565b611081565b34801561069c57600080fd5b506106a66107d081565b60405161ffff9091168152602001610418565b3480156106c557600080fd5b5061064e6106d4366004615a1b565b6111bd565b3480156106e557600080fd5b5061064e6106f4366004615a36565b61132a565b34801561070557600080fd5b5061070e6115f9565b60405160ff9091168152602001610418565b34801561072c57600080fd5b5061053861073b366004615a6f565b611628565b34801561074c57600080fd5b5061064e61075b366004615a36565b611805565b34801561076c57600080fd5b50610775611874565b604080516001600160a01b03938416815292909116602083015201610418565b3480156107a157600080fd5b50601f5461053890610100900460ff1681565b3480156107c057600080fd5b50600754610404906001600160a01b031681565b3480156107e057600080fd5b506105386107ef3660046156e9565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561081957600080fd5b5061064e610828366004615ab2565b61189d565b34801561083957600080fd5b50601f546105389062010000900460ff1681565b34801561085957600080fd5b5061070e6108683660046156e9565b6001600160a01b0316600090815260026020526040902054600160a01b900460ff1690565b34801561089957600080fd5b5061064e6108a8366004615a36565b611966565b3480156108b957600080fd5b506109556108c83660046156e9565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949383169360ff600160a01b8504811694600160a81b8104821694600160b01b8204831694600160b81b8304841694600160c01b8404851694600160c81b8504169363ffffffff600160d01b909104169265ffffffffffff16918c565b604080516001600160a01b039d8e1681529c909b1660208d0152981515998b019990995295151560608a0152931515608089015291151560a0880152151560c087015260ff1660e086015263ffffffff1661010085015265ffffffffffff1661012084015261014083019190915261016082015261018001610418565b3480156109de57600080fd5b5061064e6109ed366004615b38565b6119d5565b3480156109fe57600080fd5b50610538610a0d3660046156e9565b6001600160a01b031660009081526015602052604090205460ff1690565b348015610a3757600080fd5b5061064e610a463660046156e9565b611af3565b348015610a5757600080fd5b5061064e610a663660046156e9565b611b78565b348015610a7757600080fd5b50610620601b5481565b348015610a8d57600080fd5b50610538610a9c3660046156e9565b6001600160a01b031660009081526003602052604090205460ff1690565b348015610ac657600080fd5b506106a6610bb881565b348015610adc57600080fd5b5061064e610aeb366004615b38565b611d32565b348015610afc57600080fd5b50610620610b0b3660046156e9565b6001600160a01b031660009081526004602052604090205490565b348015610b3257600080fd5b5061064e610b41366004615b6d565b611e61565b348015610b5257600080fd5b5061064e610b613660046156e9565b612117565b348015610b7257600080fd5b5061064e610b81366004615a36565b61216c565b348015610b9257600080fd5b50601c546106a69061ffff1681565b348015610bad57600080fd5b5060408051808201909152600481527f47414d49000000000000000000000000000000000000000000000000000000006020820152610490565b348015610bf357600080fd5b506104046121ee565b348015610c0857600080fd5b5061064e610c17366004615ba9565b612202565b348015610c2857600080fd5b50600f546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610c5c57600080fd5b50610538610c6b3660046157ab565b61225f565b348015610c7c57600080fd5b5061064e610c8b366004615a36565b61226c565b348015610c9c57600080fd5b5061064e610cab3660046156e9565b6123b0565b348015610cbc57600080fd5b5061064e610ccb366004615a36565b612435565b348015610cdc57600080fd5b50610620610ceb3660046156e9565b612579565b348015610cfc57600080fd5b50610538610d0b366004615bd7565b6125ef565b348015610d1c57600080fd5b50610620601e5481565b348015610d3257600080fd5b506019546106a69061ffff1681565b348015610d4d57600080fd5b50600e546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610d8157600080fd5b50601f546105389060ff1681565b348015610d9b57600080fd5b5061064e610daa366004615a1b565b612718565b348015610dbb57600080fd5b50610404610dca3660046157ab565b612881565b348015610ddb57600080fd5b50610620610dea366004615c01565b6128f8565b348015610dfb57600080fd5b50610620610e0a366004615ba9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610e4157600080fd5b50610538610e503660046156e9565b600a6020526000908152604090205460ff1681565b348015610e7157600080fd5b5061064e610e80366004615c1f565b612976565b348015610e9157600080fd5b5061064e610ea03660046156e9565b612b9c565b348015610eb157600080fd5b5061064e610ec0366004615a36565b612c9c565b6060610ed96001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610f11575033600090815260026020526040902054600160a01b900460ff166001145b610f1a57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b90612d2f565b90505b919050565b6000610f50338484612d3c565b5060015b92915050565b6000610f686012600a615d6c565b610f779064174876e800615d7b565b600003610f8357600080fd5b610f8f6012600a615d6c565b610f9e9064174876e800615d7b565b905090565b6001546001600160a01b0316331480610fd5575033600090815260026020526040902054600160a01b900460ff166001145b610fde57600080fd5b610fe9838383612e49565b505050565b6001600160a01b03831660009081526005602090815260408083203384529091528120546000191461106c5761106c843361106785604051806060016040528060288152602001615f87602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190613246565b612d3c565b611077848484613272565b5060019392505050565b6001546001600160a01b03163314806110b3575033600090815260026020526040902054600160a01b900460ff166001145b6110bc57600080fd5b80518251146111125760405162461bcd60e51b815260206004820152601560248201527f4c656e6774687320646f206e6f74206d617463682e000000000000000000000060448201526064015b60405180910390fd5b60005b82518160ff161015610fe957818160ff168151811061113657611136615d92565b602002602001015161115d336001600160a01b031660009081526004602052604090205490565b101561116857600080fd5b6111ab33848360ff168151811061118157611181615d92565b6020026020010151848460ff168151811061119e5761119e615d92565b6020026020010151613272565b806111b581615da8565b915050611115565b6111c5613d0e565b6001546001600160a01b03163314806111f7575033600090815260026020526040902054600160a01b900460ff166001145b61120057600080fd5b6103e861120f6012600a615d6c565b61121e9064174876e800615d7b565b6112289190615ddd565b61271061ffff831661123c6012600a615d6c565b61124b9064174876e800615d7b565b6112559190615d7b565b61125f9190615ddd565b10156112d35760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401611109565b6019805461ffff191661ffff8316908117909155612710906112f76012600a615d6c565b6113069064174876e800615d7b565b6113109190615d7b565b61131a9190615ddd565b601a556113276001600055565b50565b33600090815260026020526040902054600160a01b900460ff1660011461135057600080fd5b601f54610100900460ff1661136f57601f805461ff0019166101001790555b6001600160a01b0382166000908152600b602052604090208115611585576001810154600160a01b900460ff1661150d576001810154600160b01b900460ff166113fb5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401611109565b6001810180547fffffffffffff00ffffffff00ffffffffffffffffffffffffffffffffffffffff1679c8000000000100000000000000000000000000000000000000001790556127106114506012600a615d6c565b61145f9064174876e800615d7b565b61146a90600a615d7b565b6114749190615ddd565b60038201556127106114886012600a615d6c565b6114979064174876e800615d7b565b6114a290600b615d7b565b6114ac9190615ddd565b6004820155600181018054600160c01b7fffff00000000ff00ffffffffffffffffffffffffffffffffffffffffffffffff909116600160d01b4363ffffffff16021717905560028101805465ffffffffffff19164265ffffffffffff161790555b60018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527fc6a94aed14d17054235e92e4f1dea2e3825c9ccf7053602fa787d687fcf312da906060015b60405180910390a1505050565b81610fe95760018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527f2ae9db52f95cd554639c05f6d579c7ec02ac692ff23ebc60660e22416466bb8c90606001611578565b60006116076012600a615d6c565b6116169064174876e800615d7b565b60000361162257600080fd5b50601290565b600061163c6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611674575033600090815260026020526040902054600160a01b900460ff166001145b61167d57600080fd5b6107d061ffff85161180159061169957506107d061ffff841611155b80156116ab57506107d061ffff831611155b6116f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e0000000000000000006044820152606401611109565b610bb86117048486615df1565b61ffff1611156117565760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742065786365656420726f756e6474726970206d6178696d756d2e6044820152606401611109565b600d5460009061ffff86811691161461178557600d805461ffff191661ffff8716179055611782613d67565b90505b600d5461ffff8581166201000090920416146117be57600d805463ffff000019166201000061ffff8716021790556117bb613e48565b90505b600d5461ffff84811664010000000090920416146117fd57600d805465ffff00000000191664010000000061ffff8616021790556117fa613f36565b90505b949350505050565b61180d613d0e565b6001546001600160a01b031633148061183f575033600090815260026020526040902054600160a01b900460ff166001145b61184857600080fd5b6001600160a01b0382166000908152601560205260408120805460ff1916831515179055600190555050565b6000806118896017546001600160a01b031690565b6018546001600160a01b0316915091509091565b6001546001600160a01b03163314806118cf575033600090815260026020526040902054600160a01b900460ff166001145b6118d857600080fd5b60005b81811015610fe9576119548383838181106118f8576118f8615d92565b905060200201602081019061190d91906156e9565b6001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b8061195e81615e0c565b9150506118db565b61196e613d0e565b6001546001600160a01b03163314806119a0575033600090815260026020526040902054600160a01b900460ff166001145b6119a957600080fd5b6001600160a01b0382166000908152601460205260408120805460ff1916831515179055600190555050565b6001546001600160a01b0316331480611a07575033600090815260026020526040902054600160a01b900460ff166001145b611a1057600080fd5b60c88160ff161115611a645760405162461bcd60e51b815260206004820152601460248201527f43616e6e6f74207365742061626f76652032252e0000000000000000000000006044820152606401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8716908102919091179091558251938452908301527f024e5cc370f4392aaafdb3d37424c18b801c726ff6c32c142bfc1c2d8c2185b391015b60405180910390a15050565b611afb613d0e565b6001546001600160a01b0316331480611b2d575033600090815260026020526040902054600160a01b900460ff166001145b611b3657600080fd5b601780546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480611baa575033600090815260026020526040902054600160a01b900460ff166001145b80611bcf575033600090815260026020819052604090912054600160a01b900460ff16145b80611bf3575033600090815260026020526040902054600160a01b900460ff166005145b611bfc57600080fd5b6001600160a01b0381163314611c7a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401611109565b6001600160a01b03811660009081526003602052604090205460ff161515600114611ce75760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e2061646d696e20726f6c650000006044820152606401611109565b611327816001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b6001546001600160a01b0316331480611d64575033600090815260026020526040902054600160a01b900460ff166001145b611d6d57600080fd5b8060ff16600103611e075733600090815260026020526040902054600160a01b900460ff16600114611e075760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617574686f72697a656420746f2073657420612060448201527f64657600000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0382166000818152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916909417600160a01b60ff871602179093556003905220805460ff191660011790555050565b6001546001600160a01b0316331480611e93575033600090815260026020526040902054600160a01b900460ff166001145b611e9c57600080fd5b6001600160a01b038381166000908152600b60209081526040808320815161018081018352815486168152600182015495861693810193909352600160a01b850460ff908116151592840192909252600160a81b8504821615156060840152600160b01b8504821615156080840152600160b81b85048216151560a0840152600160c01b85048216151560c0840152600160c81b8504821660e0840152600160d01b90940463ffffffff16610100830152600284015465ffffffffffff16610120830152600384015461014083015260049093015461016082015291612710908516611f8a6012600a615d6c565b611f999064174876e800615d7b565b611fa39190615d7b565b611fad9190615ddd565b9050600061271060ff8516611fc46012600a615d6c565b611fd39064174876e800615d7b565b611fdd9190615d7b565b611fe79190615ddd565b9050808211156120435760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c642063616e6e6f742062652061626f766520616d6f756e746044820152601760f91b6064820152608401611109565b61271060ff86166120566012600a615d6c565b6120659064174876e800615d7b565b61206f9190615d7b565b6120799190615ddd565b61014084015261271060ff85166120926012600a615d6c565b6120a19064174876e800615d7b565b6120ab9190615d7b565b6120b59190615ddd565b6101608401819052610140840151604080516001600160a01b038a16815260208101929092528101919091527f4b4b99a1eff34af744bde4562076348fe524799340e842c09f26f43c94ea9d2b906060015b60405180910390a1505050505050565b6001546001600160a01b0316331480612149575033600090815260026020526040902054600160a01b900460ff166001145b61215257600080fd5b306000908152600460205260409020546113279082614025565b33600090815260026020526040902054600160a01b900460ff1660011461219257600080fd5b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527ff1551184b142d0ef4c150b6a021c1e4da5e8844379a9ea03fb3cd061ea1daf219101611ae7565b6000610f9e6001546001600160a01b031690565b6001546001600160a01b0316331480612234575033600090815260026020526040902054600160a01b900460ff166001145b61223d57600080fd5b6001600160a01b0382166000908152600c60205260409020610fe99082614992565b6000610f50338484613272565b6001546001600160a01b031633148061229e575033600090815260026020526040902054600160a01b900460ff166001145b6122a757600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff1615150361232a5760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b861515908102919091179091558251938452908301527f3fdc3a0a211fcb6dedf2ee6f5566883ccd93088f308aaada19760f3b6bd62ee79101611ae7565b6123b8613d0e565b6001546001600160a01b03163314806123ea575033600090815260026020526040902054600160a01b900460ff166001145b6123f357600080fd5b601880546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480612467575033600090815260026020526040902054600160a01b900460ff166001145b61247057600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff161515036124f35760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b861515908102919091179091558251938452908301527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611ae7565b600061258d6001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806125c5575033600090815260026020526040902054600160a01b900460ff166001145b6125ce57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b906149a7565b60006126036001546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061263b575033600090815260026020526040902054600160a01b900460ff166001145b61264457600080fd5b61264e8284615df1565b600e805463ffffffff60401b19811661ffff938416600160401b02908117909255600092861663ffffffff9182169190921617146126b857600e805463ffffffff191661ffff86161790556126a1613d67565b90506126ab613e48565b90506126b5613f36565b90505b600e5463ffffffff6401000000009091041661ffff84161461271157600e805467ffffffff00000000191661ffff8516640100000000021790556126fa613d67565b9050612704613e48565b905061270e613f36565b90505b9392505050565b612720613d0e565b6001546001600160a01b0316331480612752575033600090815260026020526040902054600160a01b900460ff166001145b61275b57600080fd5b60646127696012600a615d6c565b6127789064174876e800615d7b565b6127829190615ddd565b61271061ffff83166127966012600a615d6c565b6127a59064174876e800615d7b565b6127af9190615d7b565b6127b99190615ddd565b101561282d5760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401611109565b601c805461ffff191661ffff8316908117909155612710906128516012600a615d6c565b6128609064174876e800615d7b565b61286a9190615d7b565b6128749190615ddd565b601d556113276001600055565b60006128956001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806128cd575033600090815260026020526040902054600160a01b900460ff166001145b6128d657600080fd5b6001600160a01b0383166000908152600c6020526040902061271190836149b1565b60008215612907575047610f54565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190615e25565b9050610f54565b6001546001600160a01b03163314806129a8575033600090815260026020526040902054600160a01b900460ff166001145b6129b157600080fd5b6129bb84846128f8565b8211156129c757600080fd5b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190615e3e565b508315612adc576000816001600160a01b03168361520890604051600060405180830381858888f193505050503d8060008114612a94576040519150601f19603f3d011682016040523d82523d6000602084013e612a99565b606091505b5050905080612ad65760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b50612b96565b6040516323b872dd60e01b81523060048201526001600160a01b03828116602483015260448201849052600091908516906323b872dd906064016020604051808303816000875af1158015612b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b599190615e3e565b905080612b945760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b505b50505050565b6001546001600160a01b0316331480612bce575033600090815260026020526040902054600160a01b900460ff166001145b612bd757600080fd5b6001546001600160a01b0390811690821603612c405760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920746865206f776e65604482015261722160f01b6064820152608401611109565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b612ca4613d0e565b6001546001600160a01b0316331480612cd6575033600090815260026020526040902054600160a01b900460ff166001145b612cdf57600080fd5b6001600160a01b0382166000908152601660205260408120805460ff1916831515179055600190555050565b6001600160a01b03163b151590565b6000612711836001600160a01b0384166149bd565b6060600061271183614a0c565b6001600160a01b038316612d925760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b038216612de85760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604081205460ff1615159003612ee5576001600160a01b0383166000818152600a602090815260408083208054600160ff1991821681178355600885529483902080549091169094179093555192835290917f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a1612b96848484614a68565b600680546001600160a01b0319166001600160a01b038516179055600082156130e657600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7f9190615e5b565b9150600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff89190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015613046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306a9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff16156130d65760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b6130e1848484614a68565b612b96565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315d9190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131cf9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff161561323b5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b612b96848484614a68565b6000818484111561326a5760405162461bcd60e51b8152600401611109919061575d565b505050900390565b6001600160a01b0383166132ee5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03821661336a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611109565b600081116133e05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0383166000908152600960205260408120548190819060ff161561342957600780546001600160a01b0319166001600160a01b03881617905560019250613472565b6001600160a01b03851660009081526009602052604090205460ff161561346e57600780546001600160a01b0319166001600160a01b03871617905560019150613472565b5060015b6007546001600160a01b039081166000908152600b6020908152604091829020825161018081018452815485168152600182015494851692810192909252600160a01b840460ff908116151593830193909352600160a81b8404831615156060830152600160b01b8404831615156080830152600160b81b84048316151560a0830152600160c01b84048316151560c0830152600160c81b840490921660e0820152600160d01b90920463ffffffff16610100830152600281015465ffffffffffff1661012083015260038101546101408301526004015461016082015261355a8787615105565b1561385c57601f54610100900460ff166135b65760405162461bcd60e51b815260206004820152601460248201527f54726164696e67206e6f7420656e61626c6564210000000000000000000000006044820152606401611109565b83806135bf5750825b156136ae5780516001600160a01b03166000908152600a602052604090205460ff166136525760405162461bcd60e51b8152602060048201526024808201527f54726164696e67206e6f7420656e61626c656420666f72207468697320726f7560448201527f74657221000000000000000000000000000000000000000000000000000000006064820152608401611109565b80606001516136ae5760405162461bcd60e51b815260206004820152602260248201527f54726164696e67206e6f7420656e61626c656420666f72207468697320706169604482015261722160f01b6064820152608401611109565b83806136b75750825b1561377b576001600160a01b03871660009081526015602052604090205460ff161580156136fe57506001600160a01b03861660009081526015602052604090205460ff16155b1561377b57601a5485111561377b5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401611109565b80516001600160a01b03878116911614801590613796575082155b1561385c576001600160a01b03861660009081526015602052604090205460ff1661385c57601d54856137de886001600160a01b031660009081526004602052604090205490565b6137e89190615e78565b111561385c5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401611109565b821561390757601f5460ff16613907578060a0015115613907573060009081526004602052604090205461014082015181106139055761016082015160c0830151156138e15760e08301516007546001600160a01b03166000908152600460205260409020546127109160ff16906138d49190615d7b565b6138de9190615ddd565b90505b8082106138ec578091505b6007546139039083906001600160a01b0316614025565b505b505b8060800151613a075760075461392990889088906001600160a01b0316615297565b806080015115801561394057506139408787615105565b801561396557506001600160a01b03871660009081526016602052604090205460ff16155b801561398a57506001600160a01b03861660009081526016602052604090205460ff16155b8015613994575081155b15613a075760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f60448201527f6e2e0000000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03871660009081526014602052604081205460ff1680613a4657506001600160a01b03871660009081526014602052604090205460ff165b15613a52575084613c56565b8415613aaa57600f546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8315613b02576010546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8215613b56576011546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b93849004919091169092029190911790555b601254600090613b9d9061271090613b9790613b829063ffffffff640100000000820481169116615e8b565b63ffffffff168a61541e90919063ffffffff16565b9061542a565b9050613ba98782615436565b6001600160a01b038a16600090815260046020526040902054909250613bcf9082615436565b6001600160a01b038a16600090815260046020526040808220929092553081522054613bfb9082615442565b30600081815260046020526040908190209290925590516001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613c4c9085815260200190565b60405180910390a3505b6001600160a01b038816600090815260046020526040902054613c799082615436565b6001600160a01b03808a166000908152600460205260408082209390935590891681522054613ca89082615442565b6001600160a01b0380891660008181526004602052604090819020939093559151908a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613cfc9085815260200190565b60405180910390a35050505050505050565b600260005403613d605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611109565b6002600055565b600e54600d5460009163ffffffff600160401b8204811692613d9192919091169061ffff16615ea8565b613d9b9190615ed0565b600f805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613dd8926401000000009004169061ffff16615ea8565b613de29190615ed0565b600f805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613e1d949304831692918216911617615e8b565b600f805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613e7992919091169061ffff6201000090910416615ea8565b613e839190615ed0565b6010805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613ec6926401000000009004169062010000900461ffff16615ea8565b613ed09190615ed0565b6010805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613f0b949304831692918216911617615e8b565b6010805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613f6992919091169061ffff64010000000090910416615ea8565b613f739190615ed0565b6011805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613fb59264010000000090819004909116910461ffff16615ea8565b613fbf9190615ed0565b6011805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613ffa949304831692918216911617615e8b565b6011805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b601f805460ff191660019081179091556001600160a01b038083166000908152600b60209081526040808320815161018081018352815486168082529682015495861681850152600160a01b860460ff908116151582850152600160a81b870481161515606080840191909152600160b01b8804821615156080840152600160b81b88048216151560a0840152600160c01b88048216151560c0840152600160c81b880490911660e083015263ffffffff600160d01b9097048716610100830152600283015465ffffffffffff166101208301526003830154610140830152600490920154610160820152600680546001600160a01b0319169097179096558151908101825260125480861682526401000000008104861693820193909352600160401b909204909316928101839052919003614163575050614984565b3060009081526005602090815260408083206006546001600160a01b03168452909152902054600019146141bc573060009081526005602090815260408083206006546001600160a01b03168452909152902060001990555b60006002826040015163ffffffff16836000015163ffffffff16876141e19190615d7b565b6141eb9190615ddd565b6141f59190615ddd565b905060006142038287615ef3565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061423d5761423d615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505084602001518160018151811061427557614275615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505060006142a08761544e565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143199190615e5b565b6001600160a01b03168260018151811061433557614335615d92565b60200260200101516001600160a01b0316036143d4576006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061439d908690600090879030904290600401615f06565b600060405180830381600087803b1580156143b757600080fd5b505af11580156143cb573d6000803e3d6000fd5b50505050614459565b6006546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690635c11d79590614426908690600090879030904290600401615f06565b600060405180830381600087803b15801561444057600080fd5b505af1158015614454573d6000803e3d6000fd5b505050505b6000816144658961544e565b61446f9190615ef3565b905060008461447e8784615d7b565b6144889190615ddd565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145019190615e5b565b6001600160a01b031688602001516001600160a01b03160361461357851561460e576006546018546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810189905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156145ac573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906145d19190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b614717565b85156147175760065460208901516018546040517fe8e337000000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039283166024820152604481018a90526064810185905260006084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156146b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146da9190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b6147218183615ef3565b602089015160175460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529294506000928592919091169063095ea7b3906044016020604051808303816000875af1158015614783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147a79190615e3e565b50600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481f9190615e5b565b6001600160a01b03168a602001516001600160a01b0316036148e657602089015163ffffffff16156148e1576017546040516001600160a01b03909116906152089083906000818181858888f193505050503d806000811461489d576040519150601f19603f3d011682016040523d82523d6000602084013e6148a2565b606091505b505080925050816148e15760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b614979565b602089015163ffffffff16156149795760208a01516017546040516323b872dd60e01b81523060048201526001600160a01b039182166024820152604481018490529116906323b872dd906064016020604051808303816000875af1158015614953573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149779190615e3e565b505b505050505050505050505b5050601f805460ff19169055565b6000612711836001600160a01b03841661558e565b6000610f3b825490565b60006127118383615688565b6000818152600183016020526040812054614a0457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f54565b506000610f54565b606081600001805480602002602001604051908101604052809291908181526020018280548015614a5c57602002820191906000526020600020905b815481526020019060010190808311614a48575b50505050509050919050565b600680546001600160a01b0319166001600160a01b0385161790556000808315614cfa57600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b039190615e5b565b9250600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7c9190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bee9190615e5b565b90506001600160a01b0381163b15614c0857809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f9190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cf39190615e5b565b9150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d719190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614de39190615e5b565b90506001600160a01b0381163b15614dfd57809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e749190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ee89190615e5b565b91505b6001600160a01b038083166000908152600b6020908152604080832080548a86166001600160a01b0319909116178155600180820180547fffff00000000000000000000000000000000000000000000000000000000000016968a169690961790955560028101805465ffffffffffff1916905560038101849055600481018490556009909252909120805460ff1916909217909155614f8b86846156b2565b614f9530846156b2565b6001600160a01b03861660009081526014602090815260408083208054600160ff1991821681179092556015845282852080548216831790556016845282852080548216831790556013909352922080549091169091179055614ffb3387600019612d3c565b600154615014906001600160a01b031687600019612d3c565b6150213087600019612d3c565b60405163095ea7b360e01b81526001600160a01b038781166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015615071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150959190615e3e565b503060009081526005602090815260408083206001600160a01b038a8116808652918452938290206000199055815190815286841692810192909252918616918101919091527f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d90606001612107565b6001546000906001600160a01b0384811691161480159061513457506001546001600160a01b03838116911614155b801561514b57506001546001600160a01b03163214155b801561517057506001600160a01b03821660009081526013602052604090205460ff16155b801561519557506001600160a01b03831660009081526013602052604090205460ff16155b80156151ac57506001600160a01b03821661dead14155b80156151c057506001600160a01b03821615155b80156151d557506001600160a01b0383163014155b801561520457506001600160a01b038316600090815260026020526040902054600160a01b900460ff16600114155b801561523357506001600160a01b038216600090815260026020526040902054600160a01b900460ff16600114155b801561526357506001600160a01b038316600090815260026020819052604090912054600160a01b900460ff1614155b80156127115750506001600160a01b0316600090815260026020819052604090912054600160a01b900460ff161415919050565b6001600160a01b0381166000908152600b6020526040902060010154600160b01b900460ff16156153305760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401611109565b61533a8383615105565b1580156153585750806001600160a01b0316826001600160a01b0316145b15610fe9576001600160a01b038381166000908152601360209081526040808320805460ff19166001908117909155601f805462ff0000191662010000179055938516808452600b83529281902084018054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff9091161790558051928352908201929092527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611578565b60006127118284615d7b565b60006127118284615ddd565b60006127118284615ef3565b60006127118284615e78565b6001600160a01b038082166000908152600b602090815260408083205481517fad5c464800000000000000000000000000000000000000000000000000000000815291519394169263ad5c4648926004808401939192918290030181865afa1580156154be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e29190615e5b565b6001600160a01b038381166000908152600b6020526040902060010154918116911603615510575047919050565b6001600160a01b038281166000908152600b6020526040908190206001015490516370a0823160e01b81523060048201529116906370a0823190602401602060405180830381865afa15801561556a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190615e25565b600081815260018301602052604081205480156156775760006155b2600183615ef3565b85549091506000906155c690600190615ef3565b905081811461562b5760008660000182815481106155e6576155e6615d92565b906000526020600020015490508087600001848154811061560957615609615d92565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061563c5761563c615f70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f54565b6000915050610f54565b5092915050565b600082600001828154811061569f5761569f615d92565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600c60205260409020610fe99082612d1a565b6001600160a01b038116811461132757600080fd5b6000602082840312156156fb57600080fd5b8135612711816156d4565b600081518084526020808501945080840160005b8381101561573f5781516001600160a01b03168752958201959082019060010161571a565b509495945050505050565b6020815260006127116020830184615706565b600060208083528351808285015260005b8181101561578a5785810183015185820160400152820161576e565b506000604082860101526040601f19601f8301168501019250505092915050565b600080604083850312156157be57600080fd5b82356157c9816156d4565b946020939093013593505050565b801515811461132757600080fd5b6000806000606084860312156157fa57600080fd5b8335615805816156d4565b92506020840135615815816157d7565b91506040840135615825816156d4565b809150509250925092565b60008060006060848603121561584557600080fd5b8335615850816156d4565b92506020840135615860816156d4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156158b0576158b0615871565b604052919050565b600067ffffffffffffffff8211156158d2576158d2615871565b5060051b60200190565b600082601f8301126158ed57600080fd5b813560206159026158fd836158b8565b615887565b82815260059290921b8401810191818101908684111561592157600080fd5b8286015b8481101561593c5780358352918301918301615925565b509695505050505050565b6000806040838503121561595a57600080fd5b823567ffffffffffffffff8082111561597257600080fd5b818501915085601f83011261598657600080fd5b813560206159966158fd836158b8565b82815260059290921b840181019181810190898411156159b557600080fd5b948201945b838610156159dc5785356159cd816156d4565b825294820194908201906159ba565b965050860135925050808211156159f257600080fd5b506159ff858286016158dc565b9150509250929050565b803561ffff81168114610f3e57600080fd5b600060208284031215615a2d57600080fd5b61271182615a09565b60008060408385031215615a4957600080fd5b8235615a54816156d4565b91506020830135615a64816157d7565b809150509250929050565b600080600060608486031215615a8457600080fd5b615a8d84615a09565b9250615a9b60208501615a09565b9150615aa960408501615a09565b90509250925092565b60008060208385031215615ac557600080fd5b823567ffffffffffffffff80821115615add57600080fd5b818501915085601f830112615af157600080fd5b813581811115615b0057600080fd5b8660208260051b8501011115615b1557600080fd5b60209290920196919550909350505050565b803560ff81168114610f3e57600080fd5b60008060408385031215615b4b57600080fd5b8235615b56816156d4565b9150615b6460208401615b27565b90509250929050565b600080600060608486031215615b8257600080fd5b8335615b8d816156d4565b9250615b9b60208501615b27565b9150615aa960408501615b27565b60008060408385031215615bbc57600080fd5b8235615bc7816156d4565b91506020830135615a64816156d4565b60008060408385031215615bea57600080fd5b615bf383615a09565b9150615b6460208401615a09565b60008060408385031215615c1457600080fd5b8235615bc7816157d7565b60008060008060808587031215615c3557600080fd5b8435615c40816157d7565b93506020850135615c50816156d4565b9250604085013591506060850135615c67816156d4565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115615cc3578160001904821115615ca957615ca9615c72565b80851615615cb657918102915b93841c9390800290615c8d565b509250929050565b600082615cda57506001610f54565b81615ce757506000610f54565b8160018114615cfd5760028114615d0757615d23565b6001915050610f54565b60ff841115615d1857615d18615c72565b50506001821b610f54565b5060208310610133831016604e8410600b8410161715615d46575081810a610f54565b615d508383615c88565b8060001904821115615d6457615d64615c72565b029392505050565b600061271160ff841683615ccb565b8082028115828204841417610f5457610f54615c72565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103615dbe57615dbe615c72565b60010192915050565b634e487b7160e01b600052601260045260246000fd5b600082615dec57615dec615dc7565b500490565b61ffff81811683821601908082111561568157615681615c72565b600060018201615e1e57615e1e615c72565b5060010190565b600060208284031215615e3757600080fd5b5051919050565b600060208284031215615e5057600080fd5b8151612711816157d7565b600060208284031215615e6d57600080fd5b8151612711816156d4565b80820180821115610f5457610f54615c72565b63ffffffff81811683821601908082111561568157615681615c72565b63ffffffff818116838216028082169190828114615ec857615ec8615c72565b505092915050565b600063ffffffff80841680615ee757615ee7615dc7565b92169190910492915050565b81810381811115610f5457610f54615c72565b85815284602082015260a060408201526000615f2560a0830186615706565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215615f5757600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203df85adaca5a4d5674bb344be7610f1eed1ee00ffc14e387f33ed69f77dcf48264736f6c634300081100330000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39

Deployed Bytecode

0x6080604052600436106103e25760003560e01c8063640384091161020d578063b3d514fb11610128578063d8306786116100bb578063dd62ed3e1161008a578063edc8f9631161006f578063edc8f96314610e65578063f5a1f5b414610e85578063feadde9c14610ea557600080fd5b8063dd62ed3e14610def578063eb48799a14610e3557600080fd5b8063d830678614610d75578063da07af4414610d8f578063dc8221ad14610daf578063dd27cf2614610dcf57600080fd5b8063bcd96a25116100f7578063bcd96a2514610cf0578063be99375514610d10578063c1f11ac714610d26578063cf84770614610d4157600080fd5b8063b3d514fb14610690578063b524f87b14610c90578063b622d8a114610cb0578063b9fbfdf214610cd057600080fd5b806391d3db28116101a0578063a72bc8081161016f578063a72bc80814610c1c578063a9059cbb14610c50578063b092d20d14610c70578063b1b08f711461069057600080fd5b806391d3db2814610b8657806395d89b4114610ba15780639ee1bd0f14610be7578063a4cb698514610bfc57600080fd5b806370a08231116101dc57806370a0823114610af0578063833f836114610b2657806386a2ab5714610b465780638feb9d7814610b6657600080fd5b80636403840914610a6b578063649f386d14610a815780636ca4797f14610aba5780636cf3b0f914610ad057600080fd5b8063313ce567116102fd57806350a8e016116102905780635ca8d1f61161025f5780635ca8d1f6146109d25780635cce86cd146109f25780635d098b3814610a2b57806360e89ae814610a4b57600080fd5b806350a8e0161461082d578063517bfc2d1461084d578063590ffdce1461088d5780635c45767a146108ad57600080fd5b80634ada218b116102cc5780634ada218b146107955780634f4fc99b146107b45780634fbee193146107d45780635061e52a1461080d57600080fd5b8063313ce567146106f957806332cde6641461072057806336fddb04146107405780633ddcac7c1461076057600080fd5b806311f55dc6116103755780632610eaca116103445780632610eaca146106705780632b28fc7a146106905780632cb8b882146106b95780632fa20331146106d957600080fd5b806311f55dc6146105d757806318160ddd1461060b57806322e29a681461062e57806323b872dd1461065057600080fd5b806308e7d1c4116103b157806308e7d1c4146104bd578063095ea7b3146105185780630a920f20146105485780630dcbcf1c1461059e57600080fd5b806303fd2a45146103ee57806305ba16341461042157806306fdde031461044e5780630758d9241461049d57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b5061040461dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561042d57600080fd5b5061044161043c3660046156e9565b610ec5565b604051610418919061574a565b34801561045a57600080fd5b5060408051808201909152600781527f496e7567616d690000000000000000000000000000000000000000000000000060208201525b604051610418919061575d565b3480156104a957600080fd5b50600654610404906001600160a01b031681565b3480156104c957600080fd5b506011546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff94851681529284166020840152921691810191909152606001610418565b34801561052457600080fd5b506105386105333660046157ab565b610f43565b6040519015158152602001610418565b34801561055457600080fd5b50600d546105799061ffff808216916201000081048216916401000000009091041683565b6040805161ffff94851681529284166020840152921691810191909152606001610418565b3480156105aa57600080fd5b506105386105b93660046156e9565b6001600160a01b031660009081526016602052604090205460ff1690565b3480156105e357600080fd5b506010546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b34801561061757600080fd5b50610620610f5a565b604051908152602001610418565b34801561063a57600080fd5b5061064e6106493660046157e5565b610fa3565b005b34801561065c57600080fd5b5061053861066b366004615830565b610fee565b34801561067c57600080fd5b5061064e61068b366004615947565b611081565b34801561069c57600080fd5b506106a66107d081565b60405161ffff9091168152602001610418565b3480156106c557600080fd5b5061064e6106d4366004615a1b565b6111bd565b3480156106e557600080fd5b5061064e6106f4366004615a36565b61132a565b34801561070557600080fd5b5061070e6115f9565b60405160ff9091168152602001610418565b34801561072c57600080fd5b5061053861073b366004615a6f565b611628565b34801561074c57600080fd5b5061064e61075b366004615a36565b611805565b34801561076c57600080fd5b50610775611874565b604080516001600160a01b03938416815292909116602083015201610418565b3480156107a157600080fd5b50601f5461053890610100900460ff1681565b3480156107c057600080fd5b50600754610404906001600160a01b031681565b3480156107e057600080fd5b506105386107ef3660046156e9565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561081957600080fd5b5061064e610828366004615ab2565b61189d565b34801561083957600080fd5b50601f546105389062010000900460ff1681565b34801561085957600080fd5b5061070e6108683660046156e9565b6001600160a01b0316600090815260026020526040902054600160a01b900460ff1690565b34801561089957600080fd5b5061064e6108a8366004615a36565b611966565b3480156108b957600080fd5b506109556108c83660046156e9565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b03938416949383169360ff600160a01b8504811694600160a81b8104821694600160b01b8204831694600160b81b8304841694600160c01b8404851694600160c81b8504169363ffffffff600160d01b909104169265ffffffffffff16918c565b604080516001600160a01b039d8e1681529c909b1660208d0152981515998b019990995295151560608a0152931515608089015291151560a0880152151560c087015260ff1660e086015263ffffffff1661010085015265ffffffffffff1661012084015261014083019190915261016082015261018001610418565b3480156109de57600080fd5b5061064e6109ed366004615b38565b6119d5565b3480156109fe57600080fd5b50610538610a0d3660046156e9565b6001600160a01b031660009081526015602052604090205460ff1690565b348015610a3757600080fd5b5061064e610a463660046156e9565b611af3565b348015610a5757600080fd5b5061064e610a663660046156e9565b611b78565b348015610a7757600080fd5b50610620601b5481565b348015610a8d57600080fd5b50610538610a9c3660046156e9565b6001600160a01b031660009081526003602052604090205460ff1690565b348015610ac657600080fd5b506106a6610bb881565b348015610adc57600080fd5b5061064e610aeb366004615b38565b611d32565b348015610afc57600080fd5b50610620610b0b3660046156e9565b6001600160a01b031660009081526004602052604090205490565b348015610b3257600080fd5b5061064e610b41366004615b6d565b611e61565b348015610b5257600080fd5b5061064e610b613660046156e9565b612117565b348015610b7257600080fd5b5061064e610b81366004615a36565b61216c565b348015610b9257600080fd5b50601c546106a69061ffff1681565b348015610bad57600080fd5b5060408051808201909152600481527f47414d49000000000000000000000000000000000000000000000000000000006020820152610490565b348015610bf357600080fd5b506104046121ee565b348015610c0857600080fd5b5061064e610c17366004615ba9565b612202565b348015610c2857600080fd5b50600f546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610c5c57600080fd5b50610538610c6b3660046157ab565b61225f565b348015610c7c57600080fd5b5061064e610c8b366004615a36565b61226c565b348015610c9c57600080fd5b5061064e610cab3660046156e9565b6123b0565b348015610cbc57600080fd5b5061064e610ccb366004615a36565b612435565b348015610cdc57600080fd5b50610620610ceb3660046156e9565b612579565b348015610cfc57600080fd5b50610538610d0b366004615bd7565b6125ef565b348015610d1c57600080fd5b50610620601e5481565b348015610d3257600080fd5b506019546106a69061ffff1681565b348015610d4d57600080fd5b50600e546104f19063ffffffff808216916401000000008104821691600160401b9091041683565b348015610d8157600080fd5b50601f546105389060ff1681565b348015610d9b57600080fd5b5061064e610daa366004615a1b565b612718565b348015610dbb57600080fd5b50610404610dca3660046157ab565b612881565b348015610ddb57600080fd5b50610620610dea366004615c01565b6128f8565b348015610dfb57600080fd5b50610620610e0a366004615ba9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610e4157600080fd5b50610538610e503660046156e9565b600a6020526000908152604090205460ff1681565b348015610e7157600080fd5b5061064e610e80366004615c1f565b612976565b348015610e9157600080fd5b5061064e610ea03660046156e9565b612b9c565b348015610eb157600080fd5b5061064e610ec0366004615a36565b612c9c565b6060610ed96001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610f11575033600090815260026020526040902054600160a01b900460ff166001145b610f1a57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b90612d2f565b90505b919050565b6000610f50338484612d3c565b5060015b92915050565b6000610f686012600a615d6c565b610f779064174876e800615d7b565b600003610f8357600080fd5b610f8f6012600a615d6c565b610f9e9064174876e800615d7b565b905090565b6001546001600160a01b0316331480610fd5575033600090815260026020526040902054600160a01b900460ff166001145b610fde57600080fd5b610fe9838383612e49565b505050565b6001600160a01b03831660009081526005602090815260408083203384529091528120546000191461106c5761106c843361106785604051806060016040528060288152602001615f87602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190613246565b612d3c565b611077848484613272565b5060019392505050565b6001546001600160a01b03163314806110b3575033600090815260026020526040902054600160a01b900460ff166001145b6110bc57600080fd5b80518251146111125760405162461bcd60e51b815260206004820152601560248201527f4c656e6774687320646f206e6f74206d617463682e000000000000000000000060448201526064015b60405180910390fd5b60005b82518160ff161015610fe957818160ff168151811061113657611136615d92565b602002602001015161115d336001600160a01b031660009081526004602052604090205490565b101561116857600080fd5b6111ab33848360ff168151811061118157611181615d92565b6020026020010151848460ff168151811061119e5761119e615d92565b6020026020010151613272565b806111b581615da8565b915050611115565b6111c5613d0e565b6001546001600160a01b03163314806111f7575033600090815260026020526040902054600160a01b900460ff166001145b61120057600080fd5b6103e861120f6012600a615d6c565b61121e9064174876e800615d7b565b6112289190615ddd565b61271061ffff831661123c6012600a615d6c565b61124b9064174876e800615d7b565b6112559190615d7b565b61125f9190615ddd565b10156112d35760405162461bcd60e51b815260206004820152603760248201527f4d6178205472616e73616374696f6e20616d74206d7573742062652061626f7660448201527f6520302e3125206f6620746f74616c20737570706c792e0000000000000000006064820152608401611109565b6019805461ffff191661ffff8316908117909155612710906112f76012600a615d6c565b6113069064174876e800615d7b565b6113109190615d7b565b61131a9190615ddd565b601a556113276001600055565b50565b33600090815260026020526040902054600160a01b900460ff1660011461135057600080fd5b601f54610100900460ff1661136f57601f805461ff0019166101001790555b6001600160a01b0382166000908152600b602052604090208115611585576001810154600160a01b900460ff1661150d576001810154600160b01b900460ff166113fb5760405162461bcd60e51b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401611109565b6001810180547fffffffffffff00ffffffff00ffffffffffffffffffffffffffffffffffffffff1679c8000000000100000000000000000000000000000000000000001790556127106114506012600a615d6c565b61145f9064174876e800615d7b565b61146a90600a615d7b565b6114749190615ddd565b60038201556127106114886012600a615d6c565b6114979064174876e800615d7b565b6114a290600b615d7b565b6114ac9190615ddd565b6004820155600181018054600160c01b7fffff00000000ff00ffffffffffffffffffffffffffffffffffffffffffffffff909116600160d01b4363ffffffff16021717905560028101805465ffffffffffff19164265ffffffffffff161790555b60018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527fc6a94aed14d17054235e92e4f1dea2e3825c9ccf7053602fa787d687fcf312da906060015b60405180910390a1505050565b81610fe95760018101805460ff60a81b1916600160a81b84151502179055604080516001600160a01b038516815263ffffffff4316602082015265ffffffffffff4216918101919091527f2ae9db52f95cd554639c05f6d579c7ec02ac692ff23ebc60660e22416466bb8c90606001611578565b60006116076012600a615d6c565b6116169064174876e800615d7b565b60000361162257600080fd5b50601290565b600061163c6001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480611674575033600090815260026020526040902054600160a01b900460ff166001145b61167d57600080fd5b6107d061ffff85161180159061169957506107d061ffff841611155b80156116ab57506107d061ffff831611155b6116f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420657863656564206d6178696d756d732e0000000000000000006044820152606401611109565b610bb86117048486615df1565b61ffff1611156117565760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f742065786365656420726f756e6474726970206d6178696d756d2e6044820152606401611109565b600d5460009061ffff86811691161461178557600d805461ffff191661ffff8716179055611782613d67565b90505b600d5461ffff8581166201000090920416146117be57600d805463ffff000019166201000061ffff8716021790556117bb613e48565b90505b600d5461ffff84811664010000000090920416146117fd57600d805465ffff00000000191664010000000061ffff8616021790556117fa613f36565b90505b949350505050565b61180d613d0e565b6001546001600160a01b031633148061183f575033600090815260026020526040902054600160a01b900460ff166001145b61184857600080fd5b6001600160a01b0382166000908152601560205260408120805460ff1916831515179055600190555050565b6000806118896017546001600160a01b031690565b6018546001600160a01b0316915091509091565b6001546001600160a01b03163314806118cf575033600090815260026020526040902054600160a01b900460ff166001145b6118d857600080fd5b60005b81811015610fe9576119548383838181106118f8576118f8615d92565b905060200201602081019061190d91906156e9565b6001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b8061195e81615e0c565b9150506118db565b61196e613d0e565b6001546001600160a01b03163314806119a0575033600090815260026020526040902054600160a01b900460ff166001145b6119a957600080fd5b6001600160a01b0382166000908152601460205260408120805460ff1916831515179055600190555050565b6001546001600160a01b0316331480611a07575033600090815260026020526040902054600160a01b900460ff166001145b611a1057600080fd5b60c88160ff161115611a645760405162461bcd60e51b815260206004820152601460248201527f43616e6e6f74207365742061626f76652032252e0000000000000000000000006044820152606401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8716908102919091179091558251938452908301527f024e5cc370f4392aaafdb3d37424c18b801c726ff6c32c142bfc1c2d8c2185b391015b60405180910390a15050565b611afb613d0e565b6001546001600160a01b0316331480611b2d575033600090815260026020526040902054600160a01b900460ff166001145b611b3657600080fd5b601780546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480611baa575033600090815260026020526040902054600160a01b900460ff166001145b80611bcf575033600090815260026020819052604090912054600160a01b900460ff16145b80611bf3575033600090815260026020526040902054600160a01b900460ff166005145b611bfc57600080fd5b6001600160a01b0381163314611c7a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401611109565b6001600160a01b03811660009081526003602052604090205460ff161515600114611ce75760405162461bcd60e51b815260206004820152601d60248201527f596f7520646f206e6f74206861766520616e2061646d696e20726f6c650000006044820152606401611109565b611327816001600160a01b03166000908152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916905560039091529020805460ff19169055565b6001546001600160a01b0316331480611d64575033600090815260026020526040902054600160a01b900460ff166001145b611d6d57600080fd5b8060ff16600103611e075733600090815260026020526040902054600160a01b900460ff16600114611e075760405162461bcd60e51b815260206004820152602360248201527f596f7520617265206e6f7420617574686f72697a656420746f2073657420612060448201527f64657600000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0382166000818152600260209081526040808320805474ffffffffffffffffffffffffffffffffffffffffff1916909417600160a01b60ff871602179093556003905220805460ff191660011790555050565b6001546001600160a01b0316331480611e93575033600090815260026020526040902054600160a01b900460ff166001145b611e9c57600080fd5b6001600160a01b038381166000908152600b60209081526040808320815161018081018352815486168152600182015495861693810193909352600160a01b850460ff908116151592840192909252600160a81b8504821615156060840152600160b01b8504821615156080840152600160b81b85048216151560a0840152600160c01b85048216151560c0840152600160c81b8504821660e0840152600160d01b90940463ffffffff16610100830152600284015465ffffffffffff16610120830152600384015461014083015260049093015461016082015291612710908516611f8a6012600a615d6c565b611f999064174876e800615d7b565b611fa39190615d7b565b611fad9190615ddd565b9050600061271060ff8516611fc46012600a615d6c565b611fd39064174876e800615d7b565b611fdd9190615d7b565b611fe79190615ddd565b9050808211156120435760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c642063616e6e6f742062652061626f766520616d6f756e746044820152601760f91b6064820152608401611109565b61271060ff86166120566012600a615d6c565b6120659064174876e800615d7b565b61206f9190615d7b565b6120799190615ddd565b61014084015261271060ff85166120926012600a615d6c565b6120a19064174876e800615d7b565b6120ab9190615d7b565b6120b59190615ddd565b6101608401819052610140840151604080516001600160a01b038a16815260208101929092528101919091527f4b4b99a1eff34af744bde4562076348fe524799340e842c09f26f43c94ea9d2b906060015b60405180910390a1505050505050565b6001546001600160a01b0316331480612149575033600090815260026020526040902054600160a01b900460ff166001145b61215257600080fd5b306000908152600460205260409020546113279082614025565b33600090815260026020526040902054600160a01b900460ff1660011461219257600080fd5b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527ff1551184b142d0ef4c150b6a021c1e4da5e8844379a9ea03fb3cd061ea1daf219101611ae7565b6000610f9e6001546001600160a01b031690565b6001546001600160a01b0316331480612234575033600090815260026020526040902054600160a01b900460ff166001145b61223d57600080fd5b6001600160a01b0382166000908152600c60205260409020610fe99082614992565b6000610f50338484613272565b6001546001600160a01b031633148061229e575033600090815260026020526040902054600160a01b900460ff166001145b6122a757600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff1615150361232a5760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b861515908102919091179091558251938452908301527f3fdc3a0a211fcb6dedf2ee6f5566883ccd93088f308aaada19760f3b6bd62ee79101611ae7565b6123b8613d0e565b6001546001600160a01b03163314806123ea575033600090815260026020526040902054600160a01b900460ff166001145b6123f357600080fd5b601880546001600160a01b0383166001600160a01b031990911681179091556000908152601460205260409020805460ff191660011790556113276001600055565b6001546001600160a01b0316331480612467575033600090815260026020526040902054600160a01b900460ff166001145b61247057600080fd5b6001600160a01b0382166000908152600b6020526040902060010154811515600160b81b90910460ff161515036124f35760405162461bcd60e51b815260206004820152602160248201527f416c7265616479207365742061742074686520646573697265642073746174656044820152601760f91b6064820152608401611109565b6001600160a01b0382166000818152600b602090815260409182902060010180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b861515908102919091179091558251938452908301527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611ae7565b600061258d6001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806125c5575033600090815260026020526040902054600160a01b900460ff166001145b6125ce57600080fd5b6001600160a01b0382166000908152600c60205260409020610f3b906149a7565b60006126036001546001600160a01b031690565b6001600160a01b0316336001600160a01b0316148061263b575033600090815260026020526040902054600160a01b900460ff166001145b61264457600080fd5b61264e8284615df1565b600e805463ffffffff60401b19811661ffff938416600160401b02908117909255600092861663ffffffff9182169190921617146126b857600e805463ffffffff191661ffff86161790556126a1613d67565b90506126ab613e48565b90506126b5613f36565b90505b600e5463ffffffff6401000000009091041661ffff84161461271157600e805467ffffffff00000000191661ffff8516640100000000021790556126fa613d67565b9050612704613e48565b905061270e613f36565b90505b9392505050565b612720613d0e565b6001546001600160a01b0316331480612752575033600090815260026020526040902054600160a01b900460ff166001145b61275b57600080fd5b60646127696012600a615d6c565b6127789064174876e800615d7b565b6127829190615ddd565b61271061ffff83166127966012600a615d6c565b6127a59064174876e800615d7b565b6127af9190615d7b565b6127b99190615ddd565b101561282d5760405162461bcd60e51b815260206004820152603060248201527f4d61782057616c6c657420616d74206d7573742062652061626f76652031252060448201527f6f6620746f74616c20737570706c792e000000000000000000000000000000006064820152608401611109565b601c805461ffff191661ffff8316908117909155612710906128516012600a615d6c565b6128609064174876e800615d7b565b61286a9190615d7b565b6128749190615ddd565b601d556113276001600055565b60006128956001546001600160a01b031690565b6001600160a01b0316336001600160a01b031614806128cd575033600090815260026020526040902054600160a01b900460ff166001145b6128d657600080fd5b6001600160a01b0383166000908152600c6020526040902061271190836149b1565b60008215612907575047610f54565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa15801561294b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296f9190615e25565b9050610f54565b6001546001600160a01b03163314806129a8575033600090815260026020526040902054600160a01b900460ff166001145b6129b157600080fd5b6129bb84846128f8565b8211156129c757600080fd5b60405163095ea7b360e01b81526001600160a01b038281166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015612a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3b9190615e3e565b508315612adc576000816001600160a01b03168361520890604051600060405180830381858888f193505050503d8060008114612a94576040519150601f19603f3d011682016040523d82523d6000602084013e612a99565b606091505b5050905080612ad65760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b50612b96565b6040516323b872dd60e01b81523060048201526001600160a01b03828116602483015260448201849052600091908516906323b872dd906064016020604051808303816000875af1158015612b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b599190615e3e565b905080612b945760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b505b50505050565b6001546001600160a01b0316331480612bce575033600090815260026020526040902054600160a01b900460ff166001145b612bd757600080fd5b6001546001600160a01b0390811690821603612c405760405162461bcd60e51b815260206004820152602260248201527f54686973206164647265737320697320616c726561647920746865206f776e65604482015261722160f01b6064820152608401611109565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b612ca4613d0e565b6001546001600160a01b0316331480612cd6575033600090815260026020526040902054600160a01b900460ff166001145b612cdf57600080fd5b6001600160a01b0382166000908152601660205260408120805460ff1916831515179055600190555050565b6001600160a01b03163b151590565b6000612711836001600160a01b0384166149bd565b6060600061271183614a0c565b6001600160a01b038316612d925760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b038216612de85760405162461bcd60e51b815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401611109565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604081205460ff1615159003612ee5576001600160a01b0383166000818152600a602090815260408083208054600160ff1991821681178355600885529483902080549091169094179093555192835290917f72c6620b9a99d91ec1b983b3b0f8e14afcb99c8dbe50cfb5e85d83d2032800d5910160405180910390a1612b96848484614a68565b600680546001600160a01b0319166001600160a01b038516179055600082156130e657600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7f9190615e5b565b9150600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff89190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015613046573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306a9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff16156130d65760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b6130e1848484614a68565b612b96565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315d9190615e5b565b60405163e6a4390560e01b81526001600160a01b038481166004830152306024830152919091169063e6a4390590604401602060405180830381865afa1580156131ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131cf9190615e5b565b6001600160a01b03811660009081526009602052604090205490915060ff161561323b5760405162461bcd60e51b815260206004820152601460248201527f5061697220616c726561647920657869737473210000000000000000000000006044820152606401611109565b612b96848484614a68565b6000818484111561326a5760405162461bcd60e51b8152600401611109919061575d565b505050900390565b6001600160a01b0383166132ee5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03821661336a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401611109565b600081116133e05760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b0383166000908152600960205260408120548190819060ff161561342957600780546001600160a01b0319166001600160a01b03881617905560019250613472565b6001600160a01b03851660009081526009602052604090205460ff161561346e57600780546001600160a01b0319166001600160a01b03871617905560019150613472565b5060015b6007546001600160a01b039081166000908152600b6020908152604091829020825161018081018452815485168152600182015494851692810192909252600160a01b840460ff908116151593830193909352600160a81b8404831615156060830152600160b01b8404831615156080830152600160b81b84048316151560a0830152600160c01b84048316151560c0830152600160c81b840490921660e0820152600160d01b90920463ffffffff16610100830152600281015465ffffffffffff1661012083015260038101546101408301526004015461016082015261355a8787615105565b1561385c57601f54610100900460ff166135b65760405162461bcd60e51b815260206004820152601460248201527f54726164696e67206e6f7420656e61626c6564210000000000000000000000006044820152606401611109565b83806135bf5750825b156136ae5780516001600160a01b03166000908152600a602052604090205460ff166136525760405162461bcd60e51b8152602060048201526024808201527f54726164696e67206e6f7420656e61626c656420666f72207468697320726f7560448201527f74657221000000000000000000000000000000000000000000000000000000006064820152608401611109565b80606001516136ae5760405162461bcd60e51b815260206004820152602260248201527f54726164696e67206e6f7420656e61626c656420666f72207468697320706169604482015261722160f01b6064820152608401611109565b83806136b75750825b1561377b576001600160a01b03871660009081526015602052604090205460ff161580156136fe57506001600160a01b03861660009081526015602052604090205460ff16155b1561377b57601a5485111561377b5760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f78416d6f756e742e0000000000000000000000000000000000000000000000006064820152608401611109565b80516001600160a01b03878116911614801590613796575082155b1561385c576001600160a01b03861660009081526015602052604090205460ff1661385c57601d54856137de886001600160a01b031660009081526004602052604090205490565b6137e89190615e78565b111561385c5760405162461bcd60e51b815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401611109565b821561390757601f5460ff16613907578060a0015115613907573060009081526004602052604090205461014082015181106139055761016082015160c0830151156138e15760e08301516007546001600160a01b03166000908152600460205260409020546127109160ff16906138d49190615d7b565b6138de9190615ddd565b90505b8082106138ec578091505b6007546139039083906001600160a01b0316614025565b505b505b8060800151613a075760075461392990889088906001600160a01b0316615297565b806080015115801561394057506139408787615105565b801561396557506001600160a01b03871660009081526016602052604090205460ff16155b801561398a57506001600160a01b03861660009081526016602052604090205460ff16155b8015613994575081155b15613a075760405162461bcd60e51b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f60448201527f6e2e0000000000000000000000000000000000000000000000000000000000006064820152608401611109565b6001600160a01b03871660009081526014602052604081205460ff1680613a4657506001600160a01b03871660009081526014602052604090205460ff165b15613a52575084613c56565b8415613aaa57600f546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8315613b02576010546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b9384900491909116909202919091179055613b56565b8215613b56576011546012805463ffffffff80841667ffffffffffffffff19909216919091176401000000008085048316021763ffffffff60401b1916600160401b93849004919091169092029190911790555b601254600090613b9d9061271090613b9790613b829063ffffffff640100000000820481169116615e8b565b63ffffffff168a61541e90919063ffffffff16565b9061542a565b9050613ba98782615436565b6001600160a01b038a16600090815260046020526040902054909250613bcf9082615436565b6001600160a01b038a16600090815260046020526040808220929092553081522054613bfb9082615442565b30600081815260046020526040908190209290925590516001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613c4c9085815260200190565b60405180910390a3505b6001600160a01b038816600090815260046020526040902054613c799082615436565b6001600160a01b03808a166000908152600460205260408082209390935590891681522054613ca89082615442565b6001600160a01b0380891660008181526004602052604090819020939093559151908a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613cfc9085815260200190565b60405180910390a35050505050505050565b600260005403613d605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611109565b6002600055565b600e54600d5460009163ffffffff600160401b8204811692613d9192919091169061ffff16615ea8565b613d9b9190615ed0565b600f805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613dd8926401000000009004169061ffff16615ea8565b613de29190615ed0565b600f805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613e1d949304831692918216911617615e8b565b600f805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613e7992919091169061ffff6201000090910416615ea8565b613e839190615ed0565b6010805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613ec6926401000000009004169062010000900461ffff16615ea8565b613ed09190615ed0565b6010805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613f0b949304831692918216911617615e8b565b6010805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b600e54600d5460009163ffffffff600160401b8204811692613f6992919091169061ffff64010000000090910416615ea8565b613f739190615ed0565b6011805463ffffffff191663ffffffff928316179055600e54600d54600160401b8204831692613fb59264010000000090819004909116910461ffff16615ea8565b613fbf9190615ed0565b6011805467ffffffff0000000019811664010000000063ffffffff948516810291821793849055613ffa949304831692918216911617615e8b565b6011805463ffffffff92909216600160401b0263ffffffff60401b1990921691909117905550600190565b601f805460ff191660019081179091556001600160a01b038083166000908152600b60209081526040808320815161018081018352815486168082529682015495861681850152600160a01b860460ff908116151582850152600160a81b870481161515606080840191909152600160b01b8804821615156080840152600160b81b88048216151560a0840152600160c01b88048216151560c0840152600160c81b880490911660e083015263ffffffff600160d01b9097048716610100830152600283015465ffffffffffff166101208301526003830154610140830152600490920154610160820152600680546001600160a01b0319169097179096558151908101825260125480861682526401000000008104861693820193909352600160401b909204909316928101839052919003614163575050614984565b3060009081526005602090815260408083206006546001600160a01b03168452909152902054600019146141bc573060009081526005602090815260408083206006546001600160a01b03168452909152902060001990555b60006002826040015163ffffffff16836000015163ffffffff16876141e19190615d7b565b6141eb9190615ddd565b6141f59190615ddd565b905060006142038287615ef3565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061423d5761423d615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505084602001518160018151811061427557614275615d92565b60200260200101906001600160a01b031690816001600160a01b03168152505060006142a08761544e565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143199190615e5b565b6001600160a01b03168260018151811061433557614335615d92565b60200260200101516001600160a01b0316036143d4576006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac9479061439d908690600090879030904290600401615f06565b600060405180830381600087803b1580156143b757600080fd5b505af11580156143cb573d6000803e3d6000fd5b50505050614459565b6006546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690635c11d79590614426908690600090879030904290600401615f06565b600060405180830381600087803b15801561444057600080fd5b505af1158015614454573d6000803e3d6000fd5b505050505b6000816144658961544e565b61446f9190615ef3565b905060008461447e8784615d7b565b6144889190615ddd565b9050600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156144dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145019190615e5b565b6001600160a01b031688602001516001600160a01b03160361461357851561460e576006546018546040517ff305d7190000000000000000000000000000000000000000000000000000000081523060048201526024810189905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156145ac573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906145d19190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b614717565b85156147175760065460208901516018546040517fe8e337000000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b039283166024820152604481018a90526064810185905260006084820181905260a482015290821660c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156146b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146da9190615f42565b505060408051838152602081018990527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b6147218183615ef3565b602089015160175460405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529294506000928592919091169063095ea7b3906044016020604051808303816000875af1158015614783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147a79190615e3e565b50600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061481f9190615e5b565b6001600160a01b03168a602001516001600160a01b0316036148e657602089015163ffffffff16156148e1576017546040516001600160a01b03909116906152089083906000818181858888f193505050503d806000811461489d576040519150601f19603f3d011682016040523d82523d6000602084013e6148a2565b606091505b505080925050816148e15760405162461bcd60e51b8152602060048201526009602482015268151e0819985a5b195960ba1b6044820152606401611109565b614979565b602089015163ffffffff16156149795760208a01516017546040516323b872dd60e01b81523060048201526001600160a01b039182166024820152604481018490529116906323b872dd906064016020604051808303816000875af1158015614953573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149779190615e3e565b505b505050505050505050505b5050601f805460ff19169055565b6000612711836001600160a01b03841661558e565b6000610f3b825490565b60006127118383615688565b6000818152600183016020526040812054614a0457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f54565b506000610f54565b606081600001805480602002602001604051908101604052809291908181526020018280548015614a5c57602002820191906000526020600020905b815481526020019060010190808311614a48575b50505050509050919050565b600680546001600160a01b0319166001600160a01b0385161790556000808315614cfa57600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b039190615e5b565b9250600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7c9190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614bca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bee9190615e5b565b90506001600160a01b0381163b15614c0857809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f9190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ccf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cf39190615e5b565b9150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d719190615e5b565b60405163e6a4390560e01b81526001600160a01b038581166004830152306024830152919091169063e6a4390590604401602060405180830381865afa158015614dbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614de39190615e5b565b90506001600160a01b0381163b15614dfd57809150614eeb565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e749190615e5b565b6040516364e329cb60e11b81526001600160a01b038581166004830152306024830152919091169063c9c65396906044016020604051808303816000875af1158015614ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ee89190615e5b565b91505b6001600160a01b038083166000908152600b6020908152604080832080548a86166001600160a01b0319909116178155600180820180547fffff00000000000000000000000000000000000000000000000000000000000016968a169690961790955560028101805465ffffffffffff1916905560038101849055600481018490556009909252909120805460ff1916909217909155614f8b86846156b2565b614f9530846156b2565b6001600160a01b03861660009081526014602090815260408083208054600160ff1991821681179092556015845282852080548216831790556016845282852080548216831790556013909352922080549091169091179055614ffb3387600019612d3c565b600154615014906001600160a01b031687600019612d3c565b6150213087600019612d3c565b60405163095ea7b360e01b81526001600160a01b038781166004830152600019602483015284169063095ea7b3906044016020604051808303816000875af1158015615071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150959190615e3e565b503060009081526005602090815260408083206001600160a01b038a8116808652918452938290206000199055815190815286841692810192909252918616918101919091527f8be8ca5dd0f6315b4748476b8024cfa472222bff1adc749d73ae5697ec2efc7d90606001612107565b6001546000906001600160a01b0384811691161480159061513457506001546001600160a01b03838116911614155b801561514b57506001546001600160a01b03163214155b801561517057506001600160a01b03821660009081526013602052604090205460ff16155b801561519557506001600160a01b03831660009081526013602052604090205460ff16155b80156151ac57506001600160a01b03821661dead14155b80156151c057506001600160a01b03821615155b80156151d557506001600160a01b0383163014155b801561520457506001600160a01b038316600090815260026020526040902054600160a01b900460ff16600114155b801561523357506001600160a01b038216600090815260026020526040902054600160a01b900460ff16600114155b801561526357506001600160a01b038316600090815260026020819052604090912054600160a01b900460ff1614155b80156127115750506001600160a01b0316600090815260026020819052604090912054600160a01b900460ff161415919050565b6001600160a01b0381166000908152600b6020526040902060010154600160b01b900460ff16156153305760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152608401611109565b61533a8383615105565b1580156153585750806001600160a01b0316826001600160a01b0316145b15610fe9576001600160a01b038381166000908152601360209081526040808320805460ff19166001908117909155601f805462ff0000191662010000179055938516808452600b83529281902084018054770101000000000000000000000000000000000000000000007fffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffff9091161790558051928352908201929092527f8175ec0b88ae54888c0026594d930775f30cd3705385da8218b80d8ae468c5439101611578565b60006127118284615d7b565b60006127118284615ddd565b60006127118284615ef3565b60006127118284615e78565b6001600160a01b038082166000908152600b602090815260408083205481517fad5c464800000000000000000000000000000000000000000000000000000000815291519394169263ad5c4648926004808401939192918290030181865afa1580156154be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906154e29190615e5b565b6001600160a01b038381166000908152600b6020526040902060010154918116911603615510575047919050565b6001600160a01b038281166000908152600b6020526040908190206001015490516370a0823160e01b81523060048201529116906370a0823190602401602060405180830381865afa15801561556a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3b9190615e25565b600081815260018301602052604081205480156156775760006155b2600183615ef3565b85549091506000906155c690600190615ef3565b905081811461562b5760008660000182815481106155e6576155e6615d92565b906000526020600020015490508087600001848154811061560957615609615d92565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061563c5761563c615f70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f54565b6000915050610f54565b5092915050565b600082600001828154811061569f5761569f615d92565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600c60205260409020610fe99082612d1a565b6001600160a01b038116811461132757600080fd5b6000602082840312156156fb57600080fd5b8135612711816156d4565b600081518084526020808501945080840160005b8381101561573f5781516001600160a01b03168752958201959082019060010161571a565b509495945050505050565b6020815260006127116020830184615706565b600060208083528351808285015260005b8181101561578a5785810183015185820160400152820161576e565b506000604082860101526040601f19601f8301168501019250505092915050565b600080604083850312156157be57600080fd5b82356157c9816156d4565b946020939093013593505050565b801515811461132757600080fd5b6000806000606084860312156157fa57600080fd5b8335615805816156d4565b92506020840135615815816157d7565b91506040840135615825816156d4565b809150509250925092565b60008060006060848603121561584557600080fd5b8335615850816156d4565b92506020840135615860816156d4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156158b0576158b0615871565b604052919050565b600067ffffffffffffffff8211156158d2576158d2615871565b5060051b60200190565b600082601f8301126158ed57600080fd5b813560206159026158fd836158b8565b615887565b82815260059290921b8401810191818101908684111561592157600080fd5b8286015b8481101561593c5780358352918301918301615925565b509695505050505050565b6000806040838503121561595a57600080fd5b823567ffffffffffffffff8082111561597257600080fd5b818501915085601f83011261598657600080fd5b813560206159966158fd836158b8565b82815260059290921b840181019181810190898411156159b557600080fd5b948201945b838610156159dc5785356159cd816156d4565b825294820194908201906159ba565b965050860135925050808211156159f257600080fd5b506159ff858286016158dc565b9150509250929050565b803561ffff81168114610f3e57600080fd5b600060208284031215615a2d57600080fd5b61271182615a09565b60008060408385031215615a4957600080fd5b8235615a54816156d4565b91506020830135615a64816157d7565b809150509250929050565b600080600060608486031215615a8457600080fd5b615a8d84615a09565b9250615a9b60208501615a09565b9150615aa960408501615a09565b90509250925092565b60008060208385031215615ac557600080fd5b823567ffffffffffffffff80821115615add57600080fd5b818501915085601f830112615af157600080fd5b813581811115615b0057600080fd5b8660208260051b8501011115615b1557600080fd5b60209290920196919550909350505050565b803560ff81168114610f3e57600080fd5b60008060408385031215615b4b57600080fd5b8235615b56816156d4565b9150615b6460208401615b27565b90509250929050565b600080600060608486031215615b8257600080fd5b8335615b8d816156d4565b9250615b9b60208501615b27565b9150615aa960408501615b27565b60008060408385031215615bbc57600080fd5b8235615bc7816156d4565b91506020830135615a64816156d4565b60008060408385031215615bea57600080fd5b615bf383615a09565b9150615b6460208401615a09565b60008060408385031215615c1457600080fd5b8235615bc7816157d7565b60008060008060808587031215615c3557600080fd5b8435615c40816157d7565b93506020850135615c50816156d4565b9250604085013591506060850135615c67816156d4565b939692955090935050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115615cc3578160001904821115615ca957615ca9615c72565b80851615615cb657918102915b93841c9390800290615c8d565b509250929050565b600082615cda57506001610f54565b81615ce757506000610f54565b8160018114615cfd5760028114615d0757615d23565b6001915050610f54565b60ff841115615d1857615d18615c72565b50506001821b610f54565b5060208310610133831016604e8410600b8410161715615d46575081810a610f54565b615d508383615c88565b8060001904821115615d6457615d64615c72565b029392505050565b600061271160ff841683615ccb565b8082028115828204841417610f5457610f54615c72565b634e487b7160e01b600052603260045260246000fd5b600060ff821660ff8103615dbe57615dbe615c72565b60010192915050565b634e487b7160e01b600052601260045260246000fd5b600082615dec57615dec615dc7565b500490565b61ffff81811683821601908082111561568157615681615c72565b600060018201615e1e57615e1e615c72565b5060010190565b600060208284031215615e3757600080fd5b5051919050565b600060208284031215615e5057600080fd5b8151612711816157d7565b600060208284031215615e6d57600080fd5b8151612711816156d4565b80820180821115610f5457610f54615c72565b63ffffffff81811683821601908082111561568157615681615c72565b63ffffffff818116838216028082169190828114615ec857615ec8615c72565b505092915050565b600063ffffffff80841680615ee757615ee7615dc7565b92169190910492915050565b81810381811115610f5457610f54615c72565b85815284602082015260a060408201526000615f2560a0830186615706565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215615f5757600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203df85adaca5a4d5674bb344be7610f1eed1ee00ffc14e387f33ed69f77dcf48264736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39

-----Decoded View---------------
Arg [0] : LPwithEth_ToF_ (bool): True
Arg [1] : LPTargetCoinCA_ (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : marketing_ (address): 0x861435743Ae62fd6237d2FB3aB255B4f624EE40b
Arg [3] : lpLocker_ (address): 0xA3d432884968917D2fBC88d8592955a2F6c42e39

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000861435743ae62fd6237d2fb3ab255b4f624ee40b
Arg [3] : 000000000000000000000000a3d432884968917d2fbc88d8592955a2f6c42e39


Deployed Bytecode Sourcemap

49839:32717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53485:73;;;;;;;;;;;;53516:42;53485:73;;;;;-1:-1:-1;;;;;178:55:1;;;160:74;;148:2;133:18;53485:73:0;;;;;;;;64765:176;;;;;;;;;;-1:-1:-1;64765:176:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57567:80::-;;;;;;;;;;-1:-1:-1;57639:5:0;;;;;;;;;;;;;;;;;57567:80;;;;;;;:::i;50578:26::-;;;;;;;;;;-1:-1:-1;50578:26:0;;;;-1:-1:-1;;;;;50578:26:0;;;52498:126;;;;;;;;;;-1:-1:-1;52498:126:0;;;;;;;;;;;;;;;-1:-1:-1;;;52498:126:0;;;;;;;;;;2518:10:1;2555:15;;;2537:34;;2607:15;;;2602:2;2587:18;;2580:43;2659:15;;2639:18;;;2632:43;;;;2496:2;2481:18;52498:126:0;2312:369:1;58503:161:0;;;;;;;;;;-1:-1:-1;58503:161:0;;;;;:::i;:::-;;:::i;:::-;;;3267:14:1;;3260:22;3242:41;;3230:2;3215:18;58503:161:0;3102:187:1;51880:110:0;;;;;;;;;;-1:-1:-1;51880:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;3500:6:1;3533:15;;;3515:34;;3585:15;;;3580:2;3565:18;;3558:43;3637:15;;3617:18;;;3610:43;;;;3478:2;3463:18;51880:110:0;3294:365:1;70633:140:0;;;;;;;;;;-1:-1:-1;70633:140:0;;;;;:::i;:::-;-1:-1:-1;;;;;70731:34:0;70707:4;70731:34;;;:25;:34;;;;;;;;;70633:140;52367:122;;;;;;;;;;-1:-1:-1;52367:122:0;;;;;;;;;;;;;;;-1:-1:-1;;;52367:122:0;;;;;;57238:115;;;;;;;;;;;;;:::i;:::-;;;3810:25:1;;;3798:2;3783:18;57238:115:0;3664:177:1;60263:200:0;;;;;;;;;;-1:-1:-1;60263:200:0;;;;;:::i;:::-;;:::i;:::-;;58094:401;;;;;;;;;;-1:-1:-1;58094:401:0;;;;;:::i;:::-;;:::i;74161:389::-;;;;;;;;;;-1:-1:-1;74161:389:0;;;;;:::i;:::-;;:::i;52767:41::-;;;;;;;;;;;;52804:4;52767:41;;;;;7676:6:1;7664:19;;;7646:38;;7634:2;7619:18;52767:41:0;7502:188:1;69276:290:0;;;;;;;;;;-1:-1:-1;69276:290:0;;;;;:::i;:::-;;:::i;59150:1105::-;;;;;;;;;;-1:-1:-1;59150:1105:0;;;;;:::i;:::-;;:::i;57359:112::-;;;;;;;;;;;;;:::i;:::-;;;8687:4:1;8675:17;;;8657:36;;8645:2;8630:18;57359:112:0;8515:184:1;65335:911:0;;;;;;;;;;-1:-1:-1;65335:911:0;;;;;:::i;:::-;;:::i;70028:153::-;;;;;;;;;;-1:-1:-1;70028:153:0;;;;;:::i;:::-;;:::i;68719:146::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;9290:15:1;;;9272:34;;9342:15;;;;9337:2;9322:18;;9315:43;9184:18;68719:146:0;9037:327:1;54266:34:0;;;;;;;;;;-1:-1:-1;54266:34:0;;;;;;;;;;;50611:23;;;;;;;;;;-1:-1:-1;50611:23:0;;;;-1:-1:-1;;;;;50611:23:0;;;70358:127;;;;;;;;;;-1:-1:-1;70358:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;70449:28:0;70425:4;70449:28;;;:19;:28;;;;;;;;;70358:127;6511:162;;;;;;;;;;-1:-1:-1;6511:162:0;;;;;:::i;:::-;;:::i;54307:36::-;;;;;;;;;;-1:-1:-1;54307:36:0;;;;;;;;;;;7310:116;;;;;;;;;;-1:-1:-1;7310:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;7397:11:0;7374:5;7397:11;;;:6;:11;;;;;:21;-1:-1:-1;;;7397:21:0;;;;;7310:116;69871:149;;;;;;;;;;-1:-1:-1;69871:149:0;;;;;:::i;:::-;;:::i;51274:41::-;;;;;;;;;;-1:-1:-1;51274:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51274:41:0;;;;;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;-1:-1:-1;;;51274:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10590:15:1;;;10572:34;;10642:15;;;;10637:2;10622:18;;10615:43;10701:14;;10694:22;10674:18;;;10667:50;;;;10760:14;;10753:22;10748:2;10733:18;;10726:50;10820:14;;10813:22;10807:3;10792:19;;10785:51;10880:14;;10873:22;10867:3;10852:19;;10845:51;3076:13;3069:21;10944:3;10929:19;;3057:34;8502:4;8491:16;10998:3;10983:19;;8479:29;2289:10;2278:22;11053:3;11038:19;;2266:35;10065:14;10054:26;11108:3;11093:19;;10042:39;11144:3;11129:19;;11122:36;;;;11189:3;11174:19;;11167:36;10498:3;10483:19;51274:41:0;10092:1117:1;73032:325:0;;;;;;;;;;-1:-1:-1;73032:325:0;;;;;:::i;:::-;;:::i;70493:132::-;;;;;;;;;;-1:-1:-1;70493:132:0;;;;;:::i;:::-;-1:-1:-1;;;;;70587:30:0;70563:4;70587:30;;;:21;:30;;;;;;;;;70493:132;68356:179;;;;;;;;;;-1:-1:-1;68356:179:0;;;;;:::i;:::-;;:::i;6681:263::-;;;;;;;;;;-1:-1:-1;6681:263:0;;;;;:::i;:::-;;:::i;53759:75::-;;;;;;;;;;;;;;;;7193:109;;;;;;;;;;-1:-1:-1;7193:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;7278:16:0;7256:4;7278:16;;;:11;:16;;;;;;;;;7193:109;52917:45;;;;;;;;;;;;52958:4;52917:45;;5606:268;;;;;;;;;;-1:-1:-1;5606:268:0;;;;;:::i;:::-;;:::i;57794:117::-;;;;;;;;;;-1:-1:-1;57794:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;57887:16:0;57860:7;57887:16;;;:7;:16;;;;;;;57794:117;72404:620;;;;;;;;;;-1:-1:-1;72404:620:0;;;;;:::i;:::-;;:::i;78894:137::-;;;;;;;;;;-1:-1:-1;78894:137:0;;;;;:::i;:::-;;:::i;64951:208::-;;;;;;;;;;-1:-1:-1;64951:208:0;;;;;:::i;:::-;;:::i;53867:33::-;;;;;;;;;;-1:-1:-1;53867:33:0;;;;;;;;57477:84;;;;;;;;;;-1:-1:-1;57551:7:0;;;;;;;;;;;;;;;;;57477:84;;7097:88;;;;;;;;;;;;;:::i;64029:148::-;;;;;;;;;;-1:-1:-1;64029:148:0;;;;;:::i;:::-;;:::i;52237:121::-;;;;;;;;;;-1:-1:-1;52237:121:0;;;;;;;;;;;;;;;-1:-1:-1;;;52237:121:0;;;;;;57919:167;;;;;;;;;;-1:-1:-1;57919:167:0;;;;;:::i;:::-;;:::i;71802:393::-;;;;;;;;;;-1:-1:-1;71802:393:0;;;;;:::i;:::-;;:::i;68543:168::-;;;;;;;;;;-1:-1:-1;68543:168:0;;;;;:::i;:::-;;:::i;71469:325::-;;;;;;;;;;-1:-1:-1;71469:325:0;;;;;:::i;:::-;;:::i;64412:168::-;;;;;;;;;;-1:-1:-1;64412:168:0;;;;;:::i;:::-;;:::i;66425:743::-;;;;;;;;;;-1:-1:-1;66425:743:0;;;;;:::i;:::-;;:::i;54000:83::-;;;;;;;;;;;;;;;;53636:29;;;;;;;;;;-1:-1:-1;53636:29:0;;;;;;;;52110:118;;;;;;;;;;-1:-1:-1;52110:118:0;;;;;;;;;;;;;;;-1:-1:-1;;;52110:118:0;;;;;;54239:18;;;;;;;;;;-1:-1:-1;54239:18:0;;;;;;;;69574:289;;;;;;;;;;-1:-1:-1;69574:289:0;;;;;:::i;:::-;;:::i;64588:169::-;;;;;;;;;;-1:-1:-1;64588:169:0;;;;;:::i;:::-;;:::i;73901:252::-;;;;;;;;;;-1:-1:-1;73901:252:0;;;;;:::i;:::-;;:::i;57653:133::-;;;;;;;;;;-1:-1:-1;57653:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;57755:19:0;;;57737:7;57755:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;57653:133;50805:47;;;;;;;;;;-1:-1:-1;50805:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;73365:528;;;;;;;;;;-1:-1:-1;73365:528:0;;;;;:::i;:::-;;:::i;5357:210::-;;;;;;;;;;-1:-1:-1;5357:210:0;;;;;:::i;:::-;;:::i;70189:161::-;;;;;;;;;;-1:-1:-1;70189:161:0;;;;;:::i;:::-;;:::i;64765:176::-;64863:16;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64899:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:34:::1;::::0;:32:::1;:34::i;:::-;64892:41;;4522:1;64765:176:::0;;;:::o;58503:161::-;58578:4;58595:39;871:10;58618:7;58627:6;58595:8;:39::i;:::-;-1:-1:-1;58652:4:0;58503:161;;;;;:::o;57238:115::-;57293:7;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;;50186:15;50381:30;:::i;:::-;57319:1;57308:12;57304:31;;57324:8;;;57304:31;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;;50186:15;50381:30;:::i;:::-;57336:14;;57238:115;:::o;60263:200::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;60389:66:::1;60410:11;60423:14;60439:15;60389:20;:66::i;:::-;60263:200:::0;;;:::o;58094:401::-;-1:-1:-1;;;;;58215:19:0;;58194:4;58215:19;;;:11;:19;;;;;;;;871:10;58215:33;;;;;;;;-1:-1:-1;;58215:54:0;58211:208;;58286:121;58295:6;871:10;58317:89;58355:6;58317:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58317:19:0;;;;;;:11;:19;;;;;;;;871:10;58317:33;;;;;;;;;;:37;:89::i;:::-;58286:8;:121::i;:::-;58429:36;58439:6;58447:9;58458:6;58429:9;:36::i;:::-;-1:-1:-1;58483:4:0;58094:401;;;;;:::o;74161:389::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;74301:12:::1;:19;74282:8;:15;:38;74274:72;;;::::0;-1:-1:-1;;;74274:72:0;;15674:2:1;74274:72:0::1;::::0;::::1;15656:21:1::0;15713:2;15693:18;;;15686:30;15752:23;15732:18;;;15725:51;15793:18;;74274:72:0::1;;;;;;;;;74362:7;74357:186;74379:8;:15;74375:1;:19;;;74357:186;;;74449:12;74462:1;74449:15;;;;;;;;;;:::i;:::-;;;;;;;74424:21;74434:10;-1:-1:-1::0;;;;;57887:16:0;57860:7;57887:16;;;:7;:16;;;;;;;57794:117;74424:21:::1;:40;;74416:49;;;::::0;::::1;;74480:51;74490:10;74502:8;74511:1;74502:11;;;;;;;;;;:::i;:::-;;;;;;;74515:12;74528:1;74515:15;;;;;;;;;;:::i;:::-;;;;;;;74480:9;:51::i;:::-;74396:3:::0;::::1;::::0;::::1;:::i;:::-;;;;74357:186;;69276:290:::0;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;69410:4:::2;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69400:14;;;;:::i;:::-;53624:5;69364:31;69365:13:::0;::::2;50398;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69365:13;;;;:::i;:::-;69364:31;;;;:::i;:::-;:51;;69356:119;;;::::0;-1:-1:-1;;;69356:119:0;;16707:2:1;69356:119:0::2;::::0;::::2;16689:21:1::0;16746:2;16726:18;;;16719:30;16785:34;16765:18;;;16758:62;16856:25;16836:18;;;16829:53;16899:19;;69356:119:0::2;16505:419:1::0;69356:119:0::2;69486:9;:15:::0;;-1:-1:-1;;69486:15:0::2;;::::0;::::2;::::0;;::::2;::::0;;;53624:5:::2;::::0;50398:13:::2;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69528:13;;;;:::i;:::-;69527:31;;;;:::i;:::-;69512:12;:46:::0;3394:20;2788:1;3914:7;:22;3731:213;3394:20;69276:290;:::o;59150:1105::-;871:10;4569:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4569:30:0;;;;4603:1;4569:35;4561:44;;;;;;59243:14:::1;::::0;::::1;::::0;::::1;;;59239:68;;59274:14;:21:::0;;-1:-1:-1;;59274:21:0::1;;;::::0;;59239:68:::1;-1:-1:-1::0;;;;;59341:19:0;::::1;59317:21;59341:19:::0;;;:7:::1;:19;::::0;;;;59371:875;::::1;;;59402:15;::::0;::::1;::::0;-1:-1:-1;;;59402:15:0;::::1;;;59398:533;;59446:15;::::0;::::1;::::0;-1:-1:-1;;;59446:15:0;::::1;;;59438:52;;;::::0;-1:-1:-1;;;59438:52:0;;17131:2:1;59438:52:0::1;::::0;::::1;17113:21:1::0;17170:2;17150:18;;;17143:30;17209:26;17189:18;;;17182:54;17253:18;;59438:52:0::1;16929:348:1::0;59438:52:0::1;59527:4;59509:15:::0;::::1;:22:::0;;59552;;;;;;59640:5:::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;59624:12;::::0;59634:2:::1;59624:12;:::i;:::-;59623:22;;;;:::i;:::-;59600:20;::::0;::::1;:45:::0;59708:5:::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;59692:12;::::0;59702:2:::1;59692:12;:::i;:::-;59691:22;;;;:::i;:::-;59671:17;::::0;::::1;:42:::0;59773:4:::1;59742:28:::0;::::1;:35:::0;;-1:-1:-1;;;59796:49:0;;;;-1:-1:-1;;;59832:12:0::1;59796:49;;;::::0;;;;59864:25:::1;::::0;::::1;:51:::0;;-1:-1:-1;;59864:51:0::1;59899:15;59864:51;;;::::0;;59398:533:::1;59945:21;::::0;::::1;:31:::0;;-1:-1:-1;;;;59945:31:0::1;-1:-1:-1::0;;;59945:31:0;::::1;;;;::::0;;59996:70:::1;::::0;;-1:-1:-1;;;;;17498:55:1;;17480:74;;17602:10;60027:12:0::1;17590:23:1::0;17585:2;17570:18;;17563:51;17662:14;60049:15:0::1;17650:27:1::0;17630:18;;;17623:55;;;;59996:70:0::1;::::0;17468:2:1;17453:18;59996:70:0::1;;;;;;;;60263:200:::0;;;:::o;59371:875::-:1;60088:7;60084:162;;60112:21;::::0;::::1;:31:::0;;-1:-1:-1;;;;60112:31:0::1;-1:-1:-1::0;;;60112:31:0;::::1;;;;::::0;;60163:71:::1;::::0;;-1:-1:-1;;;;;17498:55:1;;17480:74;;17602:10;60195:12:0::1;17590:23:1::0;17585:2;17570:18;;17563:51;17662:14;60217:15:0::1;17650:27:1::0;17630:18;;;17623:55;;;;60163:71:0::1;::::0;17468:2:1;17453:18;60163:71:0::1;17282:402:1::0;57359:112:0;57411:5;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;;50186:15;50381:30;:::i;:::-;57435:1;57424:12;57420:31;;57440:8;;;57420:31;-1:-1:-1;50286:2:0;;57359:112::o;65335:911::-;65432:4;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;52804:4:::1;65457:21;::::0;::::1;;::::0;::::1;::::0;:65:::1;;-1:-1:-1::0;52853:4:0::1;65499:23;::::0;::::1;;;65457:65;:117;;;;-1:-1:-1::0;52906:4:0::1;65543:31;::::0;::::1;;;65457:117;65449:170;;;::::0;-1:-1:-1;;;65449:170:0;;17891:2:1;65449:170:0::1;::::0;::::1;17873:21:1::0;17930:2;17910:18;;;17903:30;17969:25;17949:18;;;17942:53;18012:18;;65449:170:0::1;17689:347:1::0;65449:170:0::1;52958:4;65638:16;65647:7:::0;65638:6;:16:::1;:::i;:::-;:35;;;;65630:80;;;::::0;-1:-1:-1;;;65630:80:0;;18416:2:1;65630:80:0::1;::::0;::::1;18398:21:1::0;;;18435:18;;;18428:30;18494:34;18474:18;;;18467:62;18546:18;;65630:80:0::1;18214:356:1::0;65630:80:0::1;65759:6;:13:::0;65721:14:::1;::::0;65759:23:::1;::::0;;::::1;:13:::0;::::1;:23;65756:128;;65799:6;:22:::0;;-1:-1:-1;;65799:22:0::1;;::::0;::::1;;::::0;;65848:24:::1;:22;:24::i;:::-;65836:36;;65756:128;65907:6;:14:::0;:25:::1;::::0;;::::1;:14:::0;;;::::1;;:25;65904:133;;65949:6;:24:::0;;-1:-1:-1;;65949:24:0::1;::::0;::::1;::::0;::::1;;;::::0;;66000:25:::1;:23;:25::i;:::-;65988:37;;65904:133;66060:6;:18:::0;:33:::1;::::0;;::::1;:18:::0;;;::::1;;:33;66057:153;;66110:6;:32:::0;;-1:-1:-1;;66110:32:0::1;::::0;::::1;::::0;::::1;;;::::0;;66169:29:::1;:27;:29::i;:::-;66157:41;;66057:153;66229:9:::0;65335:911;-1:-1:-1;;;;65335:911:0:o;70028:153::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;-1:-1:-1::0;;;;;70133:30:0;::::2;;::::0;;;:21:::2;:30;::::0;;;;:40;;-1:-1:-1;;70133:40:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3914:22:0;;70028:153;;:::o;68719:146::-;68771:17;68790:16;68827:14;68947:11;:21;-1:-1:-1;;;;;68947:21:0;;68873:103;68827:14;69057:20;;-1:-1:-1;;;;;69057:20:0;68819:38;;;;68719:146;;:::o;6511:162::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;6589:6:::1;6585:81;6599:14:::0;;::::1;6585:81;;;6635:19;6647:3;;6651:1;6647:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7017:11:0;;;;;:6;:11;;;;;;;;7010:18;;-1:-1:-1;;7010:18:0;;;7043:11;:16;;;;;:24;;-1:-1:-1;;7043:24:0;;;6952:123;6635:19:::1;6615:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6585:81;;69871:149:::0;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;-1:-1:-1::0;;;;;69974:28:0;::::2;;::::0;;;:19:::2;:28;::::0;;;;:38;;-1:-1:-1;;69974:38:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3914:22:0;;70028:153;;:::o;73032:325::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;73178:3:::1;73156:18;:25;;;;73148:58;;;::::0;-1:-1:-1;;;73148:58:0;;18917:2:1;73148:58:0::1;::::0;::::1;18899:21:1::0;18956:2;18936:18;;;18929:30;18995:22;18975:18;;;18968:50;19035:18;;73148:58:0::1;18715:344:1::0;73148:58:0::1;-1:-1:-1::0;;;;;73219:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:25:::1;;:46:::0;;;::::1;-1:-1:-1::0;;;73219:46:0::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;73283:66;;19234:74:1;;;19324:18;;;19317:45;73283:66:0::1;::::0;19207:18:1;73283:66:0::1;;;;;;;;73032:325:::0;;:::o;68356:179::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;68446:11:::2;:33:::0;;-1:-1:-1;;;;;68446:33:0;::::2;-1:-1:-1::0;;;;;;68446:33:0;;::::2;::::0;::::2;::::0;;;:21:::2;68490:30:::0;;;:19:::2;:30;::::0;;;;:37;;-1:-1:-1;;68490:37:0::2;68446:33:::0;68490:37:::2;::::0;;3394:20;2788:1;3914:7;:22;3731:213;6681:263;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4826:26;;:78;;-1:-1:-1;871:10:0;4869:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4869:30:0;;;;4903:1;4869:35;4826:78;:130;;;-1:-1:-1;871:10:0;4921:20;;;;:6;:20;;;;;;;;:30;-1:-1:-1;;;4921:30:0;;;;:35;4826:130;:183;;;-1:-1:-1;871:10:0;4974:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4974:30:0;;;;5008:1;4974:35;4826:183;4818:206;;;;;;-1:-1:-1;;;;;6761:19:0;::::1;871:10:::0;6761:19:::1;6753:79;;;::::0;-1:-1:-1;;;6753:79:0;;19575:2:1;6753:79:0::1;::::0;::::1;19557:21:1::0;19614:2;19594:18;;;19587:30;19653:34;19633:18;;;19626:62;19724:17;19704:18;;;19697:45;19759:19;;6753:79:0::1;19373:411:1::0;6753:79:0::1;-1:-1:-1::0;;;;;6851:16:0;::::1;;::::0;;;:11:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;6843:66;;;::::0;-1:-1:-1;;;6843:66:0;;19991:2:1;6843:66:0::1;::::0;::::1;19973:21:1::0;20030:2;20010:18;;;20003:30;20069:31;20049:18;;;20042:59;20118:18;;6843:66:0::1;19789:353:1::0;6843:66:0::1;6920:16;6932:3;-1:-1:-1::0;;;;;7017:11:0;;;;;:6;:11;;;;;;;;7010:18;;-1:-1:-1;;7010:18:0;;;7043:11;:16;;;;;:24;;-1:-1:-1;;7043:24:0;;;6952:123;5606:268;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;5694:10:::1;:15;;5708:1;5694:15:::0;5691:124:::1;;871:10:::0;5730:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;5730:30:0;::::1;;;5764:1;5730:35;5722:83;;;::::0;-1:-1:-1;;;5722:83:0;;20349:2:1;5722:83:0::1;::::0;::::1;20331:21:1::0;20388:2;20368:18;;;20361:30;20427:34;20407:18;;;20400:62;20498:5;20478:18;;;20471:33;20521:19;;5722:83:0::1;20147:399:1::0;5722:83:0::1;-1:-1:-1::0;;;;;5992:16:0;;5967:22;5992:16;;;:6;:16;;;;;;;;6023:22;;-1:-1:-1;;6060:31:0;;;;-1:-1:-1;;;6060:31:0;;;;;;;;6105:11;:21;;;:28;;-1:-1:-1;;6105:28:0;-1:-1:-1;6105:28:0;;;70028:153;;:::o;72404:620::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;72551:19:0;;::::1;72528:20;72551:19:::0;;;:7:::1;:19;::::0;;;;;;;72528:42;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;;::::0;;::::1;;;::::0;;;;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;72528:42:0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;72528:42:0;;::::1;;;;::::0;;;::::1;::::0;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;72636:5:::1;::::0;72606:26;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72606:26;;;;:::i;:::-;72605:36;;;;:::i;:::-;72581:60:::0;-1:-1:-1;72652:18:0::1;72697:5;72674:19;::::0;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72674:19;;;;:::i;:::-;72673:29;;;;:::i;:::-;72652:50;;72738:10;72721:13;:27;;72713:73;;;::::0;-1:-1:-1;;;72713:73:0;;20753:2:1;72713:73:0::1;::::0;::::1;20735:21:1::0;20792:2;20772:18;;;20765:30;20831:34;20811:18;;;20804:62;-1:-1:-1;;;20882:18:1;;;20875:31;20923:19;;72713:73:0::1;20551:397:1::0;72713:73:0::1;72853:5;72823:26;::::0;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72823:26;;;;:::i;:::-;72822:36;;;;:::i;:::-;72799:20;::::0;::::1;:59:::0;72913:5:::1;72890:19;::::0;::::1;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::1;50381:30;:::i;:::-;72890:19;;;;:::i;:::-;72889:29;;;;:::i;:::-;72869:17;::::0;::::1;:49:::0;;;72976:20:::1;::::0;::::1;::::0;72936:80:::1;::::0;;-1:-1:-1;;;;;21173:55:1;;21155:74;;21260:2;21245:18;;21238:34;;;;21288:18;;21281:34;;;;72936:80:0::1;::::0;21143:2:1;21128:18;72936:80:0::1;;;;;;;;72517:507;;;72404:620:::0;;;:::o;78894:137::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;79004:4:::1;57860:7:::0;57887:16;;;:7;:16;;;;;;78973:50:::1;::::0;79012:10:::1;78973:12;:50::i;64951:208::-:0;871:10;4569:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4569:30:0;;;;4603:1;4569:35;4561:44;;;;;;-1:-1:-1;;;;;65040:23:0;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;;:49;;-1:-1:-1;;65040:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;65107:44;;21494:74:1;;;21584:18;;;21577:50;65107:44:0::1;::::0;21467:18:1;65107:44:0::1;21326:307:1::0;7097:88:0;7142:7;7167:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;64029:148;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64126:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:43:::1;::::0;64159:9;64126:32:::1;:43::i;57919:167::-:0;57997:4;58014:42;871:10;58038:9;58049:6;58014:9;:42::i;71802:393::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;71928:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;:35:::1;;::::0;:61;::::1;;-1:-1:-1::0;;;71928:35:0;;::::1;;;:61;;::::0;71920:107:::1;;;::::0;-1:-1:-1;;;71920:107:0;;21840:2:1;71920:107:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;21918:34;21898:18;;;21891:62;-1:-1:-1;;;21969:18:1;;;21962:31;22010:19;;71920:107:0::1;21638:397:1::0;71920:107:0::1;-1:-1:-1::0;;;;;72038:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:37:::1;;:62:::0;;;::::1;-1:-1:-1::0;;;72038:62:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;72118:69;;21494:74:1;;;21584:18;;;21577:50;72118:69:0::1;::::0;21467:18:1;72118:69:0::1;21326:307:1::0;68543:168:0;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;68625:20:::0;:31;;-1:-1:-1;;;;;68625:31:0;::::2;-1:-1:-1::0;;;;;;68625:31:0;;::::2;::::0;::::2;::::0;;;:20:::2;68667:29:::0;;;:19:::2;:29;::::0;;;;:36;;-1:-1:-1;;68667:36:0::2;68625:20;68667:36;::::0;;3394:20;2788:1;3914:7;:22;3731:213;71469:325;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;71573:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;:35:::1;;::::0;:50;::::1;;-1:-1:-1::0;;;71573:35:0;;::::1;;;:50;;::::0;71565:96:::1;;;::::0;-1:-1:-1;;;71565:96:0;;21840:2:1;71565:96:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;21918:34;21898:18;;;21891:62;-1:-1:-1;;;21969:18:1;;;21962:31;22010:19;;71565:96:0::1;21638:397:1::0;71565:96:0::1;-1:-1:-1::0;;;;;71672:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:35:::1;;:49:::0;;;::::1;-1:-1:-1::0;;;71672:49:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;71739:47;;21494:74:1;;;21584:18;;;21577:50;71739:47:0::1;::::0;21467:18:1;71739:47:0::1;21326:307:1::0;64412:168:0;64511:7;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64538:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:34:::1;::::0;:32:::1;:34::i;66425:743::-:0;66508:4;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;66545:21:::1;66557:9:::0;66545;:21:::1;:::i;:::-;66525:7;:41:::0;;-1:-1:-1;;;;66525:41:0;::::1;;::::0;;::::1;-1:-1:-1::0;;;66525:41:0::1;::::0;;::::1;::::0;;;-1:-1:-1;;66615:30:0;::::1;66525:41;66615:17:::0;;;;;;;;:30:::1;66612:250;;66662:7;:29:::0;;-1:-1:-1;;66662:29:0::1;;::::0;::::1;;::::0;;66718:24:::1;:22;:24::i;:::-;66706:36;;66769:25;:23;:25::i;:::-;66757:37;;66821:29;:27;:29::i;:::-;66809:41;;66612:250;66885:7;:17:::0;::::1;::::0;;;::::1;;:30;::::0;::::1;;66882:250;;66932:7;:29:::0;;-1:-1:-1;;66932:29:0::1;;::::0;::::1;::::0;::::1;;::::0;;66988:24:::1;:22;:24::i;:::-;66976:36;;67039:25;:23;:25::i;:::-;67027:37;;67091:29;:27;:29::i;:::-;67079:41;;66882:250;67151:9:::0;66425:743;-1:-1:-1;;;66425:743:0:o;69574:289::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;69709:3:::2;50398:13;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69699:13;;;;:::i;:::-;53624:5;69663:31;69664:13:::0;::::2;50398;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69664:13;;;;:::i;:::-;69663:31;;;;:::i;:::-;:50;;69655:111;;;::::0;-1:-1:-1;;;69655:111:0;;22242:2:1;69655:111:0::2;::::0;::::2;22224:21:1::0;22281:2;22261:18;;;22254:30;22320:34;22300:18;;;22293:62;22391:18;22371;;;22364:46;22427:19;;69655:111:0::2;22040:412:1::0;69655:111:0::2;69777:13;:19:::0;;-1:-1:-1;;69777:19:0::2;;::::0;::::2;::::0;;::::2;::::0;;;53624:5:::2;::::0;50398:13:::2;50286:2;50398;:13;:::i;:::-;50381:30;::::0;50186:15:::2;50381:30;:::i;:::-;69825:13;;;;:::i;:::-;69824:31;;;;:::i;:::-;69807:14;:48:::0;3394:20;2788:1;3914:7;:22;3731:213;64588:169;64687:7;4437:10;7518:6;;-1:-1:-1;;;;;7518:6:0;;7450:82;4437:10;-1:-1:-1;;;;;4421:26:0;871:10;-1:-1:-1;;;;;4421:26:0;;:78;;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;-1:-1:-1;;;;;64714:25:0;::::1;;::::0;;;:8:::1;:25;::::0;;;;:35:::1;::::0;64743:5;64714:28:::1;:35::i;73901:252::-:0;73981:7;74005:10;74001:145;;;-1:-1:-1;74038:21:0;74031:28;;74001:145;74099:35;;-1:-1:-1;;;74099:35:0;;74128:4;74099:35;;;160:74:1;-1:-1:-1;;;;;74099:20:0;;;;;133:18:1;;74099:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74092:42;;;;73365:528;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;73485:36:::1;73506:10;73518:2;73485:20;:36::i;:::-;73478:3;:43;;73470:52;;;::::0;::::1;;73533:49;::::0;-1:-1:-1;;;73533:49:0;;-1:-1:-1;;;;;22838:55:1;;;73533:49:0::1;::::0;::::1;22820:74:1::0;-1:-1:-1;;22910:18:1;;;22903:34;73533:18:0;::::1;::::0;::::1;::::0;22793::1;;73533:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73597:10;73593:293;;;73624:9;73646:10;-1:-1:-1::0;;;;;73638:24:0::1;73670:3;73680:5;73638:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73623:67;;;73713:4;73705:26;;;::::0;-1:-1:-1;;;73705:26:0;;23610:2:1;73705:26:0::1;::::0;::::1;23592:21:1::0;23649:1;23629:18;;;23622:29;-1:-1:-1;;;23667:18:1;;;23660:39;23716:18;;73705:26:0::1;23408:332:1::0;73705:26:0::1;73608:135;73593:293;;;73778:55;::::0;-1:-1:-1;;;73778:55:0;;73810:4:::1;73778:55;::::0;::::1;24008:34:1::0;-1:-1:-1;;;;;24078:15:1;;;24058:18;;;24051:43;24110:18;;;24103:34;;;73765:9:0::1;::::0;73778:23;;::::1;::::0;::::1;::::0;23920:18:1;;73778:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73764:69;;73856:4;73848:26;;;::::0;-1:-1:-1;;;73848:26:0;;23610:2:1;73848:26:0::1;::::0;::::1;23592:21:1::0;23649:1;23629:18;;;23622:29;-1:-1:-1;;;23667:18:1;;;23660:39;23716:18;;73848:26:0::1;23408:332:1::0;73848:26:0::1;73749:137;73593:293;73365:528:::0;;;;:::o;5357:210::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26;;:78;;-1:-1:-1;871:10:0;4464:20;;;;:6;:20;;;;;:30;-1:-1:-1;;;4464:30:0;;;;4498:1;4464:35;4421:78;4413:102;;;;;;5442:6:::1;::::0;-1:-1:-1;;;;;5442:6:0;;::::1;5430:18:::0;;::::1;::::0;5422:65:::1;;;::::0;-1:-1:-1;;;5422:65:0;;24350:2:1;5422:65:0::1;::::0;::::1;24332:21:1::0;24389:2;24369:18;;;24362:30;24428:34;24408:18;;;24401:62;-1:-1:-1;;;24479:18:1;;;24472:32;24521:19;;5422:65:0::1;24148:398:1::0;5422:65:0::1;5520:6;::::0;5499:38:::1;::::0;-1:-1:-1;;;;;5499:38:0;;::::1;::::0;5520:6:::1;::::0;5499:38:::1;::::0;5520:6:::1;::::0;5499:38:::1;5544:6;:17:::0;;-1:-1:-1;;;;;;5544:17:0::1;-1:-1:-1::0;;;;;5544:17:0;;;::::1;::::0;;;::::1;::::0;;5357:210::o;70189:161::-;3350:21;:19;:21::i;:::-;7518:6;;-1:-1:-1;;;;;7518:6:0;871:10;4421:26:::1;::::0;:78:::1;;-1:-1:-1::0;871:10:0;4464:20:::1;::::0;;;:6:::1;:20;::::0;;;;:30;-1:-1:-1;;;4464:30:0;::::1;;;4498:1;4464:35;4421:78;4413:102;;;::::0;::::1;;-1:-1:-1::0;;;;;70298:34:0;::::2;;::::0;;;:25:::2;:34;::::0;;;;:44;;-1:-1:-1;;70298:44:0::2;::::0;::::2;;;::::0;;-1:-1:-1;3914:22:0;;70028:153;;:::o;8772:326::-;-1:-1:-1;;;;;9067:19:0;;:23;;;8772:326::o;31429:152::-;31499:4;31523:50;31528:3;-1:-1:-1;;;;;31548:23:0;;31523:4;:50::i;33433:310::-;33496:16;33525:22;33550:19;33558:3;33550:7;:19::i;58672:310::-;-1:-1:-1;;;;;58767:20:0;;58759:52;;;;-1:-1:-1;;;58759:52:0;;24753:2:1;58759:52:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:21;24811:18;;;24804:49;24870:18;;58759:52:0;24551:343:1;58759:52:0;-1:-1:-1;;;;;58830:21:0;;58822:53;;;;-1:-1:-1;;;58822:53:0;;24753:2:1;58822:53:0;;;24735:21:1;24792:2;24772:18;;;24765:30;24831:21;24811:18;;;24804:49;24870:18;;58822:53:0;24551:343:1;58822:53:0;-1:-1:-1;;;;;58888:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;58941:33;;3810:25:1;;;58941:33:0;;3783:18:1;58941:33:0;;;;;;;58672:310;;;:::o;60471:1189::-;-1:-1:-1;;;;;60592:23:0;;;;;;:10;:23;;;;;;;;:32;;;;60588:1065;;-1:-1:-1;;;;;60670:23:0;;60643:24;60670:23;;;:10;:23;;;;;;;;60708:29;;60733:4;-1:-1:-1;;60708:29:0;;;;;;;60754:10;:23;;;;;;:30;;;;;;;;;;;60806:25;160:74:1;;;60670:23:0;;60806:25;;133:18:1;60806:25:0;;;;;;;60848:57;60860:11;60873:14;60889:15;60848:11;:57::i;60588:1065::-;60938:9;:34;;-1:-1:-1;;;;;;60938:34:0;-1:-1:-1;;;;;60938:34:0;;;;;-1:-1:-1;61018:624:0;;;;61074:9;;;;;;;;;-1:-1:-1;;;;;61074:9:0;-1:-1:-1;;;;;61074:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61056:34;;61131:9;;;;;;;;;-1:-1:-1;;;;;61131:9:0;-1:-1:-1;;;;;61131:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61120:71;;-1:-1:-1;;;61120:71:0;;-1:-1:-1;;;;;9290:15:1;;;61120:71:0;;;9272:34:1;61185:4:0;9322:18:1;;;9315:43;61120:39:0;;;;;;;9184:18:1;;61120:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61218:17:0;;;;;;:7;:17;;;;;;61109:82;;-1:-1:-1;61218:17:0;;:26;61210:59;;;;-1:-1:-1;;;61210:59:0;;25357:2:1;61210:59:0;;;25339:21:1;25396:2;25376:18;;;25369:30;25435:22;25415:18;;;25408:50;25475:18;;61210:59:0;25155:344:1;61210:59:0;61290:57;61302:11;61315:14;61331:15;61290:11;:57::i;:::-;61018:624;;;61410:9;;;;;;;;;-1:-1:-1;;;;;61410:9:0;-1:-1:-1;;;;;61410:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61399:71;;-1:-1:-1;;;61399:71:0;;-1:-1:-1;;;;;9290:15:1;;;61399:71:0;;;9272:34:1;61464:4:0;9322:18:1;;;9315:43;61399:39:0;;;;;;;9184:18:1;;61399:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;61497:17:0;;;;;;:7;:17;;;;;;61388:82;;-1:-1:-1;61497:17:0;;:26;61489:59;;;;-1:-1:-1;;;61489:59:0;;25357:2:1;61489:59:0;;;25339:21:1;25396:2;25376:18;;;25369:30;25435:22;25415:18;;;25408:50;25475:18;;61489:59:0;25155:344:1;61489:59:0;61569:57;61581:11;61594:14;61610:15;61569:11;:57::i;21247:240::-;21367:7;21428:12;21420:6;;;;21412:29;;;;-1:-1:-1;;;21412:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;21463:5:0;;;21247:240::o;74672:3603::-;-1:-1:-1;;;;;74761:18:0;;74753:68;;;;-1:-1:-1;;;74753:68:0;;25706:2:1;74753:68:0;;;25688:21:1;25745:2;25725:18;;;25718:30;25784:34;25764:18;;;25757:62;25855:7;25835:18;;;25828:35;25880:19;;74753:68:0;25504:401:1;74753:68:0;-1:-1:-1;;;;;74840:16:0;;74832:64;;;;-1:-1:-1;;;74832:64:0;;26112:2:1;74832:64:0;;;26094:21:1;26151:2;26131:18;;;26124:30;26190:34;26170:18;;;26163:62;26261:5;26241:18;;;26234:33;26284:19;;74832:64:0;25910:399:1;74832:64:0;74924:1;74915:6;:10;74907:64;;;;-1:-1:-1;;;74907:64:0;;26516:2:1;74907:64:0;;;26498:21:1;26555:2;26535:18;;;26528:30;26594:34;26574:18;;;26567:62;26665:11;26645:18;;;26638:39;26694:19;;74907:64:0;26314:405:1;74907:64:0;-1:-1:-1;;;;;75072:13:0;;74982:8;75072:13;;;:7;:13;;;;;;74982:8;;;;75072:13;;75068:220;;;75127:8;:15;;-1:-1:-1;;;;;;75127:15:0;-1:-1:-1;;;;;75127:15:0;;;;;-1:-1:-1;;;75068:220:0;;;-1:-1:-1;;;;;75164:11:0;;;;;;:7;:11;;;;;;;;75160:128;;;75218:8;:13;;-1:-1:-1;;;;;;75218:13:0;-1:-1:-1;;;;;75218:13:0;;;;;-1:-1:-1;;;75160:128:0;;;-1:-1:-1;75272:4:0;75160:128;75331:8;;-1:-1:-1;;;;;75331:8:0;;;75300:20;75323:17;;;:7;:17;;;;;;;;;75300:40;;;;;;;;;;;;;75331:8;75300:40;;;;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;;;;;-1:-1:-1;;;75300:40:0;;;;;75331:8;75300:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;75356:20;75367:4;75373:2;75356:10;:20::i;:::-;75353:840;;;75401:14;;;;;;;75393:47;;;;-1:-1:-1;;;75393:47:0;;26926:2:1;75393:47:0;;;26908:21:1;26965:2;26945:18;;;26938:30;27004:22;26984:18;;;26977:50;27044:18;;75393:47:0;26724:344:1;75393:47:0;75458:3;:11;;;;75465:4;75458:11;75455:227;;;75509:12;;-1:-1:-1;;;;;75498:24:0;;;;;:10;:24;;;;;:40;;;75490:89;;;;-1:-1:-1;;;75490:89:0;;27275:2:1;75490:89:0;;;27257:21:1;27314:2;27294:18;;;27287:30;27353:34;27333:18;;;27326:62;27424:6;27404:18;;;27397:34;27448:19;;75490:89:0;27073:400:1;75490:89:0;75606:6;:21;;;75598:68;;;;-1:-1:-1;;;75598:68:0;;27680:2:1;75598:68:0;;;27662:21:1;27719:2;27699:18;;;27692:30;27758:34;27738:18;;;27731:62;-1:-1:-1;;;27809:18:1;;;27802:32;27851:19;;75598:68:0;27478:398:1;75598:68:0;75701:3;:11;;;;75708:4;75701:11;75698:232;;;-1:-1:-1;;;;;75738:27:0;;;;;;:21;:27;;;;;;;;75737:28;:58;;;;-1:-1:-1;;;;;;75770:25:0;;;;;;:21;:25;;;;;;;;75769:26;75737:58;75733:182;;;75838:12;;75828:6;:22;;75820:75;;;;-1:-1:-1;;;75820:75:0;;28083:2:1;75820:75:0;;;28065:21:1;28122:2;28102:18;;;28095:30;28161:34;28141:18;;;28134:62;28232:10;28212:18;;;28205:38;28260:19;;75820:75:0;27881:404:1;75820:75:0;75955:12;;-1:-1:-1;;;;;75949:18:0;;;;;;;;;:27;;;75972:4;75971:5;75949:27;75946:236;;;-1:-1:-1;;;;;76002:25:0;;;;;;:21;:25;;;;;;;;75997:170;;76086:14;;76076:6;76060:13;76070:2;-1:-1:-1;;;;;57887:16:0;57860:7;57887:16;;;:7;:16;;;;;;;57794:117;76060:13;:22;;;;:::i;:::-;:40;;76052:95;;;;-1:-1:-1;;;76052:95:0;;28622:2:1;76052:95:0;;;28604:21:1;28661:2;28641:18;;;28634:30;28700:34;28680:18;;;28673:62;28771:12;28751:18;;;28744:40;28801:19;;76052:95:0;28420:406:1;76052:95:0;76208:4;76205:718;;;76234:6;;;;76229:683;;76265:6;:26;;;76261:636;;;76365:4;76316:28;57887:16;;;:7;:16;;;;;;76422:20;;;;76398:44;;76394:484;;76489:17;;;;76536:28;;;;76533:104;;;76601:16;;;;76589:8;;-1:-1:-1;;;;;76589:8:0;57860:7;57887:16;;;:7;:16;;;;;;53624:5;;76579:38;;;;;;;:::i;:::-;76578:56;;;;:::i;:::-;76568:66;;76533:104;76690:7;76666:20;:31;76663:71;;76724:7;76701:30;;76663:71;76795:8;;76760:44;;76773:20;;-1:-1:-1;;;;;76795:8:0;76760:12;:44::i;:::-;76444:434;76394:484;76293:604;76261:636;77004:6;:15;;;77000:304;;77065:8;;77036:38;;77055:4;;77061:2;;-1:-1:-1;;;;;77065:8:0;77036:18;:38::i;:::-;77093:6;:15;;;77092:16;:40;;;;;77112:20;77123:4;77129:2;77112:10;:20::i;:::-;77092:76;;;;-1:-1:-1;;;;;;77137:31:0;;;;;;:25;:31;;;;;;;;77136:32;77092:76;:110;;;;-1:-1:-1;;;;;;77173:29:0;;;;;;:25;:29;;;;;;;;77172:30;77092:110;:120;;;;;77207:5;77206:6;77092:120;77089:204;;;77233:44;;-1:-1:-1;;;77233:44:0;;29033:2:1;77233:44:0;;;29015:21:1;29072:2;29052:18;;;29045:30;29111:34;29091:18;;;29084:62;29182:4;29162:18;;;29155:32;29204:19;;77233:44:0;28831:398:1;77089:204:0;-1:-1:-1;;;;;77351:25:0;;77314:23;77351:25;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;77380:23:0;;;;;;:19;:23;;;;;;;;77351:52;77348:747;;;-1:-1:-1;77438:6:0;77348:747;;;77480:3;77477:228;;;77520:10;77504:26;:13;:26;;;;;;-1:-1:-1;;77504:26:0;;;;;;;;;;;;;;;-1:-1:-1;;;;77504:26:0;-1:-1:-1;;;77504:26:0;;;;;;;;;;;;;;;;;77477:228;;;77555:4;77552:153;;;77596:11;77580:27;:13;:27;;;;;;-1:-1:-1;;77580:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;77580:27:0;-1:-1:-1;;;77580:27:0;;;;;;;;;;;;;;;;;77552:153;;;77632:5;77629:76;;;77674:15;77658:31;:13;:31;;;;;;-1:-1:-1;;77658:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;77658:31:0;-1:-1:-1;;;77658:31:0;;;;;;;;;;;;;;;;;77629:76;77782:13;:23;77721:18;;77742:87;;53004:5;;77742:65;;77753:53;;77782:23;;;;;;;77754;77753:53;:::i;:::-;77742:65;;:6;:10;;:65;;;;:::i;:::-;:69;;:87::i;:::-;77721:108;-1:-1:-1;77862:22:0;:6;77721:108;77862:10;:22::i;:::-;-1:-1:-1;;;;;77915:13:0;;;;;;:7;:13;;;;;;77844:40;;-1:-1:-1;77915:29:0;;77933:10;77915:17;:29::i;:::-;-1:-1:-1;;;;;77899:13:0;;;;;;:7;:13;;;;;;:45;;;;78000:4;77984:22;;;;:38;;78011:10;77984:26;:38::i;:::-;77975:4;77959:22;;;;:7;:22;;;;;;;:63;;;;78042:41;;-1:-1:-1;;;;;78042:41:0;;;;;;;78072:10;3810:25:1;;3798:2;3783:18;;3664:177;78042:41:0;;;;;;;;77462:633;77348:747;-1:-1:-1;;;;;78123:13:0;;;;;;:7;:13;;;;;;:34;;78141:15;78123:17;:34::i;:::-;-1:-1:-1;;;;;78107:13:0;;;;;;;:7;:13;;;;;;:50;;;;78182:11;;;;;;;:32;;78198:15;78182;:32::i;:::-;-1:-1:-1;;;;;78168:11:0;;;;;;;:7;:11;;;;;;;:46;;;;78232:35;;;;;;;;;;78251:15;3810:25:1;;3798:2;3783:18;;3664:177;78232:35:0;;;;;;;;74742:3533;;;;;74672:3603;;;:::o;3430:293::-;2832:1;3564:7;;:19;3556:63;;;;-1:-1:-1;;;3556:63:0;;29613:2:1;3556:63:0;;;29595:21:1;29652:2;29632:18;;;29625:30;29691:33;29671:18;;;29664:61;29742:18;;3556:63:0;29411:355:1;3556:63:0;2832:1;3697:7;:18;3430:293::o;67176:360::-;67314:7;:17;67278:6;:13;67227:4;;67314:17;-1:-1:-1;;;67314:17:0;;;;;67278:33;;67294:17;;;;;67278:13;;:33;:::i;:::-;:53;;;;:::i;:::-;67255:10;:76;;-1:-1:-1;;67255:76:0;;;;;;;;67401:7;:17;67365:6;:13;-1:-1:-1;;;67401:17:0;;;;;67365:33;;67381:17;;;;;67365:13;;:33;:::i;:::-;:53;;;;:::i;:::-;67342:10;:76;;-1:-1:-1;;67342:76:0;;;;;;;;;;;;;;;;67452:43;;67475:20;;;;;67452;;;;;;:43;:::i;:::-;67429:10;:66;;;;;;;-1:-1:-1;;;67429:66:0;-1:-1:-1;;;;67429:66:0;;;;;;;;;-1:-1:-1;;;67176:360:0:o;67544:368::-;67685:7;:17;67648:6;:14;67596:4;;67685:17;-1:-1:-1;;;67685:17:0;;;;;67648:34;;67665:17;;;;;67648:14;;;;;;:34;:::i;:::-;:54;;;;:::i;:::-;67624:11;:78;;-1:-1:-1;;67624:78:0;;;;;;;;67774:7;:17;67737:6;:14;-1:-1:-1;;;67774:17:0;;;;;67737:34;;67754:17;;;;;67737:14;;;;;:34;:::i;:::-;:54;;;;:::i;:::-;67713:11;:78;;-1:-1:-1;;67713:78:0;;;;;;;;;;;;;;;;67826:45;;67850:21;;;;;67826;;;;;;:45;:::i;:::-;67802:11;:69;;;;;;;-1:-1:-1;;;67802:69:0;-1:-1:-1;;;;67802:69:0;;;;;;;;;-1:-1:-1;;;67544:368:0:o;67920:400::-;68073:7;:17;68032:6;:18;67976:4;;68073:17;-1:-1:-1;;;68073:17:0;;;;;68032:38;;68053:17;;;;;68032:18;;;;;;:38;:::i;:::-;:58;;;;:::i;:::-;68004:15;:86;;-1:-1:-1;;68004:86:0;;;;;;;;68170:7;:17;68129:6;:18;-1:-1:-1;;;68170:17:0;;;;;68129:38;;68150:17;;;;;;;;;68129:18;;;:38;:::i;:::-;:58;;;;:::i;:::-;68101:15;:86;;-1:-1:-1;;68101:86:0;;;;;;;;;;;;;;;;68226:53;;68254:25;;;;;68226;;;;;;:53;:::i;:::-;68198:15;:81;;;;;;;-1:-1:-1;;;68198:81:0;-1:-1:-1;;;;68198:81:0;;;;;;;;;-1:-1:-1;;;67920:400:0:o;79039:3123::-;54173:6;:13;;-1:-1:-1;;54173:13:0;54182:4;54173:13;;;;;;-1:-1:-1;;;;;79166:19:0;;::::1;54173:6:::0;79166:19;;;:7:::1;:19;::::0;;;;;;;79143:42;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;79143:42:0;::::1;54173:13:::0;79143:42;;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;::::1;;;::::0;;;;-1:-1:-1;;;79143:42:0;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;79143:42:0;;::::1;::::0;::::1;54173:13:::0;79143:42;;;::::1;::::0;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;79196:9:::1;:35:::0;;-1:-1:-1;;;;;;79196:35:0::1;::::0;;::::1;::::0;;;79244:36;;;;::::1;::::0;;79267:13:::1;79244:36:::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;79244:36:0;;::::1;::::0;;::::1;::::0;;;;;;;79295:21;;79291:60:::1;;79333:7;;;;79291:60;79386:4;79366:26;::::0;;;:11:::1;:26;::::0;;;;;;;79401:9:::1;::::0;-1:-1:-1;;;;;79401:9:0::1;79366:46:::0;;;;;;;;-1:-1:-1;;79366:67:0::1;79363:165;;79470:4;79450:26;::::0;;;:11:::1;:26;::::0;;;;;;;79485:9:::1;::::0;-1:-1:-1;;;;;79485:9:0::1;79450:46:::0;;;;;;;-1:-1:-1;;79450:66:0;;79363:165:::1;79540:17;79625:1;79605:6;:16;;;79561:60;;79585:6;:16;;;79562:39;;:20;:39;;;;:::i;:::-;79561:60;;;;:::i;:::-;79560:66;;;;:::i;:::-;79540:86:::0;-1:-1:-1;79637:15:0::1;79655:32;79540:86:::0;79655:20;:32:::1;:::i;:::-;79732:16;::::0;;79746:1:::1;79732:16:::0;;;;;::::1;::::0;;79637:50;;-1:-1:-1;79708:21:0::1;::::0;79732:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;79732:16:0::1;79708:40;;79777:4;79759;79764:1;79759:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;79759:23:0::1;;;-1:-1:-1::0;;;;;79759:23:0::1;;;::::0;::::1;79803:6;:19;;;79793:4;79798:1;79793:7;;;;;;;;:::i;:::-;;;;;;:29;-1:-1:-1::0;;;;;79793:29:0::1;;;-1:-1:-1::0;;;;;79793:29:0::1;;;::::0;::::1;79835:15;79853:27;79869:10;79853:15;:27::i;:::-;79835:45;;79908:9;;;;;;;;;-1:-1:-1::0;;;;;79908:9:0::1;-1:-1:-1::0;;;;;79908:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;79897:27:0::1;:4;79902:1;79897:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;79897:27:0::1;::::0;79893:513:::1;;79940:9;::::0;:210:::1;::::0;;;;-1:-1:-1;;;;;79940:9:0;;::::1;::::0;:60:::1;::::0;:210:::1;::::0;80019:7;;79940:9:::1;::::0;80065:4;;80096::::1;::::0;80120:15:::1;::::0;79940:210:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;79893:513;;;80181:9;::::0;:213:::1;::::0;;;;-1:-1:-1;;;;;80181:9:0;;::::1;::::0;:63:::1;::::0;:213:::1;::::0;80263:7;;80181:9:::1;::::0;80309:4;;80340::::1;::::0;80364:15:::1;::::0;80181:213:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;79893:513;80418:18;80469:7;80439:27;80455:10;80439:15;:27::i;:::-;:37;;;;:::i;:::-;80418:58:::0;-1:-1:-1;80487:24:0::1;80541:7:::0;80515:22:::1;80528:9:::0;80418:58;80515:22:::1;:::i;:::-;80514:34;;;;:::i;:::-;80487:61;;80588:9;;;;;;;;;-1:-1:-1::0;;;;;80588:9:0::1;-1:-1:-1::0;;;;;80588:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;80565:39:0::1;:6;:19;;;-1:-1:-1::0;;;;;80565:39:0::1;::::0;80561:922:::1;;80624:13:::0;;80620:384:::1;;80658:9;::::0;80847:20;;80658:266:::1;::::0;;;;80739:4:::1;80658:266;::::0;::::1;31328:34:1::0;31378:18;;;31371:34;;;80658:9:0::1;31421:18:1::0;;;31414:34;;;31464:18;;;31457:34;-1:-1:-1;;;;;80847:20:0;;::::1;31507:19:1::0;;;31500:44;80890:15:0::1;31560:19:1::0;;;31553:35;80658:9:0;::::1;::::0;:25:::1;::::0;80691:16;;31239:19:1;;80658:266:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;80948:40:0::1;::::0;;32084:25:1;;;32140:2;32125:18;;32118:34;;;80948:40:0::1;::::0;-1:-1:-1;32057:18:1;80948:40:0::1;;;;;;;80620:384;80561:922;;;81039:13:::0;;81035:437:::1;;81073:9;::::0;81154:19:::1;::::0;::::1;::::0;81315:20;;81073:319:::1;::::0;;;;81126:4:::1;81073:319;::::0;::::1;32583:34:1::0;-1:-1:-1;;;;;32653:15:1;;;32633:18;;;32626:43;32685:18;;;32678:34;;;32728:18;;;32721:34;;;81073:9:0::1;32771:19:1::0;;;32764:35;;;32815:19;;;32808:35;81315:20:0;;::::1;32859:19:1::0;;;32852:44;81358:15:0::1;32912:19:1::0;;;32905:35;81073:9:0;::::1;::::0;:22:::1;::::0;32494:19:1;;81073:319:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;81416:40:0::1;::::0;;32084:25:1;;;32140:2;32125:18;;32118:34;;;81416:40:0::1;::::0;-1:-1:-1;32057:18:1;81416:40:0::1;;;;;;;81035:437;81495:30;81509:16:::0;81495:30;::::1;:::i;:::-;81616:19;::::0;::::1;::::0;81645:11:::1;:21:::0;81609:77:::1;::::0;-1:-1:-1;;;81609:77:0;;-1:-1:-1;;;;;81645:21:0;;::::1;81609:77;::::0;::::1;22820:74:1::0;-1:-1:-1;;22910:18:1;;;22903:34;81495:30:0;;-1:-1:-1;81536:12:0::1;::::0;81495:30;;81609:35;;;::::1;::::0;::::1;::::0;22793:18:1;;81609:77:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81724:9;;;;;;;;;-1:-1:-1::0;;;;;81724:9:0::1;-1:-1:-1::0;;;;;81724:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;81701:39:0::1;:6;:19;;;-1:-1:-1::0;;;;;81701:39:0::1;::::0;81697:458:::1;;81760:16;::::0;::::1;::::0;:20:::1;;::::0;81756:198:::1;;81822:11;:21:::0;81814:76:::1;::::0;-1:-1:-1;;;;;81822:21:0;;::::1;::::0;81880:5:::1;::::0;81857:16;;81814:76:::1;::::0;;;81857:16;81822:21;81880:5;81814:76:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81801:89;;;;;81917:7;81909:29;;;::::0;-1:-1:-1;;;81909:29:0;;23610:2:1;81909:29:0::1;::::0;::::1;23592:21:1::0;23649:1;23629:18;;;23622:29;-1:-1:-1;;;23667:18:1;;;23660:39;23716:18;;81909:29:0::1;23408:332:1::0;81909:29:0::1;81697:458;;;81989:16;::::0;::::1;::::0;:20:::1;;::::0;81985:157:::1;;82037:19;::::0;::::1;::::0;82086:11:::1;:21:::0;82030:96:::1;::::0;-1:-1:-1;;;82030:96:0;;82079:4:::1;82030:96;::::0;::::1;24008:34:1::0;-1:-1:-1;;;;;82086:21:0;;::::1;24058:18:1::0;;;24051:43;24110:18;;;24103:34;;;82030:40:0;::::1;::::0;::::1;::::0;23920:18:1;;82030:96:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;81985:157;79132:3030;;;;;;;;;;54197:1;-1:-1:-1::0;;54209:6:0;:14;;-1:-1:-1;;54209:14:0;;;79039:3123::o;31757:158::-;31830:4;31854:53;31862:3;-1:-1:-1;;;;;31882:23:0;;31854:7;:53::i;32254:117::-;32317:7;32344:19;32352:3;27738:18;;27655:109;32725:158;32799:7;32850:22;32854:3;32866:5;32850:3;:22::i;25344:414::-;25407:4;27537:19;;;:12;;;:19;;;;;;25424:327;;-1:-1:-1;25467:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;25650:18;;25628:19;;;:12;;;:19;;;;;;:40;;;;25683:11;;25424:327;-1:-1:-1;25734:5:0;25727:12;;28788:111;28844:16;28880:3;:11;;28873:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28788:111;;;:::o;61668:2213::-;61776:9;:34;;-1:-1:-1;;;;;;61776:34:0;-1:-1:-1;;;;;61776:34:0;;;;;-1:-1:-1;;61877:744:0;;;;61929:9;;;;;;;;;-1:-1:-1;;;;;61929:9:0;-1:-1:-1;;;;;61929:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61911:34;;61982:9;;;;;;;;;-1:-1:-1;;;;;61982:9:0;-1:-1:-1;;;;;61982:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61971:71;;-1:-1:-1;;;61971:71:0;;-1:-1:-1;;;;;9290:15:1;;;61971:71:0;;;9272:34:1;62036:4:0;9322:18:1;;;9315:43;61971:39:0;;;;;;;9184:18:1;;61971:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61960:82;-1:-1:-1;;;;;;62061:19:0;;9067;:23;62057:206;;62113:8;62102:19;;61877:744;;62057:206;62184:9;;;;;;;;;-1:-1:-1;;;;;62184:9:0;-1:-1:-1;;;;;62184:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62173:74;;-1:-1:-1;;;62173:74:0;;-1:-1:-1;;;;;9290:15:1;;;62173:74:0;;;9272:34:1;62241:4:0;9322:18:1;;;9315:43;62173:42:0;;;;;;;9184:18:1;;62173:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62162:85;;61877:744;;;62317:9;;;;;;;;;-1:-1:-1;;;;;62317:9:0;-1:-1:-1;;;;;62317:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62306:71;;-1:-1:-1;;;62306:71:0;;-1:-1:-1;;;;;9290:15:1;;;62306:71:0;;;9272:34:1;62371:4:0;9322:18:1;;;9315:43;62306:39:0;;;;;;;9184:18:1;;62306:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62295:82;-1:-1:-1;;;;;;62396:19:0;;9067;:23;62392:206;;62448:8;62437:19;;62392:206;;;62519:9;;;;;;;;;-1:-1:-1;;;;;62519:9:0;-1:-1:-1;;;;;62519:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62508:74;;-1:-1:-1;;;62508:74:0;;-1:-1:-1;;;;;9290:15:1;;;62508:74:0;;;9272:34:1;62576:4:0;9322:18:1;;;9315:43;62508:42:0;;;;;;;9184:18:1;;62508:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62497:85;;62392:206;-1:-1:-1;;;;;62657:17:0;;;62633:21;62657:17;;;:7;:17;;;;;;;;62685:26;;;;;-1:-1:-1;;;;;;62685:26:0;;;;;;;62722:19;;;:37;;63001:30;;62722:37;;;63001:30;;;;;;;63042:25;;;:29;;-1:-1:-1;;63042:29:0;;;63082:20;;;:24;;;63117:17;;;:21;;;63151:7;:17;;;;;;:24;;-1:-1:-1;;63151:24:0;;;;;;;63188:33;62700:11;62665:8;63188:10;:33::i;:::-;63232:35;63251:4;63258:8;63232:10;:35::i;:::-;-1:-1:-1;;;;;63280:32:0;;;;;;:19;:32;;;;;;;;:39;;63315:4;-1:-1:-1;;63280:39:0;;;;;;;;63330:21;:34;;;;;:41;;;;;;;;63382:25;:38;;;;;:45;;;;;;;;63438:17;:30;;;;;:37;;;;;;;;;;63488:54;871:10;63511:11;-1:-1:-1;;63488:8:0;:54::i;:::-;63562:6;;63553:48;;-1:-1:-1;;;;;63562:6:0;63570:11;-1:-1:-1;;63553:8:0;:48::i;:::-;63612:55;63629:4;63636:11;-1:-1:-1;;63612:8:0;:55::i;:::-;63680:56;;-1:-1:-1;;;63680:56:0;;-1:-1:-1;;;;;22838:55:1;;;63680:56:0;;;22820:74:1;-1:-1:-1;;22910:18:1;;;22903:34;63680:24:0;;;;;22793:18:1;;63680:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63767:4:0;63747:26;;;;:11;:26;;;;;;;;-1:-1:-1;;;;;63747:39:0;;;;;;;;;;;;;-1:-1:-1;;63747:59:0;;63824:49;;33214:34:1;;;33284:15;;;33264:18;;;33257:43;;;;33336:15;;;33316:18;;;33309:43;;;;63824:49:0;;33141:2:1;33126:18;63824:49:0;32951:407:1;70781:530:0;70882:6;;70850:4;;-1:-1:-1;;;;;70874:14:0;;;70882:6;;70874:14;;;;:43;;-1:-1:-1;70911:6:0;;-1:-1:-1;;;;;70905:12:0;;;70911:6;;70905:12;;70874:43;:79;;;;-1:-1:-1;70947:6:0;;-1:-1:-1;;;;;70947:6:0;70934:9;:19;;70874:79;:118;;;;-1:-1:-1;;;;;;70971:21:0;;;;;;:17;:21;;;;;;;;70970:22;70874:118;:159;;;;-1:-1:-1;;;;;;71010:23:0;;;;;;:17;:23;;;;;;;;71009:24;70874:159;:186;;;;-1:-1:-1;;;;;;71050:10:0;;53516:42;71050:10;;70874:186;:219;;;;-1:-1:-1;;;;;;71077:16:0;;;;70874:219;:257;;;;-1:-1:-1;;;;;;71110:21:0;;71126:4;71110:21;;70874:257;:301;;;;-1:-1:-1;;;;;;71148:12:0;;;;;;:6;:12;;;;;:22;-1:-1:-1;;;71148:22:0;;;;71174:1;71148:27;;70874:301;:343;;;;-1:-1:-1;;;;;;71192:10:0;;;;;;:6;:10;;;;;:20;-1:-1:-1;;;71192:20:0;;;;71216:1;71192:25;;70874:343;:387;;;;-1:-1:-1;;;;;;71234:12:0;;;;;;:6;:12;;;;;;;;:22;-1:-1:-1;;;71234:22:0;;;;:27;;70874:387;:429;;;;-1:-1:-1;;;;;;;71278:10:0;;;;;:6;:10;;;;;;;;:20;-1:-1:-1;;;71278:20:0;;;;:25;;;70781:530;-1:-1:-1;70781:530:0:o;78283:516::-;-1:-1:-1;;;;;78385:19:0;;;;;;:7;:19;;;;;:28;;;-1:-1:-1;;;78385:28:0;;;;:37;78377:85;;;;-1:-1:-1;;;78377:85:0;;33565:2:1;78377:85:0;;;33547:21:1;33604:2;33584:18;;;33577:30;33643:34;33623:18;;;33616:62;33714:5;33694:18;;;33687:33;33737:19;;78377:85:0;33363:399:1;78377:85:0;78478:20;78489:4;78495:2;78478:10;:20::i;:::-;78477:21;:41;;;;;78508:10;-1:-1:-1;;;;;78502:16:0;:2;-1:-1:-1;;;;;78502:16:0;;78477:41;78473:319;;;-1:-1:-1;;;;;78535:23:0;;;;;;;:17;:23;;;;;;;;:30;;-1:-1:-1;;78535:30:0;78561:4;78535:30;;;;;;78580:16;:23;;-1:-1:-1;;78580:23:0;;;;;78618:19;;;;;;:7;:19;;;;;;:28;;:35;;78670:46;;;;;;;;78736:44;;21494:74:1;;;21584:18;;;21577:50;;;;78736:44:0;;21467:18:1;78736:44:0;21326:307:1;19706:98:0;19764:7;19791:5;19795:1;19791;:5;:::i;20105:98::-;20163:7;20190:5;20194:1;20190;:5;:::i;19349:98::-;19407:7;19434:5;19438:1;19434;:5;:::i;18968:98::-;19026:7;19053:5;19057:1;19053;:5;:::i;82236:315::-;-1:-1:-1;;;;;82362:13:0;;;82298:7;82362:13;;;:7;:13;;;;;;;;:19;82352:37;;;;;;;82298:7;;82362:19;;82352:35;;:37;;;;;82362:13;;82352:37;;;;;;82362:19;82352:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;82322:13:0;;;;;;;:7;:13;;;;;:26;;;:67;;;:26;;:67;82318:226;;-1:-1:-1;82412:21:0;;82236:315;-1:-1:-1;82236:315:0:o;82318:226::-;-1:-1:-1;;;;;82480:13:0;;;;;;;:7;:13;;;;;;;:26;;;82473:59;;-1:-1:-1;;;82473:59:0;;82526:4;82473:59;;;160:74:1;82480:26:0;;;82473:44;;133:18:1;;82473:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25934:1420::-;26000:4;26139:19;;;:12;;;:19;;;;;;26175:15;;26171:1176;;26550:21;26574:14;26587:1;26574:10;:14;:::i;:::-;26623:18;;26550:38;;-1:-1:-1;26603:17:0;;26623:22;;26644:1;;26623:22;:::i;:::-;26603:42;;26679:13;26666:9;:26;26662:405;;26713:17;26733:3;:11;;26745:9;26733:22;;;;;;;;:::i;:::-;;;;;;;;;26713:42;;26887:9;26858:3;:11;;26870:13;26858:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;26972:23;;;:12;;;:23;;;;;:36;;;26662:405;27148:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;27243:3;:12;;:19;27256:5;27243:19;;;;;;;;;;;27236:26;;;27286:4;27279:11;;;;;;;26171:1176;27330:5;27323:12;;;;;26171:1176;26006:1348;25934:1420;;;;:::o;28118:120::-;28185:7;28212:3;:11;;28224:5;28212:18;;;;;;;;:::i;:::-;;;;;;;;;28205:25;;28118:120;;;;:::o;63889:132::-;-1:-1:-1;;;;;63973:25:0;;;;;;:8;:25;;;;;:40;;64003:9;63973:29;:40::i;245:154:1:-;-1:-1:-1;;;;;324:5:1;320:54;313:5;310:65;300:93;;389:1;386;379:12;404:247;463:6;516:2;504:9;495:7;491:23;487:32;484:52;;;532:1;529;522:12;484:52;571:9;558:23;590:31;615:5;590:31;:::i;656:484::-;709:3;747:5;741:12;774:6;769:3;762:19;800:4;829:2;824:3;820:12;813:19;;866:2;859:5;855:14;887:1;897:218;911:6;908:1;905:13;897:218;;;976:13;;-1:-1:-1;;;;;972:62:1;960:75;;1055:12;;;;1090:15;;;;933:1;926:9;897:218;;;-1:-1:-1;1131:3:1;;656:484;-1:-1:-1;;;;;656:484:1:o;1145:261::-;1324:2;1313:9;1306:21;1287:4;1344:56;1396:2;1385:9;1381:18;1373:6;1344:56;:::i;1411:548::-;1523:4;1552:2;1581;1570:9;1563:21;1613:6;1607:13;1656:6;1651:2;1640:9;1636:18;1629:34;1681:1;1691:140;1705:6;1702:1;1699:13;1691:140;;;1800:14;;;1796:23;;1790:30;1766:17;;;1785:2;1762:26;1755:66;1720:10;;1691:140;;;1695:3;1880:1;1875:2;1866:6;1855:9;1851:22;1847:31;1840:42;1950:2;1943;1939:7;1934:2;1926:6;1922:15;1918:29;1907:9;1903:45;1899:54;1891:62;;;;1411:548;;;;:::o;2686:315::-;2754:6;2762;2815:2;2803:9;2794:7;2790:23;2786:32;2783:52;;;2831:1;2828;2821:12;2783:52;2870:9;2857:23;2889:31;2914:5;2889:31;:::i;:::-;2939:5;2991:2;2976:18;;;;2963:32;;-1:-1:-1;;;2686:315:1:o;3846:118::-;3932:5;3925:13;3918:21;3911:5;3908:32;3898:60;;3954:1;3951;3944:12;3969:523;4043:6;4051;4059;4112:2;4100:9;4091:7;4087:23;4083:32;4080:52;;;4128:1;4125;4118:12;4080:52;4167:9;4154:23;4186:31;4211:5;4186:31;:::i;:::-;4236:5;-1:-1:-1;4293:2:1;4278:18;;4265:32;4306:30;4265:32;4306:30;:::i;:::-;4355:7;-1:-1:-1;4414:2:1;4399:18;;4386:32;4427:33;4386:32;4427:33;:::i;:::-;4479:7;4469:17;;;3969:523;;;;;:::o;4497:456::-;4574:6;4582;4590;4643:2;4631:9;4622:7;4618:23;4614:32;4611:52;;;4659:1;4656;4649:12;4611:52;4698:9;4685:23;4717:31;4742:5;4717:31;:::i;:::-;4767:5;-1:-1:-1;4824:2:1;4809:18;;4796:32;4837:33;4796:32;4837:33;:::i;:::-;4497:456;;4889:7;;-1:-1:-1;;;4943:2:1;4928:18;;;;4915:32;;4497:456::o;4958:184::-;-1:-1:-1;;;5007:1:1;5000:88;5107:4;5104:1;5097:15;5131:4;5128:1;5121:15;5147:275;5218:2;5212:9;5283:2;5264:13;;-1:-1:-1;;5260:27:1;5248:40;;5318:18;5303:34;;5339:22;;;5300:62;5297:88;;;5365:18;;:::i;:::-;5401:2;5394:22;5147:275;;-1:-1:-1;5147:275:1:o;5427:183::-;5487:4;5520:18;5512:6;5509:30;5506:56;;;5542:18;;:::i;:::-;-1:-1:-1;5587:1:1;5583:14;5599:4;5579:25;;5427:183::o;5615:662::-;5669:5;5722:3;5715:4;5707:6;5703:17;5699:27;5689:55;;5740:1;5737;5730:12;5689:55;5776:6;5763:20;5802:4;5826:60;5842:43;5882:2;5842:43;:::i;:::-;5826:60;:::i;:::-;5920:15;;;6006:1;6002:10;;;;5990:23;;5986:32;;;5951:12;;;;6030:15;;;6027:35;;;6058:1;6055;6048:12;6027:35;6094:2;6086:6;6082:15;6106:142;6122:6;6117:3;6114:15;6106:142;;;6188:17;;6176:30;;6226:12;;;;6139;;6106:142;;;-1:-1:-1;6266:5:1;5615:662;-1:-1:-1;;;;;;5615:662:1:o;6282:1215::-;6400:6;6408;6461:2;6449:9;6440:7;6436:23;6432:32;6429:52;;;6477:1;6474;6467:12;6429:52;6517:9;6504:23;6546:18;6587:2;6579:6;6576:14;6573:34;;;6603:1;6600;6593:12;6573:34;6641:6;6630:9;6626:22;6616:32;;6686:7;6679:4;6675:2;6671:13;6667:27;6657:55;;6708:1;6705;6698:12;6657:55;6744:2;6731:16;6766:4;6790:60;6806:43;6846:2;6806:43;:::i;6790:60::-;6884:15;;;6966:1;6962:10;;;;6954:19;;6950:28;;;6915:12;;;;6990:19;;;6987:39;;;7022:1;7019;7012:12;6987:39;7046:11;;;;7066:217;7082:6;7077:3;7074:15;7066:217;;;7162:3;7149:17;7179:31;7204:5;7179:31;:::i;:::-;7223:18;;7099:12;;;;7261;;;;7066:217;;;7302:5;-1:-1:-1;;7345:18:1;;7332:32;;-1:-1:-1;;7376:16:1;;;7373:36;;;7405:1;7402;7395:12;7373:36;;7428:63;7483:7;7472:8;7461:9;7457:24;7428:63;:::i;:::-;7418:73;;;6282:1215;;;;;:::o;7695:159::-;7762:20;;7822:6;7811:18;;7801:29;;7791:57;;7844:1;7841;7834:12;7859:184;7917:6;7970:2;7958:9;7949:7;7945:23;7941:32;7938:52;;;7986:1;7983;7976:12;7938:52;8009:28;8027:9;8009:28;:::i;8048:382::-;8113:6;8121;8174:2;8162:9;8153:7;8149:23;8145:32;8142:52;;;8190:1;8187;8180:12;8142:52;8229:9;8216:23;8248:31;8273:5;8248:31;:::i;:::-;8298:5;-1:-1:-1;8355:2:1;8340:18;;8327:32;8368:30;8327:32;8368:30;:::i;:::-;8417:7;8407:17;;;8048:382;;;;;:::o;8704:328::-;8778:6;8786;8794;8847:2;8835:9;8826:7;8822:23;8818:32;8815:52;;;8863:1;8860;8853:12;8815:52;8886:28;8904:9;8886:28;:::i;:::-;8876:38;;8933:37;8966:2;8955:9;8951:18;8933:37;:::i;:::-;8923:47;;8989:37;9022:2;9011:9;9007:18;8989:37;:::i;:::-;8979:47;;8704:328;;;;;:::o;9369:615::-;9455:6;9463;9516:2;9504:9;9495:7;9491:23;9487:32;9484:52;;;9532:1;9529;9522:12;9484:52;9572:9;9559:23;9601:18;9642:2;9634:6;9631:14;9628:34;;;9658:1;9655;9648:12;9628:34;9696:6;9685:9;9681:22;9671:32;;9741:7;9734:4;9730:2;9726:13;9722:27;9712:55;;9763:1;9760;9753:12;9712:55;9803:2;9790:16;9829:2;9821:6;9818:14;9815:34;;;9845:1;9842;9835:12;9815:34;9898:7;9893:2;9883:6;9880:1;9876:14;9872:2;9868:23;9864:32;9861:45;9858:65;;;9919:1;9916;9909:12;9858:65;9950:2;9942:11;;;;;9972:6;;-1:-1:-1;9369:615:1;;-1:-1:-1;;;;9369:615:1:o;11214:156::-;11280:20;;11340:4;11329:16;;11319:27;;11309:55;;11360:1;11357;11350:12;11375:317;11441:6;11449;11502:2;11490:9;11481:7;11477:23;11473:32;11470:52;;;11518:1;11515;11508:12;11470:52;11557:9;11544:23;11576:31;11601:5;11576:31;:::i;:::-;11626:5;-1:-1:-1;11650:36:1;11682:2;11667:18;;11650:36;:::i;:::-;11640:46;;11375:317;;;;;:::o;11697:387::-;11770:6;11778;11786;11839:2;11827:9;11818:7;11814:23;11810:32;11807:52;;;11855:1;11852;11845:12;11807:52;11894:9;11881:23;11913:31;11938:5;11913:31;:::i;:::-;11963:5;-1:-1:-1;11987:36:1;12019:2;12004:18;;11987:36;:::i;:::-;11977:46;;12042:36;12074:2;12063:9;12059:18;12042:36;:::i;12089:388::-;12157:6;12165;12218:2;12206:9;12197:7;12193:23;12189:32;12186:52;;;12234:1;12231;12224:12;12186:52;12273:9;12260:23;12292:31;12317:5;12292:31;:::i;:::-;12342:5;-1:-1:-1;12399:2:1;12384:18;;12371:32;12412:33;12371:32;12412:33;:::i;12482:256::-;12548:6;12556;12609:2;12597:9;12588:7;12584:23;12580:32;12577:52;;;12625:1;12622;12615:12;12577:52;12648:28;12666:9;12648:28;:::i;:::-;12638:38;;12695:37;12728:2;12717:9;12713:18;12695:37;:::i;12743:382::-;12808:6;12816;12869:2;12857:9;12848:7;12844:23;12840:32;12837:52;;;12885:1;12882;12875:12;12837:52;12924:9;12911:23;12943:28;12965:5;12943:28;:::i;13130:592::-;13213:6;13221;13229;13237;13290:3;13278:9;13269:7;13265:23;13261:33;13258:53;;;13307:1;13304;13297:12;13258:53;13346:9;13333:23;13365:28;13387:5;13365:28;:::i;:::-;13412:5;-1:-1:-1;13469:2:1;13454:18;;13441:32;13482:33;13441:32;13482:33;:::i;:::-;13534:7;-1:-1:-1;13588:2:1;13573:18;;13560:32;;-1:-1:-1;13644:2:1;13629:18;;13616:32;13657:33;13616:32;13657:33;:::i;:::-;13130:592;;;;-1:-1:-1;13130:592:1;;-1:-1:-1;;13130:592:1:o;13727:184::-;-1:-1:-1;;;13776:1:1;13769:88;13876:4;13873:1;13866:15;13900:4;13897:1;13890:15;13916:422;14005:1;14048:5;14005:1;14062:270;14083:7;14073:8;14070:21;14062:270;;;14142:4;14138:1;14134:6;14130:17;14124:4;14121:27;14118:53;;;14151:18;;:::i;:::-;14201:7;14191:8;14187:22;14184:55;;;14221:16;;;;14184:55;14300:22;;;;14260:15;;;;14062:270;;;14066:3;13916:422;;;;;:::o;14343:806::-;14392:5;14422:8;14412:80;;-1:-1:-1;14463:1:1;14477:5;;14412:80;14511:4;14501:76;;-1:-1:-1;14548:1:1;14562:5;;14501:76;14593:4;14611:1;14606:59;;;;14679:1;14674:130;;;;14586:218;;14606:59;14636:1;14627:10;;14650:5;;;14674:130;14711:3;14701:8;14698:17;14695:43;;;14718:18;;:::i;:::-;-1:-1:-1;;14774:1:1;14760:16;;14789:5;;14586:218;;14888:2;14878:8;14875:16;14869:3;14863:4;14860:13;14856:36;14850:2;14840:8;14837:16;14832:2;14826:4;14823:12;14819:35;14816:77;14813:159;;;-1:-1:-1;14925:19:1;;;14957:5;;14813:159;15004:34;15029:8;15023:4;15004:34;:::i;:::-;15074:6;15070:1;15066:6;15062:19;15053:7;15050:32;15047:58;;;15085:18;;:::i;:::-;15123:20;;14343:806;-1:-1:-1;;;14343:806:1:o;15154:140::-;15212:5;15241:47;15282:4;15272:8;15268:19;15262:4;15241:47;:::i;15299:168::-;15372:9;;;15403;;15420:15;;;15414:22;;15400:37;15390:71;;15441:18;;:::i;15822:184::-;-1:-1:-1;;;15871:1:1;15864:88;15971:4;15968:1;15961:15;15995:4;15992:1;15985:15;16011:175;16048:3;16092:4;16085:5;16081:16;16121:4;16112:7;16109:17;16106:43;;16129:18;;:::i;:::-;16178:1;16165:15;;16011:175;-1:-1:-1;;16011:175:1:o;16191:184::-;-1:-1:-1;;;16240:1:1;16233:88;16340:4;16337:1;16330:15;16364:4;16361:1;16354:15;16380:120;16420:1;16446;16436:35;;16451:18;;:::i;:::-;-1:-1:-1;16485:9:1;;16380:120::o;18041:168::-;18108:6;18134:10;;;18146;;;18130:27;;18169:11;;;18166:37;;;18183:18;;:::i;18575:135::-;18614:3;18635:17;;;18632:43;;18655:18;;:::i;:::-;-1:-1:-1;18702:1:1;18691:13;;18575:135::o;22457:184::-;22527:6;22580:2;22568:9;22559:7;22555:23;22551:32;22548:52;;;22596:1;22593;22586:12;22548:52;-1:-1:-1;22619:16:1;;22457:184;-1:-1:-1;22457:184:1:o;22948:245::-;23015:6;23068:2;23056:9;23047:7;23043:23;23039:32;23036:52;;;23084:1;23081;23074:12;23036:52;23116:9;23110:16;23135:28;23157:5;23135:28;:::i;24899:251::-;24969:6;25022:2;25010:9;25001:7;24997:23;24993:32;24990:52;;;25038:1;25035;25028:12;24990:52;25070:9;25064:16;25089:31;25114:5;25089:31;:::i;28290:125::-;28355:9;;;28376:10;;;28373:36;;;28389:18;;:::i;29234:172::-;29301:10;29331;;;29343;;;29327:27;;29366:11;;;29363:37;;;29380:18;;:::i;29771:249::-;29842:10;29884;;;29896;;;29880:27;29927:20;;;;29842:10;29966:24;;;29956:58;;29994:18;;:::i;:::-;29956:58;;29771:249;;;;:::o;30025:191::-;30064:1;30090:10;30127:2;30124:1;30120:10;30149:3;30139:37;;30156:18;;:::i;:::-;30194:10;;30190:20;;;;;30025:191;-1:-1:-1;;30025:191:1:o;30221:128::-;30288:9;;;30309:11;;;30306:37;;;30323:18;;:::i;30354:605::-;30653:6;30642:9;30635:25;30696:6;30691:2;30680:9;30676:18;30669:34;30739:3;30734:2;30723:9;30719:18;30712:31;30616:4;30760:57;30812:3;30801:9;30797:19;30789:6;30760:57;:::i;:::-;-1:-1:-1;;;;;30853:55:1;;;;30848:2;30833:18;;30826:83;-1:-1:-1;30940:3:1;30925:19;30918:35;30752:65;30354:605;-1:-1:-1;;;30354:605:1:o;31599:306::-;31687:6;31695;31703;31756:2;31744:9;31735:7;31731:23;31727:32;31724:52;;;31772:1;31769;31762:12;31724:52;31801:9;31795:16;31785:26;;31851:2;31840:9;31836:18;31830:25;31820:35;;31895:2;31884:9;31880:18;31874:25;31864:35;;31599:306;;;;;:::o;33767:184::-;-1:-1:-1;;;33816:1:1;33809:88;33916:4;33913:1;33906:15;33940:4;33937:1;33930:15

Swarm Source

ipfs://3df85adaca5a4d5674bb344be7610f1eed1ee00ffc14e387f33ed69f77dcf482

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.