1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-26 10:35:50 +01:00
Commit Graph

9721 Commits

Author SHA1 Message Date
Martin.JM
01ef422812 Set alarm as used and enabled if time has changed 2024-02-18 16:33:50 +01:00
JdM
64c024a5ce Added support for xiaomi redmi watch 3 (#3582)
Co-authored-by: JdM <julien@rmbi.ch>
Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/3582
Co-authored-by: JdM <judemont@noreply.codeberg.org>
Co-committed-by: JdM <judemont@noreply.codeberg.org>
2024-02-18 13:55:14 +00:00
Arjan Schrijver
122ff5f7f4 Fossil/Skagen Hybrids: Fix crash on multi-byte unicode characters in menu
The FosslAppWriter was writing string length instead of the bytes length
into the wapp file, causing a crash when reading the file.

Fixes #3577
2024-02-17 21:25:25 +01:00
José Rebelo
ad256fade0 Test Device: Fix NPE when using the database 2024-02-16 23:09:46 +00:00
José Rebelo
a3bd7a297a Test Device: Add fake features and data 2024-02-16 22:56:27 +00:00
Damien 'Psolyca' Gaignon
6a576202a9
[Huawei] Add Huawei Watch Fit gadget 2024-02-13 14:12:23 +01:00
Arjan Schrijver
d637b9263c Fix linter errors 2024-02-13 10:54:12 +01:00
Damien 'Psolyca' Gaignon
874bb1a14e
[Huawei] Fix test 2024-02-13 00:18:48 +01:00
Daniel Dakhno
264b6470cd Revert "Device connection: added basic code for scan-reconnect"
This reverts commit adf55fea93.
2024-02-12 23:30:32 +01:00
Daniel Dakhno
adf55fea93 Device connection: added basic code for scan-reconnect 2024-02-12 23:28:10 +01:00
Andreas Shimokawa
8b9462f521 fix tests 2024-02-12 18:31:48 +01:00
arjan-s
a977436200
Translated using Weblate (Dutch)
Currently translated at 100.0% (2598 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/nl/
2024-02-12 15:37:05 +01:00
arjan-s
88dacc2d3b
Translated using Weblate (Dutch)
Currently translated at 96.8% (2516 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/nl/
2024-02-12 15:37:05 +01:00
skdubg
151cc6120a
Translated using Weblate (German)
Currently translated at 100.0% (2598 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
gallegonovato
a8e7e3fb10
Translated using Weblate (Spanish)
Currently translated at 96.7% (2514 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/es/
2024-02-12 15:37:04 +01:00
Rex_sa
0b0b3876a5
Translated using Weblate (Arabic)
Currently translated at 100.0% (2598 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ar/
2024-02-12 15:37:04 +01:00
Ghost of Sparta
43c3d85762
Translated using Weblate (Hungarian)
Currently translated at 53.5% (1390 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/hu/
2024-02-12 15:37:04 +01:00
0que
099a4bf8ef
Translated using Weblate (Russian)
Currently translated at 97.5% (2535 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ru/
2024-02-12 15:37:04 +01:00
Ihor Hordiichuk
cd9e22a2a4
Translated using Weblate (Ukrainian)
Currently translated at 94.3% (2450 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/uk/
2024-02-12 15:37:04 +01:00
Ács Zoltán
4603be0993
Translated using Weblate (Hungarian)
Currently translated at 52.6% (1367 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/hu/
2024-02-12 15:37:04 +01:00
陈少举
8ff2051430
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2598 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/zh_Hans/
2024-02-12 15:37:04 +01:00
skdubg
b7122aeb29
Translated using Weblate (German)
Currently translated at 100.0% (2598 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
skdubg
d913c4e082
Translated using Weblate (German)
Currently translated at 98.8% (2568 of 2598 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
陈少举
11e2d55cf6
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2597 of 2597 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/zh_Hans/
2024-02-12 15:37:04 +01:00
0que
a8a94d8a23
Translated using Weblate (Russian)
Currently translated at 97.3% (2528 of 2597 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ru/
2024-02-12 15:37:04 +01:00
Gregory Blanco
7aa66605a2
Translated using Weblate (Polish)
Currently translated at 98.9% (2571 of 2597 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pl/
2024-02-12 15:37:04 +01:00
skdubg
ad46e23ebc
Translated using Weblate (German)
Currently translated at 98.8% (2567 of 2597 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
gallegonovato
1474692a69
Translated using Weblate (Spanish)
Currently translated at 96.7% (2513 of 2597 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/es/
2024-02-12 15:37:04 +01:00
Rex_sa
b6140c8879
Translated using Weblate (Arabic)
Currently translated at 100.0% (2511 of 2511 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ar/
2024-02-12 15:37:04 +01:00
Ihor Hordiichuk
c5753d3ab9
Translated using Weblate (Ukrainian)
Currently translated at 97.2% (2441 of 2511 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/uk/
2024-02-12 15:37:04 +01:00
0que
b33e36eec2
Translated using Weblate (Russian)
Currently translated at 99.5% (2499 of 2511 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ru/
2024-02-12 15:37:04 +01:00
gallegonovato
2dee70022f
Translated using Weblate (Spanish)
Currently translated at 100.0% (2511 of 2511 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/es/
2024-02-12 15:37:04 +01:00
MattSolo451
4a43e31a0f
Translated using Weblate (Polish)
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pl/
2024-02-12 15:37:04 +01:00
Xtremo3
e8936124c1
Translated using Weblate (Polish)
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pl/
2024-02-12 15:37:04 +01:00
MattSolo451
cb38d095e1
Translated using Weblate (Polish)
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pl/
2024-02-12 15:37:04 +01:00
gallegonovato
9300e7035f
Translated using Weblate (Spanish)
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/es/
2024-02-12 15:37:04 +01:00
skdubg
af204c7f95
Translated using Weblate (German)
Currently translated at 98.9% (2484 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
Rex_sa
3dda7621cf
Translated using Weblate (Arabic)
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ar/
2024-02-12 15:37:04 +01:00
nautilusx
8dc09c631d
Translated using Weblate (German)
Currently translated at 98.2% (2467 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
Software In Interlingua
a91dc76d82
Added translation using Weblate (Interlingua) 2024-02-12 15:37:04 +01:00
skdubg
1fe4c2db35
Translated using Weblate (German)
Currently translated at 94.8% (2381 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
0que
14635dbf3a
Translated using Weblate (Russian)
Currently translated at 99.5% (2498 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ru/
2024-02-12 15:37:04 +01:00
skdubg
411197c8f3
Translated using Weblate (German)
Currently translated at 94.8% (2380 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
arjan-s
40aba39ea5
Translated using Weblate (Dutch)
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/nl/
2024-02-12 15:37:04 +01:00
skdubg
9ad503cfe0
Translated using Weblate (German)
Currently translated at 94.9% (2383 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
Traladarer
d647def609
Translated using Weblate (German)
Currently translated at 92.9% (2333 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
Traladarer
7f5ce81685
Translated using Weblate (German)
Currently translated at 92.9% (2333 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
skdubg
4f6bc46168
Translated using Weblate (German)
Currently translated at 92.9% (2333 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/de/
2024-02-12 15:37:04 +01:00
陈少举
2286839891
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2510 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/zh_Hans/
2024-02-12 15:37:04 +01:00
Gregory Blanco
969ee2c55e
Translated using Weblate (Polish)
Currently translated at 99.8% (2505 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pl/
2024-02-12 15:37:04 +01:00
gallegonovato
8a1bc1b524
Translated using Weblate (Spanish)
Currently translated at 99.9% (2509 of 2510 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/es/
2024-02-12 15:37:04 +01:00
陈少举
3f0e0c203d
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2487 of 2487 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/zh_Hans/
2024-02-12 15:37:04 +01:00
0que
8da0b76af1
Translated using Weblate (Russian)
Currently translated at 99.5% (2475 of 2487 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/ru/
2024-02-12 15:37:04 +01:00
Gregory Blanco
2a2c2de041
Translated using Weblate (Polish)
Currently translated at 100.0% (2487 of 2487 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/pl/
2024-02-12 15:37:04 +01:00
gallegonovato
6f48f67dcd
Translated using Weblate (Spanish)
Currently translated at 100.0% (2487 of 2487 strings)

Translation: Freeyourgadget/Gadgetbridge
Translate-URL: https://hosted.weblate.org/projects/freeyourgadget/gadgetbridge/es/
2024-02-12 15:37:04 +01:00
Andreas Shimokawa
5b804bfb17 update changelogs, bump version 2024-02-12 15:36:50 +01:00
Aleksandr Ivanov
2c316bfe9d Pebble: fix of pairing issue with Pebble 2 2024-02-10 16:01:45 +00:00
José Rebelo
983b7352cb Galaxy Buds2 Pro: Fix recognition of some versions
Not all earbuds use "Galaxy" in the name, apparently.

Fixes #3569
2024-02-10 12:46:55 +00:00
Damien 'Psolyca' Gaignon
88f3cc4fd0
[Huawei] Fix regression introduced with HiChainLite 2024-02-09 22:22:33 +01:00
Damien 'Psolyca' Gaignon
fc857b8adb
[Huawei] Fix attribut keyword 2024-02-09 12:03:04 +01:00
Damien 'Psolyca' Gaignon
ef06fd4d5e
[Huawei] Fix test 2024-02-09 12:03:03 +01:00
Damien 'Psolyca' Gaignon
21b97a9276
[Huawei] Fix BondParamsRequest stopChain 2024-02-09 12:03:03 +01:00
Damien 'Psolyca' Gaignon
510b8096ed
[Huawei] Fix transactions encryption 2024-02-09 12:03:02 +01:00
Damien 'Psolyca' Gaignon
d5cecc4a84
[Huawei] GT2 transaction crypted 2024-02-09 12:03:02 +01:00
Damien 'Psolyca' Gaignon
bb5fe00643
[Huawei] Change bond request behaviour 2024-02-09 12:03:02 +01:00
Damien 'Psolyca' Gaignon
05c11cbd14
[Huawei] Add HiChainLite firstKey handling 2024-02-09 12:03:01 +01:00
Damien 'Psolyca' Gaignon
270212a771
[Huawei] Rename authMode to deviceSupportType 2024-02-09 12:03:01 +01:00
Damien 'Psolyca' Gaignon
2880297c51
[Huawei] Fix pin code encoding 2024-02-09 12:02:53 +01:00
Arjan Schrijver
8aaa766dcd Fix crash when receiving empty music state 2024-02-04 20:35:40 +01:00
José Rebelo
145c2b8c6c Zepp OS: Recognize devices with a dash before mac address suffix 2024-02-02 20:58:00 +00:00
José Rebelo
944e0d92a7 Zepp OS: Fix AGPS uploads
Regression introduced by 34fd18885a - UIHH upload is needed for AGPS
updates on older devices.
2024-02-02 20:51:06 +00:00
Damien 'Psolyca' Gaignon
2a377ba5ab
[Huawei] Change bonding style for all BR gadgets 2024-02-01 22:14:45 +01:00
José Rebelo
3e08a754e0 Xiaomi: Fix indoor cycling recognition 2024-02-01 20:02:31 +00:00
Victor Kareh
b647631c07 pinetime: Fix weather forecast write
Fixes a typo in the weather forecast characteristic writer that causes
Gadgetbridge to send the current weather twice rather than sending the
forecast.
2024-02-01 18:59:06 +00:00
José Rebelo
dbfb8e5c38 Zepp OS: Improve logging
- Do not log characteristic changes handled by parent class
- Log discovered service names
- Request and log supported config groups
2024-02-01 18:48:15 +00:00
José Rebelo
aa4a7912ef Zepp OS: Match devices by exact bluetooth name
This attemts to reduce false positives, especially for devices that
present as two bluetooth devices such as the GTR 4.
2024-02-01 18:47:36 +00:00
José Rebelo
34fd18885a Zepp OS: Refactor firmware uploads
Zepp OS 3 firmware upgrades are big (200MB+). Gadgetbridge was crashing,
since the entire firmware file would be pulled into memory.

This commit unifies all the logic for Zepp OS firmware handling.

However, since the needed refactor was big, this commit duplicates some
of the code from Huami classes, namely:
- ZeppOsFirmwareUpdateOperation clones UpdateFirmwareOperation2020
- ZeppOsFwInstallHandler clones AbstractMiBandFWInstallHandler

This avoids changes to older device logic and introducing regressions.

Lost functionality:
- Repackaging firmwares as UIHH (does not seem to be needed, and was not
  used anyway). Code can be recovered from this commit if needed in the
  future
- Whitelisted firmwares by checksum (we do not have a lot of them at
  this point anyway)

Other misc changes:
- Rename ZipFile to GBZipFile not to clash with the java class

Tested by updating the Amazfit GTR 4 to Zepp OS 3.
2024-02-01 18:47:28 +00:00
Martin.JM
4b38a67a58 Fix Huawei exceptions related to early packets
Also adds more robust tag checks for Huawei packets
2024-01-30 12:15:46 +01:00
José Rebelo
773132c4e1 Make all Zepp OS classes explicit
There are still some actual "Huami 2021" classes that are used in
non-ZeppOS devices, but this refactor improves the distinction.
2024-01-29 23:30:28 +00:00
Damien 'Psolyca' Gaignon
86461ada1a
[Huawei] Add new Crypto and authMode 2024-01-29 21:51:45 +01:00
Damien 'Psolyca' Gaignon
f759072a7c
[Huawei] Add PBKDF2 crypto 2024-01-29 21:34:08 +01:00
Damien 'Psolyca' Gaignon
2b5a49641a
[Huawei] Fix clientNonce for HiChainLite 2024-01-29 21:21:20 +01:00
José Rebelo
61116c5fc8 Upgrade to gradlew 7.6, mockito-core 2.28.2
Fixes the unit tests after the AGP upgrade from 1a92bcf8a
2024-01-29 18:50:40 +00:00
José Rebelo
c472f0ab9a Redmi Watch 2: Experimental support 2024-01-29 18:14:34 +00:00
opcode
cf0e8be816 Xiaomi: Further sleep parsing fix 2024-01-28 21:01:20 +00:00
José Rebelo
b0ff9eae88 MusicManager: Fix NPE when music not playing 2024-01-28 20:26:35 +00:00
Damien 'Psolyca' Gaignon
a53d59f907
Add AW for bond request 2024-01-28 20:46:47 +01:00
Damien 'Psolyca' Gaignon
b860ab116f
Add uncrypted transactions for TalkBand 6 2024-01-28 20:46:47 +01:00
Damien 'Psolyca' Gaignon
2a41b77ffc
Add uncrypted transactions for GT3 2024-01-28 20:46:46 +01:00
Damien 'Psolyca' Gaignon
a64317fe7a
Add uncrypted transactions for GT2 2024-01-28 20:46:46 +01:00
Damien 'Psolyca' Gaignon
e974d00104
Set transaction encryption to false 2024-01-28 20:46:45 +01:00
Damien 'Psolyca' Gaignon
0ed9e5b1a8
Fix normal mode connection 2024-01-28 20:46:45 +01:00
Damien 'Psolyca' Gaignon
0e5545191d
Add Honor Magic Watch 2 2024-01-28 20:46:27 +01:00
José Rebelo
5999eb01d0 Nothing CMF Watch Pro: Initial support 2024-01-28 18:46:13 +00:00
Denis Pitzalis
207a2a9b01 initial support for sony WI-SP600N (#3522)
Initial support for sony wi-sp600n reported working . minor difference with the inspiring wf-sp800n

Reviewed-on: https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/3522
Co-authored-by: Denis Pitzalis <denics@free.fr>
Co-committed-by: Denis Pitzalis <denics@free.fr>
2024-01-27 23:21:11 +00:00
Aleksandr Ivanov
139e9cfb14 Pebble: fix of app configuration webview 2024-01-28 01:54:12 +03:00
opcode
4dbe5744da Xiaomi: Fix parsing sleep headers 2024-01-26 21:49:40 +01:00
José Rebelo
1a92bcf8a5 Upgrade to Android Gradle Plugin 7.4.2
Rename "main" flavor to "mainline", since that breaks the build.

https://stackoverflow.com/questions/72775247/productflavors-main-gradle-error-multiple-entries-with-same-key-main-and
2024-01-22 20:18:49 +00:00
MrYoranimo
8a7de15841 BtLEQueue: update device state on main looper
If the device connection state is updated from two threads simultaneously
(as in, from the main looper and from the thread that handles
BluetoothDevice.connectGatt), a second update may get overridden by the
first update if the broadcasts are handled out-of-order by the
LocalBroadcastManager.

By updating the device state through a handler on the main looper, the
broadcasts are sent in order as they are processed from the looper's
queue.

This may be a potential solve for issue #3524.
2024-01-21 01:56:34 +01:00
José Rebelo
7955bdfb6f Xiaomi: Improve sleep parsing
- Some devices send a random int 0, which would prevent sleep stage
  parsing
- Some devices send the details as a file of type summary, but same
  structure
- It is still not stable for all devices

Thanks to @opcode for the parsing logic
2024-01-20 23:16:36 +00:00