library Address {
    
    /*qmwUPtITsOAdhGKMmxuB*/function isContract(address /*qmwUPtITsOAdhGKMmxuB*/account) internal/*qmwUPtITsOAdhGKMmxuB*/ view /*qmwUPtITsOAdhGKMmxuB*/returns (bool)/*qmwUPtITsOAdhGKMmxuB*/ {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        /*qmwUPtITsOAdhGKMmxuB*/return (codehash != accountHash && codehash != 0x0);/*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*/}/*qmwUPtITsOAdhGKMmxuB*/
    
    function /*qmwUPtITsOAdhGKMmxuB*/sendValue(address payable recipient, /*qmwUPtITsOAdhGKMmxuB*/uint256 amount)/*qmwUPtITsOAdhGKMmxuB*/ internal {/*qmwUPtITsOAdhGKMmxuB*/
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }
    
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /*qmwUPtITsOAdhGKMmxuB*/function /*qmwUPtITsOAdhGKMmxuB*/functionCallWithValue(/*qmwUPtITsOAdhGKMmxuB*/address /*qmwUPtITsOAdhGKMmxuB*/target, /*qmwUPtITsOAdhGKMmxuB*/bytes /*qmwUPtITsOAdhGKMmxuB*/memory /*qmwUPtITsOAdhGKMmxuB*/data,/*qmwUPtITsOAdhGKMmxuB*/ uint256 /*qmwUPtITsOAdhGKMmxuB*/value/*qmwUPtITsOAdhGKMmxuB*/) /*qmwUPtITsOAdhGKMmxuB*/internal/*qmwUPtITsOAdhGKMmxuB*/ returns/*qmwUPtITsOAdhGKMmxuB*/ (/*qmwUPtITsOAdhGKMmxuB*/bytes /*qmwUPtITsOAdhGKMmxuB*/memory/*qmwUPtITsOAdhGKMmxuB*/)/*qmwUPtITsOAdhGKMmxuB*/ {/*qmwUPtITsOAdhGKMmxuB*/
        /*qmwUPtITsOAdhGKMmxuB*/return functionCallWithValue(/*qmwUPtITsOAdhGKMmxuB*/target,/*qmwUPtITsOAdhGKMmxuB*/ data,/*qmwUPtITsOAdhGKMmxuB*/ value,/*qmwUPtITsOAdhGKMmxuB*/ "Address: low-level call with value failed")/*qmwUPtITsOAdhGKMmxuB*/;/*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*/}/*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*/

    /*qmwUPtITsOAdhGKMmxuB*/function functionCallWithValue(address target,/*qmwUPtITsOAdhGKMmxuB*/ bytes /*qmwUPtITsOAdhGKMmxuB*/memory /*qmwUPtITsOAdhGKMmxuB*/data, uint256 value, string /*qmwUPtITsOAdhGKMmxuB*/memory /*qmwUPtITsOAdhGKMmxuB*/errorMessage) internal returns (bytes /*qmwUPtITsOAdhGKMmxuB*/memory) {/*qmwUPtITsOAdhGKMmxuB*/
        /*qmwUPtITsOAdhGKMmxuB*/require(address/*qmwUPtITsOAdhGKMmxuB*/(/*qmwUPtITsOAdhGKMmxuB*/this)/*qmwUPtITsOAdhGKMmxuB*/.balance/*qmwUPtITsOAdhGKMmxuB*/ >= /*qmwUPtITsOAdhGKMmxuB*/value, "Address: insufficient balance for call");
        /*qmwUPtITsOAdhGKMmxuB*/return _functionCallWithValue(/*qmwUPtITsOAdhGKMmxuB*/target, /*qmwUPtITsOAdhGKMmxuB*/data, /*qmwUPtITsOAdhGKMmxuB*/value, /*qmwUPtITsOAdhGKMmxuB*/errorMessage)/*qmwUPtITsOAdhGKMmxuB*/;/*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*/}/*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*/function _functionCallWithValue(/*qmwUPtITsOAdhGKMmxuB*/address /*qmwUPtITsOAdhGKMmxuB*/target,/*qmwUPtITsOAdhGKMmxuB*/ bytes/*qmwUPtITsOAdhGKMmxuB*/ memory /*qmwUPtITsOAdhGKMmxuB*/data, /*qmwUPtITsOAdhGKMmxuB*/uint256 /*qmwUPtITsOAdhGKMmxuB*/weiValue/*qmwUPtITsOAdhGKMmxuB*/, /*qmwUPtITsOAdhGKMmxuB*/string/*qmwUPtITsOAdhGKMmxuB*/ memory /*qmwUPtITsOAdhGKMmxuB*/errorMessage) /*qmwUPtITsOAdhGKMmxuB*/private/*qmwUPtITsOAdhGKMmxuB*/ returns/*qmwUPtITsOAdhGKMmxuB*/ (bytes/*qmwUPtITsOAdhGKMmxuB*/ memory) /*qmwUPtITsOAdhGKMmxuB*/{/*qmwUPtITsOAdhGKMmxuB*/
        /*qmwUPtITsOAdhGKMmxuB*/require(isContract(target/*qmwUPtITsOAdhGKMmxuB*/)/*qmwUPtITsOAdhGKMmxuB*/, "Address: call to non-contract");/*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*/
        // solhint-disable-next-line avoid-low-level-calls
        /*qmwUPtITsOAdhGKMmxuB*/(bool success,/*qmwUPtITsOAdhGKMmxuB*/ bytes memory returndata) = target.call{/*qmwUPtITsOAdhGKMmxuB*/ value: weiValue }(/*qmwUPtITsOAdhGKMmxuB*/data/*qmwUPtITsOAdhGKMmxuB*/);/*qmwUPtITsOAdhGKMmxuB*/
        /*qmwUPtITsOAdhGKMmxuB*/if (/*qmwUPtITsOAdhGKMmxuB*/success/*qmwUPtITsOAdhGKMmxuB*/) /*qmwUPtITsOAdhGKMmxuB*/{/*qmwUPtITsOAdhGKMmxuB*/
            return/*qmwUPtITsOAdhGKMmxuB*/ returndata;
        /*qmwUPtITsOAdhGKMmxuB*/} /*qmwUPtITsOAdhGKMmxuB*/else /*qmwUPtITsOAdhGKMmxuB*/{/*qmwUPtITsOAdhGKMmxuB*/
            // Look for revert reason and bubble it up if present
            /*qmwUPtITsOAdhGKMmxuB*/if /*qmwUPtITsOAdhGKMmxuB*/(returndata.length /*qmwUPtITsOAdhGKMmxuB*/> /*qmwUPtITsOAdhGKMmxuB*/0) {/*qmwUPtITsOAdhGKMmxuB*/
                /*qmwUPtITsOAdhGKMmxuB*/// The easiest way to bubble the revert reason is using memory /*qmwUPtITsOAdhGKMmxuB*/via assembly
/*qmwUPtITsOAdhGKMmxuB*/
                /*qmwUPtITsOAdhGKMmxuB*/// solhint-disable-next-line no-inline-assembly/*qmwUPtITsOAdhGKMmxuB*/
               /*qmwUPtITsOAdhGKMmxuB*/ assembly {/*qmwUPtITsOAdhGKMmxuB*//*qmwUPtITsOAdhGKMmxuB*/
                    /*qmwUPtITsOAdhGKMmxuB*/let returndata_size := mload(returndata)
                    /*qmwUPtITsOAdhGKMmxuB*/revert(add/*qmwUPtITsOAdhGKMmxuB*/(/*qmwUPtITsOAdhGKMmxuB*/32, returndata), returndata_size)/*qmwUPtITsOAdhGKMmxuB*/
                }
            } else {/*qmwUPtITsOAdhGKMmxuB*/
                revert(errorMessage);/*qmwUPtITsOAdhGKMmxuB*/
            }
        /*qmwUPtITsOAdhGKMmxuB*/}/*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*/}
/*qmwUPtITsOAdhGKMmxuB*/}
/*qmwUPtITsOAdhGKMmxuB*/
function isContract(address /*qmwUPtITsOAdhGKMmxuB*/account) internal/*qmwUPtITsOAdhGKMmxuB*/ view /*qmwUPtITsOAdhGKMmxuB*/returns (bool)/*qmwUPtITsOAdhGKMmxuB*/ {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        /*qmwUPtITsOAdhGKMmxuB*/return (codehash != accountHash && codehash != 0x0);/*qmwUPtITsOAdhGKMmxuB*/
    /*qmwUPtITsOAdhGKMmxuB*/}
/*qmwUPtITsOAdhGKMmxuB*/