diff --git a/rflog.h-backup b/archived/rflog-broken.h
similarity index 64%
rename from rflog.h-backup
rename to archived/rflog-broken.h
index 88769a49f7b57e193f5f8d8da3b9da31e7be71ad..eaecc9534d1661479ec6250ff937b462d3bd51e5 100644
--- a/rflog.h-backup
+++ b/archived/rflog-broken.h
@@ -1,5 +1,5 @@
 // GPT-4o generated. NOT thread safe.
-// v2502.1
+// v2502.2
 #ifndef SIMPLE_LOGGER_H
 #define SIMPLE_LOGGER_H
 
@@ -11,15 +11,15 @@
 #if defined(_WIN32) && defined(NTDDI_VERSION)
 #include <ntddk.h>
 #include <ntstrsafe.h>  // For RtlStringCbPrintfA
-#define RL_SNPRINTF_FUNC RtlStringCbPrintfA
+#define RL_SNPRINTF_F RtlStringCbPrintfA
 #define RL_LOG_FILE_PATH "N/A"
 #elif defined(_WIN32)
 #include <windows.h>
-#define RL_SNPRINTF_FUNC snprintf
+#define RL_SNPRINTF_F snprintf
 #define RL_LOG_FILE_PATH "C:\\rflog.txt"
 #else
 #include <sys/time.h>
-#define RL_SNPRINTF_FUNC snprintf
+#define RL_SNPRINTF_F snprintf
 #define RL_LOG_FILE_PATH "/tmp/rflog.txt"
 #endif
 
@@ -42,6 +42,16 @@ static RL_THREAD_LOC char log_buffer[RL_LOG_BUFFER_SIZE];
 static RL_THREAD_LOC WCHAR wideBuffer[RL_LOG_BUFFER_SIZE];
 #endif
 
