git: ea5a07ded849 - main - deskutils/calibre: Update to 8.0.1, add UDisks2 device mounting

From: Guido Falsi <madpilot_at_FreeBSD.org>
Date: Fri, 21 Mar 2025 18:28:29 UTC
The branch main has been updated by madpilot:

URL: https://cgit.FreeBSD.org/ports/commit/?id=ea5a07ded849c996ed435fb8932bdda1690acd75

commit ea5a07ded849c996ed435fb8932bdda1690acd75
Author:     Guido Falsi <madpilot@FreeBSD.org>
AuthorDate: 2025-03-21 18:27:51 +0000
Commit:     Guido Falsi <madpilot@FreeBSD.org>
CommitDate: 2025-03-21 18:27:51 +0000

    deskutils/calibre: Update to 8.0.1, add UDisks2 device mounting
    
    I submitted the DBus/UDisks2 device mounting code upstream here:
    
    https://github.com/kovidgoyal/calibre/pull/2694
    
    PR:     258224
---
 deskutils/calibre/Makefile                         |   8 +-
 deskutils/calibre/distinfo                         |  14 +-
 .../calibre/files/patch-UDisks2-Device-Mounting    | 288 +++++++++++++++++++++
 deskutils/calibre/files/user-agent-data.json       | 154 +++++------
 deskutils/calibre/pkg-plist                        |  10 +-
 5 files changed, 385 insertions(+), 89 deletions(-)

diff --git a/deskutils/calibre/Makefile b/deskutils/calibre/Makefile
index 1cc46f203efe..50790983f9bc 100644
--- a/deskutils/calibre/Makefile
+++ b/deskutils/calibre/Makefile
@@ -1,6 +1,5 @@
 PORTNAME=	calibre
-PORTVERSION=	7.26.0
-PORTREVISION=	1
+PORTVERSION=	8.0.1
 CATEGORIES=	deskutils python
 MASTER_SITES=	https://download.calibre-ebook.com/${PORTVERSION}/:DEFAULT \
 		https://raw.githubusercontent.com/rhasspy/piper/${PIPER_VOICES_HASH}/:piper
@@ -69,8 +68,8 @@ USES=		desktop-file-utils gettext-runtime:build gl localbase:ldflags \
 		pkgconfig pyqt:6 python:3.11+ qt:6 shared-mime-info shebangfix sqlite ssl \
 		tar:xz xorg
 USE_GITHUB=	nodefault
-GH_TUPLE=	kovidgoyal:calibre-translations:d1f8b5c:translations \
-		LibreOffice:dictionaries:762abe7:hypenation
+GH_TUPLE=	kovidgoyal:calibre-translations:288b823:translations \
+		LibreOffice:dictionaries:1b8d1d5:hypenation
 PIPER_VOICES_HASH=	c0670df63daf07070c9be36b5c4bed270ad72383
 USE_GL=		opengl
 USE_PYQT=	pyqt6 pysip webengine qtbuilder:build sip:build
@@ -105,6 +104,7 @@ post-extract:
 	@${CP} ${FILESDIR}/user-agent-data.json ${WRKSRC}/resources
 
 post-patch:
+	@${RM} ${WRKSRC}/src/calibre/devices/usbms/hal.py
 	@${REINPLACE_CMD} -e "s|#!/usr/bin/env python{py_major_version}|#!${PYTHON_CMD}|" \
 			-e "s|#!/usr/bin/env python|#!${PYTHON_CMD}|" \
 		${WRKSRC}/setup/install.py \
