         let semaphore = self.semaphore(for: characteristic.peripheral)
         await semaphore.wait()
         defer { semaphore.signal() }
+        self.log("Peripheral \(characteristic.peripheral) will disable notifications for characteristic \(characteristic.uuid)")
         return try await withCheckedThrowingContinuation { [weak self] continuation in
             guard let self = self else { return }
             self.async {

        let options: [String: Any] = [
            CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber(value: filterDuplicates == false)
        ]
        return AsyncThrowingStream(ScanData<Peripheral, Advertisement>.self, bufferingPolicy: .bufferingNewest(100)) {  [weak self] continuation in
            guard let self = self else { return }
            self.async {

        let semaphore = self.semaphore(for: service.peripheral)
        await semaphore.wait()
        defer { semaphore.signal() }
        self.log("Peripheral \(service.peripheral) will discover characteristics of service \(service.uuid)")
        let characteristicUUIDs = characteristics.isEmpty ? nil : characteristics.map { CBUUID($0) }
        return try await withCheckedThrowingContinuation { [weak self] continuation in
            guard let self = self else { return }