+#if defined(_WIN32) && defined(NTDDI_VERSION)
+// Windows kernel-mode only
+size_t NaiveStrlen(const char *str) {
+    if (!str) return 0;
+    size_t len = 0;
+    while (str[len]) len++;
+    return len;
+}
+#endif
+
 RL_UNUSED static const char *get_current_datetime() {
 #if defined(_WIN32) && defined(NTDDI_VERSION)
     // Windows kernel-mode implementation
@@ -53,7 +63,7 @@ RL_UNUSED static const char *get_current_datetime() {
     RtlTimeToTimeFields(&local_time, &time_fields);
 
     // Format the datetime string
-    RL_SNPRINTF_FUNC (datetime_buffer, RL_DATETIME_BUFFER_SIZE,
+    RL_SNPRINTF_F (datetime_buffer, RL_DATETIME_BUFFER_SIZE,
                        "%04d-%02d-%02d %02d:%02d:%02d.%03d",
                        time_fields.Year, time_fields.Month, time_fields.Day,
                        time_fields.Hour, time_fields.Minute, time_fields.Second, 0); // No millisecond precision in kernel
@@ -80,22 +90,28 @@ RL_UNUSED static const char *get_current_datetime() {
 
 RL_UNUSED static void log_to_file(const char *message) {
 #if defined(_WIN32) && defined(NTDDI_VERSION)
-    // Windows kernel-mode
-    size_t messageLen = strlen(message);
-    size_t maxConvertLength = RL_LOG_BUFFER_SIZE - 1; // Leave space for null terminator
-
-    if (messageLen > maxConvertLength) {
-        messageLen = maxConvertLength; // Truncate if message is too long
-    }
-
-    // Manually convert char* to WCHAR* by iterating through the string
-    for (size_t i = 0; i < messageLen; ++i) {
-        wideBuffer[i] = (WCHAR)message[i]; // Cast each char to WCHAR
+    { // Windows kernel-mode
+        HANDLE hPipe;
+        UNICODE_STRING pipeName;
+        OBJECT_ATTRIBUTES objAttr;
+        IO_STATUS_BLOCK ioStatus;
+        NTSTATUS status;
+        LARGE_INTEGER timeout;
+        timeout.QuadPart = -10 * 1000 * 10; // 10 ms timeout
+    
+        RtlInitUnicodeString(&pipeName, L"\\??\\pipe\\rflog_pipe");
+        InitializeObjectAttributes(&objAttr, &pipeName, OBJ_CASE_INSENSITIVE, NULL, NULL);
+    
+        status = ZwCreateFile(&hPipe, GENERIC_WRITE, &objAttr, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, 0, NULL, 0);
+        if (!NT_SUCCESS(status)) {
+            return; // Pipe does not exist or cannot be opened
+        }
+    
+        status = ZwWriteFile(hPipe, NULL, NULL, NULL, &ioStatus, (void*)message, (ULONG)NaiveStrlen(message), NULL, NULL);
+        ZwClose(hPipe);
+        return;
+        // old solution // TraceDtlsMiscTraceOnPort(NULL, wideBuffer);
     }
-    wideBuffer[messageLen] = L'\0'; // Null-terminate the wide string
-
-    // Log the wide string
-    TraceDtlsMiscTraceOnPort(NULL, wideBuffer);
 #else
     // User mode
     FILE *file = fopen(RL_LOG_FILE_PATH, "a");
@@ -110,23 +126,23 @@ RL_UNUSED static void log_to_file(const char *message) {
 
 
 RL_UNUSED static void rflogs(const char *message) {
-    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s", get_current_datetime(), message);
+    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s", get_current_datetime(), message);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogsi(const char *message, int value) {
-    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d", get_current_datetime(), message, value);
+    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d", get_current_datetime(), message, value);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogsii(const char *message, int value, int i2) {
-    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d", get_current_datetime(), message, value, i2);
+    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d", get_current_datetime(), message, value, i2);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogsiip(const char *message, int value, int i2, void *ptr) {
-    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d, %p", get_current_datetime(), message, value, i2, ptr);
+    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d, %p", get_current_datetime(), message, value, i2, ptr);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogss(const char *message1, const char *message2) {
-    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %s", get_current_datetime(), message1, message2);
+    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %s", get_current_datetime(), message1, message2);
     log_to_file(log_buffer);
 }
 
diff --git a/fish-config/functions/totpapi.fish b/fish-config/functions/totpapi.fish
new file mode 100644
index 0000000000000000000000000000000000000000..6a2f59ee3819f7cfae34f0309c1a05873c99d37d
--- /dev/null
+++ b/fish-config/functions/totpapi.fish
@@ -0,0 +1,7 @@
+function totpapi
+if test -n "$argv[1]"
+curl -X POST https://recolic.net/res/river/rauth/secdump.php --data $argv[1]
+else
+echo "Usage: totpapi (rsec TOTP_CARD_SEED_*)"
+end
+end
diff --git a/rflog.h b/rflog.h
index eaecc9534d1661479ec6250ff937b462d3bd51e5..88769a49f7b57e193f5f8d8da3b9da31e7be71ad 100644
--- a/rflog.h
+++ b/rflog.h
@@ -1,5 +1,5 @@
 // GPT-4o generated. NOT thread safe.
-// v2502.2
+// v2502.1
 #ifndef SIMPLE_LOGGER_H
 #define SIMPLE_LOGGER_H
 
@@ -11,15 +11,15 @@
 #if defined(_WIN32) && defined(NTDDI_VERSION)
 #include <ntddk.h>
 #include <ntstrsafe.h>  // For RtlStringCbPrintfA
-#define RL_SNPRINTF_F RtlStringCbPrintfA
+#define RL_SNPRINTF_FUNC RtlStringCbPrintfA
 #define RL_LOG_FILE_PATH "N/A"
 #elif defined(_WIN32)
 #include <windows.h>
-#define RL_SNPRINTF_F snprintf
+#define RL_SNPRINTF_FUNC snprintf
 #define RL_LOG_FILE_PATH "C:\\rflog.txt"
 #else
 #include <sys/time.h>
-#define RL_SNPRINTF_F snprintf
+#define RL_SNPRINTF_FUNC snprintf
 #define RL_LOG_FILE_PATH "/tmp/rflog.txt"
 #endif
 
@@ -42,16 +42,6 @@ static RL_THREAD_LOC char log_buffer[RL_LOG_BUFFER_SIZE];
 static RL_THREAD_LOC WCHAR wideBuffer[RL_LOG_BUFFER_SIZE];
 #endif
 
-#if defined(_WIN32) && defined(NTDDI_VERSION)
-// Windows kernel-mode only
-size_t NaiveStrlen(const char *str) {
-    if (!str) return 0;
-    size_t len = 0;
-    while (str[len]) len++;
-    return len;
-}
-#endif
-
 RL_UNUSED static const char *get_current_datetime() {
 #if defined(_WIN32) && defined(NTDDI_VERSION)
     // Windows kernel-mode implementation
@@ -63,7 +53,7 @@ RL_UNUSED static const char *get_current_datetime() {
     RtlTimeToTimeFields(&local_time, &time_fields);
 
     // Format the datetime string
-    RL_SNPRINTF_F (datetime_buffer, RL_DATETIME_BUFFER_SIZE,
+    RL_SNPRINTF_FUNC (datetime_buffer, RL_DATETIME_BUFFER_SIZE,
                        "%04d-%02d-%02d %02d:%02d:%02d.%03d",
                        time_fields.Year, time_fields.Month, time_fields.Day,
                        time_fields.Hour, time_fields.Minute, time_fields.Second, 0); // No millisecond precision in kernel
@@ -90,28 +80,22 @@ RL_UNUSED static const char *get_current_datetime() {
 
 RL_UNUSED static void log_to_file(const char *message) {
 #if defined(_WIN32) && defined(NTDDI_VERSION)
-    { // Windows kernel-mode
-        HANDLE hPipe;
-        UNICODE_STRING pipeName;
-        OBJECT_ATTRIBUTES objAttr;
-        IO_STATUS_BLOCK ioStatus;
-        NTSTATUS status;
-        LARGE_INTEGER timeout;
-        timeout.QuadPart = -10 * 1000 * 10; // 10 ms timeout
-    
-        RtlInitUnicodeString(&pipeName, L"\\??\\pipe\\rflog_pipe");
-        InitializeObjectAttributes(&objAttr, &pipeName, OBJ_CASE_INSENSITIVE, NULL, NULL);
-    
-        status = ZwCreateFile(&hPipe, GENERIC_WRITE, &objAttr, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, 0, NULL, 0);
-        if (!NT_SUCCESS(status)) {
-            return; // Pipe does not exist or cannot be opened
-        }
-    
-        status = ZwWriteFile(hPipe, NULL, NULL, NULL, &ioStatus, (void*)message, (ULONG)NaiveStrlen(message), NULL, NULL);
-        ZwClose(hPipe);
-        return;
-        // old solution // TraceDtlsMiscTraceOnPort(NULL, wideBuffer);
+    // Windows kernel-mode
+    size_t messageLen = strlen(message);
+    size_t maxConvertLength = RL_LOG_BUFFER_SIZE - 1; // Leave space for null terminator
+
+    if (messageLen > maxConvertLength) {
+        messageLen = maxConvertLength; // Truncate if message is too long
+    }
+
+    // Manually convert char* to WCHAR* by iterating through the string
+    for (size_t i = 0; i < messageLen; ++i) {
+        wideBuffer[i] = (WCHAR)message[i]; // Cast each char to WCHAR
     }
+    wideBuffer[messageLen] = L'\0'; // Null-terminate the wide string
+
+    // Log the wide string
+    TraceDtlsMiscTraceOnPort(NULL, wideBuffer);
 #else
     // User mode
     FILE *file = fopen(RL_LOG_FILE_PATH, "a");
@@ -126,23 +110,23 @@ RL_UNUSED static void log_to_file(const char *message) {
 
 
 RL_UNUSED static void rflogs(const char *message) {
-    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s", get_current_datetime(), message);
+    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s", get_current_datetime(), message);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogsi(const char *message, int value) {
-    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d", get_current_datetime(), message, value);
+    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d", get_current_datetime(), message, value);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogsii(const char *message, int value, int i2) {
-    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d", get_current_datetime(), message, value, i2);
+    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d", get_current_datetime(), message, value, i2);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogsiip(const char *message, int value, int i2, void *ptr) {
-    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d, %p", get_current_datetime(), message, value, i2, ptr);
+    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %d, %d, %p", get_current_datetime(), message, value, i2, ptr);
     log_to_file(log_buffer);
 }
 RL_UNUSED static void rflogss(const char *message1, const char *message2) {
-    RL_SNPRINTF_F(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %s", get_current_datetime(), message1, message2);
+    RL_SNPRINTF_FUNC(log_buffer, RL_LOG_BUFFER_SIZE, "[%s] %s: %s", get_current_datetime(), message1, message2);
     log_to_file(log_buffer);
 }