diff --git a/deskutils/calibre/distinfo b/deskutils/calibre/distinfo
index 3aad78af58c8..d7c25c38d081 100644
--- a/deskutils/calibre/distinfo
+++ b/deskutils/calibre/distinfo
@@ -1,9 +1,9 @@
-TIMESTAMP = 1739518398
-SHA256 (calibre/calibre-7.26.0.tar.xz) = 0a9b36c77655ebc8da67e7082604047a1fbe186f3563dc97ee60bb58abc57027
-SIZE (calibre/calibre-7.26.0.tar.xz) = 43633708
+TIMESTAMP = 1742549723
+SHA256 (calibre/calibre-8.0.1.tar.xz) = a2937a9eb0fb394a92db570496b2ea5b38066a01735385e46993bbd121068d2a
+SIZE (calibre/calibre-8.0.1.tar.xz) = 43932180
 SHA256 (calibre/VOICES.md) = a70bfdebf2f35d077b26a00378a8903509d26db04e97a9777caead04415a320d
 SIZE (calibre/VOICES.md) = 38861
-SHA256 (calibre/kovidgoyal-calibre-translations-d1f8b5c_GH0.tar.gz) = 47cbba8816f31d8d7b9dba5ab6e7e154b66706f455d62fc037116ebe31a8c46b
-SIZE (calibre/kovidgoyal-calibre-translations-d1f8b5c_GH0.tar.gz) = 74295920
-SHA256 (calibre/LibreOffice-dictionaries-762abe7_GH0.tar.gz) = d6585501ebfec22b3feb1faa9748b147db443d0a9720ef55f11444e3714a6457
-SIZE (calibre/LibreOffice-dictionaries-762abe7_GH0.tar.gz) = 117870256
+SHA256 (calibre/kovidgoyal-calibre-translations-288b823_GH0.tar.gz) = e09f3ff8749c932de6bb0263413d98599685f12622a7057ee0c07c6e20affad0
+SIZE (calibre/kovidgoyal-calibre-translations-288b823_GH0.tar.gz) = 74670184
+SHA256 (calibre/LibreOffice-dictionaries-1b8d1d5_GH0.tar.gz) = 5ea31eb76245ea30ddcd8c9f3ec149abe7b18cb0de9d878bebb66efd3a850934
+SIZE (calibre/LibreOffice-dictionaries-1b8d1d5_GH0.tar.gz) = 117894352
diff --git a/deskutils/calibre/files/patch-UDisks2-Device-Mounting b/deskutils/calibre/files/patch-UDisks2-Device-Mounting
new file mode 100644
index 000000000000..ae54d9a80b3e
--- /dev/null
+++ b/deskutils/calibre/files/patch-UDisks2-Device-Mounting
@@ -0,0 +1,288 @@
+From 6f3987721824d02a425578561ee5da49a4458607 Mon Sep 17 00:00:00 2001
+From: Guido Falsi <mad@madpilot.net>
+Date: Thu, 13 Feb 2025 17:46:43 +0100
+Subject: [PATCH] Implement FreeBSD support using UDisk2
+
+---
+ src/calibre/devices/udisks.py       |  70 ++++++++++++--
+ src/calibre/devices/usbms/device.py |  93 +++++++++++++++----
+ src/calibre/devices/usbms/hal.py    | 137 ----------------------------
+ 3 files changed, 140 insertions(+), 160 deletions(-)
+ delete mode 100644 src/calibre/devices/usbms/hal.py
+
+diff --git a/src/calibre/devices/udisks.py b/src/calibre/devices/udisks.py
+index c8e5ee00b1..aadd031f54 100644
+--- src/calibre/devices/udisks.py
++++ src/calibre/devices/udisks.py
+@@ -5,9 +5,12 @@
+ __copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
+ __docformat__ = 'restructuredtext en'
+ 
++import json
+ import os
+ import re
++import subprocess
+ from contextlib import suppress
++from calibre.constants import isfreebsd
+ 
+ 
+ def node_mountpoint(node):
+@@ -19,11 +22,18 @@ def de_mangle(raw):
+         return raw.replace(b'\\040', b' ').replace(b'\\011', b'\t').replace(b'\\012',
+                 b'\n').replace(b'\\0134', b'\\').decode('utf-8')
+ 
+-    with open('/proc/mounts', 'rb') as src:
+-        for line in src.readlines():
+-            line = line.split()
+-            if line[0] == node:
+-                return de_mangle(line[1])
++    if isfreebsd:
++        cmd = subprocess.run(['mount', '-p', '--libxo', 'json'], capture_output=True, encoding='UTF-8')
++        stdout = json.loads(cmd.stdout)
++        for row in stdout['mount']['fstab']:
++            if (row['device'].encode('utf-8') == node):
++                return de_mangle(row['mntpoint'].encode('utf-8'))
++    else:
++        with open('/proc/mounts', 'rb') as src:
++            for line in src.readlines():
++                line = line.split()
++                if line[0] == node:
++                    return de_mangle(line[1])
+     return None
+ 
+ 
+@@ -37,6 +47,7 @@ class UDisks:
+     BLOCK = f'{BUS_NAME}.Block'
+     FILESYSTEM = f'{BUS_NAME}.Filesystem'
+     DRIVE = f'{BUS_NAME}.Drive'
++    OBJECTMANAGER = 'org.freedesktop.DBus.ObjectManager'
+     PATH = '/org/freedesktop/UDisks2'
+ 
+     def __enter__(self):
+@@ -78,6 +89,37 @@ def iter_block_devices(self):
+             with suppress(Exception):
+                 yield devname, self.get_device_node_path(devname)
+ 
++    def find_device_vols_by_serial(self, serial):
++        from jeepney import DBusAddress, new_method_call
++
++        def decodePath(encoded):
++            ret = ''
++            for c in encoded:
++                if (c != 0):
++                    ret += str(c)
++            return ret
++
++        drives = []
++        blocks = []
++        vols = []
++        a = DBusAddress(self.PATH, bus_name=self.BUS_NAME, interface=self.OBJECTMANAGER)
++        msg = new_method_call(a, 'GetManagedObjects')
++        r = self.send(msg)
++        for k,v in r.body[0].items():
++            if os.path.join(self.PATH, '/block_devices') in k:
++                blocks.append({'k': k, 'v': v.get(f'{self.BUS_NAME}.Block', {})})
++            if os.path.join(self.PATH, '/drives') in k:
++                drive = v.get(f'{self.BUS_NAME}.Drive', {})
++                if drive.get('ConnectionBus')[1] == 'usb' and drive.get('Removable')[1] and drive.get('Serial')[1] == serial:
++                    drives.append(k)
++        for block in blocks:
++            if block['v']['Drive'][1] in drives:
++                vols.append({
++                    'Block': block['k'],
++                    'Device': block['v']['Device'][1].decode('ascii').strip('\x00'),
++                })
++        return vols
++
+     def device(self, device_node_path):
+         device_node_path = os.path.realpath(device_node_path)
+         devname = device_node_path.split('/')[-1]
+@@ -101,7 +143,8 @@ def filesystem_operation_message(self, device_node_path, function_name, **kw):
+     def mount(self, device_node_path):
+         msg = self.filesystem_operation_message(device_node_path, 'Mount', options=('s', ','.join(basic_mount_options())))
+         try:
+-            self.send(msg)
++            r = self.send(msg)
++            return r.body[0]
+         except Exception:
+             # May be already mounted, check
+             mp = node_mountpoint(str(device_node_path))
+@@ -130,6 +173,14 @@ def eject(self, device_node_path):
+         },))
+         self.send(msg)
+ 
++    def rescan(self, device_node_path):
++        from jeepney import new_method_call
++        devname = self.device(device_node_path)
++        a = self.address(f'block_devices/{devname}', self.BLOCK)
++        msg = new_method_call(a, 'Rescan', 'a{sv}', ({
++            'auth.no_user_interaction': ('b', True),
++        },))
++        self.send(msg)
+ 
+ def get_udisks():
+     return UDisks()
+@@ -149,6 +200,13 @@ def umount(node_path):
+     with get_udisks() as u:
+         u.unmount(node_path)
+ 
++def rescan(node_path):
++    with get_udisks() as u:
++        u.rescan(node_path)
++
++def find_device_vols_by_serial(serial):
++    with get_udisks() as u:
++        return u.find_device_vols_by_serial(serial)
+ 
+ def test_udisks():
+     import sys
+diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py
+index d4b79e9f26..ee61182b5c 100644
+--- src/calibre/devices/usbms/device.py
++++ src/calibre/devices/usbms/device.py
+@@ -20,7 +20,7 @@
+ from itertools import repeat
+ 
+ from calibre import prints
+-from calibre.constants import is_debugging, isfreebsd, islinux, ismacos, iswindows
++from calibre.constants import DEBUG, is_debugging, isfreebsd, islinux, ismacos, iswindows
+ from calibre.devices.errors import DeviceError
+ from calibre.devices.interface import FAKE_DEVICE_SERIAL, DevicePlugin, ModelMetadata
+ from calibre.devices.usbms.deviceconfig import DeviceConfig
+@@ -696,12 +696,14 @@ def is_readonly(mp):
+ #  open for FreeBSD
+ #      find the device node or nodes that match the S/N we already have from the scanner
+ #      and attempt to mount each one
+-#              1.  get list of devices in /dev with matching s/n etc.
++#              1.  get list of devices via DBUS UDisk2 with matching s/n etc.
+ #              2.  get list of volumes associated with each
+-#              3.  attempt to mount each one using Hal
++#              3.  attempt to mount each one using UDisks2
+ #              4.  when finished, we have a list of mount points and associated dbus nodes
+ #
+     def open_freebsd(self):
++        from calibre.devices.udisks import find_device_vols_by_serial
++
+         # There should be some way to access the -v arg...
+         verbose = False
+ 
+@@ -711,18 +713,80 @@ def open_freebsd(self):
+ 
+         if not d.serial:
+             raise DeviceError("Device has no S/N.  Can't continue")
+-        from .hal import get_hal
+-        hal = get_hal()
+-        vols = hal.get_volumes(d)
++
++        vols = find_device_vols_by_serial(d.serial)
++
+         if verbose:
+             print('FBSD:\t', vols)
+ 
+-        ok, mv = hal.mount_volumes(vols)
++        ok, mv = self.freebsd_mount_volumes(vols)
+         if not ok:
+             raise DeviceError(_('Unable to mount the device'))
+         for k, v in mv.items():
+             setattr(self, k, v)
+ 
++    def freebsd_mount_volumes(self, vols):
++        def fmount(node):
++            mp = self.node_mountpoint(node)
++            if mp is not None:
++                # Already mounted
++                return mp
++
++            from calibre.devices.udisks import mount, rescan
++            for i in range(6):
++                try:
++                    mp = mount(node)
++                    break
++                except Exception as e:
++                    if i < 5:
++                        rescan(node)
++                        time.sleep(1)
++                    else:
++                        print('Udisks mount call failed:')
++                        import traceback
++                        traceback.print_exc()
++
++            return mp
++
++        mp = None
++        mtd = 0
++        ans = {
++            '_main_prefix': None, '_main_vol': None,
++            '_card_a_prefix': None, '_card_a_vol': None,
++            '_card_b_prefix': None, '_card_b_vol': None,
++        }
++        for vol in vols:
++            try:
++                mp = fmount(vol['Device'])
++            except Exception as e:
++                print('Failed to mount: ' + vol['Device'])
++                import traceback
++                traceback.print_exc()
++
++            if mp is None:
++                continue
++
++            # Mount Point becomes Mount Path
++            mp += '/'
++            if DEBUG:
++                print('FBSD:\tmounted', vol['Device'], 'on', mp)
++            if mtd == 0:
++                ans['_main_prefix'], ans['_main_vol'] = mp, vol['Device']
++                if DEBUG:
++                    print('FBSD:\tmain = ', mp)
++            elif mtd == 1:
++                ans['_card_a_prefix'], ans['_card_a_vol'] = mp, vol['Device']
++                if DEBUG:
++                    print('FBSD:\tcard a = ', mp)
++            elif mtd == 2:
++                ans['_card_b_prefix'], ans['_card_b_vol'] = mp, vol['Device']
++                if DEBUG:
++                    print('FBSD:\tcard b = ', mp)
++                break
++            mtd += 1
++
++        return mtd > 0, ans
++
+ #
+ # ------------------------------------------------------
+ #
+@@ -731,14 +795,13 @@ def open_freebsd(self):
+ #        mounted filesystems, using the stored volume object
+ #
+     def eject_freebsd(self):
+-        from .hal import get_hal
+-        hal = get_hal()
++        from calibre.devices.udisks import umount
+         if self._main_prefix:
+-            hal.unmount(self._main_vol)
++            umount(self._main_vol)
+         if self._card_a_prefix:
+-            hal.unmount(self._card_a_vol)
++            umount(self._card_a_vol)
+         if self._card_b_prefix:
+-            hal.unmount(self._card_b_vol)
++            umount(self._card_b_vol)
+ 
+         self._main_prefix = self._main_vol = None
+         self._card_a_prefix = self._card_a_vol = None
+@@ -786,11 +849,7 @@ def open(self, connected_device, library_uuid):
+                     self.open_linux()
+             if isfreebsd:
+                 self._main_vol = self._card_a_vol = self._card_b_vol = None
+-                try:
+-                    self.open_freebsd()
+-                except DeviceError:
+-                    time.sleep(2)
+-                    self.open_freebsd()
++                self.open_freebsd()
+             if iswindows:
+                 self.open_windows()
+             if ismacos:
+-- 
+2.49.0
+
diff --git a/deskutils/calibre/files/user-agent-data.json b/deskutils/calibre/files/user-agent-data.json
index ccde5990a6a4..a85aa63446a2 100644
--- a/deskutils/calibre/files/user-agent-data.json
+++ b/deskutils/calibre/files/user-agent-data.json
@@ -2,112 +2,112 @@
   "common_user_agents": [
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.33 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Safari/605.1.15",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Safari/605.1.15",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 OPR/115.0.0.0",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.33 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 OPR/114.0.0.0",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:134.0) Gecko/20100101 Firefox/134.0",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
     "Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19044; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 (compatible; Liquit-SetupStore; +https://www.liquit.com/products/release-patch-management/)",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0.1 Safari/605.1.15",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0.1 Safari/605.1.15",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
     "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
-    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Avast/130.0.0.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15",
     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
   ],
   "desktop_platforms": [
-    "Macintosh; Intel Mac OS X 10_15_7",
+    "Windows NT 10.0; Microsoft Windows 10.0.19044; en-US",
     "Windows NT 10.0",
-    "Windows NT 10.0; Win64; x64",
     "Macintosh; Intel Mac OS X 10.15",
-    "Windows NT 10.0; Microsoft Windows 10.0.19044; en-US",
-    "Windows NT 6.1; Win64; x64"
+    "Macintosh; Intel Mac OS X 10_15_7",
+    "Windows NT 6.1; Win64; x64",
+    "Windows NT 10.0; Win64; x64"
   ],
-  "timestamp": "2025-02-14T07:33:34.619955+00:00",
+  "timestamp": "2025-03-21T09:35:47.732952+00:00",
   "user_agents_popularity": {
-    "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36": 2083,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0": 18138,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:134.0) Gecko/20100101 Firefox/134.0": 12517,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36": 26430,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36": 2159,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36": 3184,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36": 5137,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36": 96509,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0": 4087,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15": 2349,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15": 2019,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15": 5042,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15": 15623,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15": 1951,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0.1 Safari/605.1.15": 3265,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15": 5119,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Safari/605.1.15": 29516,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15": 45961,
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15": 10689,
-    "Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19044; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 (compatible; Liquit-SetupStore; +https://www.liquit.com/products/release-patch-management/)": 4920,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36": 10251,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36": 3174,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36": 3415,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36": 3990,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36": 7862,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36": 2311,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0": 1894,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36": 3118,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 OPR/114.0.0.0": 16343,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36": 2506,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0": 2198,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36": 13449,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Avast/130.0.0.0": 2025,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0": 4781,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 OPR/115.0.0.0": 20418,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36": 540241,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0": 275898,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.33 Safari/537.36": 18050,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36": 180872,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0": 123703,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36": 36980,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0": 4070,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0": 7405,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0": 4425,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0": 173799,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0": 130629,
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0": 44652,
-    "Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0": 4488,
-    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0": 2862
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0": 18535,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:134.0) Gecko/20100101 Firefox/134.0": 13800,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36": 40561,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36": 3300,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36": 4633,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36": 6052,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36": 102141,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0": 4268,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15": 3540,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15": 3201,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15": 2817,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15": 7533,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.6 Safari/605.1.15": 23319,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0.1 Safari/605.1.15": 4311,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1 Safari/605.1.15": 6721,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.1.1 Safari/605.1.15": 32669,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.2 Safari/605.1.15": 50304,
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3 Safari/605.1.15": 56115,
+    "Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19044; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 (compatible; Liquit-SetupStore; +https://www.liquit.com/products/release-patch-management/)": 7550,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36": 15837,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36": 4893,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36": 3838,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36": 7088,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36": 12378,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36": 3272,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0": 2645,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36": 4624,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 OPR/114.0.0.0": 16671,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36": 3299,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0": 2870,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36": 15076,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0": 5800,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 OPR/115.0.0.0": 20659,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36": 547227,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0": 280269,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.33 Safari/537.36": 225956,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36": 237635,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0": 133780,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36": 275088,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0": 142066,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36": 70797,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0": 11016,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:132.0) Gecko/20100101 Firefox/132.0": 4965,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0": 175447,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0": 134988,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0": 168049,
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0": 12497,
+    "Mozilla/5.0 (Windows NT 10.0; rv:128.0) Gecko/20100101 Firefox/128.0": 6752,
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0": 4139
   }
 }
diff --git a/deskutils/calibre/pkg-plist b/deskutils/calibre/pkg-plist
index 066679ab6eaf..453624a937cf 100644
--- a/deskutils/calibre/pkg-plist
+++ b/deskutils/calibre/pkg-plist
@@ -154,6 +154,7 @@ lib/calibre/calibre/devices/kindle/driver.py
 lib/calibre/calibre/devices/kobo/__init__.py
 lib/calibre/calibre/devices/kobo/bookmark.py
 lib/calibre/calibre/devices/kobo/books.py
+lib/calibre/calibre/devices/kobo/db.py
 lib/calibre/calibre/devices/kobo/driver.py
 lib/calibre/calibre/devices/kobo/kobotouch_config.py
 lib/calibre/calibre/devices/mime.py
@@ -198,7 +199,6 @@ lib/calibre/calibre/devices/usbms/cli.py
 lib/calibre/calibre/devices/usbms/device.py
 lib/calibre/calibre/devices/usbms/deviceconfig.py
 lib/calibre/calibre/devices/usbms/driver.py
-lib/calibre/calibre/devices/usbms/hal.py
 lib/calibre/calibre/devices/user_defined/__init__.py
 lib/calibre/calibre/devices/user_defined/driver.py
 lib/calibre/calibre/devices/utils.py
@@ -218,6 +218,7 @@ lib/calibre/calibre/ebooks/compression/palmdoc.py
 lib/calibre/calibre/ebooks/compression/tcr.py
 lib/calibre/calibre/ebooks/constants.py
 lib/calibre/calibre/ebooks/conversion/__init__.py
+lib/calibre/calibre/ebooks/conversion/archives.py
 lib/calibre/calibre/ebooks/conversion/cli.py
 lib/calibre/calibre/ebooks/conversion/config.py
 lib/calibre/calibre/ebooks/conversion/plugins/__init__.py
@@ -479,6 +480,7 @@ lib/calibre/calibre/ebooks/oeb/polish/hyphenation.py
 lib/calibre/calibre/ebooks/oeb/polish/images.py
 lib/calibre/calibre/ebooks/oeb/polish/import_book.py
 lib/calibre/calibre/ebooks/oeb/polish/jacket.py
+lib/calibre/calibre/ebooks/oeb/polish/kepubify.py
 lib/calibre/calibre/ebooks/oeb/polish/main.py
 lib/calibre/calibre/ebooks/oeb/polish/opf.py
 lib/calibre/calibre/ebooks/oeb/polish/parsing.py
@@ -493,6 +495,7 @@ lib/calibre/calibre/ebooks/oeb/polish/tests/__init__.py
 lib/calibre/calibre/ebooks/oeb/polish/tests/base.py
 lib/calibre/calibre/ebooks/oeb/polish/tests/cascade.py
 lib/calibre/calibre/ebooks/oeb/polish/tests/container.py
+lib/calibre/calibre/ebooks/oeb/polish/tests/kepubify.py
 lib/calibre/calibre/ebooks/oeb/polish/tests/main.py
 lib/calibre/calibre/ebooks/oeb/polish/tests/parsing.py
 lib/calibre/calibre/ebooks/oeb/polish/tests/structure.py
@@ -739,6 +742,8 @@ lib/calibre/calibre/gui2/convert/heuristics.py
 lib/calibre/calibre/gui2/convert/heuristics_ui.py
 lib/calibre/calibre/gui2/convert/htmlz_output.py
 lib/calibre/calibre/gui2/convert/htmlz_output_ui.py
+lib/calibre/calibre/gui2/convert/kepub_output.py
+lib/calibre/calibre/gui2/convert/kepub_output_ui.py
 lib/calibre/calibre/gui2/convert/look_and_feel.py
 lib/calibre/calibre/gui2/convert/look_and_feel_ui.py
 lib/calibre/calibre/gui2/convert/lrf_output.py
@@ -808,6 +813,7 @@ lib/calibre/calibre/gui2/dialogs/comments_dialog.py
 lib/calibre/calibre/gui2/dialogs/confirm_delete.py
 lib/calibre/calibre/gui2/dialogs/confirm_delete_location.py
 lib/calibre/calibre/gui2/dialogs/confirm_merge.py
+lib/calibre/calibre/gui2/dialogs/connect_to_folder.py
 lib/calibre/calibre/gui2/dialogs/conversion_error.py
 lib/calibre/calibre/gui2/dialogs/conversion_error_ui.py
 lib/calibre/calibre/gui2/dialogs/custom_recipes.py
@@ -1745,6 +1751,7 @@ lib/calibre/tinycss/version.py
 %%DATADIR%%/images/mimetypes/gif.png
 %%DATADIR%%/images/mimetypes/html.png
 %%DATADIR%%/images/mimetypes/jpeg.png
+%%DATADIR%%/images/mimetypes/kfx.png
 %%DATADIR%%/images/mimetypes/lit.png
 %%DATADIR%%/images/mimetypes/lrf.png
 %%DATADIR%%/images/mimetypes/lrx.png
@@ -1917,6 +1924,7 @@ lib/calibre/tinycss/version.py
 %%DATADIR%%/templates/html_export_default.tmpl
 %%DATADIR%%/templates/html_export_default_index.tmpl
 %%DATADIR%%/templates/inline_toc_styles.css
+%%DATADIR%%/templates/kobo.js
 %%DATADIR%%/templates/lrf.xsl
 %%DATADIR%%/templates/new_book.html
 %%DATADIR%%/templates/new_nav.html