From af917d715810acb71b58503e5d12f1b00958045c Mon Sep 17 00:00:00 2001 From: loucass003 Date: Thu, 12 Feb 2026 18:46:54 +0100 Subject: [PATCH 001/103] WIP --- gui/.gitignore | 5 + gui/electron.vite.config.ts | 36 ++ gui/electron/.gitignore | 1 + gui/electron/main/index.ts | 343 ++++++++++++++++++ .../main/java-version/JavaVersion.jar | Bin 0 -> 876 bytes .../main/java-version/JavaVersion.java | 8 + gui/electron/main/logger.ts | 26 ++ gui/electron/main/paths.ts | 43 +++ gui/electron/main/store.ts | 77 ++++ gui/electron/main/utils.ts | 30 ++ gui/electron/preload/index.ts | 38 ++ gui/electron/preload/interface.d.ts | 44 +++ gui/electron/ressources/icons/128x128.png | Bin 0 -> 2808 bytes gui/electron/ressources/icons/128x128@2x.png | Bin 0 -> 5884 bytes gui/electron/ressources/icons/32x32.png | Bin 0 -> 747 bytes .../ressources/icons/Square107x107Logo.png | Bin 0 -> 2336 bytes .../ressources/icons/Square142x142Logo.png | Bin 0 -> 3177 bytes .../ressources/icons/Square150x150Logo.png | Bin 0 -> 3321 bytes .../ressources/icons/Square284x284Logo.png | Bin 0 -> 6460 bytes .../ressources/icons/Square30x30Logo.png | Bin 0 -> 698 bytes .../ressources/icons/Square310x310Logo.png | Bin 0 -> 6951 bytes .../ressources/icons/Square44x44Logo.png | Bin 0 -> 1008 bytes .../ressources/icons/Square71x71Logo.png | Bin 0 -> 1534 bytes .../ressources/icons/Square89x89Logo.png | Bin 0 -> 2027 bytes gui/electron/ressources/icons/StoreLogo.png | Bin 0 -> 1163 bytes .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1190 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 3581 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 1190 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1137 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2448 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 1137 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2112 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 4960 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 2112 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3185 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 7081 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 3185 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 4236 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 9824 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 4236 bytes .../ressources/icons/appleTrayIcon.png | Bin 0 -> 922 bytes gui/electron/ressources/icons/icon.icns | Bin 0 -> 69880 bytes gui/electron/ressources/icons/icon.ico | Bin 0 -> 12393 bytes gui/electron/ressources/icons/icon.png | Bin 0 -> 11880 bytes gui/electron/ressources/icons/icon.svg | 1 + .../ressources/icons/ios/AppIcon-20x20@1x.png | Bin 0 -> 555 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 0 -> 848 bytes .../ressources/icons/ios/AppIcon-20x20@2x.png | Bin 0 -> 848 bytes .../ressources/icons/ios/AppIcon-20x20@3x.png | Bin 0 -> 1310 bytes .../ressources/icons/ios/AppIcon-29x29@1x.png | Bin 0 -> 645 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 0 -> 1287 bytes .../ressources/icons/ios/AppIcon-29x29@2x.png | Bin 0 -> 1287 bytes .../ressources/icons/ios/AppIcon-29x29@3x.png | Bin 0 -> 1921 bytes .../ressources/icons/ios/AppIcon-40x40@1x.png | Bin 0 -> 848 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 0 -> 1742 bytes .../ressources/icons/ios/AppIcon-40x40@2x.png | Bin 0 -> 1742 bytes .../ressources/icons/ios/AppIcon-40x40@3x.png | Bin 0 -> 2527 bytes .../ressources/icons/ios/AppIcon-512@2x.png | Bin 0 -> 26091 bytes .../ressources/icons/ios/AppIcon-60x60@2x.png | Bin 0 -> 2527 bytes .../ressources/icons/ios/AppIcon-60x60@3x.png | Bin 0 -> 3857 bytes .../ressources/icons/ios/AppIcon-76x76@1x.png | Bin 0 -> 1621 bytes .../ressources/icons/ios/AppIcon-76x76@2x.png | Bin 0 -> 3047 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 0 -> 3510 bytes gui/electron/shared.ts | 41 +++ gui/package.json | 39 +- gui/src-tauri/.lintstagedrc.mjs | 3 - gui/src-tauri/Cargo.toml | 66 ---- gui/src-tauri/run.bat.old | 11 - gui/src/App.tsx | 133 ++++--- gui/src/components/BVHButton.tsx | 9 +- gui/src/components/TopBar.tsx | 228 +++++------- gui/src/components/VersionUpdateModal.tsx | 8 +- gui/src/components/commons/A.tsx | 9 +- ...TauriFileInput.tsx => SystemFileInput.tsx} | 28 +- .../components/commons/icon/SimevrIcon.tsx | 4 +- .../commons/icon/UploadFolderIcon.tsx | 4 +- .../steps/FlashingMethodStep.tsx | 7 - .../onboarding/pages/ConnectTracker.tsx | 3 +- .../onboarding/pages/ConnectionLost.tsx | 15 +- .../body-proportions/ManualProportions.tsx | 34 +- .../autobone-steps/Recording.tsx | 3 +- .../autobone-steps/StartRecording.tsx | 3 +- .../settings/pages/AdvancedSettings.tsx | 94 ++--- .../settings/pages/InterfaceSettings.tsx | 38 +- gui/src/components/settings/pages/Serial.tsx | 37 +- .../tracking-checklist/TrackingChecklist.tsx | 2 +- gui/src/hooks/app.ts | 1 - gui/src/hooks/breakpoint.ts | 3 - gui/src/hooks/bvh.ts | 11 +- gui/src/hooks/cache.ts | 14 +- gui/src/hooks/config.ts | 28 +- gui/src/hooks/crossplatform.ts | 8 + gui/src/hooks/discord-presence.ts | 19 +- gui/src/hooks/electron.ts | 46 +++ gui/src/hooks/firmware-update.ts | 2 +- gui/src/i18n/config.tsx | 32 +- gui/src/index.scss | 5 + gui/src/index.tsx | 3 - gui/src/utils/logging.ts | 9 +- gui/src/utils/tauri.ts | 20 - gui/src/vite-env.d.ts | 1 - gui/tsconfig.json | 2 +- 102 files changed, 1097 insertions(+), 578 deletions(-) create mode 100644 gui/electron.vite.config.ts create mode 100644 gui/electron/.gitignore create mode 100644 gui/electron/main/index.ts create mode 100644 gui/electron/main/java-version/JavaVersion.jar create mode 100644 gui/electron/main/java-version/JavaVersion.java create mode 100644 gui/electron/main/logger.ts create mode 100644 gui/electron/main/paths.ts create mode 100644 gui/electron/main/store.ts create mode 100644 gui/electron/main/utils.ts create mode 100644 gui/electron/preload/index.ts create mode 100644 gui/electron/preload/interface.d.ts create mode 100644 gui/electron/ressources/icons/128x128.png create mode 100644 gui/electron/ressources/icons/128x128@2x.png create mode 100644 gui/electron/ressources/icons/32x32.png create mode 100644 gui/electron/ressources/icons/Square107x107Logo.png create mode 100644 gui/electron/ressources/icons/Square142x142Logo.png create mode 100644 gui/electron/ressources/icons/Square150x150Logo.png create mode 100644 gui/electron/ressources/icons/Square284x284Logo.png create mode 100644 gui/electron/ressources/icons/Square30x30Logo.png create mode 100644 gui/electron/ressources/icons/Square310x310Logo.png create mode 100644 gui/electron/ressources/icons/Square44x44Logo.png create mode 100644 gui/electron/ressources/icons/Square71x71Logo.png create mode 100644 gui/electron/ressources/icons/Square89x89Logo.png create mode 100644 gui/electron/ressources/icons/StoreLogo.png create mode 100644 gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher.png create mode 100644 gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher_round.png create mode 100644 gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher.png create mode 100644 gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher_round.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xhdpi/ic_launcher.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xhdpi/ic_launcher_round.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xxhdpi/ic_launcher.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 gui/electron/ressources/icons/appleTrayIcon.png create mode 100644 gui/electron/ressources/icons/icon.icns create mode 100644 gui/electron/ressources/icons/icon.ico create mode 100644 gui/electron/ressources/icons/icon.png create mode 100644 gui/electron/ressources/icons/icon.svg create mode 100644 gui/electron/ressources/icons/ios/AppIcon-20x20@1x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-20x20@2x-1.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-20x20@2x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-20x20@3x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-29x29@1x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-29x29@2x-1.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-29x29@2x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-29x29@3x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-40x40@1x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-40x40@2x-1.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-40x40@2x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-40x40@3x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-512@2x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-60x60@2x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-60x60@3x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-76x76@1x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-76x76@2x.png create mode 100644 gui/electron/ressources/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 gui/electron/shared.ts delete mode 100644 gui/src-tauri/.lintstagedrc.mjs delete mode 100644 gui/src-tauri/Cargo.toml delete mode 100644 gui/src-tauri/run.bat.old rename gui/src/components/commons/{TauriFileInput.tsx => SystemFileInput.tsx} (69%) create mode 100644 gui/src/hooks/crossplatform.ts create mode 100644 gui/src/hooks/electron.ts delete mode 100644 gui/src/utils/tauri.ts diff --git a/gui/.gitignore b/gui/.gitignore index bfcd0c9c7..ae7a8d26f 100644 --- a/gui/.gitignore +++ b/gui/.gitignore @@ -29,9 +29,14 @@ yarn-error.log* /dist /stats.html vite.config.ts.timestamp* +electron.vite.config.*.mjs # eslint .eslintcache # Sentry Config File .env.sentry-build-plugin + +# electron +out/ +.bin/ diff --git a/gui/electron.vite.config.ts b/gui/electron.vite.config.ts new file mode 100644 index 000000000..5847dc8ba --- /dev/null +++ b/gui/electron.vite.config.ts @@ -0,0 +1,36 @@ +import { defineConfig } from 'electron-vite' +import { resolve } from 'path' +import rendererConfig from './vite.config' // Import your existing React config + +export default defineConfig({ + main: { + build: { + rollupOptions: { + input: resolve(__dirname, 'electron/main/index.ts') + } + } + }, + preload: { + build: { + rollupOptions: { + input: resolve(__dirname, 'electron/preload/index.ts'), + output: { + format: 'cjs', // Force CJS for the preload + entryFileNames: 'index.js' // Change back to .js + } + } + } + }, + renderer: { + // 1. Spread your existing React config (plugins, resolve, etc.) + ...rendererConfig, + + // 2. Ensure the root and input are correct for the Electron build + root: '.', + build: { + rollupOptions: { + input: resolve(__dirname, 'index.html') + } + } + } +}) diff --git a/gui/electron/.gitignore b/gui/electron/.gitignore new file mode 100644 index 000000000..600e23e99 --- /dev/null +++ b/gui/electron/.gitignore @@ -0,0 +1 @@ +main/java-version/JavaVersion.class diff --git a/gui/electron/main/index.ts b/gui/electron/main/index.ts new file mode 100644 index 000000000..9116c91da --- /dev/null +++ b/gui/electron/main/index.ts @@ -0,0 +1,343 @@ +import { + app, + BrowserWindow, + dialog, + Menu, + nativeImage, + screen, + shell, + Tray, +} from 'electron'; +import { IPC_CHANNELS } from '../shared'; +import path, { join } from 'node:path'; +import open from 'open'; +import trayIcon from '../ressources/icons/icon.png?asset'; +import appleTrayIcon from '../ressources/icons/appleTrayIcon.png?asset'; +import { readFile, stat } from 'fs/promises'; +import { getPlatform, handleIpc } from './utils'; +import { + getGuiDataFolder, + getLogsFolder, + getServerDataFolder, + getWindowStateFile, +} from './paths'; +import { stores } from './store'; +import { logger } from './logger'; +import { existsSync, writeFileSync } from 'node:fs'; +import { program } from 'commander'; + +program + .option('-p --path ', 'set launch path') + .option( + '--skip-server-if-running', + 'gui will not launch the server if it is already running' + ) + .allowUnknownOption(); + +program.parse(process.argv); +const options = program.opts(); + +let mainWindow: BrowserWindow | null = null; + +handleIpc(IPC_CHANNELS.OS_STATS, async () => { + return { + type: getPlatform(), + }; +}); + +handleIpc(IPC_CHANNELS.I18N_OVERRIDE, async () => { + const overridefile = join(getServerDataFolder(), 'override.ftl'); + const exists = await stat(overridefile) + .then(() => true) + .catch(() => false); + + if (!exists) return false; + return readFile(overridefile, { encoding: 'utf-8' }); +}); + +handleIpc(IPC_CHANNELS.LOG, (e, type, ...args) => { + let payload: Record = {}; + const messageParts: unknown[] = []; + + args.forEach((arg) => { + if (arg instanceof Error) { + payload.err = arg; + } else if (typeof arg === 'object' && arg !== null) { + payload = { ...payload, ...arg }; + } else { + messageParts.push(arg); + } + }); + + const msg = messageParts.join(' '); + + switch (type) { + case 'error': + logger.error(payload, msg); + break; + case 'warn': + logger.warn(payload, msg); + break; + default: + logger.info(payload, msg); + } +}); + +handleIpc(IPC_CHANNELS.OPEN_URL, (e, url) => { + const allowsd_urls = [ + /steam:\/\/.*/, + /ms-settings:network$/, + /https:\/\/.*\.slimevr\.dev.*/, + /https:\/\/github\.com\/.*/, + /https:\/\/discord\.gg\/slimevr$/, + ]; + if (allowsd_urls.find((a) => url.match(a))) open(url); + else logger.error({ url }, 'trying to open non allowed url'); +}); + +handleIpc(IPC_CHANNELS.STORAGE, async (e, { type, method, key, value }) => { + const store = stores[type]; + if (!store) throw new Error(`Storage type ${type} not found`); + + switch (method) { + case 'get': + return store.get(key!); + case 'set': + return store.set(key!, value); + case 'delete': + return store.delete(key!); + case 'save': + return store.save(); + } +}); + +handleIpc(IPC_CHANNELS.OPEN_FILE, (e, folder) => { + const requestedPath = path.resolve(folder); + + const isAllowed = [getServerDataFolder(), getGuiDataFolder(), getLogsFolder()].some( + (parent) => { + const absoluteParent = path.resolve(parent); + const relative = path.relative(absoluteParent, requestedPath); + return !relative.startsWith('..') && !path.isAbsolute(relative); + } + ); + + if (isAllowed) { + shell.openPath(requestedPath); + } else { + logger.error({ path: requestedPath }, 'Blocked unauthorized path'); + } +}); + +handleIpc(IPC_CHANNELS.GET_FOLDER, (e, folder) => { + switch (folder) { + case 'config': + return getGuiDataFolder(); + case 'logs': + return getLogsFolder(); + } +}); + +const windowStateFile = await readFile(getWindowStateFile(), { + encoding: 'utf-8', +}).catch(() => null); + +const defaultWindowState: { + width: number; + height: number; + x?: number; + y?: number; + minimized: boolean; +} = { + width: 1289.0, + height: 709.0, + x: undefined, + y: undefined, + minimized: false, +}; +const windowState = windowStateFile ? JSON.parse(windowStateFile) : defaultWindowState; + +const MIN_WIDTH = 393; +const MIN_HEIGHT = 667; + +function validateWindowState(state: typeof defaultWindowState) { + if (state.x === undefined || state.y === undefined) { + return state; + } + + const displays = screen.getAllDisplays(); + + const isVisible = displays.some((display) => { + return ( + state.x! >= display.bounds.x && + state.y! >= display.bounds.y && + state.x! + state.width <= display.bounds.x + display.bounds.width && + state.y! + state.height <= display.bounds.y + display.bounds.height + ); + }); + + const minWidth = MIN_WIDTH; + const minHeight = MIN_HEIGHT; + + if (!isVisible || state.width < minWidth || state.height < minHeight) { + return defaultWindowState; + } + + return state; +} + +function createWindow() { + const validatedState = validateWindowState(windowState); + + mainWindow = new BrowserWindow({ + width: validatedState.width, + height: validatedState.height, + x: validatedState.x, + y: validatedState.y, + minHeight: MIN_HEIGHT, + minWidth: MIN_WIDTH, + movable: true, + frame: false, + roundedCorners: true, + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + nodeIntegration: false, + contextIsolation: true, + }, + }); + + if (windowState.minimized) { + mainWindow.minimize(); + } + + if (process.env.ELECTRON_RENDERER_URL) { + mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL); + mainWindow.webContents.openDevTools(); + } else { + mainWindow.loadFile(join(__dirname, '../renderer/index.html')); + } + + mainWindow.on('closed', () => { + mainWindow = null; + }); + + handleIpc('window-actions', (e, action) => { + switch (action) { + case 'close': + mainWindow?.close(); + break; + case 'minimize': + mainWindow?.minimize(); + break; + case 'maximize': + mainWindow?.maximize(); + break; + } + }); + + handleIpc('open-dialog', (e, options) => dialog.showOpenDialog(options)); + handleIpc('save-dialog', (e, options) => dialog.showSaveDialog(options)); + + const icon = nativeImage.createFromPath( + getPlatform() === 'macos' ? appleTrayIcon : trayIcon + ); + const tray = new Tray(icon); + tray.setToolTip('SlimeVR'); + tray.on('click', () => { + mainWindow?.show(); + }); + const contextMenu = Menu.buildFromTemplate([ + { + label: 'Show', + click: () => { + mainWindow?.show(); + }, + }, + { + label: 'Hide', + click: () => { + mainWindow?.hide(); + }, + }, + { role: 'quit' }, + ]); + tray.setContextMenu(contextMenu); + + const updateWindowState = () => { + if (!mainWindow) return; + + windowState.minimized = mainWindow.isMinimized(); + if (!mainWindow.isMinimized() && !mainWindow.isMaximized()) { + const bounds = mainWindow.getBounds(); + windowState.width = bounds.width; + windowState.height = bounds.height; + windowState.x = bounds.x; + windowState.y = bounds.y; + } + }; + + mainWindow.on('move', updateWindowState); + mainWindow.on('resize', updateWindowState); + mainWindow.on('minimize', updateWindowState); + mainWindow.on('maximize', updateWindowState); +} + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } +}); + +app.on('before-quit', () => { + logger.info('App quitting, saving...'); + stores.settings.save(); + stores.cache.save(); + + writeFileSync(getWindowStateFile(), JSON.stringify(windowState)); +}); + +const checkEnvironmentVariables = () => { + const to_check = ['_JAVA_OPTIONS', 'JAVA_TOOL_OPTIONS']; + + const set = to_check.filter((env) => !process.env[env]); + if (set.length > 0) { + dialog.showErrorBox( + 'SlimeVR', + `You have environment variables ${set.join(', ')} set, which may cause the SlimeVR Server to fail to launch properly.` + ); + app.exit(0); + return; + } +}; + +const findServer = () => { + + const paths = [ + options.path, + //TODO: appimage appdir, + path.resolve(__dirname), + + // For flatpack container + path.resolve("/app/share/slimevr/"), + path.resolve("/usr/share/slimevr/") + ] + return paths.map((p) => join(p, 'slimevr.jar')).find((p) => existsSync(p)); +} + +const spawnServer = () => {}; + +app.whenReady().then(() => { + checkEnvironmentVariables(); + + spawnServer(); + + createWindow(); + + logger.info('SlimeVR started!'); +}); diff --git a/gui/electron/main/java-version/JavaVersion.jar b/gui/electron/main/java-version/JavaVersion.jar new file mode 100644 index 0000000000000000000000000000000000000000..55d560622a5386bbd27af2c4e1c37fd9f7d8cf39 GIT binary patch literal 876 zcmWIWW@Zs#;Nak3P+jXC!+-=h8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1g8GNPMT}slO#ilv)e~e95aV`= zAW+sTu`DqxwWv5VKTj_?C$YG=G$`6%%2DJW-x?mBXqP>X(YIEu;9jw3)`ERAOcpBU z2F4#cRCyGSL;_)8q~h)H=5@ft=Rjy;M^I@`#;a+{)&i=isz5I|7-fEI|4@TUfRV@9=l7=yNOvc-gcDZOMJ=t&-R)duc~8D zs>I5PY9V*4zS}#TtuET0E3!c&z-PrYj;Y}jTQ0>fy0K!x)zFEV&o}mnHioiiN2rTD zyBqVyVN*=0^=4I@tyjcWoSAy>q8ndI#^RoGzI%(kPH5%Y*mpeL^0u$H|A)$khY7;b z#lf%s_VmaI=~OPYSa_7vwlUY~A9wP<(uBEvdNZ;&uHN!TivPFKpNHR>w?#O|Z>&FS zJA38kbf=~4Z+E$Gs9tPgGktz2lis-kIhBH@%NL{CmN&|~8a;YwU%jzWD&NdfGhkEn zH0wXBHmP0X?#;fSzfYhnGHscg6QACz^B0`?d^Jv)3kdJ=yuWD5q5LVk&vM?o_u#O1 z3FFHaA=hV-?GIKQGbt3VUX$x4`s4na#h*ApiR-s~qV8ly28Ie?3JdUNWD;ROO`EWU z2TGf$0G`-DDHUBSazX*6Oa!n6GT~a0(kZ$L$PNP~CDf+ykU% HfgKJ2mKz}$ literal 0 HcmV?d00001 diff --git a/gui/electron/main/java-version/JavaVersion.java b/gui/electron/main/java-version/JavaVersion.java new file mode 100644 index 000000000..338c2a43f --- /dev/null +++ b/gui/electron/main/java-version/JavaVersion.java @@ -0,0 +1,8 @@ +public class JavaVersion { + + public static void main(String[] args) + { + var version = Runtime.version().version().get(0); + System.exit(version); + } +} diff --git a/gui/electron/main/logger.ts b/gui/electron/main/logger.ts new file mode 100644 index 000000000..b870b7169 --- /dev/null +++ b/gui/electron/main/logger.ts @@ -0,0 +1,26 @@ +import pino from 'pino'; +import { getLogsFolder } from './paths'; +import { join } from 'node:path'; + +const transport = pino.transport({ + targets: [ + { + target: 'pino-roll', + options: { + file: join(getLogsFolder(), 'slimevr-gui.log'), + frequency: 'daily', + size: '10m', + mkdir: true, + limit: { count: 7 }, + }, + level: 'info', + }, + { + target: 'pino-pretty', + options: { colorize: true }, + level: 'debug', + }, + ], +}); + +export const logger = pino(transport); diff --git a/gui/electron/main/paths.ts b/gui/electron/main/paths.ts new file mode 100644 index 000000000..8f4ccf087 --- /dev/null +++ b/gui/electron/main/paths.ts @@ -0,0 +1,43 @@ +import { app } from 'electron'; +import { join } from 'node:path'; +import { getPlatform } from './utils'; + +export const CONFIG_IDENTIFIER = 'dev.slimevr.SlimeVR'; + +export const getGuiDataFolder = () => { + const platform = getPlatform(); + + switch (platform) { + case 'linux': + return join(app.getPath('home'), '.local/share', CONFIG_IDENTIFIER); + case 'windows': + return join(app.getPath('appData'), CONFIG_IDENTIFIER); + case 'macos': + return join( + app.getPath('home'), + 'Library/Application Support', + CONFIG_IDENTIFIER + ); + case 'unknown': + throw 'error'; + } +}; + +export const getServerDataFolder = () => { + const platform = getPlatform(); + + switch (platform) { + case 'linux': + case 'windows': + case 'macos': + return join(app.getPath('appData'), CONFIG_IDENTIFIER); + case 'unknown': + throw 'error'; + } +}; + +export const getLogsFolder = () => { + return join(getGuiDataFolder(), 'logs'); +}; + +export const getWindowStateFile = () => join(getServerDataFolder(), '.window-state.json'); diff --git a/gui/electron/main/store.ts b/gui/electron/main/store.ts new file mode 100644 index 000000000..f72b19fc0 --- /dev/null +++ b/gui/electron/main/store.ts @@ -0,0 +1,77 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; +import { dirname, join } from "path"; +import { logger } from "./logger"; +import { getGuiDataFolder } from "./paths"; + + +export class CustomStore { + private data: Record = {}; + private saveTimeout: NodeJS.Timeout | null = null; + private filePath: string; + private debounceMs: number; + + constructor(filePath: string, debounceMs: number = 2000) { + this.filePath = filePath; + this.debounceMs = debounceMs; + this.load(); + } + + /** Load data from disk into memory */ + private load() { + try { + if (existsSync(this.filePath)) { + const raw = readFileSync(this.filePath, 'utf-8'); + this.data = JSON.parse(raw); + } + } catch (err) { + logger.error(err, `Failed to load store at ${this.filePath}`); + this.data = {}; + } + } + + /** Set a key and trigger the debounced auto-save */ + set(key: string, value: unknown) { + this.data[key] = value; + this.triggerAutoSave(); + } + + get(key: string): T | undefined { + return this.data[key] as T; + } + + delete(key: string): boolean { + if (key in this.data) { + delete this.data[key]; + this.triggerAutoSave(); + return true; + } + return false; + } + + private triggerAutoSave() { + if (this.saveTimeout) clearTimeout(this.saveTimeout); + this.saveTimeout = setTimeout(() => { + this.save(); + }, this.debounceMs); + } + + save(): boolean { + try { + if (this.saveTimeout) clearTimeout(this.saveTimeout); + + const dir = dirname(this.filePath); + if (!existsSync(dir)) mkdirSync(dir, { recursive: true }); + + writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), 'utf-8'); + return true; + } catch (err) { + logger.error(err, 'Save failed', this.filePath); + return false; + } + } +} + +export const stores = { + settings: new CustomStore(join(getGuiDataFolder(), 'gui-settings.dat'), 1000), + cache: new CustomStore(join(getGuiDataFolder(), 'gui-cache.dat'), 100), +}; diff --git a/gui/electron/main/utils.ts b/gui/electron/main/utils.ts new file mode 100644 index 000000000..3444fbfa1 --- /dev/null +++ b/gui/electron/main/utils.ts @@ -0,0 +1,30 @@ +import os from 'os' +import { OSStats } from "../preload/interface"; +import { ipcMain, IpcMainInvokeEvent } from 'electron'; +import { IpcInvokeMap } from '../shared'; + +export const getPlatform = (): OSStats['type'] => { + switch (os.platform()) { + case 'darwin': + return 'macos'; + case 'win32': + return 'windows'; + case 'linux': + return 'linux'; + default: + return 'unknown'; + } +}; + + +export function handleIpc( + channel: K, + handler: ( + event: IpcMainInvokeEvent, + ...args: Parameters + ) => ReturnType +) { + ipcMain.handle(channel, (event, ...args) => { + return handler(event, ...args); + }); +} diff --git a/gui/electron/preload/index.ts b/gui/electron/preload/index.ts new file mode 100644 index 000000000..d0d778df0 --- /dev/null +++ b/gui/electron/preload/index.ts @@ -0,0 +1,38 @@ +import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron'; +import { IElectronAPI, ServerStatusEvent } from './interface'; +import { IPC_CHANNELS } from '../shared'; +// import { getGuiDataFolder, getLogsFolder } from 'electron/main/paths'; + +contextBridge.exposeInMainWorld('electronAPI', { + onServerStatus: (callback) => { + const subscription = (_event: IpcRendererEvent, value: ServerStatusEvent) => + callback(value); + ipcRenderer.on(IPC_CHANNELS.SERVER_STATUS, subscription); + return () => ipcRenderer.removeListener(IPC_CHANNELS.SERVER_STATUS, subscription); + }, + openUrl: (url) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_URL, url), + osStats: () => ipcRenderer.invoke(IPC_CHANNELS.OS_STATS), + close: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'close'), + minimize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'minimize'), + maximize: () => ipcRenderer.invoke(IPC_CHANNELS.WINDOW_ACTIONS, 'maximize'), + getStorage: async (type) => { + return { + get: (key) => + ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'get', key }), + set: (key, value) => + ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'set', key, value }), + delete: (key) => + ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'delete', key }), + save: () => ipcRenderer.invoke(IPC_CHANNELS.STORAGE, { type, method: 'save' }), + }; + }, + log: (type, ...args) => ipcRenderer.invoke(IPC_CHANNELS.LOG, type, ...args), + i18nOverride: async () => ipcRenderer.invoke(IPC_CHANNELS.I18N_OVERRIDE), + showDecorations: () => {}, + setTranslations: () => {}, + openDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_DIALOG, options), + saveDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.SAVE_DIALOG, options), + openConfigFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'config')), + openLogsFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'logs')), + openFile: (path) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, path) +} satisfies IElectronAPI); diff --git a/gui/electron/preload/interface.d.ts b/gui/electron/preload/interface.d.ts new file mode 100644 index 000000000..e536ba87e --- /dev/null +++ b/gui/electron/preload/interface.d.ts @@ -0,0 +1,44 @@ +import { OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from "electron"; + +export type ServerStatusEvent = { + type: 'stdout' | 'stderr' | 'error' | 'terminated' | 'other'; + message: string; +} + +export type OSStats = { + type: 'linux' | 'windows' | 'macos' | 'unknown'; +} + +export interface CrossStorage { + set(key: string, value: unknown): Promise; + get(key: string): Promise; + delete(key: string): Promise; + save(): Promise; +} + +export interface IElectronAPI { + onServerStatus: ( + cb: (data: ServerStatusEvent) => void + ) => () => void; + openUrl: (url: string) => Promise + osStats: () => Promise, + openLogsFolder: () => Promise, + openConfigFolder: () => Promise, + close: () => void; + minimize: () => void; + maximize: () => void; + showDecorations: (decorations: boolean) => void; + setTranslations: (translations: Record) => void; + i18nOverride: () => Promise; + getStorage: (type: 'settings' | 'cache') => Promise; + openDialog: (options: OpenDialogOptions) => Promise + saveDialog: (options: SaveDialogOptions) => Promise + log: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void; + openFile: (path: string) => void; +} + +declare global { + interface Window { + electronAPI: IElectronAPI; + } +} diff --git a/gui/electron/ressources/icons/128x128.png b/gui/electron/ressources/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..8138d275f8c785de5ba06d12be411fac15e8d04c GIT binary patch literal 2808 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 G$o~SGCpJ9* literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/128x128@2x.png b/gui/electron/ressources/icons/128x128@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2c56f71b0854382375af261cc3cabe7106c02040 GIT binary patch literal 5884 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 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/Square107x107Logo.png b/gui/electron/ressources/icons/Square107x107Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7f760794e587d9c4b5f3f36c10adf3f16466f9 GIT binary patch literal 2336 zcmV+*3E%dKP)WJx^LGTv9%wzmjyHqj{tL0rb;LTM z=82{+c6yrH99h|qtvX9FAlUWE^*i>ta|^xU$w2SiqX+k+og3A&FzwZsAG$(uDR~m6 zL;kMe6VFAP799kN9l5gei#_>U_uLxq|4Glo90V$TfN5aWZGP(<)=e2`C#HbmCph81 zs63vf`~_K`x1g#qGfl*n#I98--QDyJS8Rtcs#K@+yWU^KmM-H%M#>d{B;Z@~$#k z{HB4t1=|`$SX8M<2Z57Q+}YhlreI%~3Y`?M(nD}6Cz&CAM6d`JiC_^d62T%7EP_QM zSR{f)ut)@J)v4u^T5f>IspJC&=Bn7Un_$fnc#HzH}|;+g>U?FRz||oQlkFeO&>r z>ze`b`K)dKc2*kOEhSoC?A9D}xpTR?*DAS>&hF)W)g=Ur6&04cSA6a8=?1Q*-bb)l z(DY>NX%2DC4i8(i|CuxYF>M`272kmSq=knI(XkJGgJNCveoG=<8SS$&iq&M}2 zhQ}meR*9xT3)KE;kCY9n*Q_v-sK3BMN$V!i3mD(^}9Uj!QR_(Uu#48EeKwS+;HZY6}^*l8w^|%16=}`PJ3{`mbH6$-xp;W~LtY{vE zRQLFSPF-L|VujIhscU^m5I%hA2hFwz3bl#cNW%l#G`?z=*VLG8jaist-u?V}(IAg& zK=og`$^9!#i}QGh+q%=U45pD-Vbu+UZ4Shj{@-tMTWdUAKJQvGcC9z=*qWW=kj`Ir zEZ3o%EvDSFqQwIBY9Dv-vDbgr+{s3>u~>q49Ql5)E-2-=kcOXlr&BYoc&F-sxGAZY z-u6n$VZ{q7mSF(w$k|s6El{I@l9vr;#uX1R6ma2%N@2=1^I0s1l_)5+VbmoXTnE=P z3rr6b;w8K~*0?&vvFpXwSlb|h0j+nHnOJXG3M(2Yq_XkM)iBKQ16`VPWne}Hqw0Y| zf)h{w1kTY*h7gZeTI}jwTW$qNIV_Y_)SzJa^C$Wex{jU~4*p?0*}xsHT>B&fY9(NZ zdrgOHR(Q{t<``dMJZ@Q<4I;bSBvt|B3`_kuyQjHIb!^6PMrirw<9v;+K}v6pf>H`onBLrPW_)Hl zkTCT%i__j`oHY+r& zO=9?kj^0E?9l16up4PQ^MV@7|#&lZIjIOoFvuu{SE3aUGJzR!-Mz1^8gM2t^RKp48g)+jKGqcVNi*dgE&4M zGB>L}RH7S|QhfFC%Ru9I&qACv;(5}|T${LkY=Si!(=z}Bff>*7n99Jsl8^<;fb~El z4g(tC!7HusNX!;VgC+NJW6*dGcyiEXG37O*d4OR~*#Uy23STsU_h9-<6yDXYVMAjv zyseKrZMA_hD%ip&LW38^f@h|Qh`z0FgJfvRCQwYbXooY?{6n=t8#JHBTc5%ctTYnA zB3LAXMX*Q&i$t&p7Kvby2o}L2v9GLfB+yG{U|*B7!tJcctPsq2OQeBDBY~bQVJhS& zQ?M^^a*ESnPsUp!4FpbEVW{NU#DzU;FIb^gkJI z6-EUtH4G6eGwMu^#t2nGS@Wh>1ybF ztL#;fL;2#w{X2iTa|<`|E>Bg4+bQJ|!%~Mo{M%>BV-EF6;mJUcC%@uFSN7w@nPwnX zButMCUcUA1zPU#a?ym?7C)^tE|B-;D4pi6h@ml5d7Znx(V-r+VSV~~7?EDgnVfG6t z`lY|WYE(~sO09|KLf&;%jkVsE_8doE{wlOnN`>VTvhd)z|3a*D*Tj3#T&Js`VnbbP zWl>!#L9+%D%1A@^y4#{ndxl{tq51fl7C>8@!*5J)lOOM$Vg?Wh>V3&}7nrNlLv z*ITfy5i!l3!+T5IKKuWONE%7rg~tXjwm5 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/Square142x142Logo.png b/gui/electron/ressources/icons/Square142x142Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..28e0d6d27eebbf18e429f05e0bfedd27a808f8f4 GIT binary patch literal 3177 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 P00000NkvXXu0mjf)x9Fu literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/Square150x150Logo.png b/gui/electron/ressources/icons/Square150x150Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9202779ee9f9bb8670b02ec07b9bb955e3b7980 GIT binary patch literal 3321 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 D=BilK literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/Square284x284Logo.png b/gui/electron/ressources/icons/Square284x284Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7c35ed105e70ddc03e80b232d9f143fd58c7bbbd GIT binary patch literal 6460 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 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/Square310x310Logo.png b/gui/electron/ressources/icons/Square310x310Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f504bb1b3b1460d8bbe61717179cb6c8c05248 GIT binary patch literal 6951 zcmc(k_g7O(w8sx!O2mdp2T_r(KmtfFf`Xy*06-5PXqx~44dmbF z93!=6tqETO0Nfi7wKdFwCP>rau&Ld!uD{-}t}JRn#Uq@_p7<*V(X^!19prSFa{>TX+1~ z;cnh*t3Uk9c>DZ!*#oNsb~D0l2S4yE!}~$6_c9_6d$N)IYW@MiQ^$wvheNVMMTWee zRAqhsOxYH>-g50a|9U5g^Dvai@l?ElNteXc^2R#EtF8u}xjiC-%AYAA_UVJ|jV0kihQ?jbQPU)(NM6C@N zKB=#ULNvqr|4}-zln&V}Vhqv64g6rQGwdB9KAzeCPHqWaDwSf$yxit;)HiC^{P!_+ zdd}*uK8J!Jra73kMiOhU>IGoI_vRepDvZwZytnmi_?V^J3)=aC;SX9O*~dEvrMdy& z-}^=Uux9&{4i-5^hKMb9^!L-hU8*1VZhLqlT446GOa0!V#IEe+jn8^?mFngGyIE^% z$)W}a(1NE!bFIs*qu#~^G~)#?pNE9+E%UjXdBM5<9 zHN5#SUli@mi!7TywMS$FXyYNj{))IW!FYEe5IZDhVkw7mn(UtiEG3)OfvZK)CA@+7 zwaBv-_$J>Qz>$A7aLpmOgA#rc-g3M-?!+9L+2e|flVMHK|clQZN!rPIE~Jo;9p?y|b2v=!OQx@-2fHkPK< zb?FmK_yv+N?HnJ8EuSxHwH|8UhMPxVW}jjKbwr9HvaFHVxI5+21~s-%S1;W@QBej$ z3r=yjZK@wAZA<;3aGF(=Fr%lvwGmmMSG?bEB zRn84?-hNjtz8^YkDNB$er{B5_q!%+N&Z1u<+Hk>KmM%A{)B71ZvMbHLab2R*}-+(V55i zSU&?SXbG8Pt$YVKhWx4uFc^V|5K=;|m2Xqa1f^P5(o<{+*UwIC;NSsgxN+`K%*e$_!Rtmin3-D0iawz4U5MeD*bDqCtOl zcX*~`XxP$l{j&C{?1B&>B4sg6I{qjwnAL%usx|Ag94}aED>_8TsG?j>l#2B^H3{A} z#{8bwHemZ{zL-{VP;<$T@#SCH70bW&zvZqRj}>ELw1B$u+H$1^((kq0max?gw>2U} zyZ#tu%*Vm=Pwr`(-8$;-i%FyT-*X$!24oGD4N-OsW-#@)_Zla8_NuPH*+VIPZj^NS zMPzvbrCvyo5OJmC?8`u`E>kWg00w^mzQz&-dSGlapGOl<;h*Nk%qlO>YCHtm80j@f z=5YN-R^I{5vCmS?}GJ#(2(cMWBxH+8TyG-7g4@(J7;Bu|YqVBS51 z3@?06X)UT6m$*s&*lwY6g@vhRC4oq_jWk8sj_T-hh8-7{pFvEMu04-P(_XZY5Pk22 z5EbOMy4F-7T`^n#yDB74n9>!d;^Z$x0J?6^RRj0|jUsz3e!Q#Utu)7)vVWDkO--*= zcu2&M11B*E=N}SrB}W7Gv0tpLrUtIstNb!OsLv550CDc*A7M#q0+Kdnyo+{IGu&%L z_btsQiWh@MzRl6hMNZEu@T%;@PlMcbJW}L#4!!7k=9pt9I`+S^%Y!{P8@z8|^JF>O z7=yHJU&~*gk~d- zhbwDS%cACRhsLuNE4AOv0ycbq)M=@~9+9W_j>%8fCOrk8kYXc$oo8)hJTNfTSlFrc zI<*SwHI9;Guyczhr&njO^JDRtqX|vh8;01Mj|?-URsH2TC$>`hkbS5%>EjhvPP0U^ zGKje?O|bX!Apg#4*RL4JIr*05(3Pf7p3KW0Mp7Z$^Uf5h3`dk}?pDe-5a<7j%!k0n*yuAJ`Qme|Nty z%I$s>>FQjtoe}e}JiAm73dU_w*8T#Za2t4K>n5h)rpXD`Dm=?F` zE5!_9dVH;{MO`8ARkjjF`;F{whbukurq|%ucTSxZ*4HqoB3feq<6tmi&N7 zO2dz5D_OSp2E?cIQ`eDKq;#S}PGNUJXR{OcyoDNxC?GQIhxY>)D-aF(kuE5zBJDM< zmF>t8tmxH}6gCfT4Of4?&zc;*6OH1$Dk9zMZ+)Wd|A=TI5ueDfu<<+RQL0#hZEf@9 z(O!abVDHS1`hH9JZB9vn?0=#$UgCn<{fLnCCY|@(= z50lEo%`|pR>Yz;ue9dyI$*X^j@2mt)njt;H4sd~j(M--)8V*sUs`-oKi`jki509xv?PuPyvjiQ?7iky4H6O1)hQwTH26%q(HE@M`>U}9A%YX< zO4|##FF#c&QpZ0Z7@M}lE@EnzD$~u$>ki<{?v+QRl zA|DKk2~uv<$!B$^9ckL+vUfmtm3qZ3#3D$Qc?zkvvKDFYRYC@j4i{}pBOKo?NY@@t zoEUZ?@@@tDkiI8<9fx>V;^@UU6o-69|0eoM8VtM~JKUeoT$#x8;3Ht0x6P}ZR0+c= z@nqToB|IWI;d6ns&k?-x65PX}69ndSoh;B<^gHzu->9y=RvSjg-!xE8YM14M1p)YNSrq-F>CbV&Z$EeN)oTx-HKrHPep^W^ngMv+?B6?UkoLKa~=wW3u-l{HP+YWXf_h z{i^%Sn82%`gk6%jq__S@F?p5#nNQ_)YpFVm5Wk_fnhX}wP%)JELcO>QCoKF_y4E%h zF_X}8QgEiXd+HJv=04?*a)}>aNlB+~e(u&D>>S_jb%@Sxe`y%CkqlkNe`K%G0j1oO zG;J&7j3<3W*7^1>d|x;+F;^BiS@_mYZ)Llb3HDrgk?HIkd|7`rR8pX>@)t{SIvVT{ zaP<9=fNf^rsY|R)NnKb7-o8by?}6PpqC`o8nBjY<^)!5O*YZC8yEZoFf=7XLib9_0 zWoi7!;HsY3jo*nB(k%(K!!03V-zWWfmu45aNb!)HHxC@&H5SzBOJ8`lFMr;4T6#<~ zSg5OIMlr0@9~HpKVlbG@F7UpFwVd>gEp-{%5s;lPo!k;=<~{yJuXLy^&6UbMb?DG_xRAzZ|^<~%pr4k@$V>CX~`JrU6tYY z9vmJfRJAlQTul2@Uj@>0klOed-xeJci!2v1!qmG2V7I7N+t108!)%w~H31V3j_Tc} zuh`>nY-_kIRdBdM`$u7YZddx!KaDK@97{)VhE3QSiS+tOKez;~t{$Fvs+=HirJ^>| z;$OEh>AsC+_tcREYt&9$cXpUP>=vCGjwAPhyK}uy7gaX}48g(4gTHs0FJY=#y$i&h zZfdmMdolTWL`t+@`EMq<5$p=T7<#++lgCa}(DLPwC=ggUWy#-NUh_%S0A*``P>RT&bj+6B9j@8?qHatz2h=8Us1Z{@qehAoXcG z2aEeynquTyH#(z>(J7N;K5tJ==(t>!7CW5jc>r;#a@EgCpomn1IQh&QgoyX7KGqyi zW5M6IXfwO1hS)(h!rFRRo+wM}+ip&3S{Lyi>CxVaNd7NK<9L4eIS9~3&GzWy9HYU# z%A0mFwRA7n$CEEswk_KGG2@J~ox-M#;fGW9P|Kz0qGJ!u=rs$wfXP#q+4RC^aU#+b zrCy8}N&yW{DBuw`pz8N}_Q@+{;?(s0bVuK9W?#{Ky^aziA^U4jy#ua+2Y)r-8BXja zMG~R+i=@|0jJe+yJb7@zg{dv=(hyAi^=Qnc$DCPU%i+=4dVE*vP*>pcpwqyi=D_Q@ zoj6 zrG@Q%sY#?;JF*k19+nt(6_e@-OT41BY2v$YGG3%{!F2KPN{|qwMV1Rz==-==XQm*eQK$%RmC3A4Lcc{>wSH-CAXB?+sqWz<$UCnHqY zZ}#N5aShh=SBWBJp-LpWdB)YI2?PNPSUwIn&yjUVHdtYe?%$a*zdXujk?~pf#9yjx zdATXd>)lh+=k_RXi>RzYV$^1dm_m={<8_7A4E5zC}2nYcw?M+3J)fSSR_?8$CpM zdep}EQy)YbhXM~QFwEuaN_PlNuf>F6QSWv0AAE{NYzu|zmMR8DONMJgW}3f^G!oyp528$6iTsTnz7z+8{>S`A zG2oAh(7U(G^0FGAX%~R2I}>PnTmX9Ko2h8U=EB4!@dgPq-#$iL3kn;{+9he&NazB= zFULcsOH0_<#9bdH$WQqLi^19li5yN%8wN|qqL?*f^1DOc+$?B94BY})6st_y0|eU_ z$BL`kET&#Qfnaj>XGRs1&$hm8 zF`?xUB}sLXx!Y+``kC1qIU>ZP-VG*XNu}BSPaZ$zPCS}hf8~?SO}Nkk=t~LTkaMye z4p%j$uNW{P^%i%LOj&i(E);Ht^b%Zgb-VM-KR=`U%|cdNWKthnP!5NWo~KT7*j~OR zg#MwRVm%dV)TS4dlTxzxQ{1O2HC40B&)wnsqqFjNndc!Yk$zj;CvdmIyUTpKZRS>Q zc-`WZ2aTtYq(9D)mUbJQE(CMWZ;h>oH_g$ASb4UuM_lOko`y!vlCuh`#5<8zCUM+Z_%lqiaI}0CY?4wivNrcfU%e}!vUs#rOLsCg#N`P-d zcIo);_H_ba=8D_1L6$Fn{IYb#jRhib0j91#tX333UGce|+TfzmkF>o-s<0@~xeP9M z@Fa0ewnjS=N8yQUb_-4uCPc8^)o<_F5GmjR-k@cCh1^g@dOmGVf?8-vW>(Pu8-EZ~ zkSywh3J~uA=VD|q&U@=SK}$*W5stTq{)Hs}aS<W@6yR?o$8un6H_94vc}rB&po1l3`-CMA66Ach$Z%th;cGQUf(y29Sd z^b^g%Fgadp(679|jn}R8r*gyx)&)IcXOuL(+2iB#Jr&In##ZN_x1G%k!b|__mz^cX zCOOSRKG%b84sA1nFatr*5TFcgj(Mn$;Ss;sYtabI(K?%8JfI$o$V-3c;zc$=c{k-lx7&<#v`HuiD{J6p^l9vt^h*KUaJf#~6`x-f-jP^BjFuTh0SnR%9K>?r=k?;p$o6i&^#yKua-mLwG0= z7xOAy-z=_KZL%V!-U}Ga?-{3%`E38An}ryS)rU~vjs7Ru+1qaQqs0cY-c370i8%2x zyMRt`?Lj~UaIkpjph7lB#?VTBh>1RWkOCg9d%07)BbvJYj~ApDelY%%XR2^AR3`#oW^_Ld=kyDXp@&=&~kXBf4RJ6 z>%_CX;c#O#t<&3g%Zg?zLKB*5v$Ct<)p;HwGzEMe_->ROOOMQW{x4<5kTCWt=Xu2e zek0Tb`?kGJ0t?uBcv)$DV05JF<+3crH%oj>2QbnSW@Hg_x9W7sJnKbz{|l2<23q`f zF<-(i^e#>JY6|Qf;n{S4PP2t#WU3BFlufr5F z_5KOTXetfQU}BO>N>fjO@=YnK`ubT;6@y+ND|-83ck5 z1@od0f_2lbCPox&d7&KH3N}GE9L%K7|8?&;uCou9ZD-*hM9?$<|n1 z^7YN?+RArzomSu2-Re~&EED$8=}bU1hxZ=$VuL9enAszlURuy1BPbn~$s}4s%hg-# zH3aO`)(R|ybX!xv&<^mwmb#iR=gbD8H|T07!hJ(d!nd1=5Q>qhM*$KJMwK05ArvR6 zWSUrPMlv|&A)Ri%=yz1tI>vuh6B?E{b*YWGuR7@Ut+SIP9!YFpgyFlt5$`ZSH34fY7g8~C@30-*>ks4*nu&( zxP*1obBNTZ5A$R#yt1cr-y4!}08RN{sX#uAUrd+eZZPbLrTY zBg|k`DiwKf`30F82@spZOa?~XC8Z^-$i=}f5}t{W`{MTj)Hme%W0QqvHnN1>Wi8(l zQrO{sAAQ;T$wuS!f{>)#gK7`M}k{(#nRjaUsd( zVMG@79!posp}Jh*J$$=~PQqg2X#RyzJW#^rf>HJJu-u9;ua|6zYO2_Z?);m-1Dqpu zG96#26|*=tRfCS(uM`^~veL$)O72E98PNbif2`8*fJ8RH e27_mF$A1HR&9jI2J+P$!0000B)EBq)We@RD**erGS%>-% z|2(K5OcY&51Cz?I+k<_|XmCS%yFp4r;zJ^JDJhMP?S5}^?oQI1k8iE#YT!b7elcnYfbQ$tD|p zXHUIfy6ygnpgVL<1~buZFnD0a)3NjE{OXb}I0F`&W86Fa4V=;-E?N+C^*TGQbi@D@)ccRC#g^iV(Z~!LckNj@!w>iuLhN^hKuo+vOdx-_q zM^EenF0Wa^KzMFM3{uK2IHR67FPasMY7jY=WUnDX-&j*y8TN(QkX;1i}`~nFI=LSp))Y!88JnaE^c@ z;0QPZ&XcdcUU?9k-Aa5%Mu^jG7tX2HXvj~FM@E(NY&uV*c$)llahVkIMd2Jchsq_p zXKcz(KE85-1SY%!4ji(*RjdLwKxRIfBp#o$seA4@`NEeEdIb=KoHG{kkB&B9l4^3mHrt4@N0jz`9H->dC#*w{Bxjmp`Oatb7>QQ1v;d$P8| z@dZbeB#4R_sp+%hBoYlZ1a$4vpG3NuRzFWMq1I72NP0+qu<$$QCJX}vFzAUqeis*@ zKNckQ{P6g`&cgwi$QL063{|@U0m290zoCFp%jE#H9Fr!f%*3Qk{su^$nE6~^5Uxp$WzvS z^8BG^iF0I#B(ASFRR)sinNN?ZV30#TKXX-a#KBPy+3U2CVXvcZ8G|xh>KN4N#xH*v z>m0P^>2i*Nko-_#+Oii;EvODcC?Hof10SJ8!QlQEPQ{e*3XZwc3#xj^pA7P71yBBAIf75w(=#HS-HWmu0$DdCM#Y*82hlJXY{Iuz^RUZtxB_% zVk_?ty2;BY4sn%(FkoF-s|+nbT6u0m$}-?x#=t>kQfvP-1fx}XT+a^7>Iv7;`&YYC ztBmjD>);NQbM1#)yWy_@aU=^j}5 zR^!rTid3D+X;WdgmdaS2YWjR47&v` zGMt2fqX{Q5--q2mMBb?scz}ztz#dP>W=&6o5#^!4!8R$vJ&#;Nw~bL>%`D!HhPR5j zbz)-S`N4sHR^ed(n8iEMaPj{3zh(r3=f?B1`{?wu7Zm=x_jl^v?O#264<0qsrXO(3 z)wR!FtGj;=6}Cy4+&?pKhW|N7jzK7K?YzXQyl2;JFG2zo^h&z-?5Y+vy};fMbQ_s& kghhMf@@{YQJiEO;1Z2g;5QP~e9smFU07*qoM6N<$f;fHjiU0rr literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/Square89x89Logo.png b/gui/electron/ressources/icons/Square89x89Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..505fadf3ff3686d0ac8d9287a4aec72e7f0f33c4 GIT binary patch literal 2027 zcmV(ttQf;%*;?(oK<94^VckBJz)!y?>mUXvx zJ?DPz@BIFpbGKtBD&=x`{Ql~Z=+>sAdMWv)TF z;6jEc4z8C2T_b0~TRQgNtfxWEa-?)BM}y<>%kQm{g0@Kk_Xc>E4=$+`hc$P0Ld;LG8<*<+<9C6SHd09HGv@T#tPv3wEZ8PNwzq zmdsF?C#1x7ud8hxLt&okYa5#FEUPeAbiRG1onbInNGcfQGKfKDkQrnq2AM%-keQ5? z&B_<=bk&!o9ZOqs&z26-`&uWNPG?DMEJ>ml;w1J{l5mr02H7aNy{?BA?I5ABpZ@~z zvtNvn^Czwt){dp!g}bG(=oo;%w5OZwKHO`VJFzrmZZfmrd%?~YGVnpzkalXeuRZeb z{|%1u7VRRTb$;rj+w(3&(7EH6$;pEeU7v4hOP;srG!Jv%tKZVVH(Br=f@7f5%OD%2 z>2!`9*fCrL8W~8%L)L2vdgTkaRRyu3y%)$#CYS#i{#nm8m<}0f(VoM7G>9zCDi;7F zQ`kMIJX;Xlhf&sSGy4JsxZQn0^8Pn3lVZtz?x<{-YHhwS`xgW}(nLWVVK?Yn7^ z1q;Fj=8w?}Rbx?l)YTgxuT!Yv_UFW5%xRkO3He7M&J^QuN1DKNp>g4sywK z-oF9#GcP{LAG<9Y(rVh?w!eow{rnU8V*rclO=@v+pz*p?+ugnMHxHjF_0^@M+b7Eb zhV@EQAhGa1tXwSkQ3NctLfhhi1i%NW4@Pz%CmbJqXQZImSgdU+{MNQdRrgUhWI4c6 zfD3_^UMz;DT49oX{`KUdfb-T!iw(FEDQLG$`_j)6Uu)Ui1%{wtNlF0=x)V>4tC0jh z)Gv)(*EHL8mHKns99Z1o+ar8`ln60EXuGbymhbmMzE*GW)4ehx1U4l4Y5S;j9yby3p!CE;36=Jg)w_)ca?3LjmN1(=v`#RNDkGboyST`J)w3O91TKb`qefV>wY0XGBR%^m@&AY)ad zZH<@z4zOlhq&cI^!Go6?!vwW-Sp7JiD^BRlCUimGbEHpowX>Koq{Z_Bh~i4qrB;~- zRsw6Zk0Jql-}d?El>z=&YUPP?rf_If$zmerX%n%j0%-W%Ik4vYMLwW<8}smB7^u<^ zACwr0_<7~BTQY!2A!BYeF~RZh02b$znlv|CxQW7zl+Kp%afFV7ARk9u{A;zV=4vfl z6=W=tqf_WOfT~?ktOUUT&~I_yVfg_XYlLUsq>s-^HT>n6sy5m4$ubh2R|asw-S8uX z#t*FCNT0`GkSjo}tY(lIWF`igL1vJd7-R;SsaUp5j=RM$m?!YHrL$bz@+3?Y_}X)` zGbx6`Jb|xmGCeVBc@icno{FBf#Z%*_84B|>nU0Oxuvrv0b9fiK&Z2ER{1>;0dmI$k4^a$z7JFVz9(K^E>9G?%(;vvwy#?TQM$j zESmi8lOo7aG7}s1HMMVa)-79MRX}=$V0Zq;S1-^0^WeU4tl;nXu>01?Z-f0bf&SC7 zlynH(h9?e$rMsBb7N0nsx_h^6u)L8FcS;d?*327R#2+ez>N`=j$+WFmnTUS>RCryHDK%pVz z!KI`avY?0iR`+8k7;IGHa=87~Y~`?4Ojlwy4U;{Xi%`37^?%a3m+2uEA@u+N002ov JPDHLkV1ffv<3Rub literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/StoreLogo.png b/gui/electron/ressources/icons/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..de74c7a55b7e0853b302484e5b91dfec6d23cb12 GIT binary patch literal 1163 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 Ef>UZV!2kdN literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..02819a9234867387447440092904d464fdeb6b8c GIT binary patch literal 3581 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 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher_round.png b/gui/electron/ressources/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..3977b79719906ea1f55179c59e8bc7861ad0ebbc GIT binary patch literal 1190 zcmV;X1X=ruP)LUlasENkveE6vX&oq#{1#ikg~|sPsxS*ThDvp6@T*n7?frqrF%AgUdZVz2|p+ zpL2fa_dD%5Mpj46MvKjD>-*7T^Zz7RTz;!b@USJ4Y(Yv$x#VObGkJO{bN$Thi(IDq z8(nop@5&AT1RSAJlfhzRDwD!oE)z?QkKTB2aesNep?vheb8i~+cW?aPpzruZZ2)8} zx69SFdZX2B_oQWUV(#VhXB7|t@Cv~pH5y+naB)jVS2uUDGbIS_LjPh0v;a^JA{QP_ zVZG?#Mtluy(-MFpLDw()V80O&NR5lQ8G+rfpCGgdpa?;HW^wju83OhjmokyHLtwvA z%K(ZjLo7pls1PFuLu^`1U%)}nhTnSGWF*0k?TD~kwyVbq0$H=|x4(o#b z=vx7B`Ru%GX2ZJ%STN*WGyvM5Ep$LvBaqACcoDe2jSva|Lg3C#r)Z>xwyj?j2);!d zw1p1ng3c`*s>ZD*67=rtceA!E?BBQcv#-~EPMsdz9$` zE7dC?t9n-wh>rj71QDj5Aojx`=otI&d_^)7ucg@Ppo z;?s>z_ihQ-{9dVtA&4rCBsw0aS;V*1*%%2;sn_W$|BIBDXG@W+k?1ymbLdqwAWCQN zQqWIzADBIa*^4J`u#6ldtY;!~4$A>O!? zy*&_!5Gy)O%t?D5Gc81CS=7Kby4D?LE25E<%2NDSM2w{t%r7mw6Ab=pO%J^Vo{Z`l z*o*+SqHWE7u2_+b&kziN@doT$Lk#a8;EBgtQ;%$`_-QgO75@gvzNu>jQXc1_S8#Mv z*}KM3a+h+K!3-jC;;r<%Xb329dJD9dPtr3(M1o6lFjHynOc>=Wf?X zno4%>Td>x=+y%XGXPzIVl*|*|<%R>ON{F^C>}7~$h>sLPFBhaKEd#)Qy_B1t)G`F@ z*W;vK%Mh@iAPRH&$65q{-LT()Q~9}9&!6F>UTYAS?j0X~Am6z{hw%@e-o0Wq+gIU$ zTPpyf6g?J8g-1~?U5iM|V#LzX)uROv07UK{9a4TSLBOrxU$|=Eu=>7N<0TcW0l1Jd z1B&SCeT=IHIOHzgcXIkWO@e!=3`ZV77{vhNsdwM$HGk^`wRLStiU0rr07*qoM6N<$ Ef>UZV!2kdN literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher.png b/gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..30bd847b19916e7b3b1e783dba06e4186b29cc02 GIT binary patch literal 1137 zcmV-%1djWOP)tBmMx`52i>>isJZM!=lnRO{iU)I1s|OXut3RLzLB(6~=TNVL zs5Br}g!W=DrbHB>DJ?Axjg>C6O-XHP)p^@aOyefoq=oKkAA}^kGqdk~-`j5{nYEG% z>{dsaBnD1-%c>8Fj*4oV#Zg8JfYfAiNKVEgJwuU~QMv8u_>bgJb{kXn0l&NMdR6(J zOAAFhpO{Yr?;eEvLpN0gAnJS9pL^jFq*^@@&qh2EZE5amILxzQ;U^AMUU;o{@_=9$ zz2(c+ZG)xK0{rfSHza2usCV+2BA9th$c7o#sVd)n(J16Oz!}^v8&>V8N3}7U0E>Ca z(y@t=0jm+obAY>*)%ndv6;Nsy*I4yd?+bxo6TMcWlIK_yuqfbP5pd;U9j#m~P&C|6 zp(pJm_a}@cprTSFhhQhC+eg*4UV3)FjoLy{&3+cFgY+Qa!`p6(w#R9?vxHWASCHg) z(U-OujmTqp`AM~ka;(e$?d9U2!njZ`C3*(~q z>zkNYo0QKu220HbyN_>5lShAygE0`4>_9}rapm3V7L-iP$wHY?yH_7lDg$00-geQ( zfQL41_o!MS`@Y#9tWgNxI{BR0Z&a}g9|N|`wxn;Xi;XK#_vddpt*V&;+(emC%bZ}6 ziBvj@HM`c5$fBhNhhQU*&za61`elyMaJ4yY$;>hOI^=W~azS$ zfk@?=J$W1cIUDGQ;8ZZHWR3w*JcvaL0Gb|!^PUH(WJ1<#lMe_^c7QtAvZC&^KW{%n zEatFAGPHm>-2)2=R4OeLEdaH-q|`3atFD`J9MIB-wtg}5{yZ}xFvm;)J5(Y)oV$s4Qr3Tb@kVpNW%CMjW4L@qsxTwK& zX6wUWxjYWy^FegB5U1BY5?jD=+k$)}TV7)#El7Y-u=uaUqJaNhfH^feHf&V#;BJ6Jx*CE%wLO!yjL=9q@qOMSy&BSHq#npA+9_2*3e&3OnFVho=VnuzDg6&quz#xr4}a z@_Jk>T!$?}CFjZ!)NxJ{$l<2JtmA8s2OaYz|A00000NkvXXu0mjf DR__pL literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/gui/electron/ressources/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3fa0e0cffa736d34e8b571eec947c70d0f8a2e GIT binary patch literal 2448 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 DR__pL literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-xhdpi/ic_launcher.png b/gui/electron/ressources/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..61b2afdbf1712c4d86964ed980c9731165cea641 GIT binary patch literal 2112 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 XP~6oZ&RAA+00000NkvXXu0mjfkqQoI literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/gui/electron/ressources/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1cf7f6a432587c2ed39a1c96ffff9cced5efff GIT binary patch literal 7081 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 XP~6oZ&RAA+00000NkvXXu0mjfkqQoI literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher.png b/gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac9089da503f03013daed7ea48f4ed2749a22e6 GIT binary patch literal 4236 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 bU5csnY6#yxyXpCt0Wj3Nje4Q;Puzb25RBIV literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..09e6959fc4e098b41d68be24b4e43d3eca5477dc GIT binary patch literal 9824 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 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/gui/electron/ressources/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac9089da503f03013daed7ea48f4ed2749a22e6 GIT binary patch literal 4236 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 bU5csnY6#yxyXpCt0Wj3Nje4Q;Puzb25RBIV literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/appleTrayIcon.png b/gui/electron/ressources/icons/appleTrayIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a453a26fcdf395d856256c88196566ee08428edc GIT binary patch literal 922 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9EAKS7xB-GL52prB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=GWbo-U3d6?5LsIoWr}K!EjQ z#=rm5ZPiuSRF8P)KMb8Kpt9_4ti`bzTkid4F8O(qkDsxhc=drhVHR!hgf%bxxC+-s^7nE z&vlPGqWbI$nR-P2zxbF{E!HCjrYE*=8U+9GKYw=H?!!4B?QP9(zYDbv`^zVou=I!W z`rd8(4`qFHkCV=|XDVkb>#{HINp&jkwy*MG<&0t7@FwAk%IQ@<79UUZexTM+s#Jb% zW6u7hGuBIVS>CEVeG{|VWxnqlo1|}6`6A|wW$I;{-$tuvebZif^!J&hqLbY>ME^*w zC^d@C-up@5_c<>;JJG7`?-OqydLOpJtAb0wjD5imQ_uVS3_BGXEI1VSnC>u~|0&GW z(ai8j;lSCOvAizO*neJD&T;aV!^gGWH&a=1q_xqkyj*Y4et=o?lKffZGs@C{n{tEu<(-`)C7Zc2A&3>wV-{jL& z3C2~TKe{^pzi}1RI&hb3@1aQfy+>}GUD?gR)jIE~hPtR5_dBt;mNmOOlpO+f{)O6p rvEx|4YtP;dav#LOV5d@@c~1V)>Rg)_|8jeQ`HI2Q)z4*}Q$iB}-05cT literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/icon.icns b/gui/electron/ressources/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..753e44c34c59c3a4e643f7b395947732ee9883c7 GIT binary patch literal 69880 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 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/icon.ico b/gui/electron/ressources/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9e88b20ddcdf6e0b4559aa9af94ebf59277e2b03 GIT binary patch literal 12393 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 L;Lkt*-S>Y1Q#g>C literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/icon.png b/gui/electron/ressources/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6a09da726239dfce6d0a8315995bf3743a93c829 GIT binary patch literal 11880 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 F{|gt0!?6GW literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/icon.svg b/gui/electron/ressources/icons/icon.svg new file mode 100644 index 000000000..1917a06da --- /dev/null +++ b/gui/electron/ressources/icons/icon.svg @@ -0,0 +1 @@ + diff --git a/gui/electron/ressources/icons/ios/AppIcon-20x20@1x.png b/gui/electron/ressources/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..383c2535279fe015c192839889d55725b1156e3b GIT binary patch literal 555 zcmV+`0@VG9P)jUGlQhxT3Yr#Lqy$O}c4%#(9a>5Y#j&M@7Keh}TH2+H;Ns%q;NUK} zIJx;}6T!hv92~^I;2F_e^e(x4$>sds3&u!P^tcBO?mnLPchCFYcc1*Td(1I-1_nPs ztf?KrfP$NdYI8*$N<$QC@HS-K(!@g;chm>)B7)Gx?VJl|yp(rtn(87EBgb_|PN?@K z_#`D5m1OuRYMps4jb7x&w-!b^g^_Aur+&LshIv##wC0OfflOxT?204N5kVxbxZ6UFh7b(NqPPM( z+%sVFGSWLo&^C2!tfY}Q3c}l54}9_QA(E*CEQ2GxmBpcUEX+l4s|4FFBOqQ#ZMU?C z5fY<$`}HyIrCOnFWH39vTt7pvir-anuxr#O^r~8zJ34OX9rz@ZXB?*IHTVbA!RW~G tBPB72#VV(*C8dpZha!7vlWK`UtP^-F!yVVrFgO4J002ovPDHLkV1how2JQd= literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/ios/AppIcon-20x20@2x-1.png b/gui/electron/ressources/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..28f720c69aafc009e9d98d235737f8bd69b06116 GIT binary patch literal 848 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 literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/ios/AppIcon-29x29@2x-1.png b/gui/electron/ressources/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..26a9a81efb1b1b852374c3e798c5226ef3bb8b03 GIT binary patch literal 1287 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 aIj(X z+4=ds+4tU#Ci>))=Zi#8|J?b5?CfrnR)0J3`&!76wqDW*y18|O6llM;ckdFP<|hwz zJS=>!?sULL{$ILfNpEOS>cWRfRzt`aHpyBpL%Q1fNkDI}dake9mzni62?ZWx@R~^h zf3VbNtwm)Yg^YDGaV$m+M~+)B*mHeR&z`0!Qs*hk=puvnoqf}OVRwf zsJH1M<-V@1u$|~Cba5|QkNXK*xw4Egc8XpA<5F;FT6EOmQt(a!bh_Vs8{(Kj+RA{Xt-iuEYVHg{d$6oy^>S_ zofHfONOr~EWydFzxS$2B~jpab>DfxyFc?LrYi#r;$hED#SCuJ{vu((Ts_pcNjXeB;v&5KG?&Y6=h6 z<(ivGm$M7p2ikLjczO1JfH;S{bX@`3!8=1^D?I7G{P0rwIHXilXT3wj`Do7w5A9$> zyD|{d^BL1;Su6Am5S@V~aCjJd&>Huw8Py}1|p6( z=ESi?q<#Q-X8;8PBm}A)p3${VzdCJ#_|8`oj_xJWo)MlAiXB9|yx3}mM~~GBpj~GG zX}<~w_8TE0c&*kcJ58M%uV~K-&kB*Z2Z*nK@{FzJXIC~1{c4rEC)WV+L*X?YMSnd%n0FX;{^!Z^-$?VOKc5#m z&+}8b5#T}G&7q?b54WbQ#@NX?4$6dB>aCoO+B+0LX&Hwi9$kn?x$vHrUB01H7U)q5 z;Qb7cS2mCu@eClIG*>%}MS=aaxqi1I0EWw9+`@O<{g$t0>mF8l1_(%qn@||wpt>b; zNf9AGwSuk&K1GWIfV!F~Ri)DlD=yj;OAvIK3m&7eV)1SU3(#r}s#XGAD`3Dx)desY zX%W>44*DmO&Ithoyib2PRkIGJ7cv$5mQq<$HUPnzBhkvlp6&0G`|(P7d!k%~#rzn+ zgtcB>aQ9MO7$ANvR8X958pp6Lvr(?Nr1olUC>hmqRuunXdD;cf;GfxW;&88s^|0|G z0>)C)k1SYB5O!f)aA+)SvLaXwz#t8BJ2k?K@Wb+U?b^o!3t&;6ic^=aR=_pB2$Pw$ zB@FPVnG~}on0>7+>7WFtMzFBZ$43U(_z1XmR*GQ+)fiDV)#M_p5H-ZvgE7M1g<$BJ z#*76C18M3&8ldK|dANqkL_A6XQ~(t~1yBK0QULFjd^flLR*O!!6xiv7-NtyYdoKib zI+ndua;JPDM|7X&SIeHb6jtr;8QjLT1)>i~O_Fi}`cU=*Y6lcZ&cD40u$_nMI z56sE{v83hdoxhqMjHtkhF9TYh+JOZaRZQqCFfuMyX_^}o)H{_cR}t8Nk#V01Ak1=e z`<8;Z4?M83t|eVDJBzL6RwT-u4Pq=P6T6k}Y^S$@@{zV44Xf2Qvo)gcrPYmlwEfo9 zuR1@F4VIMrjg8-$3MBf9KBMnWs~bC(vp~K#G{`Q3HA8ocg<^}Zm8LNPW~Ge)3@(bo k0CHQTXEejmME?Q9f2@x-4ev3HOaK4?07*qoM6N<$f+_?x7XSbN literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/ios/AppIcon-40x40@2x.png b/gui/electron/ressources/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3286ca2fcc35590bccfbd5d39f3eb791fac52b GIT binary patch literal 1742 zcmV;<1~K`GP)X z+4=ds+4tU#Ci>))=Zi#8|J?b5?CfrnR)0J3`&!76wqDW*y18|O6llM;ckdFP<|hwz zJS=>!?sULL{$ILfNpEOS>cWRfRzt`aHpyBpL%Q1fNkDI}dake9mzni62?ZWx@R~^h zf3VbNtwm)Yg^YDGaV$m+M~+)B*mHeR&z`0!Qs*hk=puvnoqf}OVRwf zsJH1M<-V@1u$|~Cba5|QkNXK*xw4Egc8XpA<5F;FT6EOmQt(a!bh_Vs8{(Kj+RA{Xt-iuEYVHg{d$6oy^>S_ zofHfONOr~EWydFzxS$2B~jpab>DfxyFc?LrYi#r;$hED#SCuJ{vu((Ts_pcNjXeB;v&5KG?&Y6=h6 z<(ivGm$M7p2ikLjczO1JfH;S{bX@`3!8=1^D?I7G{P0rwIHXilXT3wj`Do7w5A9$> zyD|{d^BL1;Su6Am5S@V~aCjJd&>Huw8Py}1|p6( z=ESi?q<#Q-X8;8PBm}A)p3${VzdCJ#_|8`oj_xJWo)MlAiXB9|yx3}mM~~GBpj~GG zX}<~w_8TE0c&*kcJ58M%uV~K-&kB*Z2Z*nK@{FzJXIC~1{c4rEC)WV+L*X?YMSnd%n0FX;{^!Z^-$?VOKc5#m z&+}8b5#T}G&7q?b54WbQ#@NX?4$6dB>aCoO+B+0LX&Hwi9$kn?x$vHrUB01H7U)q5 z;Qb7cS2mCu@eClIG*>%}MS=aaxqi1I0EWw9+`@O<{g$t0>mF8l1_(%qn@||wpt>b; zNf9AGwSuk&K1GWIfV!F~Ri)DlD=yj;OAvIK3m&7eV)1SU3(#r}s#XGAD`3Dx)desY zX%W>44*DmO&Ithoyib2PRkIGJ7cv$5mQq<$HUPnzBhkvlp6&0G`|(P7d!k%~#rzn+ zgtcB>aQ9MO7$ANvR8X958pp6Lvr(?Nr1olUC>hmqRuunXdD;cf;GfxW;&88s^|0|G z0>)C)k1SYB5O!f)aA+)SvLaXwz#t8BJ2k?K@Wb+U?b^o!3t&;6ic^=aR=_pB2$Pw$ zB@FPVnG~}on0>7+>7WFtMzFBZ$43U(_z1XmR*GQ+)fiDV)#M_p5H-ZvgE7M1g<$BJ z#*76C18M3&8ldK|dANqkL_A6XQ~(t~1yBK0QULFjd^flLR*O!!6xiv7-NtyYdoKib zI+ndua;JPDM|7X&SIeHb6jtr;8QjLT1)>i~O_Fi}`cU=*Y6lcZ&cD40u$_nMI z56sE{v83hdoxhqMjHtkhF9TYh+JOZaRZQqCFfuMyX_^}o)H{_cR}t8Nk#V01Ak1=e z`<8;Z4?M83t|eVDJBzL6RwT-u4Pq=P6T6k}Y^S$@@{zV44Xf2Qvo)gcrPYmlwEfo9 zuR1@F4VIMrjg8-$3MBf9KBMnWs~bC(vp~K#G{`Q3HA8ocg<^}Zm8LNPW~Ge)3@(bo k0CHQTXEejmME?Q9f2@x-4ev3HOaK4?07*qoM6N<$f+_?x7XSbN literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/ios/AppIcon-40x40@3x.png b/gui/electron/ressources/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..21f126cf16c2fdd1811b0108b733f36aac9ffa1d GIT binary patch literal 2527 zcmV<52_W`~P);%UPy8=-C{1V+w^@OkBK@G8M|JlpGqNLy2(~DhT?|+J_t4c`EO2(r9wBXW5Zn#OAjy z5-ByB$V};S8Gk_EqL0znx#Ef*<-Q8e6_@otHl98~v1lr^9Tzsx*I7+;EE=yn=mJ+M z8mR(gGt;5(tniDT)_tgvxT|5YV+3Eh`W2=2$5|#Azy+ciZiEEqix=t0@J*bK0|=bJ z4IK3(7%v>poRGMSlVQnzz?Ug2c~mm;ZWkJ?PXMxU|iz@9&^J7 zoK>&wv=_Wy`liO!a(IEe+~#u4RxrXlJ2I^t-0qQsvEfO@oT^QN3&M*I%-}()-rT-Y zYZ46O+VmqwuOuLfje1HKT-^DdqgNsj#Xpq4)qmILqBHRuIC>=`F_hLHBe?G6wOsi? zMU6BaDQOGJjGS!j=1OM4X+uOm953NTp(>FKvks<2lK6%<;L?XQ%10x9+5=nF$sgRwk!M z+diMl#OeNL&o6_TeyfN*E}t74?GZyRSF2-?#KJ8BuG;$y1Yb z`HKSOFKzhJ7R8Gjp)s97q@KNd#&&!z6?f>#a|^V(Qt{hPjxF1m*2*LmP{~5giIseQojb<}JXp$okd+!ss(_IhUCM0?O`6b5_T`Iwl zi`gB3DZK|@{u@nBjSjk5j&dQ^0239xwsmD`%`u9-Jjn+t*euro73KM7X9Fi0k!6{Y?pcfn3_aW>n{E^xi3BPfi_(??6_W3L{4ZTaA0pT;P2*B5 zRDwIn1y}?}$Jtev|GfXSo-X?(7Ztq~w9~k}L0g~s-@7ex@H)J{8_BCH>n+EQ-|S71 z*%!eWo9xy;&2kOUadY=9=+9X}y7W^r+WElCcR0$mwyBUS+D<)oD;bweR>rhc@5MOm z`*I;V4P%paxeV#;>HFSsd>zInd`N5Ig3cSANYfV|uhDL0&+~R(H`aV3R>*t$zPBCs zQ*9Q?^!ef{-TK!PG!%a| z?Ha9P zr3e|P)BY>$0V$4F5WPvlx98xdke7z!Ox%$GbyJ9~X!yOR-ZwJRFU zT(&ux?25f^@ukSJ79P5ca|`-$5zq;E-;<{&^#aYSEiNd6Pz+r+nxYpUcwczWGTMoV z#I>y3RF7+Qd8IsU0uY>M=ouY0nPs_%N}48193cD{#`w!;0iwLs`rqOl=LnXE zLaudMQgkARBREKc*NWsdEI8my{a$Q7ngvS^3l0!mMN1C8WypdVxdmf>dvrYAbPU&u zZm0ARC6^siAr=N?n==oDU`)s1i_vCL=FQ(;>}=>3-1Z1yKHXR^UNMg4w>(*3Wh1g)RZ?x|oSGN<;x*DAA2w_qnIe$3(_9Siq}c zclzT@H!5Bu^)(3;*y&)#T+kr{8EdfhqA#X>#<-_nXSLqm5Rt8aUwA1;UL%yEA)?#p zfF%5^E*Bb?CAf4!dK%PNWj#^a?Zm*zV4MUv0Z=rG%Kv37xBrT2S)gze5{!;<5^O{w z{*Aft2s_4Su$}}E57|h^^?GE?lk6sXZ7w7jsl~Xb1jajjcr?cCMl+eHi*G)G5!pro ziU{pRcsKjH>=52niN?zinf<^JjYl^_o9JG0PXsgG3&(JVjq>O_G$2?eA)l?W*@X`Ium^ zcdbHdWv@((oa|Ifq$(6qxGUsDjm8x9aPk=Ugrppbk5eS3CiTIXyF)JE6mIpq?38wY z;xsK8+q*^GsV;adIZ0Zv#ZfE?aA^#^x?qHIp|pD7J4P1PuYRLDZ3qUL_zen2arlA5 zk;IY4klPTPj$N;tXTr^TX;p#C7QrApGOch$9bVurn`!=E;#%%isYYU)szV5z!JYMZ zi(rKJ52bJUvMFS2Z0DO&v!h@zo;gAJ;>82fHQ@)Yjtt*q`<&zLgjsTU(Q>0I3+OLfXQCq6Jq^@6q$FN=#<&5AeF|jh#GI_bRoxnxcf7reW=BAk5lWV9m5_ZRMY2R8dn#nlzRyS-9!ne9Cy^vuvS+DCvSu4Q z*%?bC`!e&MdwQPV@BP2u-*5juO!s~6vs~vo*M40`xPjiqy?YMr0RZgP);ezp04;o^ z1&s9YKP;bk7y!3FXrDiK)vtekXzxFk)BgM$8XjjgqU~;7|9UAo`=wUNXiCuKkRR0U|IVmVB8y3iCOrrdBf%aLuAjxaXgdHVZw=6sS{bOT&G66!hwBd?1v#y z1A$`ZqFz}#rntin&L&=3&p!Tma;N2`Mzq%5>GCc?=|_L=+E0ZfuLon*!ltsm2eu9> zc&1YPho||rCaP+Dv+p&hDEPjs*jO{q<*!*?+nig_;U3vc;p_gMSCvDSuk=~WbL}sx zsq3TzvG3Qmt6#KQTUd}OO_Ob{e3kEplrEa7`HWl?dzg$iG_jtDkCUE>kE6(c^epQy zzWMeLf5O{`zELIQf0z{k=3q(SNU0aeSr!|TSK&9S?)_^aQ~ccL@9n0tayyGbdYqd3 zLG1lZ=E&}yj#=X;H8&etdo;_Wejiu|z)NS)TJN9eyv=Q99kskxYf}gB7giN3Ys+aP z=22`*IS(JLafM82g#z5S1f{_FOG)JK%XDSeX4oXHA3tI}s{jDYRWH>09wq}{)?{n4 zY6bloOO(HX<~SqZd8=i>9XAyhxm%j^b4b2K>M6(TJ;4BUd@!EINSLVj-gvb-Uigct ziIGPX1%eOgufL9>EaP986D}K|fB=JdB}g|KZ7%08wll3?MzPh*h@gPVf$-_R(vS|v z$(YC_W?le}N9u)|yOxb7T1P&*Rp^DUwtr}~542zN*1^6Hj1bv*;%BxE>Bh-PdW*;! z`ts53Mld7{YzC|-vrgR)N=GU_JRH%4G*)7F`%&#=biaJgz9zaEGzysS*TiN#m0wD! z$a}y9z)bX7bpH&i-%Zl_oPi#dv*v;Te={Nk0G{L-)?PIqdt$>EP@)cMD>!!nXjlIG z;yqV&=>YN`l=A=;`0yLc_>>|Vn8is+7<)!GysKJbS*C#)={!PT$7=a!n&Ko|xQ>xk z{#d%<83yov-jP@fA>oFs6m|fS_*B1Fc38m3Uy1xR#n`c z;F2T*U;r#pv?$EEx#C??qqRsV02l>hAG((Z47gAjRC)`R5dF$gy^;-p-_aG~HjDFx za~;d;aSRjsAU2z4Zv9(1zf@KrNB<5A;AFem_T2QZ{n9b`!Ung)2u^c6pv>0SIA;2) z-i4p_x|?X`5^ij-k^fOZCG^d5P6+OyaQw+P?vB>!?%Md=v&Ih@HR*sLri=56`T3}Q z#q|E{KuGTwTzo~ni|Zcl6C>E4`I`ZNt#j6JVeuX>XfO5Z_R_}U29J(NAH z>JGQ(NN64E)(u=!65D$mIN(in{=h97Z#OJ@ody6Wborkn4#8O4kdpq={}A7CCJvmr ztTL)kf~#aWI0jW*>-=c<@~5aGI5f7>ce6Y7RbkWDGjNUlTz^ou53e^foQ1U9zpm#C z!j1!;lM8Scn7p}7a7yU+ngB z12y1MxQ=cOG*NN(jmmbUn#eAm2G4f1@6b^2Yk64+N7CCTV@a+!ayzPBW7UkJRRZBQ zwd}fl>ab0aUs?(}K#KtrQ|G1Q1VICeo$pfSIoplUI4Sdrg5H3y-@KYk31~Qt{agy# zwrS;U?u--)!=0iU_}(mFdvH=k3XbZ1+Iw2XF(*JvU`P^$b#oqTAV%R6)O-YrP(Gu6G9R2-#r&?WkyVDHc9^hro4_|o*L4?;GOSIxZ~$${N7 zi-(JMVCR){T~=4ZG$p_FFakNTem&cxlVp;T?k1#~nb&VWr*kQtQX}4S4h1$GTyY^5 zDOJCp^_;&1H%WifF=%V~sk0|aP7}1h^7Gugbm)%mD<}(W3e1Z8qIIUw&i4SGW;FmS zNrC-a_Q{&jqNdPZ7eGPivp+>W+i>+Wrd`e=Ep)xHz=rSCyqiZ*e>m*wQ1*5x{ozd) zH11lRK)C5e+g`Wxr$$}s_N5Xd=x={ zU6RnlT`@95Psi;?xNasee1)6x5J7*2v}5I4(tTjU1mdd5odiwD7Yg$UH5LW?VTSJmItCyzZGQk6Mkl61D|#B7E&g5Q=n+&= zrvYIRHER^a+(p%f%Uf4{#5O;}LgF#hWORq*Up6jv0z7_hKld$6>5`%yoFGqLR+UfZ ztMm)6=6YH{kHFjR>Jb!hQM(Bh!3e0Zy?>LD0Qwj}1e^)<7+qqF^#=G2xDuY@_ z^KFyva0pMq+f&o=diI{m*J(i(S9KN@Dx&ZOwvUdjyh8jSIXMl%K^+2lz%j>Gjz2|> z{1-b=nEAG|3aVAdCU3$I_{}%pvdm>2emva^Y;_*?rtO1`TQ?{hDcWvqFK+>xN;TL( zFX;I5sxQ6PX;3f(VFFEYfy_6HhD7oQ$P+T5ph#55?dn?rKpFW*wf z9?mnW;Or?i^C6F~e7e{K_=WR?V-JU0b^pdITofy?m8|dD@Oox_6n?pCB!6V^=ZZgw zg4@`u`92f2;W*C(AHm$D!I^68a}t9M0(4itR^MHG6crpC#R6=lHHpZPYqgLIm2wE! zEwf|R=HqCbsm#7WF+?Clxb}NG9g9bw`9M<}hafTIgk%3^W@l8OWz-&EJ8&N!g4!~s5*>{OCQqu+cw0*CZQ_rg|l8dllK2NprwxoN`UM0v-NbBFzaJNe7KYy>yA#2ts< z1~a(eQMeuiq)Y6@OHgUJ;PY?T{MY2snQEQ`Z6TWNbp|ew98CO&+BIUI?C*p>VFO(5 z0;t;Aq6S2dyheb3dR~%OmL$NkcZ`2X=8Q2!2_~HW8pnDSjQ~9*YHv*?(rLe@E^qPO znpIiw_yz+#a_R;ZZ=<$V*bDMewTGue{2E8q5O}zYNrPjBI=ega+gzY7Hf;B%@8Vlz zGmu3C8WKEr2M*xfG{7Th93rhbQq{Z0Bjns_FOZx_vGVRr-8}%?-Mi~%Lg!Y~s(a$G zInsRK<}nUxa}~6*RwqYh{TXmB2s&(Ba$Qg(LB-QFsK7&@cMTFAkSkewNTU=`C26Bi zgX^@X{3t;XRS^0%<@LkG$(o-<0Kd9|RrpMWYVT?VGu|FmJ2-YqAK4UMqiPX7qYVlQ zR>mR3{hi3z-uqTQs1;H0lDN5|4&T4)N>_r4BjCJYA$DGmI?jeUpqs9J72pX*%y1e3 z`>Hwgj3cmFMv&rcEnNXB4uSLPH~zls!}o_3tK9xu2*5+0!`HfS_ zkT)>C|3J(u%2KNGc7rX6fah=m72w5LyWF7{tT-*9qX1v;g3Yl>u6xnFJ`5P4eew%^BRC^?hF~*+N5ufz?2ZH2wh|f~vs>EITnXZF)E2i| zn)doEROJGJ67qnWPgX91UHqf;wdg}ZN+kzCvg)?UU%2>_tp>WEu8%_uxHJ0h~{nP&^GOl6b6h7g@MFTe;}yd0FmHcB~xgv4%H@m`1~(5^Oc zkiIMv*pPRyvO5Se=xuVog3_)AHPvMT3k4ApsNT7gwYt6_S;6Y9l!nRS#o4$W1r0<YcI}Db)f994 zU;>FEj%)A~T{foWSO8>+xHT+nbtov6l5#bzbStB^37W{iL)|I;K;`zg zy-w@iN}x4a=^ErurP4ph>0U3t(?)i@G21{SCwSA~igeU|QUPN!J*!r_xRiew{KImP z43P!IddqJTD%ePb6x7L60kvDmT3WTbfo_(i53P%6@XsWX{o?E%FMykIBW67;AWkZ| zn2c;>|A%3T8rgVYNcJ;)Ja662(# z^0tWo`~J{p-fHy~`JD`SPuJfq0r)=g3%arS*`)jg)V~ckZaJ(Z zrdf0RHvtcSLfMoc<;8Iz{s`_4fZ0RCvSyN&Ws1b5OThitLg^({Y1kZ_A|J13y-9ij zY-Yb)rvV6BjxAK~S~3Bj#ldTf2Vnz_rFd!0_cr6`V#=}OX&i9WcfG(|>~UbKz=uGm zHSoQ?_k~$aF|EKG^fxaIY!cwV`E{v!dE6MZs~$l5d~f*D5o115ipDW>w{c_Dkv(zL5RcSDq%+{UP^)s3w;bA;HxxZp|~IcA2Ht` zRo-S4fR7W4Uk2Q+Y3OiE!i@sl;KF+;%ZdratH4xCStz?P!6(=WqFb8!hzAIIHE<;KB zdi+@T=Y;H@7~+zN=T=>itglD)>UiI=c#Y7TMOiuZleIQ?Z_HkL4BEwzCC;>0XOntL z3ycli=es+*`zB8cpzkp4?Wv~K&KL` zLE^U!#{_jA0JEJ)i=~{Rs>NC!fT>^ld9 z5P1ol8xeGtA{$d#m1Z;X6q!olbU2Ajvws6@LR=|@C4g7)S17AnX|3Or{0?}Lu^MjCoZoJP^K@ModfN>hya`U z5T0E))^;wCoxO<$_ZboUK&8md@zYipH-Db$+9rbpGY*9`W8!s3WG02)v;RS=g(H%*$CF7XTc$j6%MxV22r?_fSF^y#XihuPpbU7h2clU zD?UN&fD z>HQTtNN>xJ>-3sV@^#9%hBRd%TAUP>oVn}Qe7u${Le`vOj2R?yaCubm9aRibQLH<< z(wy-OH6R2>4D4?le2kW}!={h_O6< zN?}oG=<|o`=8Bii>u=*`9D={`~fLcY&355 zPV*ORqrJ4KLp}b4$bc=$62_pNrbqWdJBmsX;exm@L0ViZb-&Ei{f4Gu;R=7(cTf7_ zIeL`VZ$6TZ`KHZYfrY;?9Cf}Le}LPK#jPN~~lr8!xtXXnowd=$)r9TM%= zzBl@Ycr90qM7j&y!!gpb@+QB1vy^b+kC2Nx3!So@k_lgkT~8z46xpj*^Q8Oet!rv+ z(R_@mziSt|huEaB=H%4wdV|{WCP54>%HSwMAOgp{dDz1kkFggheJ*C9%eYl(_vXl^ zI>{a){4}YjqrS&zG2ZH|+3tvSaCV}S!ibqLy9PtH+4PO|-+6ONk7AS#a$bbubCaD+$Al|(R1UT_HJ z*BFzZ7mbB!g{f}aX+kH+n)!_M+8g|{M+ajatg%JN=Qi@xciB+ zOYus}1h=Rh`Cfbq9W-l_<{F$<8EiD(t-)U|zCE6CnL0}2%8nYz^q^p^H2KGNPWYq% z@Ia^$D0=vWWItxN@e0ZanBb7P&VTGSm2LRMkJFYdwR_2`$RwOwR^`*$0wQZ?&;^nLe{N9CNGN3qoAXFuOFa!_~b*Sw1g7)nW5>zL??Gw1czr91# zebYLqH{3>7U*+!EobjJ@m_0r%msOS@jJ2WLd9LhWcjS+}A1-$LSg{^IY#zK`|ExR7 zGg6NQqn^G|1C@1m^`uBT$FrN=P0~BH+P@Sd|LAl_^Id}{{i2>!7r3iNZnQRbleBCe z^ZWjc72r?Jjn#0;N5^0{4ZLjv(tpd)#6FxEj3D}OQi?b3(xM9z5e4r|kB*Lxkr-*> zZ5}iI9uJ+}`!DLTlGQKwpg>~&wH-D8w~A#yIxPf&Q+Ozjdgh+WH5=kfZBwS-pTQtN zndqV#RD4e45I*#IEr9vcRZoGst!GC@9rSo?B=k8hP6Tl^>>rBklzDcYm)ZX`4b0bx zl3$m_9L1_sUVQitk^A0Z?m<3z1x2*&7V-JxF;}1YehM5{tK?-rU%Bp-|H-QTU^+)b zTusSHn)Y_kU}q4qZ^{0y#Kc7gaPnjd7iGaV0jCE&<+u6c+j51w*S&(uql-G`pFHcH zj}-ZEHm;JtY$y(QCXN-@2$UG^5YjmW`gLnOH~hZYGvfP70{I9(>n{~ar@lv|{&ij* zuZr_;QM!=Rwp^9uql(uDy>oIi0liS_D0a)2;_BqzW6Xpy6)U0p$Mq>MJ!QBghy}aW z9sf*?br~6SB6Scu7s)1#4XwF5fHir4`~VuP5X>q|oFA~`UPK4`N<~WH7#lv7-Z?4* zaMiQ7F0I(rU!83lqWyX>SrBJOv?EzZCV-NFOgUfM>SA#WYjXuYoEBiLSJF4~>r*>P zzL0eTL`r@WeMtOsxmFKAS1S3(6N%_!i~67P?;JvbcF!saveVyw$08^*Wpf7v!Ggye z`upv-f}4=TRR}~#ACzzQHEVAVYvH8kyh+v^=ys`iDIA;f@1i4mSI>k)>d!8_JAV;E zGyB<9097I#5!V*Hpb;!a&L=0uYk4q|wOe!z}tNw9F);!;~2zv+-OdS?6c~4nLHfNNP3PyN&z=qWbqtW`PP0 zmFIY<5HN(j6&v}QjO-ja4**CBKYF~M%y50j+Fw!~ybG!TgOTl=Xn@bLRht&(q%7PA z;Be%anqt;bWtV2B{b)|C{JWQ%-*u3f zjzvVvGqr~sgB4I@!&B@ib+Vg#BF%~Af?@wLwTOA)z&6WL#Ug|)qe`jnL1tvPjx?|C7LQgMj9!*-Mo`R@wLLhP z+!KiMV%ob*0iUpx@wA=Wt34j7!RWVL&J1Q(dN*g@7NWLrQ{avwz)6PR`I&YpNc7ok2PQo6!!@E$9no#B{d&N3 z(!qIp_jQ`m$|V~-RIEuob-C#!bC%l|assilRo%YU%6*4U)5hkADw2P>sa@UOVOWAv zXV`Zn)L3VO)K@MM{U}PZRk~PlV@y@(c2;yMsrt4JGSO2bNJ>fJXWw+WiGrT}^;j?E z$&$U-n@<+h1YED)Y|d%q|Ef{5OrD4d^_F>!t4>Let(XY}+pE6_c<|V1CBpBCm*8sq&~+Tg zanH{?dEKeU>M|NcPm^a}OvHQ+qo+Ry!25SAkn^@LH>CCfvB&q0_Uy#NZQcjBUn-qS z+c{awrtBWrk)L)3BH&u^{2w+h>m9-(b^^~196mw0=^36Qh|?zeM_vbFMJ%{;ke3PJ zw(_M_>7~$!Zjvnisz={`w$MVGgw16{sje#3OjM*4er?N8VGt-ANgshg%BF9`*v1q2 zk`n^#=si%A!yo}Zz ztEf6fSooA#%_126^jb|CIBHO+M6n18 zi{m_7095$;k4W9l@x@E0~toy)V zXFa~h&_;=qvU{7!ID);`t+e;sVx zyk%Xp0A@2SWsG8iUTqYCgvThur5cL;Q?=-d4K<~jt5wBbg1wHik@t)FXmLBrA-sm|8}krcB*_xfiUysknf`_Y)|Z|sG0^eKzd_9ifp9CtJxvdBn;ivByBU)Z0@`vCk4E9Vim+l++pvP8#&yx&O}*gSkzlvy=XE4 z&CJw!VpalV6TF3)cB$D8VUB%tw92S4k7TYpXzFh3nm$5&f<`Xo>`E>`IBK35f^_jORQbTFzi6EV$+d#=HvECvO#9w-n2 zmASU1ylfNx6vaOJDrWG-&fN*oMK;5bn9TkvjOTSUV0t{Z)LFCLbbX$0C^G50+5F~V ztS_re=EB%`$kNxPT=Jh^Bw1~S~Pe^5a72}&- z8MUbGuY~ag2wZ0@f<8xx)c&N8tFYpt6est@l|aE>cHPI5sm0JbYh8EfW%pedUjwHs zk3A^c*+=Ynf5Tzcc3x1S3u`yyj7XF&jz>9^-y+yPn6YL>4SNzKyXz+W_D^SV>_eB8 z-?wX=RUDFvAd9H|ac+yGB(meIF8M3fZuF~dkA?Td;o4!C$l-0W>xuDf3WZd&TNAu1 ze~k7qR=%fwx+G+{<@gzmAgK!j*ywr+M~uqQ`n_Z7xU}Y!7F%38(W@wZVl(6Lv=8HvpQDea!Io{>9Tec=~`a5eH*PHF`m~c~0 zWn$UWZKA&@JYpAkxSlxF!7Jv*V7l-&p!)t(4=Cer%!zdsd7sDXCZ4}3HzWa@rzG`7S6yJ@gbos z$&5tk290U^OX5OOYRUG4EY6L*%_f|B`$m=hL?=>W@cumk2c6Hn`P zQ5?U!{7NE{;x|WGskuY081qX}V8KLwu1?#6QM;%kc$1i9t+nEjHBbM&GIs8?;G_-d zs@S8rm8%hyHA0dTBclBhhw>OsGJ5;=e7-93DF0Y-x?(&##z4tb%q^39h?&Faj+8b2 zx&#V``jMG=rWl%kPN$&zX}Vgy&33Ce#+Ns8^-Y0_f@F&$_p9lpkS)q34|fNtfr@WF zUUANQ^?rB)D0Q!=C8#GfX=ecGuwH=m$jF>M>4z#9#zyrFu-eYxRD;`3?1dsei|9@fvb+p`5v zXV(Nm@}`yke6BadlH+$l}||q#GnniRerYQigK>)Oe%6 z-r%h-w+q*{p6CxJA&QEhKr}3QX>P%)V5>t&ql~6phsSznn#s+rCB?#&Jea1vT)f10 zIFCFQV+9{OSsns)HcjSD=&(pf-V9G_EX$VA4L+8V2fEKO2!MVZ^lvf_0^zOBPe+(8R=N?rgHGjT?@q6_XM>`yueRqd%+I&#bJTiSjw zVCLkY<8R0)NElPg>uw90)beTQ&UT1u&E%*Z?HP{T{&+QhQ}faH?AP{C!mz+FcL0Wz zmR82pH2LkrP~}?G9+c<>W!ddC$~q-4fU>LhY^bo@*jkttZ&Wzm(5ALCEM&bM6XFib z&@Qh$JPz7#L;2DcygT43Ixx{?8_*KCHd;MbWF2^>(vl5t$w`TUQK{9Cwx}_R+1*_7 zxOA`#-1$NEIGUBk;HU3q6B=(>D}{-`nEj7zgiDY>;?7+!bExTz5)e)2x3mZK{pa~l zH8K+9WB=^r#)N2)Y9f;D1nVwCk-3-z{jhn$@@!zo;FnlCXwS#jb!M8HBwh*@W8uw+*qGVE!VPe)vY%&yBD(4i_5Eu{ z68N+VV-!-tiKh33_w~NH%-DW-o&S>O#n@iDQKhCOx?Tw#U~|~x1bO_;a<<4aPhyw8 z{q(r@pv?8W&$2-gSL?Ue2-Q1UaeviZ#bSX%IZJVFJWZVibBXk%_7(%H8M?LyN+OrX z3mG0_nA(?|!RBhe^evM#@_Jt9Kx~t@q9O{W zDLw`}#n%zaIpdc#r+>*l1)8UROFyd0I6xWVkdOaghD(JUJ~zo765Dw9Yr8Spb?N8qQCfWCSjA2gKP9P;FTPJ=NQ4$YG(0(~+MVAAV}i~tXk5!l z8X%`lYP;Z3bt7hdcQSnLYaid?J57@npA6rdn;`BW!PNLk1*827j6PmJr+C3iLTSwBUsy$QNd@^{DJ*j5nR0&BV~R`jLeY5in2Xx zqc`^Lm>rrCHIwC6GikQd;H^#?!Kwp8a_`8L)5#A47Pfd-hX zIM0X~`4~Zwo;Kg9yuhY+A5d*nFDE9Hob+T{6-}qVCEKhD3cMGDiplKKkSVK`o_<1q zw;(2{6_ejpkNq^_Vd%?Pet~UxFnrTF&RLT&_G?FdNXWd=ah!e8|Af=uvm0Hb{H)oq z;cBo|xl>eU)lz8x2U<&+i7%V&{n{3vyy`hwVmcMO9CzuA(Wg?|erV2N@85%gp%03A z&#M$l5wE*&Zd%RHzBtg&q@!WEdYiRO*zL>bK#|U!ilAA;Reth>bZ6iY%Rc}ZKNea= z%;4O6!rq8~%PycQRrpY~bi#@eQ>tm-C=#;$N+PduVQy^1=Y7jFBgWCh!SaoO9mGLg z^saFlaae6Oi56O~I0)+yJ~n38UnPwMNmsd_8DJN9vmXon|M$_6;nlhu3pU}8)deCZInxy1iy(fS^X8ig zhUkV2Q^jGSh>75^-983EoUpXEj zTd{BLNvcI&+o_A=!;ePHcc;HL6i4R&B42#d`H6q<%Jntv23o)=N%eR>CMOTS+$j_# zcbbgcI`YZ)#HMW4!dPP+5)18FWKai+o66r^q>D`_MtO2PO0o<6?Lb7PWP&10TIuQNYIslY-DE}Sbzi|au2s8*G&(& z^rUsXD$A>1mAppU+|F!BHQuoowws^$eJVyWku+h)M0HGrwHVM zJ@ts6vfS`_j(>m=l|FffJNKT{FF~CZYm1TS<7fLSuI)%;$pJOfV)1#=e}jEp71CoL z%AYYeR#S)ADFv*sY{~NEq5N@)|wVq{f5|#Lf1iV#@@u-$3%0BX~Qkv zw~-WHRk!QrQiP9X{1K0i!f4`@UbDzRa25?tj|qrga+ZAY^|^OFR>4pLXB^Qu9f2*` zR)|%XzZ{fGF1oC)BqvP!y|b{dQ@eVRhC#CMwG3Q(Up;nSCsnZ?>pzDUtzT`w>&fe6 zccU_mrjQrks6RF5gsT90VKEosEA4H>eDlY9|pRIgUm zUdJvlOpKs>m@K%OTR@^QPLwP*xyw(< z8%yi{NN-FIC}J?qTZN=yU0mj_+DHgaf+G8WLYE&_plMoK5_QRcpayZz>PyE8t4(uw zmi~mT>s_mS`||l;<%i5K-Ti1lTykIp$HmG%#t%|DA1>Kiq`#Equt&)yUx8r zy6r?KyH9Oc;_DH2OFN@PUUZpHzO*9IQ1*rrMos|W8O0vJ>l-ESs{7`rqneOhaCvCP zzOnwk$n|vf@C653#!;23!sn&vHpk#{osfcDS!}I+XW}Z@6N5?T z36w>@{1fCmTY*?5f}gor2Xhz;>Qk1y+hU#i)BNq)bLOZIswkl8Xvi45tVegod~hZh zCi!O_3y)w;ymByqMz+l>zg={AV~}n_Pm;AJ)yQVEqCff92;$zm5t_S>S&Nb-3^IE2 zmDgsg#`DZ`e0Bd}osbnJ&pv`F@ctK79aYxa+QCsH%~tcIBiLn`HYE2eF@650?yI3)Bbax}T8C)M=cnm3j=&PLMG{Z#d+AZvznjZ> zb~ryn!slJ@OfY}_%dxZ&;^fI|p*?Gv$`Yqwaj;|@sQuuuzJml(yQ2xjNzhN?$#77K z@{aOV^Q&AJA71aCJUZW2z2#9Z@+fq!XMe6w1Z6SY=^H*S+_eFE1mEPU-fIJ}G;@&= z|1zCv&UOaIw^Q)Eva@r%@up2cy7wgrc_SN@81z&p2 z`P-r3-Q1F5Xn4kIbsTv-NujE@dJ|n5!ghBT(Q~QF^WlA9#Sx}C3aNfZZL%s z7iP6kc&4SPX{jaGN6_lX%GRZC_Vy=_#?E>*T0FC;xOxpsx;V`CzLgzgs!?jD@%rV~ z-111~MppRIEQKVl3u<>k3cOTT70tH;qB~cd<#Ozc{H-lQA z?l800zfE@7F2G=n7bu8>1xs>SuI1YsZpwZ`OV?u`4t!8V-_1iJCSqv=#a zic)aiuwa3{78YGR4H{aBMmm8#Hr&XUy+Q+YCsm%ndE}|9INRL)74$SeaH&iISR6+> z_F~?dqhJMy&}PN#UTQs(ocrK@a2ij8eBC2}{Pxz)!jx6@;(!-uzkoCpgqAnrz9|TW30mlKFt9G_KnM>b5CT!03sStQ7(2%c%u$9MNSl{HH?YY+ zhx_yusa(SS6BQkEm7NNumq6b+Tpak#N<9t(YS}A>K`%`UQi6*j@PnZ%Sa3s=&5Gic zrH%Ea;`(phFpf1tk@j~gMr{G;$-u=}`I1ypCWvy3 zu>#0k-;;9zlO6JeLH&h5v^xb*@5+GFzV3EEv}>u=RidFtAG}6`-E=bTQ!4&u+WR&k zZd@w?J9WW?!+iWc`>7RFUXFJ|{&&SpMVis6-Er9UZy{!Ed9V>0P{$bDPtk+e!A!#- z-!Gw9A%r?GD3}yVx&MU@TP=pd z%)>{FGEwRxlwHOD&nM6^3|RfGIbrwa7#+E?|!ZS$Q9u&j38_4Wd$ZWYK0y6dxgNcqp(jwBy@rbuiWhXj{koz zdrqBFu)2cW3WfuP-+W8He~-$ba(Ad`SD+rWE-X{vq&ELcAnJo_o*a7WpQ(s{0MT`K z|DKXgF*r%@Cx}ppBIM#FfVX^cUDU$Kf8oHO{vH*OK|b#}ts*lk#CZwX3B2+^-4GXV zpm(dbfEX1CC9v)ro;`AZ5utwM_kS)r@E~_63}V9@?~1%KfW5VPW;Wct2ikOO>a zQccN4$C4gWyn*Wd1Stn+2zNE}t~g>jd@?Dj zJM}EJAbp*;SN*3IQc)GmOzFOCLSDF;pPJX2cbaZ{!$b7054qo3O$l4QN+j&|Em=|Q zQHG=anvQU1S3B1&%ynaP-~|tLDim((ba-LRKw9&y67w7$qXnG1L&I7| zrs9Sn1bvRhebOR>3;IN&XPGwdi{R#^&B>k(X`$hqy~5 zqDP(u;#Rs*pSy3+Q#>`l95H2b_U)b(ZD$ae+4~t(m6R299m2DS!RRf2H^*95yqo%5 z*5<<{6o%r$${Bf&u8bXGhKZie--ROnK5Q4loT(cq9~Asc8fH(e}qn;Vs_;Tl2}dfAk8 zA3tdVYuQh1@uJ{g4&Zqi&=SJA84(O{i)9rDeofw{S&gPSr7^mpq{IebL2|o1Ed4O< zY_k4mY&L{tw#bej;MeDV-CI}lC^xEgKWDZSIT`42!@!>wtejUKin&*FZN6b$yrdij zY)PK?DM=B&x_g= z2ux^#+PFHS-GHHLpAdixvKSC__in630@IS*1*-xXIskKVZgu<0{NWx3U=aNx6jQZo zb038cb==(Gem9qzu8(5c2i#MBl71O0VTrTVtJ?s4%q~6h{?VSEP>dI2-P6#H624@m z>|^)5pviN(Apb~z)+htO8;R3|_WGPuq?tR2&ZI-P-$LWi^&Dha%(eZZB!mV|GZPmu z@Gri-1%7w@x#*(6NCW?_N;}L?uaZXm3gG1jfLY3Ap-q<&_yUwzFcc=Rhm*S>R-id9 zy{v+c^-O+1(`WWSG*%(M9K<>OU~L8`))h~n1rHSE0xJ@$8_r;1T2CY{{enGah>tx5 zm3wkjZKu{JtepmpQ?IwmL-bK%#<1&e>_+i+3oGsjJG{*Qv|A(X<=vyO_BUg#4`n~y zR(iyy-Z-rAR&6V~Ko%KD#|ePpNkvtUOeKNyz7U@~_yhDjLX0UKfYW)co+Azgv>y|@ zFF*x<)l)>?O8O9=!GL$rrd`p9ej4j#{i}furShL-eM0*jh=dIp4x^h;n`xVWM~4~t zGAJ)MCK&r-sxD)E!FzpRaMBZAxi9}z`F)cZ5?t*1y6jZsxeRfb{W|&kPMGJX;Ho9E zndDnjaled*CM#&dhORDJxSibbr0y-H6V0yhQKPckJfJ`yP;)$Nf zQZ~^=+K*qe^ef6mi^qCA)N?r7Jyq$H0pzrbG>tG|3N*ZSwty#Eq z<={gl-xecI8+R`5JeMdpX}^AEe@$iQ)*rv|o#)CHnhy4Bgee;ID#?vGi3+_5PWlX4 zF9Ai8m5XEE=)c4SPct%3R9?FM@J~hS(zeplp3?kK>mZTGG>KWeo}RDU@xck|+s$EX zlT2~Kn4-GrJI<$gM%3pe*u!Y)&=Z$|L0Q@NZf+Hu;Dv>?2CEb&mBM_iiZDBa)5NRG z1SzB5vak5y>*_<6?bW=WW36Ut0_;QAFap)z8VGBC4n8}TioapKD&D=wvX_JF{F9nWB2%GQuuxe>CMsx1bqpA%C| zm`k+aqw9%9r3w1bk6jBJ3;GMhbN;FQG{^fyg&flK4W#AS_k-u!0F&cTvDE&NP%0Y-8E_YoGKLd8h+ePn418J9FW-Gw+V^bL_sB z!hq39%urE5Ww1pNqq*1~_#Lgi@Dl3C+BUB|RbFkccUF-9og8CXszQW+%)EjGwI{>Z zI$4hgWQQJbzmG{(N*MSMZ&_Tnld|wssdHMtP5`(4DrP9bKsY2^9^UBm1dr)~leW*^ z%t4pN$D3<4!@KRB9BiNy8nC9nM!)&bcm;->0rsA)g8W;tp%cQtQ;e1ln{A%^+ffvF zT#q=wc{Z!wdo2(QmG6_#?wWNyh&lc<^INY0Y>m9KI2K_$m*4tbZR29X058FlF21(8 zUZ9WYW_88hFY#>M`LnYIbIJ0ER?%b?h%I{2q;*Xgd=j^-|4v-m!1DyuRpgj9j%usM z!PCfLqoyaO@3lo-oqH`Nro*z}StGh4@?fx^ zCOmRyl?C3X+6c5qT`_(0Ner@!FV3R8oAWUhFE0%}|>=3!Z_$ zyd%Igow7gpn~nI#_C!BzpZ&nAZGq@&+m!lJ(r7^?ejqt<4^P?M)X0TN6!4YXefP;pUg55u5h2+6#am$dQD347 zdKsl=M~p)Zt*v6Yr3A7Pd-xu#gXt1}5AFGQE(mzF!E2}4=)!9J>U|EYaWL=9T>0jj z8tiMBicUJyp(Y}Bk><%Fm<6tlj`x35UycHQW4(Zv>OBA>>yh#+)Jc4+t8+xs3 zu3zOPU`>Xew&iZ(U#&ZB+`>?kv)mUU+doWMiEOPS`OA6m*ao8$Qx37OEhHuzF9*kz z@S+4ZJ66LWvA4>HD|LT!H%8~f`iC%c&u@erfiE#YjO20>q_Iy3*Lam8yxC^+A7peM zOz^XYv4gCpTgZovRKo_M3`vOS{T+O$ZhqXi3y%(7y4EPABcDzlp~|_ z(eD#w{?TdU+4Mn(C=&&h>RG-sdsdnH^kyZX4a?s^ZvpB0Z29w5(fu!BmaI zzSzEayf9h7eX5T z20Ec-FF;_E_Q}!+{1(VPI;CWw*NRhV`XDGEV+_VdAx4Z#&P)y;LKnIhfYv!qms!9* z$qMnaBcPHnEd33VdN!hP>)Wa?4|;mcIP=HBEB>@u&{sESEue~-TvbViO5sVY&c@l^I6S4KX{E1~)py|nPXF@tydUu>D)_eP zofPLW0===}$3X4`ev8(5`0{nA)bP08c1RE%uU}f5y|AExVZ8dt`>#$A64LJ1uXtq+ z9dS1Ohah5IQeevdl@D|Fiyg$EjC_O3?C+yF6z@cFIexC#%=K~JQ}junU@2^lGk ze^XQpY=9_jSbu?m00+coqghps)@SmdA7|=}zX0mh@WN~zKEH?jDsVX25tczTHIg(B zQIVeC3ETW(<-t>=g1Y4a#L~%bj9a?HeXu5bv(h8$DiY#1vE(DjEV;ZDdkm-g$aW41 zkM$I^K{!@~%Va{DTc-=$1dz%a3O>$K3gY9J9my)}U3Y(X$-f{w(l5;HdS1VW+a<}w zbv9}rxcKth`g&B6bT--I_TzFlpxmjpz+nrUDcNU zL&SyKvrPTyN*%O7$J`1OdQS;3CYyRjnk(m2xbp80Kch$bNpC+TKp4e$={QIt2GbvX zNK^4dmhfDp%q}5h;zc>qB<)QRsUAc4U2(2dW4_6UeXa^X-bwgEVhA~lm$8cgiHFLW zLYyr3EMDB0q*NYPQa{?Jg1JT}dlkervulXge~Km_@WYYDY2`((U!=j=my2y^`vUq+ z^vC{ATI>x(9<*rY+C9TGRN_`7*GVe{ef~HRK$+6u=NEXF2_(B#jBL_nWrLS`ngv*DJu~@+DJsv0wD*LXl;+jRw z<)p?GfrlEHB9Pg((e^V^Bf-o;JE*xjWLGr6b>%x%1XE$9*f!Evi6}gcLb1mXgmfXW z*S$1Y4aByPz6J@iUA1x{F$9ln>FPMgoz8F1G`}+A75+rvrS96JenANlcZ7367AvBH z1<+=2kx9`WYD2P?V>QUluR=5@0j`>T)2Well&cJ@uvQN3uULDUNKW#P7_Jpxyl@>H zuW3ezj;qnEjDMKu{;nSKpt^@iX_300I-da8WYx-SG+t`Kfa20sHQdA*zPJIiE zBo6cx1DwLP1c-8{hv;I&G?;LG)s$z~tODQeZyKkWs0NsFML4FTgZEb=bt;g~1MJ0~ zUv0k2Ucd*SF%P=BGPLYkxN1!?V0Nae zax6X%0o;l1D;~9@f;q?s!;l=!D#gcranuc>vfeir`-PY|$L$>q5;JArwS1KTK|DY3 zhL($&Unz$z{S%iX{W3m|vcJfSfNPdUQ#Bp3QfrZYw;hh`oc880W8lJru(m}19Z#np z!x7$^Ha|5>c`BCy2aYnG2-OhJD8C3f{oI94EHqA$RDZQkp^S%{lp( zdir$`WK;#hT5caef;OEti+H+cnw%!bOT~tWn>0|=S{?|)fgO_hja`O%kJs^oE&My< z9wr*2G;wg0(43I5jzv@&h66{Mo`%S&P6(+J=!s919ecZ707C^{VZXr!9cBJ|@jZsNpQH+Ny}GS?hwv?|(P&{WR}F8;Zl zoud%Do(hptC1h!FQE-`3*q{r*{(OL=$-@BRIC zvd?X0=srYvEZ0NIli9R2M#}6%m*93S3d>0+_qis9 z!H;lozwkkQHk~lbGho&%@&V~kcb*RrWU&KTDoH2VFyf3VNmEk+3`KKI{WwLVxI2|& zECO$#2*p5;O4l`MJ4XYjo%8jcZu*!V(6Z`B$g^KIdEmimPgx1hv8 z#kASpEW*HeKwZWJOdj2R?$aj9QSy#z+7ihpl63wbn0(ZeuAtDhaCe>&0Y-3t*l z01%fWWtWfa{lzww16PtC>gc$~r&k0lTOq~nax!x@XmIS|3};5!@3+-kQi`lKZQc>- zRuObw25u8y*En?f=}A8|bJdAlXu|9|l6Qw{G8c(fEA>dYD#wiIvXH2TVZ<2_kC)Eu z3G`iRHAnMO21laN(j4k5?sFDIfy&!q_FpmQkNLHfa%b)G^<pyk)%{N~O2>)au!&JK;?>(eX~(k< zSf~_QCloe*uJ18;L3DRqn%U+e0pm3y7mrNju~TCUiE1r6@=3f&a!{ZcMfSO4_W3p1 z@Dy)vV_+;=VBD;2HhOYB4>d+f{OtK-i;1yq2a#M%v4Rt}pDll$-fswwE7tHN$d(<4 zvh-iv*BCX|m|qWR(!{^8HnmtRcBQb68-bG!HyeD)#7qU-bEG@rb_ed6ykF>z%5k5w z<23}W1h;o8v%CSzI(f3NO)3M|d9LMnSnF?Q@BkUPK!t;5)=xU6*>*dGem#8<6g zk`6oQ{n@->EvKP>H+9p15jJ|XtL)f%sahFXIKpz8;xhThX_uw1j*r{0>(BG90h*TV zkWFgCjuTt!M5$v}CQhJrAMhj7_m1OV-5xP*f{>L0Xy;iFzFd~t7GkpJp;w;IXc`Vu z67>4+c zS-#C>;c5|6)H*MkGNjS8?3z8Tyw06XGy%CkE_}z7z^Aa!vleE@&eX_u&HjQx$x2o> zwIiEK8DlGFOpN)ZK)q<}E*W*=OmK9=I@nbgbUE`MpG-o^-bc)}p{5fTdlf#9nZW4) zxZuxm0xJ9pTpc&FUryPU|G;QXXY**@@)8@rBb`uJq;0S*(St^+Na`IFRJk7rDnp z+%8CI@yOkvpO?I>ZVCVS>9|Ffdd!7_zsCmGj9AD*w`}CC>zCL&9@>!F>cafBw@ zX=b@Hvm{oA)5=_%CI>$z_mgRL$7V*Sf*(n23)T8o*PS~gMY9;GGf9JY@BmdHw!44h zD)w}CaYN2{KuJJ&V@ol$lhgcqt?LnZo3B*M5X;W}di(j+Ixp)0eZjTil(?rN8v^Dy zh0&{keR;JZYl3ByKltJO+NG29=KbDJ2KspFjQ7Wmoc5CXbAzm^FFHJcV+JONvk%%| F{U=whhqV9z literal 0 HcmV?d00001 diff --git a/gui/electron/ressources/icons/ios/AppIcon-60x60@2x.png b/gui/electron/ressources/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..21f126cf16c2fdd1811b0108b733f36aac9ffa1d GIT binary patch literal 2527 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 void; + [IPC_CHANNELS.OS_STATS]: () => Promise; + [IPC_CHANNELS.WINDOW_ACTIONS]: (action: 'close' | 'minimize' | 'maximize') => void; + [IPC_CHANNELS.LOG]: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void; + [IPC_CHANNELS.OPEN_DIALOG]: (options: OpenDialogOptions) => Promise; + [IPC_CHANNELS.SAVE_DIALOG]: (options: SaveDialogOptions) => Promise; + [IPC_CHANNELS.I18N_OVERRIDE]: () => Promise, + [IPC_CHANNELS.STORAGE]: (args: { + type: 'settings' | 'cache'; + method: 'get' | 'set' | 'delete' | 'save'; + key?: string; + value?: unknown + }) => Promise; + [IPC_CHANNELS.OPEN_FILE]: (path: string) => void; + [IPC_CHANNELS.GET_FOLDER]: (folder: 'config' | 'logs') => string; +} + +/** + * Mapping for Events (Main -> Renderer) + */ +export interface IpcEventMap { + [IPC_CHANNELS.SERVER_STATUS]: ServerStatusEvent; +} diff --git a/gui/package.json b/gui/package.json index 14722794b..496f3ddce 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,5 +1,5 @@ { - "name": "slimevr-ui", + "name": "slimevr", "version": "0.5.1", "private": true, "type": "module", @@ -16,25 +16,22 @@ "@sentry/vite-plugin": "^2.22.7", "@tailwindcss/typography": "^0.5.15", "@tanstack/react-query": "^5.48.0", - "@tauri-apps/api": "^2.0.2", - "@tauri-apps/plugin-dialog": "^2.0.0", - "@tauri-apps/plugin-fs": "2.4.1", - "@tauri-apps/plugin-http": "^2.5.0", - "@tauri-apps/plugin-log": "~2", - "@tauri-apps/plugin-opener": "^2.4.0", - "@tauri-apps/plugin-os": "^2.0.0", - "@tauri-apps/plugin-shell": "^2.3.0", - "@tauri-apps/plugin-store": "^2.4.1", "@tweenjs/tween.js": "^25.0.0", "@twemoji/svg": "^15.0.0", "ajv": "^8.17.1", "browser-fs-access": "^0.35.0", "classnames": "^2.5.1", + "commander": "^14.0.3", + "concurrently": "^9.2.1", "convert": "^5.12.0", "flatbuffers": "22.10.26", "intl-pluralrules": "^2.0.1", "ip-num": "^1.5.1", "jotai": "^2.12.2", + "open": "^11.0.0", + "pino": "^10.3.1", + "pino-pretty": "^13.1.3", + "pino-roll": "^4.0.0", "prompts": "^2.4.2", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -57,18 +54,16 @@ }, "scripts": { "start": "vite --force", - "build": "vite build", - "dev": "tauri dev", - "skipbundler": "tauri build --no-bundle", - "tauri": "tauri", + "dev": "electron-vite dev --config electron.vite.config.ts --watch", + "build": "electron-vite build --config electron.vite.config.ts", + "preview": "electron-vite preview --config electron.vite.config.ts", + "skipbundler": "echo \"Prob should do something about that\"", "lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"", "lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format", "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"", - "preview-vite": "vite preview", - "javaversion-build": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class", - "gen:javaversion": "cd src-tauri/src/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class", - "gen:firmware-tool": "openapi-codegen gen firmwareTool", - "gen:icons": "tauri icon --ios-color '#663499' src-tauri/icons/icon.svg" + "javaversion-build": "cd electron/main/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class", + "gen:javaversion": "cd electron/main/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class", + "gen:firmware-tool": "openapi-codegen gen firmwareTool" }, "devDependencies": { "@dword-design/eslint-plugin-import-alias": "^4.0.9", @@ -76,7 +71,6 @@ "@openapi-codegen/typescript": "^8.0.2", "@stylistic/eslint-plugin": "^5.5.0", "@tailwindcss/forms": "^0.5.9", - "@tauri-apps/cli": "~2", "@types/file-saver": "^2.0.7", "@types/node": "^24.3.1", "@types/react": "^18.3.11", @@ -91,6 +85,8 @@ "autoprefixer": "^10.4.20", "cross-env": "^7.0.3", "dotenv": "^16.4.5", + "electron": "^40.3.0", + "electron-vite": "^5.0.0", "eslint": "^9.39.1", "eslint-import-resolver-typescript": "^3.10.1", "eslint-plugin-import": "^2.32.0", @@ -106,5 +102,6 @@ "tailwindcss": "^3.4.13", "typescript-eslint": "^8.46.2", "vite": "^5.4.8" - } + }, + "main": "./out/main/index.js" } diff --git a/gui/src-tauri/.lintstagedrc.mjs b/gui/src-tauri/.lintstagedrc.mjs deleted file mode 100644 index 44dad3153..000000000 --- a/gui/src-tauri/.lintstagedrc.mjs +++ /dev/null @@ -1,3 +0,0 @@ -export default { - '**/*.rs': 'cargo fmt --', -}; diff --git a/gui/src-tauri/Cargo.toml b/gui/src-tauri/Cargo.toml deleted file mode 100644 index b5b855eac..000000000 --- a/gui/src-tauri/Cargo.toml +++ /dev/null @@ -1,66 +0,0 @@ -[package] -name = "slimevr" -version = "0.0.0" - -description = "SlimeVR GUI Application" -license.workspace = true -repository.workspace = true - -edition.workspace = true -rust-version.workspace = true -default-run = "slimevr" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[features] -# by default Tauri runs in production mode -# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL -default = ["custom-protocol"] -# this feature is used used for production builds where `devPath` points to the filesystem -# DO NOT remove this -custom-protocol = ["tauri/custom-protocol"] - -[build-dependencies] -tauri-build = { version = "2.0", features = [] } -cfg_aliases = "0.2" -shadow-rs = "0.35" - -[dependencies] -serde_json = "1" -serde = { version = "1", features = ["derive"] } -tauri = { version = "2.0", features = ["devtools", "tray-icon", "image-png", "rustls-tls"] } -tauri-runtime = "2.0" -tauri-plugin-dialog = "2.0" -tauri-plugin-fs = "2.4.1" -tauri-plugin-os = "2.0" -tauri-plugin-shell = "2.3.0" -tauri-plugin-store = "2.0" -flexi_logger = "0.29" -log-panics = { version = "2", features = ["with-backtrace"] } -log = "0.4" -clap = { version = "4.0.29", features = ["derive"] } -clap-verbosity-flag = "2" -rand = "0.8.5" -tempfile = "3" -which = "6.0" -glob = "0.3" -open = "5" -shadow-rs = { version = "0.35", default-features = false } -const_format = "0.2.30" -cfg-if = "1" -color-eyre = "0.6" -rfd = { version = "0.15", features = ["gtk3"], default-features = false } -dirs-next = "2.0.0" -discord-sdk = "0.3.6" -tokio = { version = "1.37.0", features = ["time"] } -itertools = "0.13.0" -tauri-plugin-opener = "2.4.0" -tauri-plugin-http = "2.5.0" -tauri-plugin-log = "2" - -[target.'cfg(windows)'.dependencies] -win32job = "1" -winreg = "0.52" - -[target.'cfg(target_os = "linux")'.dependencies] -libloading = "0.8" diff --git a/gui/src-tauri/run.bat.old b/gui/src-tauri/run.bat.old deleted file mode 100644 index 70ae2a8c8..000000000 --- a/gui/src-tauri/run.bat.old +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -setlocal enableextensions - -echo "TEST" - -cd /d "C:\Program Files (x86)\SlimeVR Server" - -jre\bin\java.exe -Xmx512M -jar slimevr.jar --no-gui -if %errorlevel% NEQ 0 ( - pause -) \ No newline at end of file diff --git a/gui/src/App.tsx b/gui/src/App.tsx index f7a79770e..215124a36 100644 --- a/gui/src/App.tsx +++ b/gui/src/App.tsx @@ -16,7 +16,6 @@ import { WebSocketApiContext, } from './hooks/websocket-api'; -import { Event, listen } from '@tauri-apps/api/event'; import { OnboardingContextProvider } from './components/onboarding/OnboardingContextProvicer'; import { OnboardingLayout } from './components/onboarding/OnboardingLayout'; import { AutomaticProportionsPage } from './components/onboarding/pages/body-proportions/AutomaticProportions'; @@ -33,13 +32,11 @@ import { VRCOSCSettings } from './components/settings/pages/VRCOSCSettings'; import { TopBar } from './components/TopBar'; import { TrackerSettingsPage } from './components/tracker/TrackerSettings'; import { OSCRouterSettings } from './components/settings/pages/OSCRouterSettings'; -import * as os from '@tauri-apps/plugin-os'; import { VMCSettings } from './components/settings/pages/VMCSettings'; import { MountingChoose } from './components/onboarding/pages/mounting/MountingChoose'; import { VersionUpdateModal } from './components/VersionUpdateModal'; -import { openUrl } from '@tauri-apps/plugin-opener'; import semver from 'semver'; -import { useBreakpoint, useIsTauri } from './hooks/breakpoint'; +import { useBreakpoint } from './hooks/breakpoint'; import { VRModePage } from './components/vr-mode/VRModePage'; import { InterfaceSettings } from './components/settings/pages/InterfaceSettings'; import { error, log } from './utils/logging'; @@ -58,6 +55,12 @@ import { StayAlignedSetup } from './components/onboarding/pages/stay-aligned/Sta import { TrackingChecklistProvider } from './components/tracking-checklist/TrackingChecklistProvider'; import { HomeScreenSettings } from './components/settings/pages/HomeScreenSettings'; import { ChecklistPage } from './components/tracking-checklist/TrackingChecklist'; +import { + ElectronContextC, + provideElectron, +} from './hooks/electron'; +import { AppLocalizationProvider } from './i18n/config'; +import { openUrl } from './hooks/crossplatform'; export const GH_REPO = 'SlimeVR/SlimeVR-Server'; export const VersionContext = createContext(''); @@ -182,7 +185,7 @@ function Layout() { export default function App() { const websocketAPI = useProvideWebsocketApi(); const [updateFound, setUpdateFound] = useState(''); - const isTauri = useIsTauri(); + const electron = provideElectron(); useEffect(() => { const onKeydown: (arg0: KeyboardEvent) => void = function (event) { @@ -224,53 +227,41 @@ export default function App() { fetchReleases().catch(() => error('failed to fetch releases')); }, []); - if (isTauri) { + if (electron.isElectron) { useEffect(() => { - const type = os.type(); - document.body.classList.add(type.toLowerCase()); - - return () => document.body.classList.remove(type.toLowerCase()); - }, []); - } - - if (isTauri) { - useEffect(() => { - const unlisten = listen( - 'server-status', - (event: Event<[string, string]>) => { - const [eventType, s] = event.payload; - if ('stderr' === eventType) { - // This strange invocation is what lets us lose the line information in the console - // See more here: https://stackoverflow.com/a/48994308 - // These two are fine to keep with console.log, they are server logs - setTimeout( - console.log.bind( - console, - `%c[SERVER] %c${s}`, - 'color:cyan', - 'color:red' - ) - ); - } else if (eventType === 'stdout') { - setTimeout( - console.log.bind( - console, - `%c[SERVER] %c${s}`, - 'color:cyan', - 'color:green' - ) - ); - } else if (eventType === 'error') { - error('Error: %s', s); - } else if (eventType === 'terminated') { - error('Server Process Terminated: %s', s); - } else if (eventType === 'other') { - log('Other process event: %s', s); - } + const unlisten = electron.api.onServerStatus(({ type, message }) => { + if (type === 'stderr') { + // This strange invocation is what lets us lose the line information in the console + // See more here: https://stackoverflow.com/a/48994308 + // These two are fine to keep with console.log, they are server logs + setTimeout( + console.log.bind( + console, + `%c[SERVER] %c${message}`, + 'color:cyan', + 'color:red' + ) + ); + } else if (type === 'stdout') { + setTimeout( + console.log.bind( + console, + `%c[SERVER] %c${message}`, + 'color:cyan', + 'color:green' + ) + ); + } else if (type === 'error') { + error('Error: %s', message); + } else if (type === 'terminated') { + error('Server Process Terminated: %s', message); + } else if (type === 'other') { + log('Other process event: %s', message); } - ); + }); + return () => { - unlisten.then((fn) => fn()); + unlisten(); }; }, []); } @@ -278,7 +269,7 @@ export default function App() { useEffect(() => { function onKeyboard(ev: KeyboardEvent) { if (ev.key === 'F1') { - return openUrl(DOCS_SITE).catch(() => window.open(DOCS_SITE, '_blank')); + return openUrl(DOCS_SITE); } } @@ -287,24 +278,28 @@ export default function App() { }, []); return ( - - - - - - - -
- - {!websocketAPI.isConnected && } - {websocketAPI.isConnected && } -
-
-
-
-
-
-
-
+ + + + + + + + + +
+ + {!websocketAPI.isConnected && } + {websocketAPI.isConnected && } +
+
+
+
+
+
+
+
+
+
); } diff --git a/gui/src/components/BVHButton.tsx b/gui/src/components/BVHButton.tsx index 24e90b32d..3abf60c7e 100644 --- a/gui/src/components/BVHButton.tsx +++ b/gui/src/components/BVHButton.tsx @@ -9,11 +9,11 @@ import { useWebsocketAPI } from '@/hooks/websocket-api'; import { BigButton } from './commons/BigButton'; import { RecordIcon } from './commons/icon/RecordIcon'; import classNames from 'classnames'; -import { isTauri } from '@tauri-apps/api/core'; -import { save } from '@tauri-apps/plugin-dialog'; import { useConfig } from '@/hooks/config'; +import { useElectron } from '@/hooks/electron'; export function BVHButton(props: React.HTMLAttributes) { + const electron = useElectron(); const { config } = useConfig(); const { useRPCPacket, sendRPCPacket } = useWebsocketAPI(); const [recording, setRecording] = useState(false); @@ -27,12 +27,12 @@ export function BVHButton(props: React.HTMLAttributes) { const toggleBVH = async () => { const record = new RecordBVHRequestT(recording); - if (isTauri() && !recording) { + if (electron.isElectron && !recording) { if (config?.bvhDirectory) { record.path = config.bvhDirectory; } else { setSaving(true); - record.path = await save({ + const save = await electron.api.saveDialog({ title: l10n.getString('bvh-save_title'), filters: [ { @@ -42,6 +42,7 @@ export function BVHButton(props: React.HTMLAttributes) { ], defaultPath: 'bvh-recording.bvh', }); + record.path = save.filePath; setSaving(false); } } diff --git a/gui/src/components/TopBar.tsx b/gui/src/components/TopBar.tsx index bb5aa785a..28febfffc 100644 --- a/gui/src/components/TopBar.tsx +++ b/gui/src/components/TopBar.tsx @@ -14,28 +14,20 @@ import { SlimeVRIcon } from './commons/icon/SimevrIcon'; import { ProgressBar } from './commons/ProgressBar'; import { Typography } from './commons/Typography'; import { DownloadIcon } from './commons/icon/DownloadIcon'; -import { openUrl } from '@tauri-apps/plugin-opener'; import { DOCS_SITE, GH_REPO, VersionContext } from '@/App'; import classNames from 'classnames'; import { QuestionIcon } from './commons/icon/QuestionIcon'; -import { useBreakpoint, useIsTauri } from '@/hooks/breakpoint'; +import { useBreakpoint } from '@/hooks/breakpoint'; import { GearIcon } from './commons/icon/GearIcon'; -import { invoke } from '@tauri-apps/api/core'; import { TrackersStillOnModal } from './TrackersStillOnModal'; import { useConfig } from '@/hooks/config'; -import { listen, TauriEvent } from '@tauri-apps/api/event'; import { TrayOrExitModal } from './TrayOrExitModal'; -import { error } from '@/utils/logging'; import { useDoubleTap } from 'use-double-tap'; -import { isTrayAvailable } from '@/utils/tauri'; import { ErrorConsentModal } from './ErrorConsentModal'; -import { - CloseRequestedEvent, - getCurrentWindow, - UserAttentionType, -} from '@tauri-apps/api/window'; import { useAtomValue } from 'jotai'; import { connectedIMUTrackersAtom } from '@/store/app-store'; +import { useElectron } from '@/hooks/electron'; +import { openUrl } from '@/hooks/crossplatform'; export function VersionTag() { return ( @@ -47,7 +39,7 @@ export function VersionTag() { )} onClick={() => { const url = `https://github.com/${GH_REPO}/releases`; - openUrl(url).catch(() => window.open(url, '_blank')); + openUrl(url); }} > {(__VERSION_TAG__ || __COMMIT_HASH__) + (__GIT_CLEAN__ ? '' : '-dirty')} @@ -61,7 +53,7 @@ export function TopBar({ children?: ReactNode; progress?: number; }) { - const isTauri = useIsTauri(); + const electron = useElectron(); const { isMobile } = useBreakpoint('mobile'); const { useRPCPacket, sendRPCPacket } = useWebsocketAPI(); const connectedIMUTrackers = useAtomValue(connectedIMUTrackersAtom); @@ -70,26 +62,27 @@ export function TopBar({ const [localIp, setLocalIp] = useState(null); const [showConnectedTrackersWarning, setConnectedTrackerWarning] = useState(false); - const [showVersionMobile, setShowVersionMobile] = useState(false); const [showTrayOrExitModal, setShowTrayOrExitModal] = useState(false); const doesMatchSettings = useMatch({ path: '/settings/*', }); const closeApp = async () => { + if (!electron.isElectron) throw 'no electron'; + await saveConfig(); - await invoke('update_window_state'); - await getCurrentWindow().destroy(); + electron.api.close(); }; const tryCloseApp = async (dontTray = false) => { - if (isTrayAvailable && config?.useTray === null) { + if (!electron.isElectron) throw 'no electron'; + + if (config?.useTray === null) { setShowTrayOrExitModal(true); return; } - if (isTrayAvailable && config?.useTray && !dontTray) { - await getCurrentWindow().hide(); - await invoke('update_tray_text'); + if (config?.useTray && !dontTray) { + electron.api.minimize(); } else if ( config?.connectedTrackersWarning && connectedIMUTrackers.filter( @@ -102,44 +95,37 @@ export function TopBar({ } }; - const showVersionBind = useDoubleTap(() => setShowVersionMobile(true)); - const unshowVersionBind = useDoubleTap(() => setShowVersionMobile(false)); - useEffect(() => { - if (!isTauri) return; + // useEffect(() => { + // if (!electron.isElectron) return; - const unlistenTrayClose = listen('try-close', async () => { - const window = getCurrentWindow(); - await window.show(); - await window.requestUserAttention(UserAttentionType.Critical); - await window.setFocus(); - if (isTrayAvailable) await invoke('update_tray_text'); - await tryCloseApp(true); - }); + // const unlistenTrayClose = listen('try-close', async () => { + // const window = getCurrentWindow(); + // await window.show(); + // await window.requestUserAttention(UserAttentionType.Critical); + // await window.setFocus(); + // if (isTrayAvailable) await invoke('update_tray_text'); + // await tryCloseApp(true); + // }); - const unlistenCloseRequested = getCurrentWindow().listen( - TauriEvent.WINDOW_CLOSE_REQUESTED, - async (data) => { - const ev = new CloseRequestedEvent(data); - ev.preventDefault(); - await tryCloseApp(); - } - ); + // const unlistenCloseRequested = getCurrentWindow().listen( + // TauriEvent.WINDOW_CLOSE_REQUESTED, + // async (data) => { + // const ev = new CloseRequestedEvent(data); + // ev.preventDefault(); + // await tryCloseApp(); + // } + // ); - return () => { - unlistenTrayClose.then((fn) => fn()); - unlistenCloseRequested.then((fn) => fn()); - }; - }, [ - config?.useTray, - config?.connectedTrackersWarning, - JSON.stringify(connectedIMUTrackers.map((t) => t.tracker.status)), - ]); - - useEffect(() => { - if (config === null || !isTauri) return; - getCurrentWindow().setDecorations(config?.decorations).catch(error); - }, [config?.decorations]); + // return () => { + // unlistenTrayClose.then((fn) => fn()); + // unlistenCloseRequested.then((fn) => fn()); + // }; + // }, [ + // config?.useTray, + // config?.connectedTrackersWarning, + // JSON.stringify(connectedIMUTrackers.map((t) => t.tracker.status)), + // ]); useEffect(() => { sendRPCPacket(RpcMessage.ServerInfosRequest, new ServerInfosRequestT()); @@ -156,54 +142,46 @@ export function TopBar({ <>
-
-
-
- {!config?.decorations && ( +
+
+
+ {!isMobile && ( )} - {(isTauri || !isMobile) && !config?.decorations && ( + {!isMobile && (
SlimeVR
)} - {(!(isMobile && !config?.decorations) || showVersionMobile) && ( - <> - - {doesMatchSettings && ( -
- {localIp || 'unknown local ip'} -
+ {(!doesMatchSettings || !isMobile) && } + {doesMatchSettings && ( +
+ > + {localIp || 'unknown local ip'} +
)} - {version && ( + {version && electron.isElectron && (
{ - const url = document.body.classList.contains('windows') - ? 'https://slimevr.dev/download' - : `https://github.com/${GH_REPO}/releases/latest`; - openUrl(url).catch(() => window.open(url, '_blank')); + const url = + electron.data().os.type === 'windows' + ? 'https://slimevr.dev/download' + : `https://github.com/${GH_REPO}/releases/latest`; + openUrl(url); }} > @@ -213,13 +191,13 @@ export function TopBar({
{!isMobile && ( <>
{progress !== undefined && ( @@ -227,29 +205,11 @@ export function TopBar({
)} - - {!isTauri && !showVersionMobile && !config?.decorations && ( -
-
- SlimeVR -
-
- )}
-
+
@@ -261,27 +221,22 @@ export function TopBar({ 'flex items-center justify-center stroke-window-icon', 'hover:bg-background-60 rounded-full w-7 h-7 cursor-pointer' )} - onClick={() => - openUrl(DOCS_SITE).catch(() => - window.open(DOCS_SITE, '_blank') - ) - } + onClick={() => openUrl(DOCS_SITE)} >
)} - - {isTauri && !config?.decorations && ( + {electron.isElectron && ( <>
getCurrentWindow().minimize()} + onClick={() => electron.api.minimize()} >
getCurrentWindow().toggleMaximize()} + onClick={() => electron.api.maximize()} >
@@ -301,35 +256,36 @@ export function TopBar({
)}
- { - await setConfig({ useTray }); - setShowTrayOrExitModal(false); + {electron.isElectron && ( + { + await setConfig({ useTray }); + setShowTrayOrExitModal(false); - // Doing this in here just in case config doesn't get updated in time - if (useTray) { - await getCurrentWindow().hide(); - await invoke('update_tray_text'); - } else if ( - config?.connectedTrackersWarning && - connectedIMUTrackers.filter( - (t) => t.tracker.status !== TrackerStatus.TIMED_OUT - ).length > 0 - ) { - setConnectedTrackerWarning(true); - } else { - await closeApp(); - } - }} - cancel={() => setShowTrayOrExitModal(false)} - /> + // Doing this in here just in case config doesn't get updated in time + if (useTray) { + electron.api.minimize(); + // await invoke('update_tray_text'); + } else if ( + config?.connectedTrackersWarning && + connectedIMUTrackers.filter( + (t) => t.tracker.status !== TrackerStatus.TIMED_OUT + ).length > 0 + ) { + setConnectedTrackerWarning(true); + } else { + await closeApp(); + } + }} + cancel={() => setShowTrayOrExitModal(false)} + /> + )} closeApp()} cancel={() => { setConnectedTrackerWarning(false); - getCurrentWindow().requestUserAttention(null); }} /> { - const url = document.body.classList.contains('windows') + const url = electron.isElectron && electron.data().os.type === 'windows' ? 'https://slimevr.dev/download' : `https://github.com/${GH_REPO}/releases/latest`; - await openUrl(url).catch(() => window.open(url, '_blank')); + await openUrl(url) closeModal(); }} > diff --git a/gui/src/components/commons/A.tsx b/gui/src/components/commons/A.tsx index 834f0abca..2cae4e8bc 100644 --- a/gui/src/components/commons/A.tsx +++ b/gui/src/components/commons/A.tsx @@ -1,4 +1,4 @@ -import { open } from '@tauri-apps/plugin-shell'; +import { openUrl } from '@/hooks/crossplatform'; import classNames from 'classnames'; import { ReactNode } from 'react'; @@ -12,14 +12,13 @@ export function A({ className?: string; }) { return ( -
- href && open(href).catch(() => window.open(href, '_blank')) + href && openUrl(href) } className={classNames(className, 'underline', 'cursor-pointer')} > {children} - + ); } diff --git a/gui/src/components/commons/TauriFileInput.tsx b/gui/src/components/commons/SystemFileInput.tsx similarity index 69% rename from gui/src/components/commons/TauriFileInput.tsx rename to gui/src/components/commons/SystemFileInput.tsx index b858b85c3..bcc03e7da 100644 --- a/gui/src/components/commons/TauriFileInput.tsx +++ b/gui/src/components/commons/SystemFileInput.tsx @@ -5,9 +5,9 @@ import { UseControllerProps, } from 'react-hook-form'; import { FileInputContentBlank, FileInputContentFile } from './FileInput'; -import { open } from '@tauri-apps/plugin-dialog'; +import { useElectron } from '@/hooks/electron'; -export function InnerTauriFileInput({ +export function InnerSytemFileInput({ label, value, onChange, @@ -20,8 +20,26 @@ export function InnerTauriFileInput({ directory: boolean; ref: RefCallBack; }) { + const electron = useElectron(); + + const handleClick = async () => { + if (!electron.isElectron) return; + + const open = await electron.api.openDialog({ + properties: ['openDirectory'], + }); + if (open.canceled) { + onChange(null); + return; + } + onChange(open.filePaths[0]); + }; + return ( -
onChange(await open({ directory }))}> +
{value !== null ? FileInputContentFile({ directory, @@ -33,7 +51,7 @@ export function InnerTauriFileInput({ ); } -export function TauriFileInput({ +export function SystemFileInput({ control, rules, name, @@ -56,7 +74,7 @@ export function TauriFileInput({ name={name} control={control} render={({ field: { onChange, value, ref } }) => ( - ); diff --git a/gui/src/components/firmware-tool/steps/FlashingMethodStep.tsx b/gui/src/components/firmware-tool/steps/FlashingMethodStep.tsx index 998b9508b..cdfacc641 100644 --- a/gui/src/components/firmware-tool/steps/FlashingMethodStep.tsx +++ b/gui/src/components/firmware-tool/steps/FlashingMethodStep.tsx @@ -132,7 +132,6 @@ function SerialDevicesList({ useEffect(() => { if (isActive) { const id = setInterval(() => { - console.log('request'); sendRPCPacket( RpcMessage.SerialDevicesRequest, new SerialDevicesRequestT() @@ -379,12 +378,6 @@ export function FlashingMethodStep({ const flashingMethod = watch('flashingMethod'); - console.log( - !isValid, - selectedDevices === null, - selectedDevices?.length === 0 - ); - return ( <>
diff --git a/gui/src/components/onboarding/pages/ConnectTracker.tsx b/gui/src/components/onboarding/pages/ConnectTracker.tsx index 95911e5a0..b68861912 100644 --- a/gui/src/components/onboarding/pages/ConnectTracker.tsx +++ b/gui/src/components/onboarding/pages/ConnectTracker.tsx @@ -25,7 +25,6 @@ import { useAtomValue } from 'jotai'; import { connectedIMUTrackersAtom } from '@/store/app-store'; import { BaseModal } from '@/components/commons/BaseModal'; import { A } from '@/components/commons/A'; -import { CONNECT_TRACKER } from '@/utils/tauri'; import { useTrackingChecklist } from '@/hooks/tracking-checklist'; const statusLabelMap = { @@ -224,7 +223,7 @@ export function ConnectTrackersPage() { />
- -
-
- - {l10n.getString('settings-utils-advanced-open_data-v1')} - -
- - {l10n.getString( - 'settings-utils-advanced-open_data-description-v1' - )} - + {electron.isElectron && ( + <> +
+
+ + {l10n.getString('settings-utils-advanced-open_data-v1')} + +
+ + {l10n.getString( + 'settings-utils-advanced-open_data-description-v1' + )} + +
+
+
+ +
-
-
- -
-
- -
-
- - {l10n.getString('settings-utils-advanced-open_logs')} - -
- - {l10n.getString( - 'settings-utils-advanced-open_logs-description' - )} - +
+
+ + {l10n.getString('settings-utils-advanced-open_logs')} + +
+ + {l10n.getString( + 'settings-utils-advanced-open_logs-description' + )} + +
+
+
+ +
-
-
- -
-
+ + )}
diff --git a/gui/src/components/settings/pages/InterfaceSettings.tsx b/gui/src/components/settings/pages/InterfaceSettings.tsx index 0f870746e..02634354f 100644 --- a/gui/src/components/settings/pages/InterfaceSettings.tsx +++ b/gui/src/components/settings/pages/InterfaceSettings.tsx @@ -17,17 +17,15 @@ import { BellIcon } from '@/components/commons/icon/BellIcon'; import { Range } from '@/components/commons/Range'; import { Dropdown } from '@/components/commons/Dropdown'; import { ArrowRightLeftIcon } from '@/components/commons/icon/ArrowIcons'; -import { isTrayAvailable } from '@/utils/tauri'; -import { isTauri } from '@tauri-apps/api/core'; -import { TauriFileInput } from '@/components/commons/TauriFileInput'; +import { SystemFileInput } from '@/components/commons/SystemFileInput'; import { DeveloperModeWidget } from '@/components/widgets/DeveloperModeWidget'; +import { useElectron } from '@/hooks/electron'; interface InterfaceSettingsForm { appearance: { theme: string; textSize: number; fonts: string; - decorations: boolean; }; behavior: { devmode: boolean; @@ -45,6 +43,7 @@ interface InterfaceSettingsForm { } export function InterfaceSettings() { + const electron = useElectron() const { currentLocales } = useLocaleConfig(); const { l10n } = useLocalization(); const { config, setConfig } = useConfig(); @@ -54,7 +53,6 @@ export function InterfaceSettings() { theme: config?.theme ?? defaultConfig.theme, textSize: config?.textSize ?? defaultConfig.textSize, fonts: config?.fonts.join(',') ?? defaultConfig.fonts.join(','), - decorations: config?.decorations ?? defaultConfig.decorations, }, notifications: { watchNewDevices: @@ -111,7 +109,6 @@ export function InterfaceSettings() { theme: values.appearance.theme, fonts: values.appearance.fonts.split(','), textSize: values.appearance.textSize, - decorations: values.appearance.decorations, useTray: values.behavior.useTray, discordPresence: values.behavior.discordPresence, @@ -243,7 +240,7 @@ export function InterfaceSettings() { {l10n.getString('settings-interface-behavior')}
- {isTrayAvailable && ( + {electron.isElectron && ( <> {l10n.getString('settings-general-interface-use_tray')} @@ -343,7 +340,7 @@ export function InterfaceSettings() { />
- {isTauri() && ( + {electron.isElectron && ( <> {l10n.getString( @@ -360,7 +357,7 @@ export function InterfaceSettings() {
- {l10n.getString('settings-interface-appearance')} -
- - {l10n.getString('settings-interface-appearance-decorations')} - -
-
- - {l10n.getString( - 'settings-interface-appearance-decorations-description' - )} - -
-
- -
diff --git a/gui/src/components/settings/pages/Serial.tsx b/gui/src/components/settings/pages/Serial.tsx index 7ff5f2ee0..8c9c1d385 100644 --- a/gui/src/components/settings/pages/Serial.tsx +++ b/gui/src/components/settings/pages/Serial.tsx @@ -22,11 +22,7 @@ import { Typography } from '@/components/commons/Typography'; import { Localized, useLocalization } from '@fluent/react'; import { BaseModal } from '@/components/commons/BaseModal'; import { WarningBox } from '@/components/commons/TipBox'; -import { useIsTauri } from '@/hooks/breakpoint'; import { fileSave } from 'browser-fs-access'; -import { save } from '@tauri-apps/plugin-dialog'; -import { writeTextFile } from '@tauri-apps/plugin-fs'; -import { error } from '@/utils/logging'; import { waitUntil } from '@/utils/a11y'; import { Input } from '@/components/commons/Input'; import { PauseIcon } from '@/components/commons/icon/PauseIcon'; @@ -213,7 +209,6 @@ export function Serial() { setValue('customCommand', ''); }; - const isTauri = useIsTauri(); const consoleContentRef = useRef(consoleContent); useLayoutEffect(() => { consoleContentRef.current = consoleContent; @@ -230,31 +225,13 @@ export function Serial() { ); } - if (isTauri) { - save({ - filters: [ - { - name: l10n.getString('settings-serial-file_type'), - extensions: ['txt'], - }, - ], - defaultPath: 'serial-logs.txt', - }) - .then((path) => - path ? writeTextFile(path, consoleContentRef.current) : undefined - ) - .catch((err) => { - error(err); - }); - } else { - const blob = new Blob([consoleContentRef.current], { - type: 'text/plain', - }); - fileSave(blob, { - fileName: 'serial-logs.txt', - extensions: ['.txt'], - }); - } + const blob = new Blob([consoleContentRef.current], { + type: 'text/plain', + }); + fileSave(blob, { + fileName: 'serial-logs.txt', + extensions: ['.txt'], + }); }; const pauseScroll = () => { diff --git a/gui/src/components/tracking-checklist/TrackingChecklist.tsx b/gui/src/components/tracking-checklist/TrackingChecklist.tsx index 20626fd3d..4e2f42e30 100644 --- a/gui/src/components/tracking-checklist/TrackingChecklist.tsx +++ b/gui/src/components/tracking-checklist/TrackingChecklist.tsx @@ -11,7 +11,6 @@ import { TrackingChecklistStepId, } from 'solarxr-protocol'; import { ReactNode, useEffect, useMemo, useState } from 'react'; -import { openUrl } from '@tauri-apps/plugin-opener'; import { CheckIcon } from '@/components/commons/icon/CheckIcon'; import { Typography } from '@/components/commons/Typography'; import { Button } from '@/components/commons/Button'; @@ -29,6 +28,7 @@ import { WrenchIcon } from '@/components/commons/icon/WrenchIcons'; import { TrackingChecklistModal } from './TrackingChecklistModal'; import { NavLink, useNavigate } from 'react-router-dom'; import { useBreakpoint } from '@/hooks/breakpoint'; +import { openUrl } from '@/hooks/crossplatform'; function Step({ step: { status, id, optional, firstRequired }, diff --git a/gui/src/hooks/app.ts b/gui/src/hooks/app.ts index a1f32f313..0623db19b 100644 --- a/gui/src/hooks/app.ts +++ b/gui/src/hooks/app.ts @@ -77,7 +77,6 @@ export function useProvideAppContext(): AppContext { useLayoutEffect(() => { if (!config) return; if (config.errorTracking !== undefined) { - console.log('change'); // Alows for sentry to refresh if user change the setting once the gui // is initialized getSentryOrCompute(config.errorTracking ?? false, config.uuid); diff --git a/gui/src/hooks/breakpoint.ts b/gui/src/hooks/breakpoint.ts index 0bd522ea2..c3224d682 100644 --- a/gui/src/hooks/breakpoint.ts +++ b/gui/src/hooks/breakpoint.ts @@ -22,6 +22,3 @@ export function useBreakpoint(breakpointKey: K) { } as Record; } -export function useIsTauri() { - return window.isTauri; -} diff --git a/gui/src/hooks/bvh.ts b/gui/src/hooks/bvh.ts index e9202d432..a8d4fe2c1 100644 --- a/gui/src/hooks/bvh.ts +++ b/gui/src/hooks/bvh.ts @@ -1,12 +1,12 @@ import { useLocalization } from '@fluent/react'; -import { isTauri } from '@tauri-apps/api/core'; import { useEffect, useState } from 'react'; import { RecordBVHRequestT, RecordBVHStatusT, RpcMessage } from 'solarxr-protocol'; import { useWebsocketAPI } from './websocket-api'; import { useConfig } from './config'; -import { save } from '@tauri-apps/plugin-dialog'; +import { useElectron } from './electron'; export function useBHV() { + const electron = useElectron() const { config } = useConfig(); const { useRPCPacket, sendRPCPacket } = useWebsocketAPI(); const [state, setState] = useState<'idle' | 'recording' | 'saving'>('idle'); @@ -19,12 +19,12 @@ export function useBHV() { const toggle = async () => { const record = new RecordBVHRequestT(state === 'recording'); - if (isTauri() && state === 'idle') { + if (electron.isElectron && state === 'idle') { if (config?.bvhDirectory) { record.path = config.bvhDirectory; } else { setState('saving'); - record.path = await save({ + const open = await electron.api.saveDialog({ title: l10n.getString('bvh-save_title'), filters: [ { @@ -33,7 +33,8 @@ export function useBHV() { }, ], defaultPath: 'bvh-recording.bvh', - }); + }) + record.path = open.filePath; setState('idle'); } } diff --git a/gui/src/hooks/cache.ts b/gui/src/hooks/cache.ts index 748e034b4..d755a2515 100644 --- a/gui/src/hooks/cache.ts +++ b/gui/src/hooks/cache.ts @@ -1,11 +1,4 @@ -import { isTauri } from '@tauri-apps/api/core'; -import { LazyStore } from '@tauri-apps/plugin-store'; - -interface CrossStorage { - set(key: string, value: unknown): Promise; - get(key: string): Promise; - delete(key: string): Promise; -} +import { CrossStorage } from 'electron/preload/interface'; const localStore: CrossStorage = { get: async (key: string) => @@ -16,10 +9,11 @@ const localStore: CrossStorage = { localStorage.removeItem(`slimevr-cache/${key}`); return true; }, + save: async () => true }; -const store: CrossStorage = isTauri() - ? new LazyStore('gui-cache.dat', { autoSave: 100, defaults: {} }) +const store: CrossStorage = window.electronAPI + ? await window.electronAPI.getStorage('cache') : localStore; export async function cacheGet(key: string): Promise { diff --git a/gui/src/hooks/config.ts b/gui/src/hooks/config.ts index 68b921d69..439a5dd94 100644 --- a/gui/src/hooks/config.ts +++ b/gui/src/hooks/config.ts @@ -5,11 +5,10 @@ import { } from '@/components/widgets/DeveloperModeWidget'; import { error } from '@/utils/logging'; import { useDebouncedEffect } from './timeout'; -import { load, Store } from '@tauri-apps/plugin-store'; -import { useIsTauri } from './breakpoint'; import { waitUntil } from '@/utils/a11y'; -import { isTauri } from '@tauri-apps/api/core'; import { v4 as uuidv4 } from 'uuid'; +import { useElectron } from './electron'; +import { CrossStorage } from 'electron/preload/interface'; export interface WindowConfig { width: number; @@ -44,7 +43,6 @@ export interface Config { assignMode: AssignMode | null; discordPresence: boolean; errorTracking: boolean | null; - decorations: boolean; vrcMutedWarnings: string[]; bvhDirectory: string | null; homeLayout: 'default' | 'table'; @@ -75,7 +73,6 @@ export const defaultConfig: Config = { assignMode: null, discordPresence: false, errorTracking: null, - decorations: false, vrcMutedWarnings: [], devSettings: defaultDevSettings, bvhDirectory: null, @@ -84,18 +81,19 @@ export const defaultConfig: Config = { lastUsedProportions: null, }; -interface CrossStorage { - set(key: string, value: unknown): Promise; - get(key: string): Promise; -} const localStore: CrossStorage = { get: async (key: string) => (localStorage.getItem(key) as T) ?? undefined, set: async (key, value) => localStorage.setItem(key, value as string), + save: async () => true, + delete: async (key: string) => { + localStorage.removeItem(key); + return true; + }, }; -const store: CrossStorage = isTauri() - ? await load('gui-settings.dat', { autoSave: 100, defaults: {} }) +const store: CrossStorage = window.electronAPI + ? await window.electronAPI.getStorage('settings') : localStore; function fallbackToDefaults(loadedConfig: any): Config { @@ -138,7 +136,7 @@ export function useConfigProvider(initialConfig: Config | null): ConfigContext { const [currConfig, set] = useState( initialConfig || (defaultConfig as Config) ); - const tauri = useIsTauri(); + const electron = useElectron() useDebouncedEffect( () => { @@ -159,7 +157,7 @@ export function useConfigProvider(initialConfig: Config | null): ConfigContext { } as Config) : null ); - if (tauri) { + if (electron.isElectron) { await waitUntil( async () => { const newConfig: Partial = JSON.parse( @@ -196,8 +194,8 @@ export function useConfigProvider(initialConfig: Config | null): ConfigContext { config: currConfig, setConfig, saveConfig: async () => { - if (!tauri) return; - await (store as Store).save(); + if (!electron.isElectron) return; + await store.save(); }, }; } diff --git a/gui/src/hooks/crossplatform.ts b/gui/src/hooks/crossplatform.ts new file mode 100644 index 000000000..15096803b --- /dev/null +++ b/gui/src/hooks/crossplatform.ts @@ -0,0 +1,8 @@ + +export async function openUrl(url: string) { + if (window.electronAPI) { + window.electronAPI.openUrl(url); + } else { + window.open(url, '_blank') + } +} diff --git a/gui/src/hooks/discord-presence.ts b/gui/src/hooks/discord-presence.ts index f728b73a5..d922ae05a 100644 --- a/gui/src/hooks/discord-presence.ts +++ b/gui/src/hooks/discord-presence.ts @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import { useConfig } from './config'; import { useInterval } from './timeout'; -import { invoke } from '@tauri-apps/api/core'; +// import { invoke } from '@tauri-apps/api/core'; import { warn } from '@/utils/logging'; import { useLocalization } from '@fluent/react'; import { connectedIMUTrackersAtom } from '@/store/app-store'; @@ -53,23 +53,24 @@ export function useDiscordPresence() { }, [config?.discordPresence]); } -export function checkDiscordClient(): Promise { - return invoke('discord_client_exists'); +export async function checkDiscordClient(): Promise { + // return invoke('discord_client_exists'); + return false; } -export function createDiscordClient(): Promise { - return invoke('create_discord_client'); +export async function createDiscordClient(): Promise { + // return invoke('create_discord_client'); } -export function clearDiscordPresence(): Promise { - return invoke('clear_presence'); +export async function clearDiscordPresence(): Promise { + // return invoke('clear_presence'); } -export function updateDiscordPresence(obj: { +export async function updateDiscordPresence(obj: { details: string; state?: string; small_icon?: [string, string]; button?: { label: string; url: string }; }): Promise { - return invoke('update_presence', obj); + // return invoke('update_presence', obj); } diff --git a/gui/src/hooks/electron.ts b/gui/src/hooks/electron.ts new file mode 100644 index 000000000..d1d62304f --- /dev/null +++ b/gui/src/hooks/electron.ts @@ -0,0 +1,46 @@ +import { IElectronAPI, OSStats } from 'electron/preload/interface'; +import { createContext, useContext, useLayoutEffect, useState } from 'react'; + +type CachedData = { + os: OSStats; +}; +type AvailableElectron = { + isElectron: true; + api: IElectronAPI; + + data: () => CachedData; +}; +type ElectronContext = AvailableElectron | { isElectron: false }; + +export const ElectronContextC = createContext(undefined as any); + +export function provideElectron(): ElectronContext { + const api = window.electronAPI; + if (!api) return { isElectron: false }; + const [cachedData, setCachedData] = useState(); + + useLayoutEffect(() => { + Promise.all([api.osStats()]).then(([os]) => { + setCachedData({ + os, + }); + }); + }, []); + + return { + isElectron: true, + api, + data: () => { + if (!cachedData) throw 'not loaded yet'; + return cachedData; + }, + }; +} + +export function useElectron() { + const context = useContext(ElectronContextC); + if (!context) { + throw new Error('useElectron must be within a ElectronContext Provider'); + } + return context; +} diff --git a/gui/src/hooks/firmware-update.ts b/gui/src/hooks/firmware-update.ts index 17288f3e0..e3995230b 100644 --- a/gui/src/hooks/firmware-update.ts +++ b/gui/src/hooks/firmware-update.ts @@ -1,5 +1,5 @@ import { BoardType, DeviceDataT } from 'solarxr-protocol'; -import { fetch as tauriFetch } from '@tauri-apps/plugin-http'; +// import { fetch as tauriFetch } from '@tauri-apps/plugin-http'; import { cacheWrap } from './cache'; import semver from 'semver'; import { normalizedHash } from './crypto'; diff --git a/gui/src/i18n/config.tsx b/gui/src/i18n/config.tsx index 4c9c5278b..0cfab662a 100644 --- a/gui/src/i18n/config.tsx +++ b/gui/src/i18n/config.tsx @@ -13,22 +13,12 @@ import { createContext, useContext, } from 'react'; -import { exists, readTextFile, BaseDirectory } from '@tauri-apps/plugin-fs'; import { error } from '@/utils/logging'; -import { invoke } from '@tauri-apps/api/core'; -import { isTrayAvailable } from '@/utils/tauri'; import { langs } from './names'; +import { useElectron } from '@/hooks/electron'; export const defaultNS = 'translation'; export const DEFAULT_LOCALE = 'en'; -const OVERRIDE_FILENAME = 'override.ftl'; - -// AppConfig path: https://docs.rs/tauri/1.2.4/tauri/api/path/fn.config_dir.html -// We doing this only once, don't want an override check to be done on runtime, -// only on launch :P -const overrideLangExists = exists(OVERRIDE_FILENAME, { - baseDir: BaseDirectory.AppConfig, -}).catch(() => false); // Fetch translation file async function fetchMessages(locale: string): Promise<[string, string]> { @@ -70,6 +60,7 @@ const TRAY_MENU_KEYS = ['tray_menu-show', 'tray_menu-hide', 'tray_menu-quit']; export const LangContext = createContext(undefined as never); export function AppLocalizationProvider(props: AppLocalizationProviderProps) { + const electron = useElectron(); const [currentLocales, setCurrentLocales] = useState([DEFAULT_LOCALE]); const [l10n, setL10n] = useState(null); @@ -81,13 +72,11 @@ export function AppLocalizationProvider(props: AppLocalizationProviderProps) { ); setCurrentLocales([currentLocale]); - const currentLocaleFile: [string, string] = (await overrideLangExists) - ? [ - currentLocale, - await readTextFile(OVERRIDE_FILENAME, { - baseDir: BaseDirectory.AppConfig, - }), - ] + const overrideFile = + electron.isElectron && (await electron.api.i18nOverride()); + + const currentLocaleFile: [string, string] = overrideFile + ? [currentLocale, overrideFile] : await fetchMessages(currentLocale); const fetchedMessages = [ @@ -113,16 +102,13 @@ export function AppLocalizationProvider(props: AppLocalizationProviderProps) { }, []); useEffect(() => { - if (l10n === null || !isTrayAvailable) return; + if (l10n === null || !electron.isElectron) return; const newI18n: Record = {}; TRAY_MENU_KEYS.forEach((key) => { newI18n[key] = l10n.getString(key); }); - const promise = invoke('update_translations', { newI18n }); - return () => { - promise.then(() => {}); - }; + electron.api.setTranslations(newI18n); }, [l10n]); if (l10n === null) { diff --git a/gui/src/index.scss b/gui/src/index.scss index 8a422d013..74775f9d9 100644 --- a/gui/src/index.scss +++ b/gui/src/index.scss @@ -421,3 +421,8 @@ button, div { hyphens: auto; } + + +[data-electron-drag-region="true"] { + -webkit-app-region: drag; +} diff --git a/gui/src/index.tsx b/gui/src/index.tsx index 666cb682e..ab0c00674 100644 --- a/gui/src/index.tsx +++ b/gui/src/index.tsx @@ -4,7 +4,6 @@ import React from 'react'; import * as ReactDOMClient from 'react-dom/client'; import Modal from 'react-modal'; import App from './App'; -import { AppLocalizationProvider } from './i18n/config'; import './index.scss'; Modal.setAppElement('#root'); @@ -15,9 +14,7 @@ if (container) { const root = ReactDOMClient.createRoot(container); root.render( - - ); } diff --git a/gui/src/utils/logging.ts b/gui/src/utils/logging.ts index e73297a5c..e41a17927 100644 --- a/gui/src/utils/logging.ts +++ b/gui/src/utils/logging.ts @@ -1,17 +1,14 @@ -import { isTauri } from '@tauri-apps/api/core'; -import { warn as tauriWarn, error as tauriError, info } from '@tauri-apps/plugin-log'; - export function log(...msgs: any[]) { console.log(...msgs); - if (isTauri()) info(msgs.join()); + if (window.electronAPI) window.electronAPI.log('info', ...msgs); } export function error(...msgs: any[]) { console.error(...msgs); - if (isTauri()) tauriError(msgs.join()); + if (window.electronAPI) window.electronAPI.log('error', ...msgs); } export function warn(...msgs: any[]) { console.warn(...msgs); - if (isTauri()) tauriWarn(msgs.join()); + if (window.electronAPI) window.electronAPI.log('warn', ...msgs); } diff --git a/gui/src/utils/tauri.ts b/gui/src/utils/tauri.ts deleted file mode 100644 index bf7595759..000000000 --- a/gui/src/utils/tauri.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { invoke, isTauri } from '@tauri-apps/api/core'; -import { type } from '@tauri-apps/plugin-os'; - -/** - * Fetches the resource as a blob if necessary because of https://github.com/tauri-apps/tauri/issues/3725 - * @param url static asset to fetch - * @returns URL - */ -export async function fetchResourceUrl(url: string) { - if (!isTauri() || type() !== 'linux') return url; - return URL.createObjectURL(await fetch(url).then((res) => res.blob())); -} - -// FIXME: For some fucking reason, you can't top-level await on a react component file -// on Chromium on developments builds specifically -Uriel -export const AUTOBONE_VIDEO = await fetchResourceUrl('/videos/autobone.webm'); -export const CONNECT_TRACKER = await fetchResourceUrl('/videos/turn-on-tracker.webm'); - -export const isTrayAvailable = - isTauri() && (await invoke('is_tray_available')); diff --git a/gui/src/vite-env.d.ts b/gui/src/vite-env.d.ts index 67b54758b..843b46429 100644 --- a/gui/src/vite-env.d.ts +++ b/gui/src/vite-env.d.ts @@ -6,7 +6,6 @@ declare const __VERSION_TAG__: string; declare const __GIT_CLEAN__: boolean; interface Window { - readonly isTauri: boolean; readonly __ANDROID__: | { isThere: () => boolean; diff --git a/gui/tsconfig.json b/gui/tsconfig.json index a89d9f33b..3c2bdef4c 100644 --- a/gui/tsconfig.json +++ b/gui/tsconfig.json @@ -20,6 +20,6 @@ "@/*": ["./src/*"] } }, - "include": ["src"], + "include": ["src", "electron/**/*"], "references": [{ "path": "./tsconfig.node.json" }] } From b90f52ad7b11c304890474740c1fda13f53e7309 Mon Sep 17 00:00:00 2001 From: loucass003 Date: Thu, 12 Feb 2026 20:37:50 +0100 Subject: [PATCH 002/103] WIP --- gui/.gitignore | 1 - gui/electron-builder.yml | 42 +++++++++++ gui/electron.vite.config.ts | 14 ++-- gui/electron/.gitignore | 2 +- gui/electron/main/index.ts | 53 +++++++++++--- .../java-version/JavaVersion.jar | Bin .../java-version/JavaVersion.java | 0 gui/package.json | 10 ++- gui/src-tauri/capabilities/migrated.json | 66 ------------------ gui/src-tauri/icons/128x128.png | Bin 2808 -> 0 bytes gui/src-tauri/icons/128x128@2x.png | Bin 5884 -> 0 bytes gui/src-tauri/icons/32x32.png | Bin 747 -> 0 bytes gui/src-tauri/icons/Square107x107Logo.png | Bin 2336 -> 0 bytes gui/src-tauri/icons/Square142x142Logo.png | Bin 3177 -> 0 bytes gui/src-tauri/icons/Square150x150Logo.png | Bin 3321 -> 0 bytes gui/src-tauri/icons/Square284x284Logo.png | Bin 6460 -> 0 bytes gui/src-tauri/icons/Square30x30Logo.png | Bin 698 -> 0 bytes gui/src-tauri/icons/Square310x310Logo.png | Bin 6951 -> 0 bytes gui/src-tauri/icons/Square44x44Logo.png | Bin 1008 -> 0 bytes gui/src-tauri/icons/Square71x71Logo.png | Bin 1534 -> 0 bytes gui/src-tauri/icons/Square89x89Logo.png | Bin 2027 -> 0 bytes gui/src-tauri/icons/StoreLogo.png | Bin 1163 -> 0 bytes .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 1190 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 3581 -> 0 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 1190 -> 0 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 1137 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 2448 -> 0 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 1137 -> 0 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 2112 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 4960 -> 0 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 2112 -> 0 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 3185 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 7081 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 3185 -> 0 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 4236 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 9824 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 4236 -> 0 bytes gui/src-tauri/icons/appleTrayIcon.png | Bin 922 -> 0 bytes gui/src-tauri/icons/icon.icns | Bin 69880 -> 0 bytes gui/src-tauri/icons/icon.ico | Bin 12393 -> 0 bytes gui/src-tauri/icons/icon.png | Bin 11880 -> 0 bytes gui/src-tauri/icons/icon.svg | 1 - gui/src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 555 -> 0 bytes .../icons/ios/AppIcon-20x20@2x-1.png | Bin 848 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 848 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 1310 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 645 -> 0 bytes .../icons/ios/AppIcon-29x29@2x-1.png | Bin 1287 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 1287 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 1921 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 848 -> 0 bytes .../icons/ios/AppIcon-40x40@2x-1.png | Bin 1742 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 1742 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 2527 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-512@2x.png | Bin 26091 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 2527 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 3857 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 1621 -> 0 bytes gui/src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 3047 -> 0 bytes .../icons/ios/AppIcon-83.5x83.5@2x.png | Bin 3510 -> 0 bytes .../safe-mode.dev.slimevr.SlimeVR.desktop | 13 ---- gui/src-tauri/src/JavaVersion.jar | Bin 888 -> 0 bytes gui/src-tauri/src/JavaVersion.java | 8 --- gui/vite.config.ts | 1 + 64 files changed, 103 insertions(+), 108 deletions(-) create mode 100644 gui/electron-builder.yml rename gui/electron/{main => ressources}/java-version/JavaVersion.jar (100%) rename gui/electron/{main => ressources}/java-version/JavaVersion.java (100%) delete mode 100644 gui/src-tauri/capabilities/migrated.json delete mode 100644 gui/src-tauri/icons/128x128.png delete mode 100644 gui/src-tauri/icons/128x128@2x.png delete mode 100644 gui/src-tauri/icons/32x32.png delete mode 100644 gui/src-tauri/icons/Square107x107Logo.png delete mode 100644 gui/src-tauri/icons/Square142x142Logo.png delete mode 100644 gui/src-tauri/icons/Square150x150Logo.png delete mode 100644 gui/src-tauri/icons/Square284x284Logo.png delete mode 100644 gui/src-tauri/icons/Square30x30Logo.png delete mode 100644 gui/src-tauri/icons/Square310x310Logo.png delete mode 100644 gui/src-tauri/icons/Square44x44Logo.png delete mode 100644 gui/src-tauri/icons/Square71x71Logo.png delete mode 100644 gui/src-tauri/icons/Square89x89Logo.png delete mode 100644 gui/src-tauri/icons/StoreLogo.png delete mode 100644 gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png delete mode 100644 gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png delete mode 100644 gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png delete mode 100644 gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 gui/src-tauri/icons/appleTrayIcon.png delete mode 100644 gui/src-tauri/icons/icon.icns delete mode 100644 gui/src-tauri/icons/icon.ico delete mode 100644 gui/src-tauri/icons/icon.png delete mode 100644 gui/src-tauri/icons/icon.svg delete mode 100644 gui/src-tauri/icons/ios/AppIcon-20x20@1x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-20x20@2x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-20x20@3x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-29x29@1x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-29x29@2x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-29x29@3x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-40x40@1x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-40x40@2x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-40x40@3x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-512@2x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-60x60@2x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-60x60@3x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-76x76@1x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-76x76@2x.png delete mode 100644 gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png delete mode 100644 gui/src-tauri/safe-mode.dev.slimevr.SlimeVR.desktop delete mode 100644 gui/src-tauri/src/JavaVersion.jar delete mode 100644 gui/src-tauri/src/JavaVersion.java diff --git a/gui/.gitignore b/gui/.gitignore index ae7a8d26f..77383db18 100644 --- a/gui/.gitignore +++ b/gui/.gitignore @@ -39,4 +39,3 @@ electron.vite.config.*.mjs # electron out/ -.bin/ diff --git a/gui/electron-builder.yml b/gui/electron-builder.yml new file mode 100644 index 000000000..ed8b5c2f6 --- /dev/null +++ b/gui/electron-builder.yml @@ -0,0 +1,42 @@ +appId: dev.slimevr.SlimeVR +productName: SlimeVR +# These help fill the missing metadata requirements +directories: + output: dist/artifacts + +# The 'files' key determines what goes INSIDE the app.asar +files: + - out/**/* # This captures the built JS/CSS/Assets from Vite + - index.html # Ensure your entry point is included + - package.json + +# Include the JAR next to the EXE +extraFiles: + - from: "../../server/desktop/build/libs/slimevr.jar" + to: "." + - from: "./69-slimevr-devices.rules" + to: "." + +linux: + category: Game + target: + - target: AppImage + # - target: deb + # - target: rpm + # - target: zip + +# Target-specific dependencies (Fixes the 'unknown property' error) +deb: + depends: + - openjdk-17-jre-headless + - udev +rpm: + depends: + - java-latest-openjdk + - udev + +# If you ever build for Windows/Mac later +win: + target: portable +mac: + target: zip diff --git a/gui/electron.vite.config.ts b/gui/electron.vite.config.ts index 5847dc8ba..7c7d2e2a4 100644 --- a/gui/electron.vite.config.ts +++ b/gui/electron.vite.config.ts @@ -6,7 +6,7 @@ export default defineConfig({ main: { build: { rollupOptions: { - input: resolve(__dirname, 'electron/main/index.ts') + input: resolve(__dirname, 'electron/main/index.ts'), } } }, @@ -21,13 +21,17 @@ export default defineConfig({ } } }, - renderer: { - // 1. Spread your existing React config (plugins, resolve, etc.) + renderer: { ...rendererConfig, - - // 2. Ensure the root and input are correct for the Electron build root: '.', build: { + commonjsOptions: { + // Force Rollup to treat the protocol directory as CommonJS + // even though it's not in node_modules + include: [/solarxr-protocol/, /node_modules/], + // Required for Flatbuffers/Generated code interop + transformMixedEsModules: true, + }, rollupOptions: { input: resolve(__dirname, 'index.html') } diff --git a/gui/electron/.gitignore b/gui/electron/.gitignore index 600e23e99..9fe637a9d 100644 --- a/gui/electron/.gitignore +++ b/gui/electron/.gitignore @@ -1 +1 @@ -main/java-version/JavaVersion.class +ressources/java-version/JavaVersion.class diff --git a/gui/electron/main/index.ts b/gui/electron/main/index.ts index 9116c91da..684c975ce 100644 --- a/gui/electron/main/index.ts +++ b/gui/electron/main/index.ts @@ -9,10 +9,11 @@ import { Tray, } from 'electron'; import { IPC_CHANNELS } from '../shared'; -import path, { join } from 'node:path'; +import path, { dirname, join } from 'node:path'; import open from 'open'; import trayIcon from '../ressources/icons/icon.png?asset'; import appleTrayIcon from '../ressources/icons/appleTrayIcon.png?asset'; +import javaVersionFile from '../ressources/java-version/JavaVersion.jar?asset'; import { readFile, stat } from 'fs/promises'; import { getPlatform, handleIpc } from './utils'; import { @@ -305,7 +306,7 @@ app.on('before-quit', () => { const checkEnvironmentVariables = () => { const to_check = ['_JAVA_OPTIONS', 'JAVA_TOOL_OPTIONS']; - const set = to_check.filter((env) => !process.env[env]); + const set = to_check.filter((env) => !!process.env[env]); if (set.length > 0) { dialog.showErrorBox( 'SlimeVR', @@ -316,23 +317,55 @@ const checkEnvironmentVariables = () => { } }; -const findServer = () => { - +const findServerJar = () => { const paths = [ options.path, - //TODO: appimage appdir, + // AppImage passes the fakeroot in `APPDIR` env var. + process.env['APPDIR'] + ? path.resolve(join(process.env['APPDIR'], 'usr/share/slimevr/')) + : undefined, path.resolve(__dirname), // For flatpack container - path.resolve("/app/share/slimevr/"), - path.resolve("/usr/share/slimevr/") - ] - return paths.map((p) => join(p, 'slimevr.jar')).find((p) => existsSync(p)); + path.resolve('/app/share/slimevr/'), + path.resolve('/usr/share/slimevr/'), + ]; + return paths + .filter((p) => !!p) + .map((p) => join(p, 'slimevr.jar')) + .find((p) => existsSync(p)); +}; + +const validJavaPaths = () => { } -const spawnServer = () => {}; +const findJavaBin = (sharedDir: string) => { + const javaBin = getPlatform() === 'windows' ? 'java.exe' : 'java'; + const jre = join(sharedDir, 'jre/bin', javaBin); + if (!existsSync(jre)) { + return validJavaPaths(); + } + + + +} + +const spawnServer = () => { + + const serverJar = findServerJar() + if (!serverJar) { + return false; + } + const sharedDir = dirname(serverJar); + const javaBin = findJavaBin(sharedDir); + + logger.info({ serverJar }, 'found server jar'); + +}; app.whenReady().then(() => { + console.log(javaVersionFile); + checkEnvironmentVariables(); spawnServer(); diff --git a/gui/electron/main/java-version/JavaVersion.jar b/gui/electron/ressources/java-version/JavaVersion.jar similarity index 100% rename from gui/electron/main/java-version/JavaVersion.jar rename to gui/electron/ressources/java-version/JavaVersion.jar diff --git a/gui/electron/main/java-version/JavaVersion.java b/gui/electron/ressources/java-version/JavaVersion.java similarity index 100% rename from gui/electron/main/java-version/JavaVersion.java rename to gui/electron/ressources/java-version/JavaVersion.java diff --git a/gui/package.json b/gui/package.json index 496f3ddce..e6eaf5aea 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,7 +1,8 @@ { "name": "slimevr", - "version": "0.5.1", - "private": true, + "version": "0.0.0", + "author": "SlimeVR Team ", + "homepage": "https://slimevr.dev", "type": "module", "dependencies": { "@fluent/bundle": "^0.18.0", @@ -56,8 +57,9 @@ "start": "vite --force", "dev": "electron-vite dev --config electron.vite.config.ts --watch", "build": "electron-vite build --config electron.vite.config.ts", + "package": "pnpm run build && electron-builder --linux", "preview": "electron-vite preview --config electron.vite.config.ts", - "skipbundler": "echo \"Prob should do something about that\"", + "skipbundler": "vite build", "lint": "tsc --noEmit && eslint --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && prettier --check \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"", "lint:fix": "tsc --noEmit && eslint --fix --max-warnings=0 \"src/**/*.{js,jsx,ts,tsx,json}\" && pnpm run format", "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,css,scss,md,json}\"", @@ -84,8 +86,10 @@ "@vitejs/plugin-react": "^4.3.2", "autoprefixer": "^10.4.20", "cross-env": "^7.0.3", + "dmg-license": "^1.0.11", "dotenv": "^16.4.5", "electron": "^40.3.0", + "electron-builder": "^26.7.0", "electron-vite": "^5.0.0", "eslint": "^9.39.1", "eslint-import-resolver-typescript": "^3.10.1", diff --git a/gui/src-tauri/capabilities/migrated.json b/gui/src-tauri/capabilities/migrated.json deleted file mode 100644 index 3d4eabb87..000000000 --- a/gui/src-tauri/capabilities/migrated.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "identifier": "migrated", - "description": "permissions that were migrated from v1", - "local": true, - "windows": [ - "main" - ], - "permissions": [ - "core:default", - "core:window:allow-close", - "core:window:allow-toggle-maximize", - "core:window:allow-minimize", - "core:window:allow-start-dragging", - "core:window:allow-hide", - "core:window:allow-show", - "core:window:allow-set-focus", - "core:window:allow-destroy", - "core:window:allow-request-user-attention", - "core:window:allow-set-decorations", - "store:default", - "os:allow-os-type", - "os:allow-hostname", - "os:allow-locale", - "dialog:allow-open", - "dialog:allow-save", - "shell:allow-open", - "store:allow-get", - "store:allow-set", - "store:allow-save", - "fs:allow-write-text-file", - "fs:allow-read-text-file", - "fs:allow-exists", - { - "identifier": "fs:scope", - "allow": [ - { - "path": "$APPDATA" - }, - { - "path": "$APPDATA/**" - } - ] - }, - { - "identifier": "opener:allow-open-url", - "allow": [ - { - "url": "steam:*" - }, - { - "url": "ms-settings:network" - } - ] - }, - { - "identifier": "http:default", - "allow": [ - { - "url": "https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download/*" - } - ] - }, - "opener:default", - "log:default" - ] -} diff --git a/gui/src-tauri/icons/128x128.png b/gui/src-tauri/icons/128x128.png deleted file mode 100644 index 8138d275f8c785de5ba06d12be411fac15e8d04c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2808 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 G$o~SGCpJ9* diff --git a/gui/src-tauri/icons/128x128@2x.png b/gui/src-tauri/icons/128x128@2x.png deleted file mode 100644 index 2c56f71b0854382375af261cc3cabe7106c02040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5884 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 diff --git a/gui/src-tauri/icons/Square107x107Logo.png b/gui/src-tauri/icons/Square107x107Logo.png deleted file mode 100644 index ac7f760794e587d9c4b5f3f36c10adf3f16466f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2336 zcmV+*3E%dKP)WJx^LGTv9%wzmjyHqj{tL0rb;LTM z=82{+c6yrH99h|qtvX9FAlUWE^*i>ta|^xU$w2SiqX+k+og3A&FzwZsAG$(uDR~m6 zL;kMe6VFAP799kN9l5gei#_>U_uLxq|4Glo90V$TfN5aWZGP(<)=e2`C#HbmCph81 zs63vf`~_K`x1g#qGfl*n#I98--QDyJS8Rtcs#K@+yWU^KmM-H%M#>d{B;Z@~$#k z{HB4t1=|`$SX8M<2Z57Q+}YhlreI%~3Y`?M(nD}6Cz&CAM6d`JiC_^d62T%7EP_QM zSR{f)ut)@J)v4u^T5f>IspJC&=Bn7Un_$fnc#HzH}|;+g>U?FRz||oQlkFeO&>r z>ze`b`K)dKc2*kOEhSoC?A9D}xpTR?*DAS>&hF)W)g=Ur6&04cSA6a8=?1Q*-bb)l z(DY>NX%2DC4i8(i|CuxYF>M`272kmSq=knI(XkJGgJNCveoG=<8SS$&iq&M}2 zhQ}meR*9xT3)KE;kCY9n*Q_v-sK3BMN$V!i3mD(^}9Uj!QR_(Uu#48EeKwS+;HZY6}^*l8w^|%16=}`PJ3{`mbH6$-xp;W~LtY{vE zRQLFSPF-L|VujIhscU^m5I%hA2hFwz3bl#cNW%l#G`?z=*VLG8jaist-u?V}(IAg& zK=og`$^9!#i}QGh+q%=U45pD-Vbu+UZ4Shj{@-tMTWdUAKJQvGcC9z=*qWW=kj`Ir zEZ3o%EvDSFqQwIBY9Dv-vDbgr+{s3>u~>q49Ql5)E-2-=kcOXlr&BYoc&F-sxGAZY z-u6n$VZ{q7mSF(w$k|s6El{I@l9vr;#uX1R6ma2%N@2=1^I0s1l_)5+VbmoXTnE=P z3rr6b;w8K~*0?&vvFpXwSlb|h0j+nHnOJXG3M(2Yq_XkM)iBKQ16`VPWne}Hqw0Y| zf)h{w1kTY*h7gZeTI}jwTW$qNIV_Y_)SzJa^C$Wex{jU~4*p?0*}xsHT>B&fY9(NZ zdrgOHR(Q{t<``dMJZ@Q<4I;bSBvt|B3`_kuyQjHIb!^6PMrirw<9v;+K}v6pf>H`onBLrPW_)Hl zkTCT%i__j`oHY+r& zO=9?kj^0E?9l16up4PQ^MV@7|#&lZIjIOoFvuu{SE3aUGJzR!-Mz1^8gM2t^RKp48g)+jKGqcVNi*dgE&4M zGB>L}RH7S|QhfFC%Ru9I&qACv;(5}|T${LkY=Si!(=z}Bff>*7n99Jsl8^<;fb~El z4g(tC!7HusNX!;VgC+NJW6*dGcyiEXG37O*d4OR~*#Uy23STsU_h9-<6yDXYVMAjv zyseKrZMA_hD%ip&LW38^f@h|Qh`z0FgJfvRCQwYbXooY?{6n=t8#JHBTc5%ctTYnA zB3LAXMX*Q&i$t&p7Kvby2o}L2v9GLfB+yG{U|*B7!tJcctPsq2OQeBDBY~bQVJhS& zQ?M^^a*ESnPsUp!4FpbEVW{NU#DzU;FIb^gkJI z6-EUtH4G6eGwMu^#t2nGS@Wh>1ybF ztL#;fL;2#w{X2iTa|<`|E>Bg4+bQJ|!%~Mo{M%>BV-EF6;mJUcC%@uFSN7w@nPwnX zButMCUcUA1zPU#a?ym?7C)^tE|B-;D4pi6h@ml5d7Znx(V-r+VSV~~7?EDgnVfG6t z`lY|WYE(~sO09|KLf&;%jkVsE_8doE{wlOnN`>VTvhd)z|3a*D*Tj3#T&Js`VnbbP zWl>!#L9+%D%1A@^y4#{ndxl{tq51fl7C>8@!*5J)lOOM$Vg?Wh>V3&}7nrNlLv z*ITfy5i!l3!+T5IKKuWONE%7rg~tXjwm5 diff --git a/gui/src-tauri/icons/Square142x142Logo.png b/gui/src-tauri/icons/Square142x142Logo.png deleted file mode 100644 index 28e0d6d27eebbf18e429f05e0bfedd27a808f8f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3177 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 P00000NkvXXu0mjf)x9Fu diff --git a/gui/src-tauri/icons/Square150x150Logo.png b/gui/src-tauri/icons/Square150x150Logo.png deleted file mode 100644 index c9202779ee9f9bb8670b02ec07b9bb955e3b7980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3321 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 D=BilK diff --git a/gui/src-tauri/icons/Square284x284Logo.png b/gui/src-tauri/icons/Square284x284Logo.png deleted file mode 100644 index 7c35ed105e70ddc03e80b232d9f143fd58c7bbbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6460 zcmcI}S6CBF({^amK|w%z6a+y5>7gT_kzPWVVo)ieg(d=q08&&WsPrbigiw{}so2S?QOt*gYLoT~`xGeV^ntKG=y*}32 z8(FK}`(>wI$PeY~@^-LoUY$Od%2tpFH|dJS*u9^Caqw@*%#6_F0azFiiANEpBanmAj_Oc^5^Po+nAxP=&+3N3ljQ z{z&EtY^_{QU=AKyK5228fzROU{g3Cs_sKNCaeW7+ynbZ{T!DXk&T5CE0u|}$xhU|* zy1c}0)Wee*U1_pbut}d+;I1OE9irm+dRK}cPQ{TS&cUrXN+!5-(zm(Yc=ROXh9eh6 z-(FYC$=SjISqgT{a^4XXu-lS;6wXy z4FIGbPIH2J6vh2cr#xhT+0k>+d+gM%qmY?}B-3W8yu5P9-F!$^hsq(YF~(zsP^{+= zcw2tB{Oy%JW6;52wLiXn!#zbs<-lJ&um6)Gd^mK{_sCYU@YVxH)hsF5;;SJ06KA1; zVV8yRu#?_K&ZWNS3eDUy_I2!vQ?h~TKKhf-yTjnsU(MoJdcoC!gv?n+*9(n5D5juJ$4)C^ zyB_6Kuav>OXaz06z3eaj(+wj{ZX>vXs*E*xDZrn{;{h9m7Ugy^S|^_dVFMN1cK`z$F29e8 zWnd9iV=RX1VedGfvkY`;{v@c#e_*XEFaI>`VNSDrBO@*U{dv&=OX}UC43^q}p0{xtu_t-`qNIYjo&W*k3)E zg{TCex;w^V&-ehtKrBXK_ykQliChugQNY&BaGp1d60b%Nxl;jDTsTr@#X019(8=CZ zmBTUUCPVuMNsc575Y!4V5#Uk>1scd+?weh974RcE8Gk zV*7f$1mHm?p<9nj!p`3^ymxkYl6pvcy)wy#+uXNLTG#rf-!@QH#5@iYc@I;FDDYZZ zV+Pv56lIfJ%jbtr8zZh>4J#`ENiA!VHf+oay>(6#wfM2W1o!9ik1TAlX9LE)I@f#1 z3%#$1heg^Z(QU3p{&he_>jf}Q`+$5hhZ-;rLZo%ik(c!P%fh(6aTkRh0?RVUNyG#wQ|2*j)D{Z`W_ zr7WA@Ln>}_`yJLA%wd)ot7m^HuykC9#3R4W;Dtd#2eiNLz- zWNJJ;#Q!ed1s8j#-S=z#oYd}PG`=}IXFDlj6uE8VN1$i;Or`}r=>O__gnHPx;a=As z;PI{*&0e4Ut-&7O?D7XVT2;yK-$llv$6Y~-ZEo*h9;X3H#Z#xu5=z=mrc#T%rF3}m z$j;jJ?^h@1HB)QmZh3m~d4F?$_#vjl2ESSE#2?lz8+guMidj)lKv=~EJID3PVT~-N zM!9Ob4TD(o?L}u-6g3OrY6jzuzEv>eqk_S%bKO1{$aul`0p7o!I=PF3egmPZVPFHz zEkyx1silYuT^Op{U#){d_wx%OmoG-Eptm;7U(Dl#*T@;ZF@s2kIb@dDC^BEIG)!OY z5=>g!M-KLNI`8fm$XxvVghPMpJ_14^ejb8|=6Fm<6P57~Ha0bI3<($&MSa(i~aY<6*H0##phL(7G<2ogf1X4k?RZ(yOa4vy&SvSB^T; zrxuD`T^SA$b&T=JrX_svhI6fB-oP^z(W-PGkM(<7*e1bUidSkY!=KQDSxrTl{2?3Y z0WN_D`!2=GL{5_?4Uga?RT-6K+aavUlXjfcmR>;%dY`+pSXjiZ{&^35H(kG=ugoOu zT{TnF7H}*p_D0_OFd}g5#EphU#y^)BAx4CCDb+Hw$U7_Ugr}5HUn(8VdiRC*oGgTL z+gq>QaPSW^k$l)=BWPiZ%x#J(gJvIi5ZM^Ts8ja6SeHwv*QXhWj2X0J03W({Hut^* zhk}{G<97tSn|pZh>*tuVjVz6o?09_F$S@7Fe4VLFFOyj=t1**6ti25U4;`mETh+E0 z_cCeUT(nRN-#HIW@CTKv8?9Cg#K_Q}>yG1!~u1wBEtU@H1MY5Be&Pwx#o|VytxOrqUKc3%vQO6#c)k5(L^cck?!~xFjoy!9UK|3NSF4O zXimY6Lb`5N5Um6h&2p9D-px(BX^3E~KHCu^_7XGBlOX!JO#5!t&bIDfqmN+|EfIucULAn0acj$~P?E2u#aQbYU- z2PYbQ)X{^VjEF}w1UUxQ!4~YJ*yB+TLt!#OA?T|dzpFTVZRAn9I|GZ%`iB2FZxpQc zjEY&_(wp4}Vm9X4-=xefYi5SZ7lnUkm3cO9l|ryF1n z)-0&H;Ck^hnG@>;SI$lPLnYBtE`5{v0{Y?$ElT>7!3GAb`plR+OY`$ch1qai1k@E0wix?JkTPzr10QaA4k z43@@HH1EB3wkjSmf%m{COMkm0JoYN_RNA<{egXLKZTYkGe{2k`XjArAjD8na}| zLz{>bT zQMI6ZwnEJYLXXCXSzexPGEbU1=8hRHci3_%uN?c?j_%NN6XA$9GupIt!VFSQ=_(+X z)*6|yzNl$8erIW9Dw??bJS*PGm^KacutF-zxDs^o@t&Pt;1Y-MnDzr370*<&RvgAkb%p zRx>I>l`JUeXvZpxP#2V}xg<4(u8hWPhCl`(5eg*4kDa7)(y( ze-i!JdCcV+q>xh$6?yK-sFO2%1!Ts9yz8r5?=mAms;sr+MOn=xOfRKcU0+!>d>~`_ z4{8LG3`(3u<4Bl*A~D3(780g=t5&H|DeSD2H;wvnYo2f(23_I*Ld#4|3Vw}5`bw*m zNcAwX9P@zIYTgpI|ANrxAEkQQG8rkKe|#Lkd9qxe>d#;dQvK}HA3+AhP;mk8S~bMj z8(iCTb5Y1#T<`x!usWAyO#ExUUvry1QU%;hW~)qOL70Xuj46fLi-P>pr~t{lwXUT5 zoEj|JyeW;BuLxtSi|v=27H%zExXaBX4V6IBj;#G%15l#VN^Z268()8UFYz7r#n6Cr zrs@kOSbfOVm)ayrwid9LUeDBd&4kALKgQzH7Z;OX=Oz}17w^LF85D|MW;~7qbCBlT z@?NYWSSJuvZyX<+TvhmRD`skwPx_3Xg)u{T z{v@DrhEIQ%2Uw$bG-UnF`ePGzJ3D>KPSuS3wslQ%fJRTHJl65Qhu*9c);- z^utW#q_fFI$#NwZDDhis@Ur=JVfvNtwlMuaVsuzGZ7~f_*;3le1FK}&zozrX4W9MA z#(W%d{X_wcK`vm`s(CzR%(+7RE8zza>A3jZM@^;cLTk6HEL-aa)kgU}gyGAqL<4If z%t$^zY(2@O)4xrqSkJx+&8$;qhDkQQm2?$!_;xhewIm8AC(8&nLE&kerTlIS+nb07 zf9IinQX%z4OWWr1rltA$phe-A!8;n{y~2NBpA(m(MOA+#Xo(=Gp9@+$oSRJ;zcAS5P-1*YJ zHpJ``>i`2`iz$VvJ3?y0i2~!eA5D=hhaQ8p2V}PX(_QOxT{x1#N4@JEOJ%o6DII~3 zt5|nDQ~0?oGLR^#cRUr#2M0uu(*sSUEdQbj$^3K~*Cdbh(e&%R{je0xRMKVyI*9xM zUSInkAkF_N5B`6twyuL%4;Bvv+^nAX)n=CR*=v!Hiw5A4A_w8h)};6^9oLm~hHfNO9-2Vjn{?onkM;x%tFvc4LSMcc^0d9Yysq~BYgG78b@rdr zEAjMPgKJbY6jA%0AiRL%eWQo;^*+pg$a-0k#mY>;AitHxk&nd-}>Zf3pVg@rj7VK*JC+eikW&Y5asb!!F0fR!T*(X-eDgjbM@(f9*0*jBX=8wjp}UF{ob}ObB&&|mtZwgq?VE8k4dR1u{8ddaZ|DVcAZq82KqlvaKA1)Xzz4f4H`P;e8{(9Z^;6!t z)$VLtD_!h3ySmx#kT_BujXZFKP2`Gcjgo<--ZvqJn(A4U$r)cphdh%7_ZM4b@dOt> zRVVELz5^(5a7#T?C+jfS{p0^I^F4cDgb zOd?cCG)BnC^I^|OAiEb1EW9s$OsTs$xmrE-Ms!40cbwe K(UG^_}k=VfzAmbTeQ(?6tyCvV^1^ZeiEeM#J)5)(*F zvox2Zsc_8WqQ<}?iE{1xkDni(3eC#v-IxP^yl!eN!{$HJzDNuPC`_Qt7cXu9Y5#KC z1w|nPS$OX{eeB{qqu2{Ji5fY2qSe{jaHUVqyzyGNo@V6t(owhHLr1}8q2+EEl7KC~K)z~7<_S90fI#Ong#TjStXXJ+Dk zZQE5M!)V~|3M(*qW1LujAaHgzPOkj3OiwsIySH>zu{Z_O_mdj9-0DCq88r{a?9(^T zz~fsVpuWBZcbBd~grN7;(m@Gkr4QSwKGZPP*1IJQPxW33iVQv{}f(WHYU*OZ* zHMsrc^1iWCd5%DFOk3(eaekS=(J7SJkVvEH<(Qp#@z1Y_#7(Jd#@+Ta6Auw*u&KB#yU+5TU2UZ>0kP2{MVMY=D`a#|+XC*U;k^im za(&fqC^DTwbERZAcuo1LaN?(homC@?SBfP^W|=Rf?0_Q!S$OYIKVSn~Zv1%q4($t{ gwHk=_@~UP12etqW5!?V(xBvhE07*qoM6N<$g4D7}_y7O^ diff --git a/gui/src-tauri/icons/Square310x310Logo.png b/gui/src-tauri/icons/Square310x310Logo.png deleted file mode 100644 index d8f504bb1b3b1460d8bbe61717179cb6c8c05248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6951 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 diff --git a/gui/src-tauri/icons/Square89x89Logo.png b/gui/src-tauri/icons/Square89x89Logo.png deleted file mode 100644 index 505fadf3ff3686d0ac8d9287a4aec72e7f0f33c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2027 zcmV(ttQf;%*;?(oK<94^VckBJz)!y?>mUXvx zJ?DPz@BIFpbGKtBD&=x`{Ql~Z=+>sAdMWv)TF z;6jEc4z8C2T_b0~TRQgNtfxWEa-?)BM}y<>%kQm{g0@Kk_Xc>E4=$+`hc$P0Ld;LG8<*<+<9C6SHd09HGv@T#tPv3wEZ8PNwzq zmdsF?C#1x7ud8hxLt&okYa5#FEUPeAbiRG1onbInNGcfQGKfKDkQrnq2AM%-keQ5? z&B_<=bk&!o9ZOqs&z26-`&uWNPG?DMEJ>ml;w1J{l5mr02H7aNy{?BA?I5ABpZ@~z zvtNvn^Czwt){dp!g}bG(=oo;%w5OZwKHO`VJFzrmZZfmrd%?~YGVnpzkalXeuRZeb z{|%1u7VRRTb$;rj+w(3&(7EH6$;pEeU7v4hOP;srG!Jv%tKZVVH(Br=f@7f5%OD%2 z>2!`9*fCrL8W~8%L)L2vdgTkaRRyu3y%)$#CYS#i{#nm8m<}0f(VoM7G>9zCDi;7F zQ`kMIJX;Xlhf&sSGy4JsxZQn0^8Pn3lVZtz?x<{-YHhwS`xgW}(nLWVVK?Yn7^ z1q;Fj=8w?}Rbx?l)YTgxuT!Yv_UFW5%xRkO3He7M&J^QuN1DKNp>g4sywK z-oF9#GcP{LAG<9Y(rVh?w!eow{rnU8V*rclO=@v+pz*p?+ugnMHxHjF_0^@M+b7Eb zhV@EQAhGa1tXwSkQ3NctLfhhi1i%NW4@Pz%CmbJqXQZImSgdU+{MNQdRrgUhWI4c6 zfD3_^UMz;DT49oX{`KUdfb-T!iw(FEDQLG$`_j)6Uu)Ui1%{wtNlF0=x)V>4tC0jh z)Gv)(*EHL8mHKns99Z1o+ar8`ln60EXuGbymhbmMzE*GW)4ehx1U4l4Y5S;j9yby3p!CE;36=Jg)w_)ca?3LjmN1(=v`#RNDkGboyST`J)w3O91TKb`qefV>wY0XGBR%^m@&AY)ad zZH<@z4zOlhq&cI^!Go6?!vwW-Sp7JiD^BRlCUimGbEHpowX>Koq{Z_Bh~i4qrB;~- zRsw6Zk0Jql-}d?El>z=&YUPP?rf_If$zmerX%n%j0%-W%Ik4vYMLwW<8}smB7^u<^ zACwr0_<7~BTQY!2A!BYeF~RZh02b$znlv|CxQW7zl+Kp%afFV7ARk9u{A;zV=4vfl z6=W=tqf_WOfT~?ktOUUT&~I_yVfg_XYlLUsq>s-^HT>n6sy5m4$ubh2R|asw-S8uX z#t*FCNT0`GkSjo}tY(lIWF`igL1vJd7-R;SsaUp5j=RM$m?!YHrL$bz@+3?Y_}X)` zGbx6`Jb|xmGCeVBc@icno{FBf#Z%*_84B|>nU0Oxuvrv0b9fiK&Z2ER{1>;0dmI$k4^a$z7JFVz9(K^E>9G?%(;vvwy#?TQM$j zESmi8lOo7aG7}s1HMMVa)-79MRX}=$V0Zq;S1-^0^WeU4tl;nXu>01?Z-f0bf&SC7 zlynH(h9?e$rMsBb7N0nsx_h^6u)L8FcS;d?*327R#2+ez>N`=j$+WFmnTUS>RCryHDK%pVz z!KI`avY?0iR`+8k7;IGHa=87~Y~`?4Ojlwy4U;{Xi%`37^?%a3m+2uEA@u+N002ov JPDHLkV1ffv<3Rub diff --git a/gui/src-tauri/icons/StoreLogo.png b/gui/src-tauri/icons/StoreLogo.png deleted file mode 100644 index de74c7a55b7e0853b302484e5b91dfec6d23cb12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 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 Ef>UZV!2kdN diff --git a/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 02819a9234867387447440092904d464fdeb6b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3581 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 diff --git a/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 3977b79719906ea1f55179c59e8bc7861ad0ebbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1190 zcmV;X1X=ruP)LUlasENkveE6vX&oq#{1#ikg~|sPsxS*ThDvp6@T*n7?frqrF%AgUdZVz2|p+ zpL2fa_dD%5Mpj46MvKjD>-*7T^Zz7RTz;!b@USJ4Y(Yv$x#VObGkJO{bN$Thi(IDq z8(nop@5&AT1RSAJlfhzRDwD!oE)z?QkKTB2aesNep?vheb8i~+cW?aPpzruZZ2)8} zx69SFdZX2B_oQWUV(#VhXB7|t@Cv~pH5y+naB)jVS2uUDGbIS_LjPh0v;a^JA{QP_ zVZG?#Mtluy(-MFpLDw()V80O&NR5lQ8G+rfpCGgdpa?;HW^wju83OhjmokyHLtwvA z%K(ZjLo7pls1PFuLu^`1U%)}nhTnSGWF*0k?TD~kwyVbq0$H=|x4(o#b z=vx7B`Ru%GX2ZJ%STN*WGyvM5Ep$LvBaqACcoDe2jSva|Lg3C#r)Z>xwyj?j2);!d zw1p1ng3c`*s>ZD*67=rtceA!E?BBQcv#-~EPMsdz9$` zE7dC?t9n-wh>rj71QDj5Aojx`=otI&d_^)7ucg@Ppo z;?s>z_ihQ-{9dVtA&4rCBsw0aS;V*1*%%2;sn_W$|BIBDXG@W+k?1ymbLdqwAWCQN zQqWIzADBIa*^4J`u#6ldtY;!~4$A>O!? zy*&_!5Gy)O%t?D5Gc81CS=7Kby4D?LE25E<%2NDSM2w{t%r7mw6Ab=pO%J^Vo{Z`l z*o*+SqHWE7u2_+b&kziN@doT$Lk#a8;EBgtQ;%$`_-QgO75@gvzNu>jQXc1_S8#Mv z*}KM3a+h+K!3-jC;;r<%Xb329dJD9dPtr3(M1o6lFjHynOc>=Wf?X zno4%>Td>x=+y%XGXPzIVl*|*|<%R>ON{F^C>}7~$h>sLPFBhaKEd#)Qy_B1t)G`F@ z*W;vK%Mh@iAPRH&$65q{-LT()Q~9}9&!6F>UTYAS?j0X~Am6z{hw%@e-o0Wq+gIU$ zTPpyf6g?J8g-1~?U5iM|V#LzX)uROv07UK{9a4TSLBOrxU$|=Eu=>7N<0TcW0l1Jd z1B&SCeT=IHIOHzgcXIkWO@e!=3`ZV77{vhNsdwM$HGk^`wRLStiU0rr07*qoM6N<$ Ef>UZV!2kdN diff --git a/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 30bd847b19916e7b3b1e783dba06e4186b29cc02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1137 zcmV-%1djWOP)tBmMx`52i>>isJZM!=lnRO{iU)I1s|OXut3RLzLB(6~=TNVL zs5Br}g!W=DrbHB>DJ?Axjg>C6O-XHP)p^@aOyefoq=oKkAA}^kGqdk~-`j5{nYEG% z>{dsaBnD1-%c>8Fj*4oV#Zg8JfYfAiNKVEgJwuU~QMv8u_>bgJb{kXn0l&NMdR6(J zOAAFhpO{Yr?;eEvLpN0gAnJS9pL^jFq*^@@&qh2EZE5amILxzQ;U^AMUU;o{@_=9$ zz2(c+ZG)xK0{rfSHza2usCV+2BA9th$c7o#sVd)n(J16Oz!}^v8&>V8N3}7U0E>Ca z(y@t=0jm+obAY>*)%ndv6;Nsy*I4yd?+bxo6TMcWlIK_yuqfbP5pd;U9j#m~P&C|6 zp(pJm_a}@cprTSFhhQhC+eg*4UV3)FjoLy{&3+cFgY+Qa!`p6(w#R9?vxHWASCHg) z(U-OujmTqp`AM~ka;(e$?d9U2!njZ`C3*(~q z>zkNYo0QKu220HbyN_>5lShAygE0`4>_9}rapm3V7L-iP$wHY?yH_7lDg$00-geQ( zfQL41_o!MS`@Y#9tWgNxI{BR0Z&a}g9|N|`wxn;Xi;XK#_vddpt*V&;+(emC%bZ}6 ziBvj@HM`c5$fBhNhhQU*&za61`elyMaJ4yY$;>hOI^=W~azS$ zfk@?=J$W1cIUDGQ;8ZZHWR3w*JcvaL0Gb|!^PUH(WJ1<#lMe_^c7QtAvZC&^KW{%n zEatFAGPHm>-2)2=R4OeLEdaH-q|`3atFD`J9MIB-wtg}5{yZ}xFvm;)J5(Y)oV$s4Qr3Tb@kVpNW%CMjW4L@qsxTwK& zX6wUWxjYWy^FegB5U1BY5?jD=+k$)}TV7)#El7Y-u=uaUqJaNhfH^feHf&V#;BJ6Jx*CE%wLO!yjL=9q@qOMSy&BSHq#npA+9_2*3e&3OnFVho=VnuzDg6&quz#xr4}a z@_Jk>T!$?}CFjZ!)NxJ{$l<2JtmA8s2OaYz|A00000NkvXXu0mjf DR__pL diff --git a/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index ea3fa0e0cffa736d34e8b571eec947c70d0f8a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2448 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 DR__pL diff --git a/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 61b2afdbf1712c4d86964ed980c9731165cea641..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2112 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 XP~6oZ&RAA+00000NkvXXu0mjfkqQoI diff --git a/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index fb1cf7f6a432587c2ed39a1c96ffff9cced5efff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7081 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 XP~6oZ&RAA+00000NkvXXu0mjfkqQoI diff --git a/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 1ac9089da503f03013daed7ea48f4ed2749a22e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4236 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 bU5csnY6#yxyXpCt0Wj3Nje4Q;Puzb25RBIV diff --git a/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 09e6959fc4e098b41d68be24b4e43d3eca5477dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9824 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 diff --git a/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 1ac9089da503f03013daed7ea48f4ed2749a22e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4236 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 bU5csnY6#yxyXpCt0Wj3Nje4Q;Puzb25RBIV diff --git a/gui/src-tauri/icons/appleTrayIcon.png b/gui/src-tauri/icons/appleTrayIcon.png deleted file mode 100644 index a453a26fcdf395d856256c88196566ee08428edc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 922 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9EAKS7xB-GL52prB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=GWbo-U3d6?5LsIoWr}K!EjQ z#=rm5ZPiuSRF8P)KMb8Kpt9_4ti`bzTkid4F8O(qkDsxhc=drhVHR!hgf%bxxC+-s^7nE z&vlPGqWbI$nR-P2zxbF{E!HCjrYE*=8U+9GKYw=H?!!4B?QP9(zYDbv`^zVou=I!W z`rd8(4`qFHkCV=|XDVkb>#{HINp&jkwy*MG<&0t7@FwAk%IQ@<79UUZexTM+s#Jb% zW6u7hGuBIVS>CEVeG{|VWxnqlo1|}6`6A|wW$I;{-$tuvebZif^!J&hqLbY>ME^*w zC^d@C-up@5_c<>;JJG7`?-OqydLOpJtAb0wjD5imQ_uVS3_BGXEI1VSnC>u~|0&GW z(ai8j;lSCOvAizO*neJD&T;aV!^gGWH&a=1q_xqkyj*Y4et=o?lKffZGs@C{n{tEu<(-`)C7Zc2A&3>wV-{jL& z3C2~TKe{^pzi}1RI&hb3@1aQfy+>}GUD?gR)jIE~hPtR5_dBt;mNmOOlpO+f{)O6p rvEx|4YtP;dav#LOV5d@@c~1V)>Rg)_|8jeQ`HI2Q)z4*}Q$iB}-05cT diff --git a/gui/src-tauri/icons/icon.icns b/gui/src-tauri/icons/icon.icns deleted file mode 100644 index 753e44c34c59c3a4e643f7b395947732ee9883c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69880 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 diff --git a/gui/src-tauri/icons/icon.ico b/gui/src-tauri/icons/icon.ico deleted file mode 100644 index 9e88b20ddcdf6e0b4559aa9af94ebf59277e2b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12393 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 L;Lkt*-S>Y1Q#g>C diff --git a/gui/src-tauri/icons/icon.png b/gui/src-tauri/icons/icon.png deleted file mode 100644 index 6a09da726239dfce6d0a8315995bf3743a93c829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11880 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 F{|gt0!?6GW diff --git a/gui/src-tauri/icons/icon.svg b/gui/src-tauri/icons/icon.svg deleted file mode 100644 index 1917a06da..000000000 --- a/gui/src-tauri/icons/icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png b/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png deleted file mode 100644 index 383c2535279fe015c192839889d55725b1156e3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 555 zcmV+`0@VG9P)jUGlQhxT3Yr#Lqy$O}c4%#(9a>5Y#j&M@7Keh}TH2+H;Ns%q;NUK} zIJx;}6T!hv92~^I;2F_e^e(x4$>sds3&u!P^tcBO?mnLPchCFYcc1*Td(1I-1_nPs ztf?KrfP$NdYI8*$N<$QC@HS-K(!@g;chm>)B7)Gx?VJl|yp(rtn(87EBgb_|PN?@K z_#`D5m1OuRYMps4jb7x&w-!b^g^_Aur+&LshIv##wC0OfflOxT?204N5kVxbxZ6UFh7b(NqPPM( z+%sVFGSWLo&^C2!tfY}Q3c}l54}9_QA(E*CEQ2GxmBpcUEX+l4s|4FFBOqQ#ZMU?C z5fY<$`}HyIrCOnFWH39vTt7pvir-anuxr#O^r~8zJ34OX9rz@ZXB?*IHTVbA!RW~G tBPB72#VV(*C8dpZha!7vlWK`UtP^-F!yVVrFgO4J002ovPDHLkV1how2JQd= diff --git a/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png deleted file mode 100644 index 28f720c69aafc009e9d98d235737f8bd69b06116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 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 diff --git a/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png deleted file mode 100644 index 26a9a81efb1b1b852374c3e798c5226ef3bb8b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmV+i1^D`jP)kCphsk&1ly`oWNr%b{A2o1avYk01=-pjh1TE+}N`zBg3uh;F7qFmb8AIA~%wyizD6Y8{ z(kwuNr7kEA#6m-^hZF)!VJmA`K<_=gB^6}NvyrrddIRws4fYR62Pvcok8bE|6!N_$ zEhq{Urb&-S=`*CI+*Nsd%kaJtdRvhl)W;eguk4Tz>*|z40g4XlP=G=`&>pBu<#EFx zgJIv{@aXi<<1{=rNcrq0UA=IJ&i#9hN_tgZk0#Smnw-hdkEcGTWJ-Oed-P=zlfSqD zwp^@o;9%I#|K1%<(xo#w+OF<2b-iNu&ZrwTH8)BheeoXuo?R`_!t9bfp=;Lv3o9&7 zZ}aczOoCFG`11!vDE)NmGa8-f-0K%L5q7-i-@l&cp$rM{I;rIx1?1fE30@$E#|Qbo z+?Bg+L88EX|L3O^O+@%TwYxg4=d=UoAunTt1N?k^q6$0Zs;6B@VOdne>0@JULC&3+ z;Dtuq^Gi0ZG^(!4OWE4@_s0gGPv}k`8?Qmmf3-+|u~34JOr~3cMV<-BJoDfWpZr5B zOF4cF`|H8xR`;R@x!Up21;~d-hiZ@*7{Uu-hH!%cFtF>F@=cX~n0KO;FD!W&dMm~OruCJ`qmR7c0n;wai8V?g023!sgIr%Q2*j5DZ}_*L6nwb@K8I|6KZGl@@>QA=%OK4W1-r1s!qpJ(kqt!6;n*TsjAcRwgLhGH6G&IP%|x9v%=gcnt9Q6 zb;1y~pqPa5t_F#YuEc4s>V%@qc=$6L4^aSE%(po#?U%MT*ioCKb}gstTfk=3YXN(pJkCphsk&1ly`oWNr%b{A2o1avYk01=-pjh1TE+}N`zBg3uh;F7qFmb8AIA~%wyizD6Y8{ z(kwuNr7kEA#6m-^hZF)!VJmA`K<_=gB^6}NvyrrddIRws4fYR62Pvcok8bE|6!N_$ zEhq{Urb&-S=`*CI+*Nsd%kaJtdRvhl)W;eguk4Tz>*|z40g4XlP=G=`&>pBu<#EFx zgJIv{@aXi<<1{=rNcrq0UA=IJ&i#9hN_tgZk0#Smnw-hdkEcGTWJ-Oed-P=zlfSqD zwp^@o;9%I#|K1%<(xo#w+OF<2b-iNu&ZrwTH8)BheeoXuo?R`_!t9bfp=;Lv3o9&7 zZ}aczOoCFG`11!vDE)NmGa8-f-0K%L5q7-i-@l&cp$rM{I;rIx1?1fE30@$E#|Qbo z+?Bg+L88EX|L3O^O+@%TwYxg4=d=UoAunTt1N?k^q6$0Zs;6B@VOdne>0@JULC&3+ z;Dtuq^Gi0ZG^(!4OWE4@_s0gGPv}k`8?Qmmf3-+|u~34JOr~3cMV<-BJoDfWpZr5B zOF4cF`|H8xR`;R@x!Up21;~d-hiZ@*7{Uu-hH!%cFtF>F@=cX~n0KO;FD!W&dMm~OruCJ`qmR7c0n;wai8V?g023!sgIr%Q2*j5DZ}_*L6nwb@K8I|6KZGl@@>QA=%OK4W1-r1s!qpJ(kqt!6;n*TsjAcRwgLhGH6G&IP%|x9v%=gcnt9Q6 zb;1y~pqPa5t_F#YuEc4s>V%@qc=$6L4^aSE%(po#?U%MT*ioCKb}gstTfk=3YXN(pJTGgLcNH@s-e8>15}izm-Nz#NL>}+ZcE(Sv75x~f1I^uH@o)EJ|Z{%{!(7{u4m@A z-+c4Ux04;^$gWSDOhUI8=UMgM0*emB_}}SxmTg2emaD8%FZ18)%QY4sOtA+a7?S!7 z#Zf^^HCC!!XQ~Dg1;`e1KPoa1*9<3ac!ovlnW7HYCg zGS3U_XC)#JX&iE#2e^QbE6YXqhX9qd)~dk;j2bJ89J*u6ov-}v%E$DZz$Y>gWuV`qC4R>~7x@qT_ zNzMcxT&iAg8sNg5GpT&2-{JTnbyGH^TQ7%Oso!Wak}raLDA$UdCy#T}@vUUFJ}Mb~ znDY!Hrlmp5Ut#P*Za_ki zKyU*T!6mo^mqc(0F2N-cTuY6g9Aky4IaZ#lu)-zn=WK=G`lb9xhJWcQX>h;(c#>T{ zf6cct!W)2-w9=X6n%7kAwKqQ6&%ffy2*Gs?cQ|4D-j2Q7*!U-7z5pH=$sBn1{zT+n zwL1;=>tvB#x$rkzYAkcB9gGaL-`}jpS!zp+zfW)_bx#9Yp1Z^5uia*sFI;0ke)}8S zoQ|_>F5NyRn^*Zo`0JN{U6<3BZo#Z-rNK_Ucb=X5>Sx32V~2Noau4eQ*RKI0=(5k8 zm}JF5SvWV!_8r>ZyKrB9dyj7egsjlbKm6_x8y(9zKIco#f z{nvT}22e~CV0{P2M-Be8lVG`pOS1;+%?a^vPryBJWQ2olTagC%*y)!XH_|KE*WTI7 z!RUYh+G*JrCklqYckJ2LJ8;psvBM*4UPs6y(?~C1&5{8;dA7i(#k!u`^H^`dH8&33 z36qNGuzn)G5J-%9M?~gLqzUWLUaBzQ(y$U{4&KXeUT8`+)|d3fr~+Nw!d~ zu^C}>_6k;XLn!H@N!7JbJ7!sOU z9VnjP`#7Hsp^>OO8txUa6g<9@n-Q5DZj2Z0l z*C*Ow#jb|e@xCscCle}(LiF+0=@%`*n#%?l(M5ENV32|o{qEMM<=vQPxbR=dB$>e$ zZLE=ZR|~)hmt?^L4j_pDt-!hlEWm}|l?^35!39`7mUIGE1pL0{GQ{Jo(tw==fHPNb zt^rr=;79f2&VD{+0DN$Kw{<Eo_zCr zTmNS#BwY~R!Ka=w&8#{J?g{6i-l*>v$Ie-n{lxZ13=;_1LCw>h2tDDUH?$}@FyVZ3 zWBqqGI&jieJiO;5_j+c#f>F#d_$;Pz= z*MqhU$ql*$S3;^}L_>EXx=2hv%8D#EK#}E2N+x0;%MDQL4i~ecSR%4&1;*Pan7enI zVp@eq)k?jcS(~|9_8dF+BwXYN(nARj2>AvMQUjJAPD+oocFH@vp9SEUF=CpHpT$Cn z=OThwaOXQ*o{#k@+P;_UE3VP1;BmU zZDs)NHIS~XUq~5Xg=0Yjj-{mL<)mV2G%&c3mjx1#7&D5#v&y?}N&54$IklZ*h3iRY z605yR?&8B`shNB`=?>Uev_upve9KTGc({6I9*wZ=LaVn^Fu0UfkJo)(5b8Gf=VQQd zf?F!;t-CQNuwh7EjY*Mh%;;FMZH4ehdN&FRpciq2;9Y*sWbv(W0_zbFw{|iZQE(A5 z$()ePvmEu&-)pw0*96cQpkd*iU?a6EbCWV8`=HEz5R3>hIQ%(a!8}F zwc=v$ZjRsvD1u9H2`-7?5?q2y>a1{Mxki(S00ge#O1;EL{tH~mEd(eL!!*~?*-Nr2%)O-|pf-7GXf-O-<{^`HP)_=Nlxan9nL?M|!0!KCeXzR(( z_=ZhP0mmg{qIU}Jfad~g?m4>+kdTSeL~eujz1 zl~f3O_K+2?wN`KepHBN3bzE5v=gjx)X|m8)J31od*8b|HV%7{=ciH*HE>3QcJe6bTTx3rL8tvc%n^H`g2fQ{@MhYKd~CG(|PtGcc~fzA)RMjA<|iE``Gtt7~;P z_DW!YqjiA4H-6eJkU?O{ng&ZfHCIeiICx4LIIf7M`%n+c)>d^}I=cTd%PZUJ(clT6 ztbl=@0iP->9M46m0a=mk19mCJ>mLq9HPX*VD2-AfCU&zRliV87<4 z>-R5GOdo0+X3PpJHm3meZs7|%p0q;VRSp7f=4parqaivsah&F+lazJ|i&JRS_~fX4 z{vm1D#{dNQX_ul=T7?T88=%?gMJs0tH1jOcl9L=R`69)@ZakQ%bFyew$Vg==WQAMw zy{3RyZjUkNp4@rMJ~roogqzLaUOrl4)rvibbiT(Up~s``174jOvws3O-f9kspEZ&m zkJ#@yLyB_%0UnX50p{3VuPQVrTeV5K&>#v7*8wBg(@) zo6YQW7s3iwIt>9F){T!4@`+(g_S>5<0?b;03l+xy!tb7DERqGv=cJT;o3YL5M zVxdd|6WG{n28)F<1ayz{1b#x*5Lgij~bk&mnR?xZ94QAdqw1 aIj(X z+4=ds+4tU#Ci>))=Zi#8|J?b5?CfrnR)0J3`&!76wqDW*y18|O6llM;ckdFP<|hwz zJS=>!?sULL{$ILfNpEOS>cWRfRzt`aHpyBpL%Q1fNkDI}dake9mzni62?ZWx@R~^h zf3VbNtwm)Yg^YDGaV$m+M~+)B*mHeR&z`0!Qs*hk=puvnoqf}OVRwf zsJH1M<-V@1u$|~Cba5|QkNXK*xw4Egc8XpA<5F;FT6EOmQt(a!bh_Vs8{(Kj+RA{Xt-iuEYVHg{d$6oy^>S_ zofHfONOr~EWydFzxS$2B~jpab>DfxyFc?LrYi#r;$hED#SCuJ{vu((Ts_pcNjXeB;v&5KG?&Y6=h6 z<(ivGm$M7p2ikLjczO1JfH;S{bX@`3!8=1^D?I7G{P0rwIHXilXT3wj`Do7w5A9$> zyD|{d^BL1;Su6Am5S@V~aCjJd&>Huw8Py}1|p6( z=ESi?q<#Q-X8;8PBm}A)p3${VzdCJ#_|8`oj_xJWo)MlAiXB9|yx3}mM~~GBpj~GG zX}<~w_8TE0c&*kcJ58M%uV~K-&kB*Z2Z*nK@{FzJXIC~1{c4rEC)WV+L*X?YMSnd%n0FX;{^!Z^-$?VOKc5#m z&+}8b5#T}G&7q?b54WbQ#@NX?4$6dB>aCoO+B+0LX&Hwi9$kn?x$vHrUB01H7U)q5 z;Qb7cS2mCu@eClIG*>%}MS=aaxqi1I0EWw9+`@O<{g$t0>mF8l1_(%qn@||wpt>b; zNf9AGwSuk&K1GWIfV!F~Ri)DlD=yj;OAvIK3m&7eV)1SU3(#r}s#XGAD`3Dx)desY zX%W>44*DmO&Ithoyib2PRkIGJ7cv$5mQq<$HUPnzBhkvlp6&0G`|(P7d!k%~#rzn+ zgtcB>aQ9MO7$ANvR8X958pp6Lvr(?Nr1olUC>hmqRuunXdD;cf;GfxW;&88s^|0|G z0>)C)k1SYB5O!f)aA+)SvLaXwz#t8BJ2k?K@Wb+U?b^o!3t&;6ic^=aR=_pB2$Pw$ zB@FPVnG~}on0>7+>7WFtMzFBZ$43U(_z1XmR*GQ+)fiDV)#M_p5H-ZvgE7M1g<$BJ z#*76C18M3&8ldK|dANqkL_A6XQ~(t~1yBK0QULFjd^flLR*O!!6xiv7-NtyYdoKib zI+ndua;JPDM|7X&SIeHb6jtr;8QjLT1)>i~O_Fi}`cU=*Y6lcZ&cD40u$_nMI z56sE{v83hdoxhqMjHtkhF9TYh+JOZaRZQqCFfuMyX_^}o)H{_cR}t8Nk#V01Ak1=e z`<8;Z4?M83t|eVDJBzL6RwT-u4Pq=P6T6k}Y^S$@@{zV44Xf2Qvo)gcrPYmlwEfo9 zuR1@F4VIMrjg8-$3MBf9KBMnWs~bC(vp~K#G{`Q3HA8ocg<^}Zm8LNPW~Ge)3@(bo k0CHQTXEejmME?Q9f2@x-4ev3HOaK4?07*qoM6N<$f+_?x7XSbN diff --git a/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png b/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png deleted file mode 100644 index 9f3286ca2fcc35590bccfbd5d39f3eb791fac52b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1742 zcmV;<1~K`GP)X z+4=ds+4tU#Ci>))=Zi#8|J?b5?CfrnR)0J3`&!76wqDW*y18|O6llM;ckdFP<|hwz zJS=>!?sULL{$ILfNpEOS>cWRfRzt`aHpyBpL%Q1fNkDI}dake9mzni62?ZWx@R~^h zf3VbNtwm)Yg^YDGaV$m+M~+)B*mHeR&z`0!Qs*hk=puvnoqf}OVRwf zsJH1M<-V@1u$|~Cba5|QkNXK*xw4Egc8XpA<5F;FT6EOmQt(a!bh_Vs8{(Kj+RA{Xt-iuEYVHg{d$6oy^>S_ zofHfONOr~EWydFzxS$2B~jpab>DfxyFc?LrYi#r;$hED#SCuJ{vu((Ts_pcNjXeB;v&5KG?&Y6=h6 z<(ivGm$M7p2ikLjczO1JfH;S{bX@`3!8=1^D?I7G{P0rwIHXilXT3wj`Do7w5A9$> zyD|{d^BL1;Su6Am5S@V~aCjJd&>Huw8Py}1|p6( z=ESi?q<#Q-X8;8PBm}A)p3${VzdCJ#_|8`oj_xJWo)MlAiXB9|yx3}mM~~GBpj~GG zX}<~w_8TE0c&*kcJ58M%uV~K-&kB*Z2Z*nK@{FzJXIC~1{c4rEC)WV+L*X?YMSnd%n0FX;{^!Z^-$?VOKc5#m z&+}8b5#T}G&7q?b54WbQ#@NX?4$6dB>aCoO+B+0LX&Hwi9$kn?x$vHrUB01H7U)q5 z;Qb7cS2mCu@eClIG*>%}MS=aaxqi1I0EWw9+`@O<{g$t0>mF8l1_(%qn@||wpt>b; zNf9AGwSuk&K1GWIfV!F~Ri)DlD=yj;OAvIK3m&7eV)1SU3(#r}s#XGAD`3Dx)desY zX%W>44*DmO&Ithoyib2PRkIGJ7cv$5mQq<$HUPnzBhkvlp6&0G`|(P7d!k%~#rzn+ zgtcB>aQ9MO7$ANvR8X958pp6Lvr(?Nr1olUC>hmqRuunXdD;cf;GfxW;&88s^|0|G z0>)C)k1SYB5O!f)aA+)SvLaXwz#t8BJ2k?K@Wb+U?b^o!3t&;6ic^=aR=_pB2$Pw$ zB@FPVnG~}on0>7+>7WFtMzFBZ$43U(_z1XmR*GQ+)fiDV)#M_p5H-ZvgE7M1g<$BJ z#*76C18M3&8ldK|dANqkL_A6XQ~(t~1yBK0QULFjd^flLR*O!!6xiv7-NtyYdoKib zI+ndua;JPDM|7X&SIeHb6jtr;8QjLT1)>i~O_Fi}`cU=*Y6lcZ&cD40u$_nMI z56sE{v83hdoxhqMjHtkhF9TYh+JOZaRZQqCFfuMyX_^}o)H{_cR}t8Nk#V01Ak1=e z`<8;Z4?M83t|eVDJBzL6RwT-u4Pq=P6T6k}Y^S$@@{zV44Xf2Qvo)gcrPYmlwEfo9 zuR1@F4VIMrjg8-$3MBf9KBMnWs~bC(vp~K#G{`Q3HA8ocg<^}Zm8LNPW~Ge)3@(bo k0CHQTXEejmME?Q9f2@x-4ev3HOaK4?07*qoM6N<$f+_?x7XSbN diff --git a/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png b/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png deleted file mode 100644 index 21f126cf16c2fdd1811b0108b733f36aac9ffa1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2527 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 F{U=whhqV9z diff --git a/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png b/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png deleted file mode 100644 index 21f126cf16c2fdd1811b0108b733f36aac9ffa1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2527 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 diff --git a/gui/src-tauri/src/JavaVersion.java b/gui/src-tauri/src/JavaVersion.java deleted file mode 100644 index 338c2a43f..000000000 --- a/gui/src-tauri/src/JavaVersion.java +++ /dev/null @@ -1,8 +0,0 @@ -public class JavaVersion { - - public static void main(String[] args) - { - var version = Runtime.version().version().get(0); - System.exit(version); - } -} diff --git a/gui/vite.config.ts b/gui/vite.config.ts index a09fed7b6..5ee8f4a24 100644 --- a/gui/vite.config.ts +++ b/gui/vite.config.ts @@ -36,6 +36,7 @@ export function i18nHotReload(): PluginOption { // https://vitejs.dev/config/ export default defineConfig({ + base: './', define: { __COMMIT_HASH__: JSON.stringify(commitHash), __VERSION_TAG__: JSON.stringify(versionTag), From d1cf5dee2408e0561eb117b1e4cca60d57f4071b Mon Sep 17 00:00:00 2001 From: loucass003 Date: Thu, 12 Feb 2026 20:52:51 +0100 Subject: [PATCH 003/103] MOAR --- .envrc | 1 - .github/CODEOWNERS | 38 - .github/workflows/build-gui.yml | 8 - .github/workflows/gradle.yaml | 14 - .gitignore | 7 +- .vscode/extensions.json | 1 - CONTRIBUTING.md | 7 +- Cargo.lock | 6898 ------------------------------- Cargo.toml | 16 - deny.toml | 242 -- flake.lock | 39 - flake.nix | 107 +- package.json | 7 +- pnpm-lock.yaml | 2982 +++++++++++-- rust-toolchain.toml | 4 - rustfmt.toml | 6 - 16 files changed, 2740 insertions(+), 7637 deletions(-) delete mode 100644 .github/CODEOWNERS delete mode 100644 Cargo.lock delete mode 100644 Cargo.toml delete mode 100644 deny.toml delete mode 100644 rust-toolchain.toml delete mode 100644 rustfmt.toml diff --git a/.envrc b/.envrc index b6178ffd3..9fa501499 100644 --- a/.envrc +++ b/.envrc @@ -2,7 +2,6 @@ if ! has nix_direnv_version || ! nix_direnv_version 2.2.1; then source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.1/direnvrc" "sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs=" fi -nix_direnv_watch_file rust-toolchain.toml nix_direnv_watch_file package.json if ! use flake . --impure then diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 2bd0a7617..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,38 +0,0 @@ -# Global code owner -* @Eirenliel - -# Make everyone be able to approve SolarXR submodule changes -/solarxr-protocol @ButterscotchV @Erimelowo @loucass003 - -# Make Loucass the owner of all GUI stuff -/gui/ @loucass003 -/pnpm-lock.yaml @loucass003 -/pnpm-workspace.yaml @loucass003 - -# loucass003 and Erimel responsible for i18n -/gui/public/i18n/ @loucass003 @Erimelowo @ImSapphire -/gui/src/i18n/ @loucass003 @Erimelowo -/l10n.toml @loucass003 @Erimelowo - -/gui/src/components/settings/ @Erimelowo @loucass003 - -# Rust part of the GUI -/gui/src-tauri/ @loucass003 -/Cargo.lock @loucass003 - -# Some server code~ -/server/ @ButterscotchV @Eirenliel @Erimelowo - -/server/src/main/java/dev/slimevr/autobone/ @ButterscotchV -/server/src/main/java/dev/slimevr/poserecorder/ @ButterscotchV -/server/src/main/java/dev/slimevr/posestreamer/ @ButterscotchV - -/server/src/main/java/dev/slimevr/osc/ @Erimelowo -/server/src/main/java/dev/slimevr/tracking/processor/ @Erimelowo -/server/src/main/java/dev/slimevr/filtering/ @Erimelowo - -# Linux files -*.nix @loucass003 -/flake.lock @loucass003 -/dev.slimevr.SlimeVR.metainfo.xml @loucass003 -/.envrc @loucass003 diff --git a/.github/workflows/build-gui.yml b/.github/workflows/build-gui.yml index 7723254d5..3b02ad554 100644 --- a/.github/workflows/build-gui.yml +++ b/.github/workflows/build-gui.yml @@ -75,14 +75,6 @@ jobs: # Disables uploading logs as a build artifact debug: false - - if: matrix.os == 'windows-11-arm' - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - cache: false - - - name: Cache cargo dependencies - uses: Swatinem/rust-cache@v2 - - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v6 diff --git a/.github/workflows/gradle.yaml b/.github/workflows/gradle.yaml index 7a7b9f1c0..85da592b0 100644 --- a/.github/workflows/gradle.yaml +++ b/.github/workflows/gradle.yaml @@ -208,9 +208,6 @@ jobs: gir1.2-javascriptcoregtk-4.1=2.44.0-2 \ gir1.2-webkit2-4.1=2.44.0-2; - - name: Cache cargo dependencies - uses: Swatinem/rust-cache@v2 - - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v6 @@ -284,9 +281,6 @@ jobs: name: 'SlimeVR-Server' path: server/desktop/build/libs/ - - name: Cache cargo dependencies - uses: Swatinem/rust-cache@v2 - - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v6 @@ -296,7 +290,6 @@ jobs: - name: Install dependencies run: | - rustup target add x86_64-apple-darwin pnpm i - name: Build @@ -364,13 +357,6 @@ jobs: name: 'SlimeVR-Server' path: server/desktop/build/libs/ - - if: matrix.os == 'windows-11-arm' - uses: actions-rust-lang/setup-rust-toolchain@v1 - with: - cache: false - - - name: Cache cargo dependencies - uses: Swatinem/rust-cache@v2 - uses: pnpm/action-setup@v4 - name: Use Node.js diff --git a/.gitignore b/.gitignore index 1f6767f08..fc9250e50 100644 --- a/.gitignore +++ b/.gitignore @@ -34,9 +34,6 @@ # ignore gradle build folder build/ -# Rust build artifacts -/target - # direnv has been claimed for Nix usage .direnv/ .devenv @@ -46,3 +43,7 @@ local.properties # Ignore temporary config vrconfig.yml.tmp + + +# Nixos +.bin/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json index eef1c9bc5..e7a44dbb2 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -7,7 +7,6 @@ "gaborv.flatbuffers", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", - "rust-lang.rust-analyzer", "bradlc.vscode-tailwindcss", "EditorConfig.EditorConfig", "macabeus.vscode-fluent", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 752157210..ee409c749 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,8 +7,6 @@ This document describes essential knowledge required to contribute to the SlimeV - [Git](https://git-scm.com/downloads) - [Java v17+](https://adoptium.net/temurin/releases/) - [Node.js v16.9+](https://nodejs.org) (We recommend the use of `nvm` instead of installing Node.js directly) -- [Microsoft Edge WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section) or `webkit2gtk` for Linux -- [Rust](https://rustup.rs) ## Cloning the code First, clone the codebase using git in a terminal in the folder you want. @@ -32,13 +30,12 @@ be at `server/build/libs/slimevr.jar` (you can ignore `server.jar`). (Note: Your IDE may be able to do all of the above for you.) -### Tauri (gui) +### Electron (gui) - Activate corepack (included with Node.JS) via `corepack enable` (might require administrator permissions) - Run `pnpm i` in your IDE's terminal to download and install dependencies. - To launch the GUI in dev mode, run `pnpm gui`. -- Finally, to compile for production, run `pnpm run tauri build`. The result -will be at `target/release/slimevr.exe`. +- Finally, to compile for production, run `pnpm build`. The result ## Code style diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index acdd46ade..000000000 --- a/Cargo.lock +++ /dev/null @@ -1,6898 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.15", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_log-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" - -[[package]] -name = "android_logger" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" -dependencies = [ - "android_log-sys", - "env_filter", - "log", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - -[[package]] -name = "anstyle-parse" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "anyhow" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" - -[[package]] -name = "app_dirs2" -version = "2.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e7b35733e3a8c1ccb90385088dd5b6eaa61325cb4d1ad56e683b5224ff352e" -dependencies = [ - "jni", - "ndk-context", - "winapi", - "xdg", -] - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "ashpd" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43c03d9e36dd40cab48435be0b09646da362c278223ca535493877b2c1dee9" -dependencies = [ - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.8.5", - "raw-window-handle", - "serde", - "serde_repr", - "tokio", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "zbus 4.0.1", -] - -[[package]] -name = "async-broadcast" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f7e37c0ed80b2a977691c47dae8625cfb21e205827106c64f7c588766b2e50" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 0.38.37", - "slab", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix 0.38.37", - "tracing", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "async-signal" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 0.38.37", - "signal-hook-registry", - "slab", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "atk" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" -dependencies = [ - "atk-sys", - "glib", - "libc", -] - -[[package]] -name = "atk-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide 0.7.4", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -dependencies = [ - "serde", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "block2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" -dependencies = [ - "objc2 0.6.1", -] - -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "borsh" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" -dependencies = [ - "once_cell", - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "brotli" -version = "8.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", -] - -[[package]] -name = "brotli-decompressor" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" -dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byte-unit" -version = "5.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174" -dependencies = [ - "rust_decimal", - "serde", - "utf8-width", -] - -[[package]] -name = "bytecheck" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bytemuck" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -dependencies = [ - "serde", -] - -[[package]] -name = "cairo-rs" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" -dependencies = [ - "bitflags 2.6.0", - "cairo-sys-rs", - "glib", - "libc", - "once_cell", - "thiserror 1.0.64", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "camino" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "cargo_toml" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" -dependencies = [ - "serde", - "toml 0.8.23", -] - -[[package]] -name = "cc" -version = "1.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfb" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" -dependencies = [ - "byteorder", - "fnv", - "uuid", -] - -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.52.6", -] - -[[package]] -name = "clap" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap-verbosity-flag" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e099138e1807662ff75e2cebe4ae2287add879245574489f9b1588eb5e5564ed" -dependencies = [ - "clap", - "log", -] - -[[package]] -name = "clap_builder" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "color-eyre" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" -dependencies = [ - "backtrace", - "color-spantrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", - "tracing-error", -] - -[[package]] -name = "color-spantrace" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" -dependencies = [ - "once_cell", - "owo-colors", - "tracing-core", - "tracing-error", -] - -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const_fn" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373e9fafaa20882876db20562275ff58d50e0caa2590077fe7ce7bef90211d0d" - -[[package]] -name = "const_format" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" -dependencies = [ - "cookie", - "document-features", - "idna 1.0.3", - "log", - "publicsuffix", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.6.0", - "core-foundation 0.10.0", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.6.0", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "cssparser" -version = "0.29.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" -dependencies = [ - "cssparser-macros", - "dtoa-short", - "itoa", - "matches", - "phf 0.10.1", - "proc-macro2", - "quote", - "smallvec", - "syn 1.0.109", -] - -[[package]] -name = "cssparser-macros" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" -dependencies = [ - "quote", - "syn 2.0.87", -] - -[[package]] -name = "ctor" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" -dependencies = [ - "quote", - "syn 2.0.87", -] - -[[package]] -name = "darling" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.87", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "data-url" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.87", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.0", - "windows-sys 0.59.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.6", - "winapi", -] - -[[package]] -name = "discord-sdk" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f1d6193792828a1f83d8edbbbce2602cc07ad35ca0d5a9d5c6195e311d85d4e" -dependencies = [ - "anyhow", - "app_dirs2", - "async-trait", - "bitflags 2.6.0", - "crossbeam-channel", - "data-encoding", - "num-traits", - "parking_lot", - "serde", - "serde_json", - "serde_repr", - "thiserror 1.0.64", - "time", - "tokio", - "tracing", - "url", - "winreg 0.52.0", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading 0.8.5", -] - -[[package]] -name = "dlopen2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "document-features" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" -dependencies = [ - "litrs", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" -dependencies = [ - "serde", -] - -[[package]] -name = "dtoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" - -[[package]] -name = "dtoa-short" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" -dependencies = [ - "dtoa", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "embed-resource" -version = "3.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 0.9.2", - "vswhom", - "winreg 0.55.0", -] - -[[package]] -name = "embed_plist" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" - -[[package]] -name = "enumflags2" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "env_filter" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "erased-serde" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" -dependencies = [ - "serde", - "typeid", -] - -[[package]] -name = "errno" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" - -[[package]] -name = "fdeflate" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "fern" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" -dependencies = [ - "log", -] - -[[package]] -name = "field-offset" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" -dependencies = [ - "memoffset", - "rustc_version", -] - -[[package]] -name = "flate2" -version = "1.0.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "flexi_logger" -version = "0.29.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a5a6882b2e137c4f2664562995865084eb5a00611fba30c582ef10354c4ad8" -dependencies = [ - "chrono", - "log", - "nu-ansi-term", - "regex", - "thiserror 2.0.12", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gdk" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" -dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - -[[package]] -name = "gdk-pixbuf" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" -dependencies = [ - "gdk-pixbuf-sys", - "gio", - "glib", - "libc", - "once_cell", -] - -[[package]] -name = "gdk-pixbuf-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gdk-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkwayland-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" -dependencies = [ - "gdk-sys", - "glib-sys", - "gobject-sys", - "libc", - "pkg-config", - "system-deps", -] - -[[package]] -name = "gdkx11" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce" -dependencies = [ - "gdk", - "gdkx11-sys", - "gio", - "glib", - "libc", - "x11", -] - -[[package]] -name = "gdkx11-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" -dependencies = [ - "gdk-sys", - "glib-sys", - "libc", - "system-deps", - "x11", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" -dependencies = [ - "rustix 1.0.8", - "windows-targets 0.52.6", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "gio" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "once_cell", - "pin-project-lite", - "smallvec", - "thiserror 1.0.64", -] - -[[package]] -name = "gio-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", - "winapi", -] - -[[package]] -name = "git2" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" -dependencies = [ - "bitflags 2.6.0", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glib" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" -dependencies = [ - "bitflags 2.6.0", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "once_cell", - "smallvec", - "thiserror 1.0.64", -] - -[[package]] -name = "glib-macros" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" -dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.0", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "glib-sys" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" -dependencies = [ - "libc", - "system-deps", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "gtk" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" -dependencies = [ - "atk", - "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", - "glib", - "gtk-sys", - "gtk3-macros", - "libc", - "pango", - "pkg-config", -] - -[[package]] -name = "gtk-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" -dependencies = [ - "atk-sys", - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "pango-sys", - "system-deps", -] - -[[package]] -name = "gtk3-macros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "h2" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.6.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "html5ever" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" -dependencies = [ - "log", - "mac", - "markup5ever", - "match_token", -] - -[[package]] -name = "http" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "hyper" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core 0.52.0", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ico" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" -dependencies = [ - "byteorder", - "png", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10" -dependencies = [ - "bytemuck", - "byteorder-lite", - "num-traits", - "png", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" -dependencies = [ - "equivalent", - "hashbrown 0.15.0", - "serde", -] - -[[package]] -name = "infer" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" -dependencies = [ - "cfb", -] - -[[package]] -name = "ipnet" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" - -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - -[[package]] -name = "is_debug" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "javascriptcore-rs" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" -dependencies = [ - "bitflags 1.3.2", - "glib", - "javascriptcore-rs-sys", -] - -[[package]] -name = "javascriptcore-rs-sys" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.64", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "json-patch" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" -dependencies = [ - "jsonptr", - "serde", - "serde_json", - "thiserror 1.0.64", -] - -[[package]] -name = "jsonptr" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "keyboard-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" -dependencies = [ - "bitflags 2.6.0", - "serde", - "unicode-segmentation", -] - -[[package]] -name = "kuchikiki" -version = "0.8.8-speedreader" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" -dependencies = [ - "cssparser", - "html5ever", - "indexmap 2.6.0", - "selectors", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libappindicator" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" -dependencies = [ - "glib", - "gtk", - "gtk-sys", - "libappindicator-sys", - "log", -] - -[[package]] -name = "libappindicator-sys" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" -dependencies = [ - "gtk-sys", - "libloading 0.7.4", - "once_cell", -] - -[[package]] -name = "libc" -version = "0.2.175" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" - -[[package]] -name = "libgit2-sys" -version = "0.17.0+1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" -dependencies = [ - "cfg-if", - "windows-targets 0.52.6", -] - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.6.0", - "libc", -] - -[[package]] -name = "libz-sys" -version = "1.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "litrs" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" -dependencies = [ - "value-bag", -] - -[[package]] -name = "log-panics" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f9dd8546191c1850ecf67d22f5ff00a935b890d0e84713159a55495cc2ac5f" -dependencies = [ - "backtrace", - "log", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "markup5ever" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" -dependencies = [ - "log", - "phf 0.11.2", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", -] - -[[package]] -name = "match_token" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi 0.3.9", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "muda" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" -dependencies = [ - "crossbeam-channel", - "dpi", - "gtk", - "keyboard-types", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "once_cell", - "png", - "serde", - "thiserror 2.0.12", - "windows-sys 0.59.0", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.6.0", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror 1.0.64", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" -dependencies = [ - "objc2-encode", - "objc2-exception-helper", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.6.0", - "block2 0.5.1", - "libc", - "objc2 0.5.2", - "objc2-core-data 0.2.2", - "objc2-core-image 0.2.2", - "objc2-foundation 0.2.2", - "objc2-quartz-core 0.2.2", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" -dependencies = [ - "bitflags 2.6.0", - "block2 0.6.1", - "libc", - "objc2 0.6.1", - "objc2-cloud-kit", - "objc2-core-data 0.3.1", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image 0.3.1", - "objc2-foundation 0.3.1", - "objc2-quartz-core 0.3.1", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.6.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" -dependencies = [ - "bitflags 2.6.0", - "dispatch2", - "objc2 0.6.1", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" -dependencies = [ - "bitflags 2.6.0", - "dispatch2", - "objc2 0.6.1", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-core-image" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" -dependencies = [ - "objc2 0.6.1", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-exception-helper" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" -dependencies = [ - "cc", -] - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.6.0", - "block2 0.5.1", - "dispatch", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" -dependencies = [ - "bitflags 2.6.0", - "block2 0.6.1", - "libc", - "objc2 0.6.1", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-javascript-core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9052cb1bb50a4c161d934befcf879526fb87ae9a68858f241e693ca46225cf5a" -dependencies = [ - "objc2 0.6.1", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.6.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.6.0", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-security" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f8e0ef3ab66b08c42644dcb34dba6ec0a574bbd8adbb8bdbdc7a2779731a44" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" -dependencies = [ - "bitflags 2.6.0", - "objc2 0.6.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-web-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" -dependencies = [ - "bitflags 2.6.0", - "block2 0.6.1", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "objc2-javascript-core", - "objc2-security", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "open" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" -dependencies = [ - "is-wsl", - "libc", - "pathdiff", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "os_info" -version = "3.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae99c7fa6dd38c7cafe1ec085e804f8f555a2f8659b0dbe03f1f9963a9b51092" -dependencies = [ - "log", - "serde", - "windows-sys 0.52.0", -] - -[[package]] -name = "os_pipe" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - -[[package]] -name = "pango" -version = "0.18.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" -dependencies = [ - "gio", - "glib", - "libc", - "once_cell", - "pango-sys", -] - -[[package]] -name = "pango-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "pathdiff" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_shared 0.8.0", -] - -[[package]] -name = "phf" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" -dependencies = [ - "phf_macros 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros 0.11.2", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_codegen" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" -dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared 0.8.0", - "rand 0.7.3", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared 0.10.0", - "rand 0.8.5", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "plist" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" -dependencies = [ - "base64 0.22.1", - "indexmap 2.6.0", - "quick-xml 0.32.0", - "serde", - "time", -] - -[[package]] -name = "png" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "polling" -version = "3.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi 0.4.0", - "pin-project-lite", - "rustix 0.38.37", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" -dependencies = [ - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit 0.22.27", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - -[[package]] -name = "proc-macro2" -version = "1.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "psl-types" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "publicsuffix" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" -dependencies = [ - "idna 1.0.3", - "psl-types", -] - -[[package]] -name = "quick-xml" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.36.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 1.0.64", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring", - "rustc-hash", - "rustls", - "slab", - "thiserror 1.0.64", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.15", - "libredox", - "thiserror 1.0.64", -] - -[[package]] -name = "redox_users" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" -dependencies = [ - "getrandom 0.2.15", - "libredox", - "thiserror 2.0.12", -] - -[[package]] -name = "regex" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "reqwest" -version = "0.12.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" -dependencies = [ - "base64 0.22.1", - "bytes", - "cookie", - "cookie_store", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-rustls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots", - "windows-registry", -] - -[[package]] -name = "rfd" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af382a047821a08aa6bfc09ab0d80ff48d45d8726f7cd8e44891f7cb4a4278e" -dependencies = [ - "ashpd", - "block2 0.5.1", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "log", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-sys 0.48.0", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "spin", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rust_decimal" -version = "1.37.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand 0.8.5", - "rkyv", - "serde", - "serde_json", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustix" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustls" -version = "0.23.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schemars" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" -dependencies = [ - "dyn-clone", - "indexmap 1.9.3", - "schemars_derive", - "serde", - "serde_json", - "url", - "uuid", -] - -[[package]] -name = "schemars_derive" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.87", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "selectors" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" -dependencies = [ - "bitflags 1.3.2", - "cssparser", - "derive_more", - "fxhash", - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "precomputed-hash", - "servo_arc", - "smallvec", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-untagged" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" -dependencies = [ - "erased-serde", - "serde", - "typeid", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.6.0", - "serde", - "serde_derive", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "serialize-to-javascript" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" -dependencies = [ - "serde", - "serde_json", - "serialize-to-javascript-impl", -] - -[[package]] -name = "serialize-to-javascript-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "servo_arc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" -dependencies = [ - "nodrop", - "stable_deref_trait", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shadow-rs" -version = "0.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2311e39772c00391875f40e34d43efef247b23930143a70ca5fbec9505937420" -dependencies = [ - "const_format", - "git2", - "is_debug", - "time", - "tzdb", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shared_child" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slimevr" -version = "0.0.0" -dependencies = [ - "cfg-if", - "cfg_aliases", - "clap", - "clap-verbosity-flag", - "color-eyre", - "const_format", - "dirs-next", - "discord-sdk", - "flexi_logger", - "glob", - "itertools", - "libloading 0.8.5", - "log", - "log-panics", - "open", - "rand 0.8.5", - "rfd", - "serde", - "serde_json", - "shadow-rs", - "tauri", - "tauri-build", - "tauri-plugin-dialog", - "tauri-plugin-fs", - "tauri-plugin-http", - "tauri-plugin-log", - "tauri-plugin-opener", - "tauri-plugin-os", - "tauri-plugin-shell", - "tauri-plugin-store", - "tauri-runtime", - "tempfile", - "tokio", - "which", - "win32job", - "winreg 0.52.0", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "softbuffer" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" -dependencies = [ - "bytemuck", - "cfg_aliases", - "core-graphics", - "foreign-types", - "js-sys", - "log", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-quartz-core 0.2.2", - "raw-window-handle", - "redox_syscall", - "wasm-bindgen", - "web-sys", - "windows-sys 0.59.0", -] - -[[package]] -name = "soup3" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" -dependencies = [ - "futures-channel", - "gio", - "glib", - "libc", - "soup3-sys", -] - -[[package]] -name = "soup3-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" -dependencies = [ - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" -dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot", - "phf_shared 0.10.0", - "precomputed-hash", - "serde", -] - -[[package]] -name = "string_cache_codegen" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" -dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro2", - "quote", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "swift-rs" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" -dependencies = [ - "base64 0.21.7", - "serde", - "serde_json", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "sys-locale" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" -dependencies = [ - "libc", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.6.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck 0.5.0", - "pkg-config", - "toml 0.8.23", - "version-compare", -] - -[[package]] -name = "tao" -version = "0.34.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "959469667dbcea91e5485fc48ba7dd6023face91bb0f1a14681a70f99847c3f7" -dependencies = [ - "bitflags 2.6.0", - "block2 0.6.1", - "core-foundation 0.10.0", - "core-graphics", - "crossbeam-channel", - "dispatch", - "dlopen2", - "dpi", - "gdkwayland-sys", - "gdkx11-sys", - "gtk", - "jni", - "lazy_static", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", - "once_cell", - "parking_lot", - "raw-window-handle", - "scopeguard", - "tao-macros", - "unicode-segmentation", - "url", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "tao-macros" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tauri" -version = "2.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c" -dependencies = [ - "anyhow", - "bytes", - "cookie", - "dirs", - "dunce", - "embed_plist", - "getrandom 0.3.3", - "glob", - "gtk", - "heck 0.5.0", - "http", - "image", - "jni", - "libc", - "log", - "mime", - "muda", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", - "objc2-ui-kit", - "objc2-web-kit", - "percent-encoding", - "plist", - "raw-window-handle", - "reqwest", - "serde", - "serde_json", - "serde_repr", - "serialize-to-javascript", - "swift-rs", - "tauri-build", - "tauri-macros", - "tauri-runtime", - "tauri-runtime-wry", - "tauri-utils", - "thiserror 2.0.12", - "tokio", - "tray-icon", - "url", - "urlpattern", - "webkit2gtk", - "webview2-com", - "window-vibrancy", - "windows", -] - -[[package]] -name = "tauri-build" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f" -dependencies = [ - "anyhow", - "cargo_toml", - "dirs", - "glob", - "heck 0.5.0", - "json-patch", - "schemars", - "semver", - "serde", - "serde_json", - "tauri-utils", - "tauri-winres", - "toml 0.9.2", - "walkdir", -] - -[[package]] -name = "tauri-codegen" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a" -dependencies = [ - "base64 0.22.1", - "brotli", - "ico", - "json-patch", - "plist", - "png", - "proc-macro2", - "quote", - "semver", - "serde", - "serde_json", - "sha2", - "syn 2.0.87", - "tauri-utils", - "thiserror 2.0.12", - "time", - "url", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.87", - "tauri-codegen", - "tauri-utils", -] - -[[package]] -name = "tauri-plugin" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9946a3cede302eac0c6eb6c6070ac47b1768e326092d32efbb91f21ed58d978f" -dependencies = [ - "anyhow", - "glob", - "plist", - "schemars", - "serde", - "serde_json", - "tauri-utils", - "toml 0.9.2", - "walkdir", -] - -[[package]] -name = "tauri-plugin-dialog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beee42a4002bc695550599b011728d9dfabf82f767f134754ed6655e434824e" -dependencies = [ - "log", - "raw-window-handle", - "rfd", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "tauri-plugin-fs", - "thiserror 2.0.12", - "url", -] - -[[package]] -name = "tauri-plugin-fs" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7" -dependencies = [ - "anyhow", - "dunce", - "glob", - "percent-encoding", - "schemars", - "serde", - "serde_json", - "serde_repr", - "tauri", - "tauri-plugin", - "tauri-utils", - "thiserror 2.0.12", - "toml 0.9.2", - "url", -] - -[[package]] -name = "tauri-plugin-http" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c1a38da944b357ffa23bafd563b1579f18e6fbd118fcd84769406d35dcc5c7" -dependencies = [ - "bytes", - "cookie_store", - "data-url", - "http", - "regex", - "reqwest", - "schemars", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "tauri-plugin-fs", - "thiserror 2.0.12", - "tokio", - "url", - "urlpattern", -] - -[[package]] -name = "tauri-plugin-log" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c1438bc7662acd16d508c919b3c087efd63669a4c75625dff829b1c75975ec" -dependencies = [ - "android_logger", - "byte-unit", - "fern", - "log", - "objc2 0.6.1", - "objc2-foundation 0.3.1", - "serde", - "serde_json", - "serde_repr", - "swift-rs", - "tauri", - "tauri-plugin", - "thiserror 2.0.12", - "time", -] - -[[package]] -name = "tauri-plugin-opener" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" -dependencies = [ - "dunce", - "glob", - "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", - "open", - "schemars", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "thiserror 2.0.12", - "url", - "windows", - "zbus 5.4.0", -] - -[[package]] -name = "tauri-plugin-os" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1c77ebf6f20417ab2a74e8c310820ba52151406d0c80fbcea7df232e3f6ba" -dependencies = [ - "gethostname", - "log", - "os_info", - "serde", - "serde_json", - "serialize-to-javascript", - "sys-locale", - "tauri", - "tauri-plugin", - "thiserror 2.0.12", -] - -[[package]] -name = "tauri-plugin-shell" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54777d0c0d8add34eea3ced84378619ef5b97996bd967d3038c668feefd21071" -dependencies = [ - "encoding_rs", - "log", - "open", - "os_pipe", - "regex", - "schemars", - "serde", - "serde_json", - "shared_child", - "tauri", - "tauri-plugin", - "thiserror 2.0.12", - "tokio", -] - -[[package]] -name = "tauri-plugin-store" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85dd80d60a76ee2c2fdce09e9ef30877b239c2a6bb76e6d7d03708aa5f13a19" -dependencies = [ - "dunce", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "thiserror 2.0.12", - "tokio", - "tracing", -] - -[[package]] -name = "tauri-runtime" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cfc9ad45b487d3fded5a4731a567872a4812e9552e3964161b08edabf93846" -dependencies = [ - "cookie", - "dpi", - "gtk", - "http", - "jni", - "objc2 0.6.1", - "objc2-ui-kit", - "objc2-web-kit", - "raw-window-handle", - "serde", - "serde_json", - "tauri-utils", - "thiserror 2.0.12", - "url", - "webkit2gtk", - "webview2-com", - "windows", -] - -[[package]] -name = "tauri-runtime-wry" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807" -dependencies = [ - "gtk", - "http", - "jni", - "log", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-foundation 0.3.1", - "once_cell", - "percent-encoding", - "raw-window-handle", - "softbuffer", - "tao", - "tauri-runtime", - "tauri-utils", - "url", - "webkit2gtk", - "webview2-com", - "windows", - "wry", -] - -[[package]] -name = "tauri-utils" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a3852fdf9a4f8fbeaa63dc3e9a85284dd6ef7200751f0bd66ceee30c93f212" -dependencies = [ - "anyhow", - "brotli", - "cargo_metadata", - "ctor", - "dunce", - "glob", - "html5ever", - "http", - "infer", - "json-patch", - "kuchikiki", - "log", - "memchr", - "phf 0.11.2", - "proc-macro2", - "quote", - "regex", - "schemars", - "semver", - "serde", - "serde-untagged", - "serde_json", - "serde_with", - "swift-rs", - "thiserror 2.0.12", - "toml 0.9.2", - "url", - "urlpattern", - "uuid", - "walkdir", -] - -[[package]] -name = "tauri-winres" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" -dependencies = [ - "embed-resource", - "indexmap 2.6.0", - "toml 0.8.23", -] - -[[package]] -name = "tempfile" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix 0.38.37", - "windows-sys 0.59.0", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "thiserror" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" -dependencies = [ - "thiserror-impl 1.0.64", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "libc", - "num-conv", - "num_threads", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" -dependencies = [ - "indexmap 2.6.0", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", - "toml_parser", - "toml_writer", - "winnow 0.7.12", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.6.0", - "toml_datetime 0.6.11", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap 2.6.0", - "toml_datetime 0.6.11", - "winnow 0.5.40", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.6.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.12", -] - -[[package]] -name = "toml_parser" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" -dependencies = [ - "winnow 0.7.12", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-error" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" -dependencies = [ - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "sharded-slab", - "thread_local", - "tracing-core", -] - -[[package]] -name = "tray-icon" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" -dependencies = [ - "crossbeam-channel", - "dirs", - "libappindicator", - "muda", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.1", - "once_cell", - "png", - "serde", - "thiserror 2.0.12", - "windows-sys 0.59.0", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typeid" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "tz-rs" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33851b15c848fad2cf4b105c6bb66eb9512b6f6c44a4b13f57c53c73c707e2b4" -dependencies = [ - "const_fn", -] - -[[package]] -name = "tzdb" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b580f6b365fa89f5767cdb619a55d534d04a4e14c2d7e5b9a31e94598687fb1" -dependencies = [ - "iana-time-zone", - "tz-rs", - "tzdb_data", -] - -[[package]] -name = "tzdb_data" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "654c1ec546942ce0594e8d220e6b8e3899e0a0a8fe70ddd54d32a376dfefe3f8" -dependencies = [ - "tz-rs", -] - -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-ucd-ident" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" -dependencies = [ - "form_urlencoded", - "idna 0.5.0", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlpattern" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" -dependencies = [ - "regex", - "serde", - "unic-ucd-ident", - "url", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8-width" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "uuid" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" -dependencies = [ - "getrandom 0.2.15", - "serde", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "value-bag" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" -dependencies = [ - "cfg-if", - "once_cell", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.87", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" - -[[package]] -name = "wasm-streams" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wayland-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" -dependencies = [ - "cc", - "downcast-rs", - "rustix 0.38.37", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" -dependencies = [ - "bitflags 2.6.0", - "rustix 0.38.37", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" -dependencies = [ - "bitflags 2.6.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" -dependencies = [ - "proc-macro2", - "quick-xml 0.36.2", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" -dependencies = [ - "dlib", - "log", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webkit2gtk" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" -dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "gdk", - "gdk-sys", - "gio", - "gio-sys", - "glib", - "glib-sys", - "gobject-sys", - "gtk", - "gtk-sys", - "javascriptcore-rs", - "libc", - "once_cell", - "soup3", - "webkit2gtk-sys", -] - -[[package]] -name = "webkit2gtk-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" -dependencies = [ - "bitflags 1.3.2", - "cairo-sys-rs", - "gdk-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk-sys", - "javascriptcore-rs-sys", - "libc", - "pkg-config", - "soup3-sys", - "system-deps", -] - -[[package]] -name = "webpki-roots" -version = "0.26.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "webview2-com" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" -dependencies = [ - "webview2-com-macros", - "webview2-com-sys", - "windows", - "windows-core 0.61.2", - "windows-implement", - "windows-interface", -] - -[[package]] -name = "webview2-com-macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "webview2-com-sys" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" -dependencies = [ - "thiserror 2.0.12", - "windows", - "windows-core 0.61.2", -] - -[[package]] -name = "which" -version = "6.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" -dependencies = [ - "either", - "home", - "rustix 0.38.37", - "winsafe", -] - -[[package]] -name = "win32job" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e915da468fb933fad27a318d59e163b1c8ae079be5efc080ff75990d1555dd" -dependencies = [ - "thiserror 1.0.64", - "winapi", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "window-vibrancy" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" -dependencies = [ - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "raw-window-handle", - "windows-sys 0.59.0", - "windows-version", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" -dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-version" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "wry" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f0e9642a0d061f6236c54ccae64c2722a7879ad4ec7dff59bd376d446d8e90" -dependencies = [ - "base64 0.22.1", - "block2 0.6.1", - "cookie", - "crossbeam-channel", - "dirs", - "dpi", - "dunce", - "gdkx11", - "gtk", - "html5ever", - "http", - "javascriptcore-rs", - "jni", - "kuchikiki", - "libc", - "ndk", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "objc2-ui-kit", - "objc2-web-kit", - "once_cell", - "percent-encoding", - "raw-window-handle", - "sha2", - "soup3", - "tao-macros", - "thiserror 2.0.12", - "url", - "webkit2gtk", - "webkit2gtk-sys", - "webview2-com", - "windows", - "windows-core 0.61.2", - "windows-version", - "x11-dl", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "xdg" -version = "2.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" - -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "synstructure", -] - -[[package]] -name = "zbus" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" -dependencies = [ - "async-broadcast", - "async-process", - "async-recursion", - "async-trait", - "derivative", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.27.1", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tokio", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros 4.0.1", - "zbus_names 3.0.0", - "zvariant 4.0.0", -] - -[[package]] -name = "zbus" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbddd8b6cb25d5d8ec1b23277b45299a98bfb220f1761ca11e186d5c702507f8" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-util", - "hex", - "nix 0.29.0", - "ordered-stream", - "serde", - "serde_repr", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.59.0", - "winnow 0.7.12", - "xdg-home", - "zbus_macros 5.4.0", - "zbus_names 4.2.0", - "zvariant 5.7.0", -] - -[[package]] -name = "zbus_macros" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", - "zvariant_utils 1.1.0", -] - -[[package]] -name = "zbus_macros" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac404d48b4e9cf193c8b49589f3280ceca5ff63519e7e64f55b4cf9c47ce146" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.87", - "zbus_names 4.2.0", - "zvariant 5.7.0", - "zvariant_utils 3.2.1", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant 4.0.0", -] - -[[package]] -name = "zbus_names" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" -dependencies = [ - "serde", - "static_assertions", - "winnow 0.7.12", - "zvariant 5.7.0", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "zvariant" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "url", - "zvariant_derive 4.0.0", -] - -[[package]] -name = "zvariant" -version = "5.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "999dd3be73c52b1fccd109a4a81e4fcd20fab1d3599c8121b38d04e1419498db" -dependencies = [ - "endi", - "enumflags2", - "serde", - "winnow 0.7.12", - "zvariant_derive 5.7.0", - "zvariant_utils 3.2.1", -] - -[[package]] -name = "zvariant_derive" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", - "zvariant_utils 1.1.0", -] - -[[package]] -name = "zvariant_derive" -version = "5.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6643fd0b26a46d226bd90d3f07c1b5321fe9bb7f04673cb37ac6d6883885b68e" -dependencies = [ - "proc-macro-crate 3.3.0", - "proc-macro2", - "quote", - "syn 2.0.87", - "zvariant_utils 3.2.1", -] - -[[package]] -name = "zvariant_utils" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "zvariant_utils" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.87", - "winnow 0.7.12", -] diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index d0ef97f7b..000000000 --- a/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[workspace] -# Use 2021 edition resolver, better resolves crate features. -resolver = "2" - -# A list of all rust crates in the workspace. -members = ["gui/src-tauri"] - -# These settings can be inherited by workspace members -[workspace.package] -edition = "2021" -license = "MIT OR Apache-2.0" -rust-version = "1.82" # Tauri's MSRV -repository = "https://github.com/SlimeVR/SlimeVR-Server" - -[profile.release] -lto = "thin" diff --git a/deny.toml b/deny.toml deleted file mode 100644 index a8fcf386e..000000000 --- a/deny.toml +++ /dev/null @@ -1,242 +0,0 @@ -# This template contains all of the possible sections and their default values - -# Note that all fields that take a lint level have these possible values: -# * deny - An error will be produced and the check will fail -# * warn - A warning will be produced, but the check will not fail -# * allow - No warning or error will be produced, though in some cases a note -# will be - -# The values provided in this template are the default values that will be used -# when any section or field is not specified in your own configuration - -# Root options - -# The graph table configures how the dependency graph is constructed and thus -# which crates the checks are performed against -[graph] -# If 1 or more target triples (and optionally, target_features) are specified, -# only the specified targets will be checked when running `cargo deny check`. -# This means, if a particular package is only ever used as a target specific -# dependency, such as, for example, the `nix` crate only being used via the -# `target_family = "unix"` configuration, that only having windows targets in -# this list would mean the nix crate, as well as any of its exclusive -# dependencies not shared by any other crates, would be ignored, as the target -# list here is effectively saying which targets you are building for. -targets = [ - # The triple can be any string, but only the target triples built in to - # rustc (as of 1.40) can be checked against actual config expressions - #"x86_64-unknown-linux-musl", - # You can also specify which target_features you promise are enabled for a - # particular target. target_features are currently not validated against - # the actual valid features supported by the target architecture. - #{ triple = "wasm32-unknown-unknown", features = ["atomics"] }, -] -# When creating the dependency graph used as the source of truth when checks are -# executed, this field can be used to prune crates from the graph, removing them -# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate -# is pruned from the graph, all of its dependencies will also be pruned unless -# they are connected to another crate in the graph that hasn't been pruned, -# so it should be used with care. The identifiers are [Package ID Specifications] -# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html) -#exclude = [] -# If true, metadata will be collected with `--all-features`. Note that this can't -# be toggled off if true, if you want to conditionally enable `--all-features` it -# is recommended to pass `--all-features` on the cmd line instead -all-features = false -# If true, metadata will be collected with `--no-default-features`. The same -# caveat with `all-features` applies -no-default-features = false -# If set, these feature will be enabled when collecting metadata. If `--features` -# is specified on the cmd line they will take precedence over this option. -#features = [] - -# The output table provides options for how/if diagnostics are outputted -[output] -# When outputting inclusion graphs in diagnostics that include features, this -# option can be used to specify the depth at which feature edges will be added. -# This option is included since the graphs can be quite large and the addition -# of features from the crate(s) to all of the graph roots can be far too verbose. -# This option can be overridden via `--feature-depth` on the cmd line -feature-depth = 1 - -# This section is considered when running `cargo deny check advisories` -# More documentation for the advisories section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html -[advisories] -# The path where the advisory databases are cloned/fetched into -#db-path = "$CARGO_HOME/advisory-dbs" -# The url(s) of the advisory databases to use -#db-urls = ["https://github.com/rustsec/advisory-db"] -# A list of advisory IDs to ignore. Note that ignored advisories will still -# output a note when they are encountered. -ignore = [ - #"RUSTSEC-0000-0000", - #{ id = "RUSTSEC-0000-0000", reason = "you can specify a reason the advisory is ignored" }, - #"a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish - #{ crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" }, -] -# If this is true, then cargo deny will use the git executable to fetch advisory database. -# If this is false, then it uses a built-in git library. -# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support. -# See Git Authentication for more information about setting up git authentication. -#git-fetch-with-cli = true - -# This section is considered when running `cargo deny check licenses` -# More documentation for the licenses section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html -[licenses] -# List of explicitly allowed licenses -# See https://spdx.org/licenses/ for list of possible licenses -# [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -allow = [ - "MIT", - "Apache-2.0", - "Apache-2.0 WITH LLVM-exception", - "Unicode-3.0", - "Unicode-DFS-2016", - "MIT-0", - "ISC", - "BSD-3-Clause", - "Zlib", - "MPL-2.0", -] -# The confidence threshold for detecting a license from license text. -# The higher the value, the more closely the license text must be to the -# canonical license text of a valid SPDX license file. -# [possible values: any between 0.0 and 1.0]. -confidence-threshold = 0.8 -# Allow 1 or more licenses on a per-crate basis, so that particular licenses -# aren't accepted for every possible crate as with the normal allow list -exceptions = [ - # Each entry is the crate and version constraint, and its specific allow - # list - #{ allow = ["Zlib"], crate = "adler32" }, -] - -# Some crates don't have (easily) machine readable licensing information, -# adding a clarification entry for it allows you to manually specify the -# licensing information -#[[licenses.clarify]] -# The package spec the clarification applies to -#crate = "ring" -# The SPDX expression for the license requirements of the crate -#expression = "MIT AND ISC AND OpenSSL" -# One or more files in the crate's source used as the "source of truth" for -# the license expression. If the contents match, the clarification will be used -# when running the license check, otherwise the clarification will be ignored -# and the crate will be checked normally, which may produce warnings or errors -# depending on the rest of your configuration -#license-files = [ -# Each entry is a crate relative path, and the (opaque) hash of its contents -#{ path = "LICENSE", hash = 0xbd0eed23 } -#] - -[licenses.private] -# If true, ignores workspace crates that aren't published, or are only -# published to private registries. -# To see how to mark a crate as unpublished (to the official registry), -# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field. -ignore = false -# One or more private registries that you might publish crates to, if a crate -# is only published to private registries, and ignore is true, the crate will -# not have its license(s) checked -registries = [ - #"https://sekretz.com/registry -] - -# This section is considered when running `cargo deny check bans`. -# More documentation about the 'bans' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html -[bans] -# Lint level for when multiple versions of the same crate are detected -multiple-versions = "warn" -# Lint level for when a crate version requirement is `*` -wildcards = "allow" -# The graph highlighting used when creating dotgraphs for crates -# with multiple versions -# * lowest-version - The path to the lowest versioned duplicate is highlighted -# * simplest-path - The path to the version with the fewest edges is highlighted -# * all - Both lowest-version and simplest-path are used -highlight = "all" -# The default lint level for `default` features for crates that are members of -# the workspace that is being checked. This can be overridden by allowing/denying -# `default` on a crate-by-crate basis if desired. -workspace-default-features = "allow" -# The default lint level for `default` features for external crates that are not -# members of the workspace. This can be overridden by allowing/denying `default` -# on a crate-by-crate basis if desired. -external-default-features = "allow" -# List of crates that are allowed. Use with care! -allow = [ - #"ansi_term@0.11.0", - #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is allowed" }, -] -# List of crates to deny -deny = [ - #"ansi_term@0.11.0", - #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason it is banned" }, - # Wrapper crates can optionally be specified to allow the crate when it - # is a direct dependency of the otherwise banned crate - #{ crate = "ansi_term@0.11.0", wrappers = ["this-crate-directly-depends-on-ansi_term"] }, -] - -# List of features to allow/deny -# Each entry the name of a crate and a version range. If version is -# not specified, all versions will be matched. -#[[bans.features]] -#crate = "reqwest" -# Features to not allow -#deny = ["json"] -# Features to allow -#allow = [ -# "rustls", -# "__rustls", -# "__tls", -# "hyper-rustls", -# "rustls", -# "rustls-pemfile", -# "rustls-tls-webpki-roots", -# "tokio-rustls", -# "webpki-roots", -#] -# If true, the allowed features must exactly match the enabled feature set. If -# this is set there is no point setting `deny` -#exact = true - -# Certain crates/versions that will be skipped when doing duplicate detection. -skip = [ - #"ansi_term@0.11.0", - #{ crate = "ansi_term@0.11.0", reason = "you can specify a reason why it can't be updated/removed" }, -] -# Similarly to `skip` allows you to skip certain crates during duplicate -# detection. Unlike skip, it also includes the entire tree of transitive -# dependencies starting at the specified crate, up to a certain depth, which is -# by default infinite. -skip-tree = [ - #"ansi_term@0.11.0", # will be skipped along with _all_ of its direct and transitive dependencies - #{ crate = "ansi_term@0.11.0", depth = 20 }, -] - -# This section is considered when running `cargo deny check sources`. -# More documentation about the 'sources' section can be found here: -# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html -[sources] -# Lint level for what to happen when a crate from a crate registry that is not -# in the allow list is encountered -unknown-registry = "warn" -# Lint level for what to happen when a crate from a git repository that is not -# in the allow list is encountered -unknown-git = "warn" -# List of URLs for allowed crate registries. Defaults to the crates.io index -# if not specified. If it is specified but empty, no registries are allowed. -allow-registry = ["https://github.com/rust-lang/crates.io-index"] -# List of URLs for allowed Git repositories -allow-git = [] - -[sources.allow-org] -# 1 or more github.com organizations to allow git sources for -github = [""] -# 1 or more gitlab.com organizations to allow git sources for -gitlab = [""] -# 1 or more bitbucket.org organizations to allow git sources for -bitbucket = [""] diff --git a/flake.lock b/flake.lock index 093a5d86c..9be99d6b9 100644 --- a/flake.lock +++ b/flake.lock @@ -1,26 +1,5 @@ { "nodes": { - "fenix": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ], - "rust-analyzer-src": "rust-analyzer-src" - }, - "locked": { - "lastModified": 1756795219, - "narHash": "sha256-tKBQtz1JLKWrCJUxVkHKR+YKmVpm0KZdJdPWmR2slQ8=", - "owner": "nix-community", - "repo": "fenix", - "rev": "80dbdab137f2809e3c823ed027e1665ce2502d74", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "fenix", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -72,27 +51,9 @@ }, "root": { "inputs": { - "fenix": "fenix", "flake-parts": "flake-parts", "nixpkgs": "nixpkgs" } - }, - "rust-analyzer-src": { - "flake": false, - "locked": { - "lastModified": 1756597274, - "narHash": "sha256-wfaKRKsEVQDB7pQtAt04vRgFphkVscGRpSx3wG1l50E=", - "owner": "rust-lang", - "repo": "rust-analyzer", - "rev": "21614ed2d3279a9aa1f15c88d293e65a98991b30", - "type": "github" - }, - "original": { - "owner": "rust-lang", - "ref": "nightly", - "repo": "rust-analyzer", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 8de560edd..a0f0deb88 100644 --- a/flake.nix +++ b/flake.nix @@ -4,69 +4,76 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-parts.url = "github:hercules-ci/flake-parts"; - fenix = { - url = "github:nix-community/fenix"; - inputs.nixpkgs.follows = "nixpkgs"; - }; }; - outputs = inputs@{ self, nixpkgs, flake-parts, fenix, ... }: + outputs = + inputs@{ self, nixpkgs, flake-parts, ... }: flake-parts.lib.mkFlake { inherit inputs; } { systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; - perSystem = { system, lib, ... }: + perSystem = { system, lib, pkgs, ... }: let - pkgs = import nixpkgs { inherit system; }; + targetElectron = pkgs.electron; - rust_toolchain = lib.importTOML ./rust-toolchain.toml; - fenixPkgs = fenix.packages.${system}; - - rustToolchainSet = fenixPkgs.fromToolchainName { - name = rust_toolchain.toolchain.channel; - sha256 = "sha256-+9FmLhAOezBZCOziO0Qct1NOrfpjNsXxc/8I0c7BdKE="; - }; - in { + hw_deps = with pkgs; [ + udev + libusb1 + ]; + build_tools = with pkgs; [ + p7zip + fpm + squashfsTools + rpm + desktop-file-utils # Required for mksquashfs validation + ]; + in + { devShells.default = pkgs.mkShell { - name = "slimevr"; + name = "slimevr-electron"; - buildInputs = - (with pkgs; [ - cacert - ]) ++ lib.optionals pkgs.stdenv.isLinux (with pkgs; [ - atk cairo dbus dbus.lib dprint gdk-pixbuf glib.out glib-networking - gobject-introspection gtk3 harfbuzz libffi libsoup_3 openssl.dev pango - pkg-config treefmt webkitgtk_4_1 zlib - gst_all_1.gstreamer gst_all_1.gst-plugins-base - gst_all_1.gst-plugins-good gst_all_1.gst-plugins-bad - librsvg freetype expat libayatana-appindicator udev libusb1 - ]) ++ lib.optionals pkgs.stdenv.isDarwin [ - pkgs.darwin.apple_sdk.frameworks.Security - ] ++ [ - pkgs.jdk17 - pkgs.kotlin - rustToolchainSet.rustc - rustToolchainSet.cargo - rustToolchainSet.rustfmt - ]; - - nativeBuildInputs = with pkgs; [ pnpm nodejs_22 gradle ]; - - RUST_BACKTRACE = 1; - GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules:${pkgs.dconf.lib}/lib/gio/modules"; + buildInputs = with pkgs; [ + nodejs_22 + pnpm + pkg-config + targetElectron + ] ++ hw_deps + ++ build_tools; shellHook = '' - export SLIMEVR_RUST_LD_LIBRARY_PATH="$LD_LIBRARY_PATH" - export LD_LIBRARY_PATH="${pkgs.udev}/lib:${pkgs.libayatana-appindicator}/lib:$LD_LIBRARY_PATH" - export GST_PLUGIN_SYSTEM_PATH_1_0="${pkgs.gst_all_1.gstreamer.out}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-base}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-good}/lib/gstreamer-1.0:${pkgs.gst_all_1.gst-plugins-bad}/lib/gstreamer-1.0" + # 1. Standard Electron Overrides + export ELECTRON_SKIP_BINARY_DOWNLOAD=1 + export ELECTRON_OVERRIDE_DIST_PATH="${targetElectron}/lib/electron" + export ELECTRON_PATH="${targetElectron}/bin/electron" - # Force linker and pkg-config to use udev from nixpkgs so libgudev/hidapi - # resolve against the correct libudev implementation at link time. - export PKG_CONFIG_PATH="${pkgs.udev}/lib/pkgconfig:${pkgs.glib}/lib/pkgconfig:$PKG_CONFIG_PATH" - export LIBRARY_PATH="${pkgs.udev}/lib:$LIBRARY_PATH" - export LD_RUN_PATH="${pkgs.udev}/lib:$LD_RUN_PATH" - export NIX_LDFLAGS="-L${pkgs.udev}/lib -ludev $NIX_LDFLAGS" - export LDFLAGS="-L${pkgs.udev}/lib -Wl,-rpath,${pkgs.udev}/lib -ludev $LDFLAGS" + # 2. Fix broken local Electron binary + LOCAL_ELECTRON="./node_modules/electron/dist/electron" + if [ -f "$LOCAL_ELECTRON" ] && [ ! -L "$LOCAL_ELECTRON" ]; then + rm "$LOCAL_ELECTRON" + ln -s "${targetElectron}/bin/electron" "$LOCAL_ELECTRON" + fi + + # 3. FIX FOR ELECTRON-BUILDER ON NIXOS (The AppImage Tools Hack) + # Define where electron-builder stores its downloaded tools + EB_CACHE="$HOME/.cache/electron-builder/appimage/appimage-12.0.1/linux-x64" + mkdir -p "$EB_CACHE" + + # Symlink Nix-native tools over the broken ones + ln -sf "${pkgs.squashfsTools}/bin/mksquashfs" "$EB_CACHE/mksquashfs" + ln -sf "${pkgs.desktop-file-utils}/bin/desktop-file-validate" "$EB_CACHE/desktop-file-validate" + + # General system binary overrides + export USE_SYSTEM_7ZA=true + export USE_SYSTEM_FPM=true + export ELECTRON_BUILDER_BINARIES_7ZA_PATH="${pkgs.p7zip}/bin/7za" + + # 4. Hardware/Linker paths + export PKG_CONFIG_PATH="${pkgs.lib.makeSearchPath "lib/pkgconfig" hw_deps}:$PKG_CONFIG_PATH" + export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath (hw_deps ++ build_tools)}:$LD_LIBRARY_PATH" + + echo "--- SlimeVR Nix Environment ---" + echo "Electron: $(electron --version)" + echo "AppImage tools patched for NixOS." ''; }; }; diff --git a/package.json b/package.json index f3204639d..6d5d4041d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "slimevr-ui", - "version": "0.5.1", + "name": "slimevr", + "version": "0.0.0", "private": true, "packageManager": "pnpm@9.12.2", "workspaces": [ @@ -9,9 +9,8 @@ ], "scripts": { "gui": "pnpm run update-solarxr && cd gui && pnpm run dev", - "tauri": "cd gui && pnpm run tauri", "skipbundler": "cd gui && pnpm run skipbundler", - "build": "pnpm run tauri build", + "build": "echo \"Prob should do something about that\"", "update-solarxr": "cd solarxr-protocol && pnpm run build", "prepare": "husky && pnpm run update-solarxr", "preinstall": "npx only-allow pnpm" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5c980358..8d7260db9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,40 +46,13 @@ importers: version: 10.29.0(react@18.3.1) '@sentry/vite-plugin': specifier: ^2.22.7 - version: 2.22.7 + version: 2.22.7(encoding@0.1.13) '@tailwindcss/typography': specifier: ^0.5.15 version: 0.5.15(tailwindcss@3.4.14(ts-node@9.1.1(typescript@5.6.3))) '@tanstack/react-query': specifier: ^5.48.0 version: 5.48.0(react@18.3.1) - '@tauri-apps/api': - specifier: ^2.0.2 - version: 2.0.2 - '@tauri-apps/plugin-dialog': - specifier: ^2.0.0 - version: 2.0.0 - '@tauri-apps/plugin-fs': - specifier: 2.4.1 - version: 2.4.1 - '@tauri-apps/plugin-http': - specifier: ^2.5.0 - version: 2.5.0 - '@tauri-apps/plugin-log': - specifier: ~2 - version: 2.7.1 - '@tauri-apps/plugin-opener': - specifier: ^2.4.0 - version: 2.4.0 - '@tauri-apps/plugin-os': - specifier: ^2.0.0 - version: 2.0.0 - '@tauri-apps/plugin-shell': - specifier: ^2.3.0 - version: 2.3.0 - '@tauri-apps/plugin-store': - specifier: ^2.4.1 - version: 2.4.1 '@tweenjs/tween.js': specifier: ^25.0.0 version: 25.0.0 @@ -95,6 +68,12 @@ importers: classnames: specifier: ^2.5.1 version: 2.5.1 + commander: + specifier: ^14.0.3 + version: 14.0.3 + concurrently: + specifier: ^9.2.1 + version: 9.2.1 convert: specifier: ^5.12.0 version: 5.13.1 @@ -110,6 +89,18 @@ importers: jotai: specifier: ^2.12.2 version: 2.12.2(@types/react@18.3.11)(react@18.3.1) + open: + specifier: ^11.0.0 + version: 11.0.0 + pino: + specifier: ^10.3.1 + version: 10.3.1 + pino-pretty: + specifier: ^13.1.3 + version: 13.1.3 + pino-roll: + specifier: ^4.0.0 + version: 4.0.0 prompts: specifier: ^2.4.2 version: 2.4.2 @@ -173,19 +164,16 @@ importers: version: 4.0.9 '@openapi-codegen/cli': specifier: ^3.1.0 - version: 3.1.0 + version: 3.1.0(encoding@0.1.13) '@openapi-codegen/typescript': specifier: ^8.0.2 version: 8.0.2 '@stylistic/eslint-plugin': specifier: ^5.5.0 - version: 5.5.0(eslint@9.39.1(jiti@1.21.6)) + version: 5.5.0(eslint@9.39.1(jiti@2.6.1)) '@tailwindcss/forms': specifier: ^0.5.9 version: 0.5.9(tailwindcss@3.4.14(ts-node@9.1.1(typescript@5.6.3))) - '@tauri-apps/cli': - specifier: ~2 - version: 2.0.3 '@types/file-saver': specifier: ^2.0.7 version: 2.0.7 @@ -212,10 +200,10 @@ importers: version: 0.163.0 '@typescript-eslint/eslint-plugin': specifier: ^8.48.1 - version: 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + version: 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@typescript-eslint/parser': specifier: ^8.48.1 - version: 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + version: 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@vitejs/plugin-react': specifier: ^4.3.2 version: 4.3.2(vite@5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1)) @@ -225,27 +213,39 @@ importers: cross-env: specifier: ^7.0.3 version: 7.0.3 + dmg-license: + specifier: ^1.0.11 + version: 1.0.11 dotenv: specifier: ^16.4.5 version: 16.4.5 + electron: + specifier: ^40.3.0 + version: 40.3.0 + electron-builder: + specifier: ^26.7.0 + version: 26.7.0(electron-builder-squirrel-windows@26.7.0) + electron-vite: + specifier: ^5.0.0 + version: 5.0.0(@swc/core@1.6.5)(vite@5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1)) eslint: specifier: ^9.39.1 - version: 9.39.1(jiti@1.21.6) + version: 9.39.1(jiti@2.6.1) eslint-import-resolver-typescript: specifier: ^3.10.1 - version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.6)) + version: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.6)) + version: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: specifier: ^6.10.2 - version: 6.10.2(eslint@9.39.1(jiti@1.21.6)) + version: 6.10.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.1(jiti@1.21.6)) + version: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^7.0.1 - version: 7.0.1(eslint@9.39.1(jiti@1.21.6)) + version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) globals: specifier: ^15.10.0 version: 15.10.0 @@ -269,7 +269,7 @@ importers: version: 3.4.14(ts-node@9.1.1(typescript@5.6.3)) typescript-eslint: specifier: ^8.46.2 - version: 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) vite: specifier: ^5.4.8 version: 5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1) @@ -289,6 +289,9 @@ importers: packages: + 7zip-bin@5.2.0: + resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -305,6 +308,10 @@ packages: resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.24.7': resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} @@ -313,6 +320,10 @@ packages: resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.24.7': resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} @@ -321,6 +332,10 @@ packages: resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} engines: {node: '>=6.9.0'} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.24.7': resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} @@ -329,6 +344,10 @@ packages: resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.24.7': resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} @@ -337,6 +356,10 @@ packages: resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.24.7': resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} @@ -345,6 +368,10 @@ packages: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.24.7': resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} @@ -357,6 +384,10 @@ packages: resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.24.7': resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} @@ -369,10 +400,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-plugin-utils@7.24.7': resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} @@ -393,6 +434,10 @@ packages: resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} @@ -401,6 +446,10 @@ packages: resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.7': resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} @@ -409,6 +458,10 @@ packages: resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.24.7': resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} @@ -417,6 +470,10 @@ packages: resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} @@ -435,6 +492,17 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.24.7': resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} @@ -459,6 +527,10 @@ packages: resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.24.7': resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} @@ -467,6 +539,10 @@ packages: resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.24.7': resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} @@ -475,12 +551,20 @@ packages: resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@clack/core@0.4.1': resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} '@clack/prompts@0.9.1': resolution: {integrity: sha512-JIpyaboYZeWYlyP0H+OoPPxd6nqueG/CmN6ixBiNFsIDHREevjIf0n0Ohh5gr5C8pEDknzgvz+pIJ8dMhzWIeg==} + '@develar/schema-utils@2.6.5': + resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} + engines: {node: '>= 8.9.0'} + '@dword-design/dedent@0.7.0': resolution: {integrity: sha512-OFmAmzKiDUh9m7WRMYcoEOPI7b5tS5hdqQmtKDwF+ZssVJv8a+GHo9VOtFsmlw3h8Roh/9QzFWIsjSFZyQUMdg==} @@ -496,6 +580,46 @@ packages: engines: {node: '>=14'} deprecated: Use lodash and endent + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} + engines: {node: '>=10.12.0'} + hasBin: true + + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true + + '@electron/get@2.0.3': + resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} + engines: {node: '>=12'} + + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} + + '@electron/notarize@2.5.0': + resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} + engines: {node: '>= 10.0.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + + '@electron/rebuild@4.0.3': + resolution: {integrity: sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==} + engines: {node: '>=22.12.0'} + hasBin: true + + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} + hasBin: true + '@emnapi/core@1.7.0': resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==} @@ -511,138 +635,294 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -736,6 +1016,14 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -743,6 +1031,9 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -766,6 +1057,14 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@malept/cross-spawn-promise@2.0.0': + resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} + engines: {node: '>= 12.13.0'} + + '@malept/flatpak-bundler@0.4.0': + resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} + engines: {node: '>= 10.0.0'} + '@mediapipe/tasks-vision@0.10.8': resolution: {integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==} @@ -797,6 +1096,14 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@octokit/endpoint@10.1.4': resolution: {integrity: sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==} engines: {node: '>= 18'} @@ -898,6 +1205,9 @@ packages: resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1146,6 +1456,10 @@ packages: resolution: {integrity: sha512-sYRNiNm4toQGq2BfZSJPdw36em3eQaLu+3NTFpA7Hl4g3Sp2Rt3CYObnW5bxlFEruRhxzvdyB383N9OefVZ6KA==} engines: {node: '>= 14'} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -1231,6 +1545,10 @@ packages: '@swc/types@0.1.9': resolution: {integrity: sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==} + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} @@ -1253,104 +1571,6 @@ packages: peerDependencies: react: ^18.0.0 - '@tauri-apps/api@2.0.2': - resolution: {integrity: sha512-3wSwmG+1kr6WrgAFKK5ijkNFPp8TT3FLj3YHUb5EwMO+3FxX4uWlfSWkeeBy+Kc1RsKzugtYLuuya+98Flj+3w==} - - '@tauri-apps/api@2.6.0': - resolution: {integrity: sha512-hRNcdercfgpzgFrMXWwNDBN0B7vNzOzRepy6ZAmhxi5mDLVPNrTpo9MGg2tN/F7JRugj4d2aF7E1rtPXAHaetg==} - - '@tauri-apps/api@2.9.0': - resolution: {integrity: sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw==} - - '@tauri-apps/cli-darwin-arm64@2.0.3': - resolution: {integrity: sha512-jIsbxGWS+As1ZN7umo90nkql/ZAbrDK0GBT6UsgHSz5zSwwArICsZFFwE1pLZip5yoiV5mn3TGG2c1+v+0puzQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tauri-apps/cli-darwin-x64@2.0.3': - resolution: {integrity: sha512-ROITHtLTA1muyrwgyuwyasmaLCGtT4as/Kd1kerXaSDtFcYrnxiM984ZD0+FDUEDl5BgXtYa/sKKkKQFjgmM0A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.3': - resolution: {integrity: sha512-bQ3EZwCFfrLg/ZQ2I8sLuifSxESz4TP56SleTkKsPtTIZgNnKpM88PRDz4neiRroHVOq8NK0X276qi9LjGcXPw==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tauri-apps/cli-linux-arm64-gnu@2.0.3': - resolution: {integrity: sha512-aLfAA8P9OTErVUk3sATxtXqpAtlfDPMPp4fGjDysEELG/MyekGhmh2k/kG/i32OdPeCfO+Nr37wJksARJKubGw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tauri-apps/cli-linux-arm64-musl@2.0.3': - resolution: {integrity: sha512-I4MVD7nf6lLLRmNQPpe5beEIFM6q7Zkmh77ROA5BNu/+vHNL5kiTMD+bmd10ZL2r753A6pO7AvqkIxcBuIl0tg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tauri-apps/cli-linux-x64-gnu@2.0.3': - resolution: {integrity: sha512-C6Jkx2zZGKkoi+sg5FK9GoH/0EvAaOgrZfF5azV5EALGba46g7VpWcZgp9zFUd7K2IzTi+0OOY8TQ2OVfKZgew==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tauri-apps/cli-linux-x64-musl@2.0.3': - resolution: {integrity: sha512-qi4ghmTfSAl+EEUDwmwI9AJUiOLNSmU1RgiGgcPRE+7A/W+Am9UnxYySAiRbB/gJgTl9sj/pqH5Y9duP1/sqHg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tauri-apps/cli-win32-arm64-msvc@2.0.3': - resolution: {integrity: sha512-UXxHkYmFesC97qVmZre4vY7oDxRDtC2OeKNv0bH+iSnuUp/ROxzJYGyaelnv9Ybvgl4YVqDCnxgB28qMM938TA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tauri-apps/cli-win32-ia32-msvc@2.0.3': - resolution: {integrity: sha512-D+xoaa35RGlkXDpnL5uDTpj29untuC5Wp6bN9snfgFDagD0wnFfC8+2ZQGu16bD0IteWqDI0OSoIXhNvy+F+wg==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@tauri-apps/cli-win32-x64-msvc@2.0.3': - resolution: {integrity: sha512-eWV9XWb4dSYHXl13OtYWLjX1JHphUEkHkkGwJrhr8qFBm7RbxXxQvrsUEprSi51ug/dwJenjJgM4zR8By4htfw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@tauri-apps/cli@2.0.3': - resolution: {integrity: sha512-JwEyhc5BAVpn4E8kxzY/h7+bVOiXQdudR1r3ODMfyyumZBfgIWqpD/WuTcPq6Yjchju1BSS+80jAE/oYwI/RKg==} - engines: {node: '>= 10'} - hasBin: true - - '@tauri-apps/plugin-dialog@2.0.0': - resolution: {integrity: sha512-ApNkejXP2jpPBSifznPPcHTXxu9/YaRW+eJ+8+nYwqp0lLUtebFHG4QhxitM43wwReHE81WAV1DQ/b+2VBftOA==} - - '@tauri-apps/plugin-fs@2.4.1': - resolution: {integrity: sha512-vJlKZVGF3UAFGoIEVT6Oq5L4HGDCD78WmA4uhzitToqYiBKWAvZR61M6zAyQzHqLs0ADemkE4RSy/5sCmZm6ZQ==} - - '@tauri-apps/plugin-http@2.5.0': - resolution: {integrity: sha512-l4M2DUIsOBIMrbj4dJZwrB4mJiB7OA/2Tj3gEbX2fjq5MOpETklJPKfDvzUTDwuq4lIKCKKykz8E8tpOgvi0EQ==} - - '@tauri-apps/plugin-log@2.7.1': - resolution: {integrity: sha512-jdb+o0wxQc8PjnLktgGpOs9Dh1YupaOGDXzO+Y8peA1UZ1ep3eXv4E1oiJ7nIQVN0XUFDDhnn3aBszl8ijhR+A==} - - '@tauri-apps/plugin-opener@2.4.0': - resolution: {integrity: sha512-43VyN8JJtvKWJY72WI/KNZszTpDpzHULFxQs0CJBIYUdCRowQ6Q1feWTDb979N7nldqSuDOaBupZ6wz2nvuWwQ==} - - '@tauri-apps/plugin-os@2.0.0': - resolution: {integrity: sha512-M7hG/nNyQYTJxVG/UhTKhp9mpXriwWzrs9mqDreB8mIgqA3ek5nHLdwRZJWhkKjZrnDT4v9CpA9BhYeplTlAiA==} - - '@tauri-apps/plugin-shell@2.3.0': - resolution: {integrity: sha512-6GIRxO2z64uxPX4CCTuhQzefvCC0ew7HjdBhMALiGw74vFBDY95VWueAHOHgNOMV4UOUAFupyidN9YulTe5xlA==} - - '@tauri-apps/plugin-store@2.4.1': - resolution: {integrity: sha512-ckGSEzZ5Ii4Hf2D5x25Oqnm2Zf9MfDWAzR+volY0z/OOBz6aucPKEY0F649JvQ0Vupku6UJo7ugpGRDOFOunkA==} - '@tweenjs/tween.js@23.1.2': resolution: {integrity: sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==} @@ -1375,6 +1595,9 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/debounce@1.2.4': resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} @@ -1393,6 +1616,9 @@ packages: '@types/file-saver@2.0.7': resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1405,6 +1631,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1417,6 +1646,9 @@ packages: '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/plist@3.0.5': + resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -1438,6 +1670,9 @@ packages: '@types/react@18.3.11': resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1453,9 +1688,15 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} + '@types/webxr@0.5.16': resolution: {integrity: sha512-0E0Cl84FECtzrB4qG19TNTqpunw0F1YF0QZZnFMF6pDw1kNKJtrlTKlVB34stGIsHbZsYQ7H0tNjPfZftkHHoA==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.46.4': resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1686,6 +1927,14 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + engines: {node: '>=10.0.0'} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1705,6 +1954,15 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1742,6 +2000,16 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + app-builder-bin@5.0.0-alpha.12: + resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + + app-builder-lib@26.7.0: + resolution: {integrity: sha512-/UgCD8VrO79Wv8aBNpjMfsS1pIUfIPURoRn0Ik6tMe5avdZF+vQgl/juJgipcMmH3YS0BD573lCdCHyoi84USg==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.7.0 + electron-builder-squirrel-windows: 26.7.0 + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -1811,9 +2079,35 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-exit-hook@2.0.1: + resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} + engines: {node: '>=0.12.0'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -1845,6 +2139,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1855,12 +2153,23 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1878,12 +2187,41 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} + engines: {node: '>=12.0.0'} + + builder-util@26.4.1: + resolution: {integrity: sha512-FlgH43XZ50w3UtS1RVGDWOz8v9qMXPC7upMtKMtBEnYdt1OVoS61NYhKm/4x+cIaWqJTXua0+VVPI+fSPGXNIw==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -1892,6 +2230,10 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + cached-iterable@0.3.0: resolution: {integrity: sha512-MDqM6TpBVebZD4UDtmlFp8EjVtRcsB6xt9aRdWymjk0fWVUUGgmt/V7o0H0gkI2Tkvv8B0ucjidZm4mLosdlWw==} engines: {node: '>=8.9.0'} @@ -1976,9 +2318,28 @@ packages: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chromium-pickle-js@0.2.0: + resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -1988,6 +2349,14 @@ packages: engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -2004,6 +2373,13 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -2020,6 +2396,10 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2027,6 +2407,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2034,18 +2418,44 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + compare-version@0.1.2: + resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} + engines: {node: '>=0.10.0'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@9.2.1: + resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} + engines: {node: '>=18'} + hasBin: true + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} convert@5.13.1: resolution: {integrity: sha512-LB7K75X/D7Xp9ZYhNrjcny8kr+xzlDcw/KK6lccXrHhxvr2E/LO/UtlYRZRdpAVb9xe5uEBY++uish8Rz5+9IQ==} + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + crc@3.8.0: + resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -2097,6 +2507,12 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} @@ -2153,6 +2569,17 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -2165,6 +2592,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -2173,6 +2604,10 @@ packages: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2185,6 +2620,13 @@ packages: engines: {node: '>=0.10'} hasBin: true + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -2195,13 +2637,29 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + dir-compare@4.2.0: + resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dmg-builder@26.7.0: + resolution: {integrity: sha512-uOOBA3f+kW3o4KpSoMQ6SNpdXU7WtxlJRb9vCZgOvqhTz4b3GjcoWKstdisizNZLsylhTMv8TLHFPFW0Uxsj/g==} + + dmg-license@1.0.11: + resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} + engines: {node: '>=8'} + os: [darwin] + hasBin: true + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -2223,12 +2681,48 @@ packages: resolution: {integrity: sha512-uW2UKSsuty9ANJ3YByIQE4ANkD8nqUPO7r6Fwcc1ADKPe9FRdcPpMl3VEput4JSvKBJ4J86npIC2MLP0pYkCuw==} hasBin: true + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-builder-squirrel-windows@26.7.0: + resolution: {integrity: sha512-3EqkQK+q0kGshdPSKEPb2p5F75TENMKu6Fe5aTdeaPfdzFK4Yjp5L0d6S7K8iyvqIsGQ/ei4bnpyX9wt+kVCKQ==} + + electron-builder@26.7.0: + resolution: {integrity: sha512-LoXbCvSFxLesPneQ/fM7FB4OheIDA2tjqCdUkKlObV5ZKGhYgi5VHPHO/6UUOUodAlg7SrkPx7BZJPby+Vrtbg==} + engines: {node: '>=14.0.0'} + hasBin: true + + electron-publish@26.6.0: + resolution: {integrity: sha512-LsyHMMqbvJ2vsOvuWJ19OezgF2ANdCiHpIucDHNiLhuI+/F3eW98ouzWSRmXXi82ZOPZXC07jnIravY4YYwCLQ==} + electron-to-chromium@1.4.803: resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==} electron-to-chromium@1.5.41: resolution: {integrity: sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==} + electron-vite@5.0.0: + resolution: {integrity: sha512-OHp/vjdlubNlhNkPkL/+3JD34ii5ov7M0GpuXEVdQeqdQ3ulvVR7Dg/rNBLfS5XPIFwgoBLDf9sjjrL+CuDyRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@swc/core': ^1.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@swc/core': + optional: true + + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} + + electron@40.3.0: + resolution: {integrity: sha512-ZaDkTZpNHr863tyZHieoqbaiLI0e3RVCXoEC5y1Ld70/Q5H1mPV9d5TK0h1dWtaSFVOW0w8iDvtdLwAXtasXpg==} + engines: {node: '>= 12.20.55'} + hasBin: true + emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -2238,13 +2732,23 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} @@ -2303,6 +2807,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -2311,6 +2818,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -2455,12 +2967,27 @@ packages: exenv@1.2.2: resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + extsprintf@1.4.1: + resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} + engines: {'0': node >=0.6.0} + fast-content-type-parse@2.0.1: resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-copy@4.0.2: + resolution: {integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2486,6 +3013,9 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -2505,6 +3035,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2548,6 +3081,10 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -2555,6 +3092,26 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2638,11 +3195,21 @@ packages: glob@10.4.1: resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} @@ -2677,6 +3244,10 @@ packages: peerDependencies: got: ^12.0.0 + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} @@ -2739,6 +3310,9 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hermes-estree@0.25.1: resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} @@ -2754,15 +3328,27 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + http2-client@1.3.5: resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -2771,6 +3357,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} @@ -2787,6 +3377,15 @@ packages: hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + iconv-corefoundation@1.1.7: + resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} + engines: {node: ^8.11.2 || >=10} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2815,6 +3414,13 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} @@ -2829,6 +3435,10 @@ packages: intl-pluralrules@2.0.1: resolution: {integrity: sha512-astxTLzIdXPeN0K9Rumi6LfMpm3rvNO0iJE+h/k8Kr/is+wPbRe4ikyDjlLr6VTh/mEfNv8RjN+gu3KwDiuhqg==} + ip-address@10.1.0: + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} + ip-num@1.5.1: resolution: {integrity: sha512-QziFxgxq3mjIf5CuwlzXFYscHxgLqdEdJKRo2UJ5GurL5zrSRMzT/O+nK0ABimoFH8MWF8YwIiwECYsHc1LpUQ==} @@ -2915,6 +3525,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2949,6 +3564,19 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -3028,6 +3656,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3047,12 +3679,28 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -3066,10 +3714,23 @@ packages: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jotai@2.12.2: resolution: {integrity: sha512-oN8715y7MkjXlSrpyjlR887TOuc/NLZMs9gvgtfWH/JP47ChwO0lR2ijSwBvPMYyXRAPT+liIAhuBavluKGgtA==} engines: {node: '>=12.20.0'} @@ -3082,6 +3743,10 @@ packages: react: optional: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3111,6 +3776,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -3120,6 +3788,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -3141,6 +3812,9 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + lazy-val@1.0.5: + resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3188,6 +3862,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -3199,6 +3877,10 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3210,12 +3892,19 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + maath@0.10.7: resolution: {integrity: sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==} peerDependencies: '@types/three': '>=0.144.0' three: '>=0.144.0' + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} @@ -3223,9 +3912,17 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + matchmediaquery@0.4.2: resolution: {integrity: sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==} @@ -3385,6 +4082,19 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3397,6 +4107,10 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -3409,9 +4123,17 @@ packages: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true + minimatch@10.2.0: + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -3423,6 +4145,30 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} @@ -3431,6 +4177,14 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -3453,9 +4207,23 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-abi@4.26.0: + resolution: {integrity: sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==} + engines: {node: '>=22.12.0'} + + node-addon-api@1.7.2: + resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + node-fetch-h2@2.3.0: resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} engines: {node: 4.x || >=6.0.0} @@ -3469,6 +4237,11 @@ packages: encoding: optional: true + node-gyp@11.5.0: + resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + node-readfiles@0.2.0: resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} @@ -3478,6 +4251,11 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3486,6 +4264,10 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} @@ -3568,6 +4350,10 @@ packages: objectorarray@1.0.5: resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3583,6 +4369,10 @@ packages: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -3594,10 +4384,18 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} @@ -3618,6 +4416,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + engines: {node: '>=18'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -3646,6 +4448,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3661,11 +4467,18 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + pegjs@0.10.0: resolution: {integrity: sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==} engines: {node: '>=0.10'} hasBin: true + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -3689,6 +4502,23 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + + pino-pretty@13.1.3: + resolution: {integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==} + hasBin: true + + pino-roll@4.0.0: + resolution: {integrity: sha512-axI1aQaIxXdw1F4OFFli1EDxIrdYNGLowkw/ZoZogX8oCSLHUghzwVVXUS8U+xD/Savwa5IXpiXmsSGKFX/7Sg==} + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -3697,6 +4527,10 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + plist@3.1.0: + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3754,9 +4588,18 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + potpack@1.0.2: resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3766,10 +4609,21 @@ packages: engines: {node: '>=14'} hasBin: true + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + promise-worker-transferable@1.0.4: resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} @@ -3780,6 +4634,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + property-expr@2.0.6: resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} @@ -3799,6 +4656,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -3889,9 +4749,17 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-binary-file-arch@1.0.6: + resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} + hasBin: true + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3900,6 +4768,10 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -3942,6 +4814,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + reselect@4.1.8: resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} @@ -3963,14 +4839,25 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3978,6 +4865,15 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + rollup-plugin-visualizer@5.12.0: resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} engines: {node: '>=14'} @@ -3993,9 +4889,16 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -4004,6 +4907,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -4016,17 +4922,41 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + sass@1.80.2: resolution: {integrity: sha512-9wXY8cGBlUmoUoT+vwOZOFCiS+naiWVjqlreN9ar9PudXbGwlMTFwCR5K9kB4dFumJ6ib98wZyAObJKsWf1nAA==} engines: {node: '>=14.0.0'} hasBin: true + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + scheduler@0.21.0: resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4041,6 +4971,10 @@ packages: engines: {node: '>=10'} hasBin: true + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4064,6 +4998,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + should-equal@2.0.0: resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} @@ -4109,6 +5047,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -4116,6 +5058,10 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -4124,6 +5070,21 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -4164,9 +5125,24 @@ packages: spdx-satisfies@5.0.1: resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} + stats-gl@2.2.8: resolution: {integrity: sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==} @@ -4224,6 +5200,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -4251,6 +5230,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} @@ -4259,6 +5242,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + sumchecker@3.0.1: + resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} + engines: {node: '>= 8.0'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -4267,6 +5254,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -4288,6 +5279,17 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + + temp-file@3.4.0: + resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} + terser@5.31.1: resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} engines: {node: '>=10'} @@ -4300,6 +5302,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@4.0.0: + resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} + engines: {node: '>=20'} + three-mesh-bvh@0.7.8: resolution: {integrity: sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==} deprecated: Deprecated due to three.js version incompatibility. Please use v0.8.0, instead. @@ -4314,6 +5320,9 @@ packages: three@0.163.0: resolution: {integrity: sha512-HlMgCb2TF/dTLRtknBnjUTsR8FsDqBY43itYop2+Zg822I+Kd0Ua2vs8CvfBVefXkBdNDrLMoRTGCIIpfCuDew==} + tiny-async-pool@1.3.0: + resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} + tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} @@ -4324,6 +5333,13 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -4338,6 +5354,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4357,6 +5377,9 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -4401,6 +5424,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -4477,6 +5504,14 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -4495,6 +5530,10 @@ packages: universal-user-agent@7.0.3: resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -4530,6 +5569,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4545,6 +5587,10 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + verror@1.10.1: + resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} + engines: {node: '>=0.6.0'} + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -4585,6 +5631,9 @@ packages: warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + webgl-constants@1.1.1: resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} @@ -4636,6 +5685,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -4655,6 +5709,14 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + xmlbuilder@15.1.1: + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4662,6 +5724,13 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -4692,6 +5761,9 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -4741,6 +5813,8 @@ packages: snapshots: + 7zip-bin@5.2.0: {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -4758,10 +5832,18 @@ snapshots: '@babel/highlight': 7.25.7 picocolors: 1.0.1 + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.24.7': {} '@babel/compat-data@7.25.8': {} + '@babel/compat-data@7.29.0': {} + '@babel/core@7.24.7': dependencies: '@ampproject/remapping': 2.3.0 @@ -4802,6 +5884,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.24.7': dependencies: '@babel/types': 7.24.7 @@ -4816,6 +5918,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.0.2 + '@babel/helper-compilation-targets@7.24.7': dependencies: '@babel/compat-data': 7.24.7 @@ -4832,23 +5942,33 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.0 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.8 '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + '@babel/template': 7.25.7 + '@babel/types': 7.25.8 + + '@babel/helper-globals@7.28.0': {} '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.8 '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color @@ -4859,6 +5979,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': dependencies: '@babel/core': 7.24.7 @@ -4880,12 +6007,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-plugin-utils@7.24.7': {} + '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 + '@babel/traverse': 7.25.7 + '@babel/types': 7.25.8 transitivePeerDependencies: - supports-color @@ -4898,20 +6036,26 @@ snapshots: '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.24.7 + '@babel/types': 7.25.8 '@babel/helper-string-parser@7.24.7': {} '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.24.7': {} '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-option@7.24.7': {} '@babel/helper-validator-option@7.25.7': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helpers@7.24.7': dependencies: '@babel/template': 7.24.7 @@ -4922,19 +6066,24 @@ snapshots: '@babel/template': 7.25.7 '@babel/types': 7.25.8 + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.1 '@babel/highlight@7.25.7': dependencies: '@babel/helper-validator-identifier': 7.25.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.1 '@babel/parser@7.24.7': dependencies: @@ -4944,6 +6093,15 @@ snapshots: dependencies: '@babel/types': 7.25.8 + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 @@ -4970,6 +6128,12 @@ snapshots: '@babel/parser': 7.25.8 '@babel/types': 7.25.8 + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@babel/traverse@7.24.7': dependencies: '@babel/code-frame': 7.24.7 @@ -4997,6 +6161,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.24.7': dependencies: '@babel/helper-string-parser': 7.24.7 @@ -5009,6 +6185,11 @@ snapshots: '@babel/helper-validator-identifier': 7.25.7 to-fast-properties: 2.0.0 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@clack/core@0.4.1': dependencies: picocolors: 1.1.1 @@ -5020,6 +6201,11 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 + '@develar/schema-utils@2.6.5': + dependencies: + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + '@dword-design/dedent@0.7.0': dependencies: babel-plugin-add-module-exports: 1.0.4 @@ -5047,6 +6233,106 @@ snapshots: lodash: 4.17.21 tinycolor2: 1.6.0 + '@electron/asar@3.4.1': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + + '@electron/fuses@1.8.0': + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + + '@electron/get@2.0.3': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.5.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/rebuild@4.0.3': + dependencies: + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + detect-libc: 2.1.2 + got: 11.8.6 + graceful-fs: 4.2.11 + node-abi: 4.26.0 + node-api-version: 0.2.1 + node-gyp: 11.5.0 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.3 + tar: 7.5.7 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@electron/universal@2.0.3': + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.3 + dir-compare: 4.2.0 + fs-extra: 11.3.3 + minimatch: 9.0.4 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/windows-sign@1.2.2': + dependencies: + cross-dirname: 0.1.0 + debug: 4.4.3 + fs-extra: 11.3.3 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 + transitivePeerDependencies: + - supports-color + optional: true + '@emnapi/core@1.7.0': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -5066,75 +6352,153 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-x64@0.21.5': optional: true + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@1.21.6))': + '@esbuild/win32-x64@0.25.12': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.1': {} @@ -5225,11 +6589,16 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 - optional: true '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -5237,6 +6606,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -5249,19 +6623,30 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/sourcemap-codec@1.5.5': - optional: true + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - optional: true + + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.3 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color '@mediapipe/tasks-vision@0.10.8': {} @@ -5303,6 +6688,20 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.2.2 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.3 + '@octokit/endpoint@10.1.4': dependencies: '@octokit/types': 14.1.0 @@ -5326,7 +6725,7 @@ snapshots: dependencies: '@octokit/openapi-types': 25.1.0 - '@openapi-codegen/cli@3.1.0': + '@openapi-codegen/cli@3.1.0(encoding@0.1.13)': dependencies: '@clack/prompts': 0.9.1 '@octokit/request': 9.2.4 @@ -5341,7 +6740,7 @@ snapshots: openapi3-ts: 2.0.2 prettier: 3.3.3 slash: 4.0.0 - swagger2openapi: 7.0.8 + swagger2openapi: 7.0.8(encoding@0.1.13) tslib: 2.6.3 typanion: 3.14.0 typescript: 5.7.3 @@ -5415,6 +6814,8 @@ snapshots: '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -5588,11 +6989,11 @@ snapshots: '@sentry-internal/replay-canvas': 10.29.0 '@sentry/core': 10.29.0 - '@sentry/bundler-plugin-core@2.22.7': + '@sentry/bundler-plugin-core@2.22.7(encoding@0.1.13)': dependencies: '@babel/core': 7.25.8 '@sentry/babel-plugin-component-annotate': 2.22.7 - '@sentry/cli': 2.39.1 + '@sentry/cli': 2.39.1(encoding@0.1.13) dotenv: 16.4.5 find-up: 5.0.0 glob: 9.3.5 @@ -5623,10 +7024,10 @@ snapshots: '@sentry/cli-win32-x64@2.39.1': optional: true - '@sentry/cli@2.39.1': + '@sentry/cli@2.39.1(encoding@0.1.13)': dependencies: https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 @@ -5651,21 +7052,23 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 - '@sentry/vite-plugin@2.22.7': + '@sentry/vite-plugin@2.22.7(encoding@0.1.13)': dependencies: - '@sentry/bundler-plugin-core': 2.22.7 + '@sentry/bundler-plugin-core': 2.22.7(encoding@0.1.13) unplugin: 1.0.1 transitivePeerDependencies: - encoding - supports-color + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/is@5.6.0': {} - '@stylistic/eslint-plugin@5.5.0(eslint@9.39.1(jiti@1.21.6))': + '@stylistic/eslint-plugin@5.5.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/types': 8.46.4 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -5723,6 +7126,10 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + '@szmarczak/http-timer@5.0.1': dependencies: defer-to-connect: 2.0.1 @@ -5747,87 +7154,6 @@ snapshots: '@tanstack/query-core': 5.48.0 react: 18.3.1 - '@tauri-apps/api@2.0.2': {} - - '@tauri-apps/api@2.6.0': {} - - '@tauri-apps/api@2.9.0': {} - - '@tauri-apps/cli-darwin-arm64@2.0.3': - optional: true - - '@tauri-apps/cli-darwin-x64@2.0.3': - optional: true - - '@tauri-apps/cli-linux-arm-gnueabihf@2.0.3': - optional: true - - '@tauri-apps/cli-linux-arm64-gnu@2.0.3': - optional: true - - '@tauri-apps/cli-linux-arm64-musl@2.0.3': - optional: true - - '@tauri-apps/cli-linux-x64-gnu@2.0.3': - optional: true - - '@tauri-apps/cli-linux-x64-musl@2.0.3': - optional: true - - '@tauri-apps/cli-win32-arm64-msvc@2.0.3': - optional: true - - '@tauri-apps/cli-win32-ia32-msvc@2.0.3': - optional: true - - '@tauri-apps/cli-win32-x64-msvc@2.0.3': - optional: true - - '@tauri-apps/cli@2.0.3': - optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.0.3 - '@tauri-apps/cli-darwin-x64': 2.0.3 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.3 - '@tauri-apps/cli-linux-arm64-gnu': 2.0.3 - '@tauri-apps/cli-linux-arm64-musl': 2.0.3 - '@tauri-apps/cli-linux-x64-gnu': 2.0.3 - '@tauri-apps/cli-linux-x64-musl': 2.0.3 - '@tauri-apps/cli-win32-arm64-msvc': 2.0.3 - '@tauri-apps/cli-win32-ia32-msvc': 2.0.3 - '@tauri-apps/cli-win32-x64-msvc': 2.0.3 - - '@tauri-apps/plugin-dialog@2.0.0': - dependencies: - '@tauri-apps/api': 2.0.2 - - '@tauri-apps/plugin-fs@2.4.1': - dependencies: - '@tauri-apps/api': 2.6.0 - - '@tauri-apps/plugin-http@2.5.0': - dependencies: - '@tauri-apps/api': 2.6.0 - - '@tauri-apps/plugin-log@2.7.1': - dependencies: - '@tauri-apps/api': 2.9.0 - - '@tauri-apps/plugin-opener@2.4.0': - dependencies: - '@tauri-apps/api': 2.6.0 - - '@tauri-apps/plugin-os@2.0.0': - dependencies: - '@tauri-apps/api': 2.0.2 - - '@tauri-apps/plugin-shell@2.3.0': - dependencies: - '@tauri-apps/api': 2.6.0 - - '@tauri-apps/plugin-store@2.4.1': - dependencies: - '@tauri-apps/api': 2.9.0 - '@tweenjs/tween.js@23.1.2': {} '@tweenjs/tween.js@25.0.0': {} @@ -5860,6 +7186,13 @@ snapshots: dependencies: '@babel/types': 7.24.7 + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 24.10.0 + '@types/responselike': 1.0.3 + '@types/debounce@1.2.4': {} '@types/debug@4.1.12': @@ -5876,6 +7209,10 @@ snapshots: '@types/file-saver@2.0.7': {} + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 24.10.0 + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -5886,6 +7223,10 @@ snapshots: '@types/json5@0.0.29': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 24.10.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5898,6 +7239,11 @@ snapshots: '@types/offscreencanvas@2019.7.3': {} + '@types/plist@3.0.5': + dependencies: + '@types/node': 24.10.0 + xmlbuilder: 15.1.1 + '@types/prop-types@15.7.12': {} '@types/react-dom@18.3.0': @@ -5925,6 +7271,10 @@ snapshots: '@types/prop-types': 15.7.12 csstype: 3.1.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 24.10.0 + '@types/semver@7.5.8': {} '@types/stats.js@0.17.3': {} @@ -5941,17 +7291,24 @@ snapshots: '@types/unist@3.0.3': {} + '@types/verror@1.10.11': {} + '@types/webxr@0.5.16': {} - '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 24.10.0 + optional: true + + '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.46.4 - '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.46.4 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -5960,15 +7317,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.48.1 - '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.48.1 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -5977,26 +7334,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.4 '@typescript-eslint/types': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.46.4 debug: 4.3.7 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.48.1 '@typescript-eslint/types': 8.48.1 '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.48.1 debug: 4.4.3 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -6037,25 +7394,25 @@ snapshots: dependencies: typescript: 5.6.3 - '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.6.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) debug: 4.3.7 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.48.1 '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) debug: 4.4.3 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: @@ -6096,24 +7453,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.46.4 '@typescript-eslint/types': 8.46.4 '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.6.3) - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3)': + '@typescript-eslint/utils@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.48.1 '@typescript-eslint/types': 8.48.1 '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.6.3) - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -6207,6 +7564,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@xmldom/xmldom@0.8.11': {} + + abbrev@3.0.1: {} + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -6221,6 +7582,12 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6260,6 +7627,51 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + app-builder-bin@5.0.0-alpha.12: {} + + app-builder-lib@26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.3 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.7.0) + dotenv: 16.4.5 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.7.0(dmg-builder@26.7.0) + electron-publish: 26.6.0 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.7 + jiti: 2.6.1 + js-yaml: 4.1.0 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.2.0 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.3 + tar: 7.5.7 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + arg@4.1.3: {} arg@5.0.2: {} @@ -6376,8 +7788,22 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + assert-plus@1.0.0: {} + ast-types-flow@0.0.8: {} + astral-regex@2.0.0: {} + + async-exit-hook@2.0.1: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atomic-sleep@1.0.0: {} + autoprefixer@10.4.20(postcss@8.4.38): dependencies: browserslist: 4.24.0 @@ -6410,6 +7836,10 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + base64-js@1.5.1: {} bidi-js@1.0.3: @@ -6418,6 +7848,15 @@ snapshots: binary-extensions@2.3.0: {} + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolean@3.2.0: + optional: true + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -6427,6 +7866,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -6447,13 +7890,71 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) + buffer-crc32@0.2.13: {} + buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + builder-util-runtime@9.5.1: + dependencies: + debug: 4.4.3 + sax: 1.4.4 + transitivePeerDependencies: + - supports-color + + builder-util@26.4.1: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.0 + sanitize-filename: 1.6.3 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + cac@6.7.14: {} + + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.1 + lru-cache: 10.2.2 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.4 + ssri: 12.0.0 + tar: 7.5.7 + unique-filename: 4.0.0 + + cacheable-lookup@5.0.4: {} + cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -6466,6 +7967,16 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + cached-iterable@0.3.0: {} call-bind-apply-helpers@1.0.2: @@ -6553,8 +8064,20 @@ snapshots: dependencies: readdirp: 4.0.2 + chownr@3.0.0: {} + + chromium-pickle-js@0.2.0: {} + + ci-info@4.3.1: {} + + ci-info@4.4.0: {} + classnames@2.5.1: {} + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -6568,6 +8091,13 @@ snapshots: parse5-htmlparser2-tree-adapter: 6.0.1 yargs: 16.2.0 + cli-spinners@2.9.2: {} + + cli-truncate@2.1.0: + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -6589,6 +8119,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -6603,23 +8139,54 @@ snapshots: colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + comma-separated-tokens@2.0.3: {} commander@12.1.0: {} + commander@14.0.3: {} + commander@2.20.3: optional: true commander@4.1.1: {} + commander@5.1.0: {} + + commander@9.5.0: + optional: true + + compare-version@0.1.2: {} + concat-map@0.0.1: {} + concurrently@9.2.1: + dependencies: + chalk: 4.1.2 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + convert-source-map@2.0.0: {} convert@5.13.1: {} + core-util-is@1.0.2: {} + + crc@3.8.0: + dependencies: + buffer: 5.7.1 + create-require@1.1.1: {} + cross-dirname@0.1.0: + optional: true + cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 @@ -6680,6 +8247,10 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-fns@4.1.0: {} + + dateformat@4.6.3: {} + debounce@1.2.1: {} debug@3.2.7: @@ -6731,6 +8302,17 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -6741,6 +8323,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -6749,6 +8333,8 @@ snapshots: delay@5.0.0: {} + delayed-stream@1.0.0: {} + dequal@2.0.3: {} detect-gpu@5.0.38: @@ -6757,6 +8343,11 @@ snapshots: detect-libc@1.0.3: {} + detect-libc@2.1.2: {} + + detect-node@2.1.0: + optional: true + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -6765,12 +8356,45 @@ snapshots: diff@4.0.2: {} + dir-compare@4.2.0: + dependencies: + minimatch: 3.1.2 + p-limit: 3.1.0 + dlv@1.1.3: {} + dmg-builder@26.7.0(electron-builder-squirrel-windows@26.7.0): + dependencies: + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0) + builder-util: 26.4.1 + fs-extra: 10.1.0 + iconv-lite: 0.6.3 + js-yaml: 4.1.0 + optionalDependencies: + dmg-license: 1.0.11 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + dmg-license@1.0.11: + dependencies: + '@types/plist': 3.0.5 + '@types/verror': 1.10.11 + ajv: 6.12.6 + crc: 3.8.0 + iconv-corefoundation: 1.1.7 + plist: 3.1.0 + smart-buffer: 4.2.0 + verror: 1.10.1 + doctrine@2.1.0: dependencies: esutils: 2.0.3 + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.4.5 + dotenv@16.4.5: {} draco3d@1.5.7: {} @@ -6787,22 +8411,107 @@ snapshots: ebnf@1.9.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + + electron-builder-squirrel-windows@26.7.0(dmg-builder@26.7.0): + dependencies: + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0) + builder-util: 26.4.1 + electron-winstaller: 5.4.0 + transitivePeerDependencies: + - dmg-builder + - supports-color + + electron-builder@26.7.0(electron-builder-squirrel-windows@26.7.0): + dependencies: + app-builder-lib: 26.7.0(dmg-builder@26.7.0)(electron-builder-squirrel-windows@26.7.0) + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + ci-info: 4.4.0 + dmg-builder: 26.7.0(electron-builder-squirrel-windows@26.7.0) + fs-extra: 10.1.0 + lazy-val: 1.0.5 + simple-update-notifier: 2.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + + electron-publish@26.6.0: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 26.4.1 + builder-util-runtime: 9.5.1 + chalk: 4.1.2 + form-data: 4.0.5 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-to-chromium@1.4.803: {} electron-to-chromium@1.5.41: {} + electron-vite@5.0.0(@swc/core@1.6.5)(vite@5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1)): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + cac: 6.7.14 + esbuild: 0.25.12 + magic-string: 0.30.21 + picocolors: 1.1.1 + vite: 5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1) + optionalDependencies: + '@swc/core': 1.6.5 + transitivePeerDependencies: + - supports-color + + electron-winstaller@5.4.0: + dependencies: + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.17.21 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 + transitivePeerDependencies: + - supports-color + + electron@40.3.0: + dependencies: + '@electron/get': 2.0.3 + '@types/node': 24.10.0 + extract-zip: 2.0.1 + transitivePeerDependencies: + - supports-color + emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 + env-paths@2.2.1: {} + environment@1.1.0: {} + err-code@2.0.3: {} + es-abstract@1.23.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -6989,6 +8698,9 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 + es6-error@4.1.1: + optional: true + es6-promise@3.3.1: {} esbuild@0.21.5: @@ -7017,6 +8729,35 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + escalade@3.1.2: {} escalade@3.2.0: {} @@ -7035,33 +8776,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.6)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.6)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.6)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.39.1(jiti@1.21.6) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) + eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.6)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -7070,9 +8811,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.6)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -7084,13 +8825,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': 8.48.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@1.21.6)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.1(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -7100,7 +8841,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -7109,18 +8850,18 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@1.21.6)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): dependencies: '@babel/core': 7.25.8 '@babel/parser': 7.25.8 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.1.13 zod-validation-error: 4.0.2(zod@4.1.13) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@1.21.6)): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -7128,7 +8869,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.1(jiti@1.21.6) + eslint: 9.39.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -7151,9 +8892,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1(jiti@1.21.6): + eslint@9.39.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 @@ -7188,7 +8929,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.6 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -7240,10 +8981,26 @@ snapshots: exenv@1.2.2: {} + exponential-backoff@3.1.3: {} + extend@3.0.2: {} + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + extsprintf@1.4.1: {} + fast-content-type-parse@2.0.1: {} + fast-copy@4.0.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.2: @@ -7268,6 +9025,10 @@ snapshots: dependencies: reusify: 1.0.4 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -7280,6 +9041,10 @@ snapshots: dependencies: flat-cache: 4.0.1 + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7324,6 +9089,14 @@ snapshots: form-data-encoder@2.1.4: {} + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + fraction.js@4.3.7: {} fs-extra@10.1.0: @@ -7332,6 +9105,35 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.3.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -7436,6 +9238,15 @@ snapshots: minipass: 7.1.2 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + glob@9.3.5: dependencies: fs.realpath: 1.0.0 @@ -7443,6 +9254,16 @@ snapshots: minipass: 4.2.8 path-scurry: 1.11.1 + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.3 + serialize-error: 7.0.1 + optional: true + globals@11.12.0: {} globals@14.0.0: {} @@ -7466,6 +9287,20 @@ snapshots: dependencies: got: 12.6.1 + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + got@12.6.1: dependencies: '@sindresorhus/is': 5.6.0 @@ -7544,6 +9379,8 @@ snapshots: dependencies: '@types/hast': 3.0.4 + help-me@5.0.0: {} + hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -7558,12 +9395,28 @@ snapshots: dependencies: react-is: 16.13.1 + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + html-url-attributes@3.0.1: {} http-cache-semantics@4.1.1: {} + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + http2-client@1.3.5: {} + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -7576,6 +9429,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@1.1.1: {} human-signals@5.0.0: {} @@ -7584,6 +9444,15 @@ snapshots: hyphenate-style-name@1.1.0: {} + iconv-corefoundation@1.1.7: + dependencies: + cli-truncate: 2.1.0 + node-addon-api: 1.7.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.1: {} @@ -7604,6 +9473,13 @@ snapshots: imurmurhash@0.1.4: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + inline-style-parser@0.2.4: {} internal-slot@1.0.7: @@ -7620,6 +9496,8 @@ snapshots: intl-pluralrules@2.0.1: {} + ip-address@10.1.0: {} + ip-num@1.5.1: {} is-alphabetical@2.0.1: {} @@ -7712,6 +9590,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -7740,6 +9620,14 @@ snapshots: is-hexadecimal@2.0.1: {} + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -7812,6 +9700,8 @@ snapshots: dependencies: which-typed-array: 1.1.19 + is-unicode-supported@0.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: @@ -7831,10 +9721,20 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@2.0.5: {} + isbinaryfile@4.0.10: {} + + isbinaryfile@5.0.7: {} + isexe@2.0.0: {} + isexe@3.1.5: {} + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -7855,13 +9755,27 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.4 + picocolors: 1.1.1 + jiti@1.21.6: {} + jiti@2.6.1: {} + jotai@2.12.2(@types/react@18.3.11)(react@18.3.1): optionalDependencies: '@types/react': 18.3.11 react: 18.3.1 + joycon@3.1.1: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -7880,12 +9794,19 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: + optional: true + json5@1.0.2: dependencies: minimist: 1.2.8 json5@2.2.3: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -7911,6 +9832,8 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + lazy-val@1.0.5: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7967,6 +9890,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 @@ -7981,6 +9909,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + lowercase-keys@2.0.0: {} + lowercase-keys@3.0.0: {} lru-cache@10.2.2: {} @@ -7989,19 +9919,48 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + maath@0.10.7(@types/three@0.163.0)(three@0.163.0): dependencies: '@types/three': 0.163.0 three: 0.163.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 make-error@1.3.6: {} + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.1.1 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + markdown-table@3.0.4: {} + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + optional: true + matchmediaquery@0.4.2: dependencies: css-mediaquery: 0.1.2 @@ -8343,7 +10302,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -8372,22 +10331,40 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} mimic-function@5.0.1: {} + mimic-response@1.0.1: {} + mimic-response@3.1.0: {} mimic-response@4.0.0: {} mini-svg-data-uri@1.4.4: {} + minimatch@10.2.0: + dependencies: + brace-expansion: 5.0.2 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 @@ -8398,10 +10375,46 @@ snapshots: minimist@1.2.8: {} + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + minipass@4.2.8: {} minipass@7.1.2: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + ms@2.1.2: {} ms@2.1.3: {} @@ -8418,15 +10431,44 @@ snapshots: natural-compare@1.4.0: {} + negotiator@1.0.0: {} + + node-abi@4.26.0: + dependencies: + semver: 7.7.3 + + node-addon-api@1.7.2: {} + node-addon-api@7.1.1: {} + node-api-version@0.2.1: + dependencies: + semver: 7.7.3 + node-fetch-h2@2.3.0: dependencies: http2-client: 1.3.5 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-gyp@11.5.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + tar: 7.5.7 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color node-readfiles@0.2.0: dependencies: @@ -8436,10 +10478,16 @@ snapshots: node-releases@2.0.18: {} + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} + normalize-url@6.1.0: {} + normalize-url@8.0.1: {} npm-run-path@4.0.1: @@ -8547,6 +10595,8 @@ snapshots: objectorarray@1.0.5: {} + on-exit-leak-free@2.1.2: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -8563,6 +10613,15 @@ snapshots: dependencies: mimic-function: 5.0.1 + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -8582,12 +10641,26 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-cancelable@2.1.1: {} + p-cancelable@3.0.0: {} p-limit@2.3.0: @@ -8606,6 +10679,8 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map@7.0.4: {} + p-try@2.2.0: {} parent-module@1.0.1: @@ -8635,6 +10710,8 @@ snapshots: path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -8646,8 +10723,12 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.2 + pe-library@0.4.1: {} + pegjs@0.10.0: {} + pend@1.2.0: {} + picocolors@1.0.1: {} picocolors@1.1.1: {} @@ -8660,12 +10741,59 @@ snapshots: pify@2.3.0: {} + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 + + pino-pretty@13.1.3: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 4.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pump: 3.0.0 + secure-json-parse: 4.1.0 + sonic-boom: 4.2.1 + strip-json-comments: 5.0.3 + + pino-roll@4.0.0: + dependencies: + date-fns: 4.1.0 + sonic-boom: 4.2.1 + + pino-std-serializers@7.1.0: {} + + pino@10.3.1: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 4.0.0 + pirates@4.0.6: {} pkg-up@3.1.0: dependencies: find-up: 3.0.0 + plist@3.1.0: + dependencies: + '@xmldom/xmldom': 0.8.11 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 + pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} @@ -8719,14 +10847,30 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true + potpack@1.0.2: {} + powershell-utils@0.1.0: {} + prelude-ls@1.2.1: {} prettier@3.3.3: {} + proc-log@5.0.0: {} + + process-warning@5.0.0: {} + progress@2.0.3: {} + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + promise-worker-transferable@1.0.4: dependencies: is-promise: 2.2.2 @@ -8743,6 +10887,12 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + property-expr@2.0.6: {} property-information@6.5.0: {} @@ -8758,6 +10908,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} react-composer@5.0.3(react@18.3.1): @@ -8856,16 +11008,30 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-binary-file-arch@1.0.6: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + read-cache@1.0.0: dependencies: pify: 2.3.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 readdirp@4.0.2: {} + real-require@0.2.0: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -8945,6 +11111,10 @@ snapshots: require-from-string@2.0.2: {} + resedit@1.7.2: + dependencies: + pe-library: 0.4.1 + reselect@4.1.8: {} resolve-alpn@1.2.1: {} @@ -8965,19 +11135,44 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + responselike@3.0.0: dependencies: lowercase-keys: 3.0.0 + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 + retry@0.12.0: {} + reusify@1.0.4: {} rfdc@1.4.1: {} + rimraf@2.6.3: + dependencies: + glob: 7.2.3 + + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + optional: true + rollup-plugin-visualizer@5.12.0(rollup@4.24.0): dependencies: open: 8.4.2 @@ -9009,10 +11204,16 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 + run-applescript@7.1.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.2: + dependencies: + tslib: 2.6.3 + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -9028,6 +11229,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -9045,6 +11248,14 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + sass@1.80.2: dependencies: '@parcel/watcher': 2.4.1 @@ -9052,6 +11263,8 @@ snapshots: immutable: 4.3.6 source-map-js: 1.2.0 + sax@1.4.4: {} + scheduler@0.21.0: dependencies: loose-envify: 1.4.0 @@ -9060,12 +11273,24 @@ snapshots: dependencies: loose-envify: 1.4.0 + secure-json-parse@4.1.0: {} + + semver-compare@1.0.0: + optional: true + + semver@5.7.2: {} + semver@6.3.1: {} semver@7.6.3: {} semver@7.7.3: {} + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + optional: true + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -9096,6 +11321,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.3: {} + should-equal@2.0.0: dependencies: should-type: 1.4.0 @@ -9161,10 +11388,20 @@ snapshots: signal-exit@4.1.0: {} + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.3 + sisteransi@1.0.5: {} slash@4.0.0: {} + slice-ansi@3.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -9175,6 +11412,25 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.1.0 + smart-buffer: 4.2.0 + + sonic-boom@4.2.1: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.0: {} source-map-js@1.2.1: {} @@ -9213,8 +11469,19 @@ snapshots: spdx-expression-parse: 3.0.1 spdx-ranges: 2.1.1 + split2@4.2.0: {} + + sprintf-js@1.1.3: + optional: true + + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + stable-hash@0.0.5: {} + stat-mode@1.0.0: {} + stats-gl@2.2.8: dependencies: '@types/three': 0.163.0 @@ -9307,6 +11574,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -9328,6 +11599,8 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + style-to-object@1.0.8: dependencies: inline-style-parser: 0.2.4 @@ -9342,6 +11615,12 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + sumchecker@3.0.1: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -9350,16 +11629,20 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} suspend-react@0.1.3(react@18.3.1): dependencies: react: 18.3.1 - swagger2openapi@7.0.8: + swagger2openapi@7.0.8(encoding@0.1.13): dependencies: call-me-maybe: 1.0.2 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) node-fetch-h2: 2.3.0 node-readfiles: 0.2.0 oas-kit-common: 1.0.8 @@ -9401,6 +11684,24 @@ snapshots: transitivePeerDependencies: - ts-node + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + temp-file@3.4.0: + dependencies: + async-exit-hook: 2.0.1 + fs-extra: 10.1.0 + + temp@0.9.4: + dependencies: + mkdirp: 0.5.6 + rimraf: 2.6.3 + terser@5.31.1: dependencies: '@jridgewell/source-map': 0.3.11 @@ -9417,6 +11718,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@4.0.0: + dependencies: + real-require: 0.2.0 + three-mesh-bvh@0.7.8(three@0.163.0): dependencies: three: 0.163.0 @@ -9433,6 +11738,10 @@ snapshots: three@0.163.0: {} + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + tiny-case@1.0.3: {} tinycolor2@1.6.0: {} @@ -9442,6 +11751,12 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + + tmp@0.2.5: {} + to-fast-properties@2.0.0: {} to-regex-range@5.0.1: @@ -9452,6 +11767,8 @@ snapshots: tr46@0.0.3: {} + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} troika-three-text@0.49.1(three@0.163.0): @@ -9470,6 +11787,10 @@ snapshots: trough@2.2.0: {} + truncate-utf8-bytes@1.0.2: + dependencies: + utf8-byte-length: 1.0.5 + ts-api-utils@2.1.0(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -9529,6 +11850,9 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.13.1: + optional: true + type-fest@2.19.0: {} typed-array-buffer@1.0.2: @@ -9596,13 +11920,13 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.6 - typescript-eslint@8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3): + typescript-eslint@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3))(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.6.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@1.21.6))(typescript@5.6.3) - eslint: 9.39.1(jiti@1.21.6) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -9641,6 +11965,14 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -9666,6 +11998,8 @@ snapshots: universal-user-agent@7.0.3: {} + universalify@0.1.2: {} + universalify@2.0.1: {} unplugin@1.0.1: @@ -9702,8 +12036,8 @@ snapshots: update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 + escalade: 3.2.0 + picocolors: 1.1.1 update-browserslist-db@1.1.1(browserslist@4.24.0): dependencies: @@ -9723,6 +12057,8 @@ snapshots: dependencies: react: 18.3.1 + utf8-byte-length@1.0.5: {} + util-deprecate@1.0.2: {} utility-types@3.11.0: {} @@ -9731,6 +12067,12 @@ snapshots: uuid@9.0.1: {} + verror@1.10.1: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.4.1 + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -9756,6 +12098,10 @@ snapshots: dependencies: loose-envify: 1.4.0 + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + webgl-constants@1.1.1: {} webgl-sdf-generator@1.1.1: {} @@ -9847,6 +12193,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@5.0.0: + dependencies: + isexe: 3.1.5 + word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -9869,10 +12219,21 @@ snapshots: wrappy@1.0.2: {} + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.0 + powershell-utils: 0.1.0 + + xmlbuilder@15.1.1: {} + y18n@5.0.8: {} yallist@3.1.1: {} + yallist@4.0.0: {} + + yallist@5.0.0: {} + yaml@1.10.2: {} yaml@2.4.5: {} @@ -9896,13 +12257,18 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/rust-toolchain.toml b/rust-toolchain.toml deleted file mode 100644 index 7f84529d2..000000000 --- a/rust-toolchain.toml +++ /dev/null @@ -1,4 +0,0 @@ -[toolchain] -channel = "1.89" -profile = "default" -components = ["rustc", "cargo", "clippy", "rustfmt", "rust-analyzer", "rust-src"] diff --git a/rustfmt.toml b/rustfmt.toml deleted file mode 100644 index b003e24fe..000000000 --- a/rustfmt.toml +++ /dev/null @@ -1,6 +0,0 @@ -# 88 comes from python's black as inspiration. -# Note that rust by default treats a tab as having a width of 4 spaces when doing the -# calculation for line wrapping. -max_width = 88 -# Tabs allow for enhanced accessibility and the ability to choose indent size. -hard_tabs = true From 87699438b4a85210bc022447c458752230d637fe Mon Sep 17 00:00:00 2001 From: loucass003 Date: Fri, 13 Feb 2026 23:49:16 +0100 Subject: [PATCH 004/103] Progress? --- flake.nix | 119 +++++++++++++++++++++++++++++++++++++ gui/electron/main/index.ts | 24 +++++++- gui/package.json | 1 + gui/src/App.tsx | 2 +- gui/vite.config.ts | 1 - pnpm-lock.yaml | 64 ++++++++++++++++++++ 6 files changed, 208 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index a0f0deb88..2e9077fe0 100644 --- a/flake.nix +++ b/flake.nix @@ -27,8 +27,127 @@ rpm desktop-file-utils # Required for mksquashfs validation ]; + + electronLibs = with pkgs; [ + alsa-lib + at-spi2-atk + at-spi2-core + cairo + cups + dbus + expat + gdk-pixbuf + glib + gtk3 + libdrm + libgbm + libglvnd # Provides libEGL.so.1, libGL.so.1, etc. + libnotify + libxkbcommon + mesa + nspr + nss + pango + systemd + vulkan-loader + wayland + xorg.libX11 + xorg.libXcomposite + xorg.libXdamage + xorg.libXext + xorg.libXfixes + xorg.libXrandr + xorg.libxcb + xorg.libxshmfence + ]; + + # Shared patching logic + patchLogic = '' + echo "Patching SlimeVR binary for NixOS..." + + # Patch the main binary with correct interpreter and RPATH + ${pkgs.patchelf}/bin/patchelf \ + --set-interpreter ${pkgs.glibc}/lib/ld-linux-x86-64.so.2 \ + --set-rpath "\$ORIGIN:${pkgs.lib.makeLibraryPath (electronLibs ++ hw_deps)}" \ + "$UNPACKED_DIR/slimevr" + + # Patch chrome-sandbox + if [ -f "$UNPACKED_DIR/chrome-sandbox" ]; then + ${pkgs.patchelf}/bin/patchelf \ + --set-interpreter ${pkgs.glibc}/lib/ld-linux-x86-64.so.2 \ + "$UNPACKED_DIR/chrome-sandbox" + fi + + # Patch bundled shared libraries + for lib in "$UNPACKED_DIR"/*.so; do + if [ -f "$lib" ]; then + echo "Patching $(basename "$lib")..." + ${pkgs.patchelf}/bin/patchelf \ + --set-rpath "\$ORIGIN:${pkgs.lib.makeLibraryPath electronLibs}" \ + "$lib" 2>/dev/null || true + fi + done + + echo "✓ Binary patched successfully!" + ''; + + patchScript = pkgs.writeShellScriptBin "patch-slimevr" '' + set -e + cd "$(git rev-parse --show-toplevel)" + UNPACKED_DIR="./gui/dist/artifacts/linux-unpacked" + + if [ ! -d "$UNPACKED_DIR" ]; then + echo "Error: Build artifacts not found at $UNPACKED_DIR" + echo "Please run 'pnpm run package' first" + exit 1 + fi + + ${patchLogic} + echo "" + echo "You can now run: cd $UNPACKED_DIR && ./slimevr" + ''; + + buildAndPatchScript = pkgs.writeShellScriptBin "build-and-patch-slimevr" '' + set -e + cd "$(git rev-parse --show-toplevel)/gui" + + echo "Building Electron app..." + ${pkgs.pnpm}/bin/pnpm run package + + cd .. + UNPACKED_DIR="./gui/dist/artifacts/linux-unpacked" + + ${patchLogic} + echo "" + echo "You can now run: cd $UNPACKED_DIR && ./slimevr" + ''; + + buildPatchAndRunScript = pkgs.writeShellScriptBin "build-patch-run-slimevr" '' + set -e + cd "$(git rev-parse --show-toplevel)/gui" + + echo "Building Electron app..." + ${pkgs.pnpm}/bin/pnpm run package + + cd .. + UNPACKED_DIR="./gui/dist/artifacts/linux-unpacked" + + ${patchLogic} + echo "" + echo "Launching SlimeVR..." + cd "$UNPACKED_DIR" + export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath (electronLibs ++ hw_deps)}:$LD_LIBRARY_PATH" + exec ./slimevr + ''; in { + packages = { + patch-script = patchScript; + build-and-patch = buildAndPatchScript; + build-patch-run = buildPatchAndRunScript; + default = patchScript; + }; + devShells.default = pkgs.mkShell { name = "slimevr-electron"; diff --git a/gui/electron/main/index.ts b/gui/electron/main/index.ts index 684c975ce..4fb2c951a 100644 --- a/gui/electron/main/index.ts +++ b/gui/electron/main/index.ts @@ -4,6 +4,8 @@ import { dialog, Menu, nativeImage, + net, + protocol, screen, shell, Tray, @@ -38,6 +40,19 @@ program program.parse(process.argv); const options = program.opts(); +// Register custom protocol to handle asset paths with leading slashes +protocol.registerSchemesAsPrivileged([ + { + scheme: 'app', + privileges: { + standard: true, + secure: true, + supportFetchAPI: true, + corsEnabled: true + } + } +]); + let mainWindow: BrowserWindow | null = null; handleIpc(IPC_CHANNELS.OS_STATS, async () => { @@ -215,7 +230,7 @@ function createWindow() { mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL); mainWindow.webContents.openDevTools(); } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')); + mainWindow.loadURL('app://./index.html'); } mainWindow.on('closed', () => { @@ -366,6 +381,13 @@ const spawnServer = () => { app.whenReady().then(() => { console.log(javaVersionFile); + // Register protocol handler for app:// scheme to handle assets with leading slashes + protocol.handle('app', (request) => { + const url = request.url.slice('app://'.length); + const filePath = path.normalize(join(__dirname, '../renderer', url)); + return net.fetch('file://' + filePath); + }); + checkEnvironmentVariables(); spawnServer(); diff --git a/gui/package.json b/gui/package.json index e6eaf5aea..4f385d615 100644 --- a/gui/package.json +++ b/gui/package.json @@ -69,6 +69,7 @@ }, "devDependencies": { "@dword-design/eslint-plugin-import-alias": "^4.0.9", + "@electron/asar": "^4.0.1", "@openapi-codegen/cli": "^3.1.0", "@openapi-codegen/typescript": "^8.0.2", "@stylistic/eslint-plugin": "^5.5.0", diff --git a/gui/src/App.tsx b/gui/src/App.tsx index 215124a36..c7fc0410b 100644 --- a/gui/src/App.tsx +++ b/gui/src/App.tsx @@ -1,6 +1,6 @@ import { createContext, useEffect, useState } from 'react'; import { - BrowserRouter as Router, + HashRouter as Router, Outlet, Route, Routes, diff --git a/gui/vite.config.ts b/gui/vite.config.ts index 5ee8f4a24..a09fed7b6 100644 --- a/gui/vite.config.ts +++ b/gui/vite.config.ts @@ -36,7 +36,6 @@ export function i18nHotReload(): PluginOption { // https://vitejs.dev/config/ export default defineConfig({ - base: './', define: { __COMMIT_HASH__: JSON.stringify(commitHash), __VERSION_TAG__: JSON.stringify(versionTag), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d7260db9..38c2db920 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -162,6 +162,9 @@ importers: '@dword-design/eslint-plugin-import-alias': specifier: ^4.0.9 version: 4.0.9 + '@electron/asar': + specifier: ^4.0.1 + version: 4.0.1 '@openapi-codegen/cli': specifier: ^3.1.0 version: 3.1.0(encoding@0.1.13) @@ -585,6 +588,11 @@ packages: engines: {node: '>=10.12.0'} hasBin: true + '@electron/asar@4.0.1': + resolution: {integrity: sha512-F4Ykm1jiBGY1WV/o8Q8oFW8Nq0u+S2/vPujzNJtdSJ6C4LHC4CiGLn7c17s7SolZ23gcvCebMncmZtNc+MkxPQ==} + engines: {node: '>=22.12.0'} + hasBin: true + '@electron/fuses@1.8.0': resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} hasBin: true @@ -2407,6 +2415,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -3077,6 +3089,10 @@ packages: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -3198,6 +3214,12 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -3889,6 +3911,10 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4424,6 +4450,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4467,6 +4496,10 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + pe-library@0.4.1: resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} engines: {node: '>=12', npm: '>=6'} @@ -6239,6 +6272,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + '@electron/asar@4.0.1': + dependencies: + commander: 13.1.0 + glob: 11.1.0 + minimatch: 10.2.0 + '@electron/fuses@1.8.0': dependencies: chalk: 4.1.2 @@ -8147,6 +8186,8 @@ snapshots: commander@12.1.0: {} + commander@13.1.0: {} + commander@14.0.3: {} commander@2.20.3: @@ -9087,6 +9128,11 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data-encoder@2.1.4: {} form-data@4.0.5: @@ -9238,6 +9284,15 @@ snapshots: minipass: 7.1.2 path-scurry: 1.11.1 + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.0 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -9915,6 +9970,8 @@ snapshots: lru-cache@10.2.2: {} + lru-cache@11.2.6: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -10683,6 +10740,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -10723,6 +10782,11 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.2 + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.6 + minipass: 7.1.2 + pe-library@0.4.1: {} pegjs@0.10.0: {} From e83adadf1f7613004e07e209a64f99719ab5fe9d Mon Sep 17 00:00:00 2001 From: loucass003 Date: Sat, 14 Feb 2026 01:37:09 +0100 Subject: [PATCH 005/103] There is no way this works. RIGHT?! --- .github/workflows/build-gui.yml | 18 +- .github/workflows/gradle.yaml | 66 ++-- gui/electron-builder.yml | 25 +- gui/electron.vite.config.ts | 7 + gui/package.json | 86 +++-- .../widgets/IMUVisualizerWidget.tsx | 302 +++++++++++++----- .../widgets/SkeletonVisualizerWidget.tsx | 32 +- pnpm-lock.yaml | 236 +++++++------- 8 files changed, 456 insertions(+), 316 deletions(-) diff --git a/.github/workflows/build-gui.yml b/.github/workflows/build-gui.yml index 3b02ad554..8053ab0f1 100644 --- a/.github/workflows/build-gui.yml +++ b/.github/workflows/build-gui.yml @@ -67,9 +67,9 @@ jobs: name: Set up Linux dependencies uses: awalsh128/cache-apt-pkgs-action@v1.6.0 with: - packages: libgtk-3-dev webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf + packages: libgtk-3-dev libappindicator3-dev librsvg2-dev patchelf # Increment to invalidate the cache - version: ${{ format('v1.0-{0}', env.BUILD_ARCH) }} + version: ${{ format('v1.1-{0}', env.BUILD_ARCH) }} # Enables a workaround to attempt to run pre and post install scripts execute_install_scripts: true # Disables uploading logs as a build artifact @@ -91,31 +91,25 @@ jobs: env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} NODE_OPTIONS: ${{ matrix.os == 'macos-latest' && '--max-old-space-size=4096' || '' }} - run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs ) + run: cd gui && pnpm run build - if: startsWith(matrix.os, 'windows') name: Upload a Build Artifact (Windows) uses: actions/upload-artifact@v6 with: - # Artifact name name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }} - # A file, directory or wildcard pattern that describes what to upload - path: target/release/slimevr.exe + path: gui/out/**/* - if: startsWith(matrix.os, 'ubuntu') name: Upload a Build Artifact (Linux) uses: actions/upload-artifact@v6 with: - # Artifact name name: ${{ format('SlimeVR-GUI-Linux-{0}', env.BUILD_ARCH) }} - # A file, directory or wildcard pattern that describes what to upload - path: target/release/slimevr + path: gui/out/**/* - if: matrix.os == 'macos-latest' name: Upload a Build Artifact (macOS) uses: actions/upload-artifact@v6 with: - # Artifact name name: SlimeVR-GUI-macOS - # A file, directory or wildcard pattern that describes what to upload - path: target/release/slimevr + path: gui/out/**/* diff --git a/.github/workflows/gradle.yaml b/.github/workflows/gradle.yaml index 85da592b0..bfc880874 100644 --- a/.github/workflows/gradle.yaml +++ b/.github/workflows/gradle.yaml @@ -190,24 +190,14 @@ jobs: uses: awalsh128/cache-apt-pkgs-action@v1.6.0 with: packages: | - build-essential curl wget file libssl-dev libgtk-3-dev libappindicator3-dev librsvg2-dev xdg-utils + build-essential curl wget file libssl-dev libgtk-3-dev libappindicator3-dev librsvg2-dev xdg-utils patchelf # Increment to invalidate the cache - version: ${{ format('v1.0-{0}', env.BUILD_ARCH) }} + version: ${{ format('v2.0-electron-{0}', env.BUILD_ARCH) }} # Enables a workaround to attempt to run pre and post install scripts execute_install_scripts: true # Disables uploading logs as a build artifact debug: false - - name: Set up specific Linux versioned dependencies - run: | - sudo apt-get update && sudo apt-get install -y \ - libwebkit2gtk-4.1-0=2.44.0-2 \ - libwebkit2gtk-4.1-dev=2.44.0-2 \ - libjavascriptcoregtk-4.1-0=2.44.0-2 \ - libjavascriptcoregtk-4.1-dev=2.44.0-2 \ - gir1.2-javascriptcoregtk-4.1=2.44.0-2 \ - gir1.2-webkit2-4.1=2.44.0-2; - - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v6 @@ -221,11 +211,14 @@ jobs: - name: Build env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - run: pnpm run tauri build --config $( ./gui/scripts/gitversion.mjs ) + run: | + cd gui + pnpm run build + pnpm exec electron-builder --linux --publish never - name: Make GUI tarball run: | - tar czf slimevr-gui-dist.tar.gz -C gui/dist/ . + tar czf slimevr-gui-dist.tar.gz -C gui/out/renderer/ . - uses: actions/upload-artifact@v6 if: matrix.os == 'ubuntu-latest' @@ -236,24 +229,24 @@ jobs: - uses: actions/upload-artifact@v6 with: name: ${{ format('SlimeVR-GUI-Deb-{0}', env.BUILD_ARCH) }} - path: target/release/bundle/deb/slimevr*.deb + path: gui/dist/artifacts/*.deb - uses: actions/upload-artifact@v6 with: name: ${{ format('SlimeVR-GUI-AppImage-{0}', env.BUILD_ARCH) }} - path: target/release/bundle/appimage/slimevr*.AppImage + path: gui/dist/artifacts/*.AppImage - uses: actions/upload-artifact@v6 with: name: ${{ format('SlimeVR-GUI-RPM-{0}', env.BUILD_ARCH) }} - path: target/release/bundle/rpm/slimevr*.rpm + path: gui/dist/artifacts/*.rpm - name: Prepare for release if: startsWith(github.ref, 'refs/tags/') run: | - cp target/release/bundle/appimage/slimevr*.AppImage "./SlimeVR-$BUILD_ARCH.appimage" - cp target/release/bundle/deb/slimevr*.deb "./SlimeVR-$BUILD_ARCH.deb" - cp target/release/bundle/rpm/slimevr*.rpm "./SlimeVR-$BUILD_ARCH.rpm" + cp gui/dist/artifacts/*.AppImage "./SlimeVR-$BUILD_ARCH.appimage" + cp gui/dist/artifacts/*.deb "./SlimeVR-$BUILD_ARCH.deb" + cp gui/dist/artifacts/*.rpm "./SlimeVR-$BUILD_ARCH.rpm" - name: Upload to draft release uses: softprops/action-gh-release@v2 @@ -296,37 +289,25 @@ jobs: env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} NODE_OPTIONS: --max-old-space-size=4096 - run: pnpm run tauri build --target universal-apple-darwin --config $( ./gui/scripts/gitversion.mjs ) - - - name: Modify Application run: | - cd target/universal-apple-darwin/release/bundle/macos/slimevr.app/Contents/MacOS - cp $( git rev-parse --show-toplevel )/server/desktop/build/libs/slimevr.jar ./ - cd ../../../ - /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName SlimeVR" slimevr.app/Contents/Info.plist - /usr/libexec/PlistBuddy -c "Set :CFBundleName SlimeVR" slimevr.app/Contents/Info.plist - codesign --sign - --deep --force slimevr.app - mv slimevr.app SlimeVR.app - cd ../dmg/ - ./bundle_dmg.sh --volname SlimeVR --icon slimevr 180 170 --app-drop-link 480 170 \ - --window-size 660 400 --hide-extension ../macos/SlimeVR.app \ - --volicon ../macos/SlimeVR.app/Contents/Resources/icon.icns --skip-jenkins \ - --eula ../../../../../LICENSE-MIT slimevr.dmg ../macos/SlimeVR.app + cd gui + pnpm run build + pnpm exec electron-builder --mac --universal --publish never - uses: actions/upload-artifact@v6 with: name: SlimeVR-GUI-MacApp - path: target/universal-apple-darwin/release/bundle/macos/SlimeVR*.app + path: gui/dist/artifacts/*.app - uses: actions/upload-artifact@v6 with: name: SlimeVR-GUI-MacDmg - path: target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg + path: gui/dist/artifacts/*.dmg - name: Prepare for release if: startsWith(github.ref, 'refs/tags/') run: | - cp target/universal-apple-darwin/release/bundle/dmg/slimevr.dmg ./SlimeVR-mac.dmg + cp gui/dist/artifacts/*.dmg ./SlimeVR-mac.dmg - name: Upload to draft release uses: softprops/action-gh-release@v2 @@ -373,16 +354,19 @@ jobs: shell: bash env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs ) + run: | + cd gui + pnpm run build + pnpm exec electron-builder --win portable --publish never - name: Bundle to zips shell: bash run: | mkdir SlimeVR - cp gui/src-tauri/icons/icon.ico ./SlimeVR/run.ico + cp gui/dist/artifacts/*.exe ./SlimeVR/slimevr.exe + cp gui/electron/ressources/icons/icon.ico ./SlimeVR/run.ico cp server/desktop/build/libs/slimevr.jar ./SlimeVR/slimevr.jar cp server/core/resources/* ./SlimeVR/ - cp target/release/slimevr.exe ./SlimeVR/ 7z a -tzip "SlimeVR-$BUILD_ARCH.zip" ./SlimeVR/ - uses: actions/upload-artifact@v6 diff --git a/gui/electron-builder.yml b/gui/electron-builder.yml index ed8b5c2f6..f5e06c062 100644 --- a/gui/electron-builder.yml +++ b/gui/electron-builder.yml @@ -4,11 +4,25 @@ productName: SlimeVR directories: output: dist/artifacts +# Optimize Electron bundle size +asar: true + +# Only include English Chromium locale (saves ~44MB) +electronLanguages: + - en-US + # The 'files' key determines what goes INSIDE the app.asar files: - - out/**/* # This captures the built JS/CSS/Assets from Vite - - index.html # Ensure your entry point is included + - out/**/* + - index.html - package.json + - node_modules/** + # Exclude unnecessary files from node_modules to reduce size + - "!node_modules/*/{README,readme,README.md,readme.md,CHANGELOG,CHANGELOG.md,changelog.md}" + - "!node_modules/*/{test,tests,__tests__,docs,doc,example,examples}" + - "!node_modules/*/.{git,github,vscode,editorconfig,eslintrc,prettierrc}" + - "!node_modules/**/*.{map,ts,tsx,d.ts}" + - "!**/.DS_Store" # Include the JAR next to the EXE extraFiles: @@ -21,9 +35,8 @@ linux: category: Game target: - target: AppImage - # - target: deb - # - target: rpm - # - target: zip + - target: deb + - target: rpm # Target-specific dependencies (Fixes the 'unknown property' error) deb: @@ -39,4 +52,4 @@ rpm: win: target: portable mac: - target: zip + target: dmg diff --git a/gui/electron.vite.config.ts b/gui/electron.vite.config.ts index 7c7d2e2a4..f9d7b3773 100644 --- a/gui/electron.vite.config.ts +++ b/gui/electron.vite.config.ts @@ -7,6 +7,13 @@ export default defineConfig({ build: { rollupOptions: { input: resolve(__dirname, 'electron/main/index.ts'), + external: [ + 'pino', + 'pino-pretty', + 'pino-roll', + 'commander', + 'open' + ] } } }, diff --git a/gui/package.json b/gui/package.json index 4f385d615..b37cbd22e 100644 --- a/gui/package.json +++ b/gui/package.json @@ -5,53 +5,11 @@ "homepage": "https://slimevr.dev", "type": "module", "dependencies": { - "@fluent/bundle": "^0.18.0", - "@fluent/react": "^0.15.2", - "@fontsource/poppins": "^5.1.0", - "@formatjs/intl-localematcher": "^0.2.32", - "@hookform/resolvers": "^3.6.0", - "@react-hookz/deep-equal": "^3.0.3", - "@react-three/drei": "^9.114.3", - "@react-three/fiber": "^8.17.10", - "@sentry/react": "10.29.0", - "@sentry/vite-plugin": "^2.22.7", - "@tailwindcss/typography": "^0.5.15", - "@tanstack/react-query": "^5.48.0", - "@tweenjs/tween.js": "^25.0.0", - "@twemoji/svg": "^15.0.0", - "ajv": "^8.17.1", - "browser-fs-access": "^0.35.0", - "classnames": "^2.5.1", "commander": "^14.0.3", - "concurrently": "^9.2.1", - "convert": "^5.12.0", - "flatbuffers": "22.10.26", - "intl-pluralrules": "^2.0.1", - "ip-num": "^1.5.1", - "jotai": "^2.12.2", "open": "^11.0.0", "pino": "^10.3.1", "pino-pretty": "^13.1.3", - "pino-roll": "^4.0.0", - "prompts": "^2.4.2", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-error-boundary": "^4.0.13", - "react-helmet": "^6.1.0", - "react-hook-form": "^7.63.0", - "react-markdown": "^9.0.1", - "react-modal": "^3.16.1", - "react-responsive": "^10.0.0", - "react-router-dom": "^6.26.2", - "remark-gfm": "^4.0.0", - "semver": "^7.6.3", - "solarxr-protocol": "file:../solarxr-protocol", - "three": "^0.163.0", - "ts-pattern": "^5.4.0", - "typescript": "^5.6.3", - "use-double-tap": "^1.3.6", - "uuid": "^13.0.0", - "yup": "^1.4.0" + "pino-roll": "^4.0.0" }, "scripts": { "start": "vite --force", @@ -70,10 +28,22 @@ "devDependencies": { "@dword-design/eslint-plugin-import-alias": "^4.0.9", "@electron/asar": "^4.0.1", + "@fluent/bundle": "^0.18.0", + "@fluent/react": "^0.15.2", + "@fontsource/poppins": "^5.1.0", + "@formatjs/intl-localematcher": "^0.2.32", + "@hookform/resolvers": "^3.6.0", "@openapi-codegen/cli": "^3.1.0", "@openapi-codegen/typescript": "^8.0.2", + "@react-hookz/deep-equal": "^3.0.3", + "@sentry/react": "10.29.0", + "@sentry/vite-plugin": "^2.22.7", "@stylistic/eslint-plugin": "^5.5.0", "@tailwindcss/forms": "^0.5.9", + "@tailwindcss/typography": "^0.5.15", + "@tanstack/react-query": "^5.48.0", + "@tweenjs/tween.js": "^25.0.0", + "@twemoji/svg": "^15.0.0", "@types/file-saver": "^2.0.7", "@types/node": "^24.3.1", "@types/react": "^18.3.11", @@ -85,8 +55,11 @@ "@typescript-eslint/eslint-plugin": "^8.48.1", "@typescript-eslint/parser": "^8.48.1", "@vitejs/plugin-react": "^4.3.2", + "ajv": "^8.17.1", "autoprefixer": "^10.4.20", - "cross-env": "^7.0.3", + "browser-fs-access": "^0.35.0", + "classnames": "^2.5.1", + "convert": "^5.12.0", "dmg-license": "^1.0.11", "dotenv": "^16.4.5", "electron": "^40.3.0", @@ -98,15 +71,38 @@ "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", + "flatbuffers": "22.10.26", "globals": "^15.10.0", + "intl-pluralrules": "^2.0.1", + "ip-num": "^1.5.1", + "jotai": "^2.12.2", "prettier": "^3.3.3", + "prompts": "^2.4.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-error-boundary": "^4.0.13", + "react-helmet": "^6.1.0", + "react-hook-form": "^7.63.0", + "react-markdown": "^9.0.1", + "react-modal": "^3.16.1", + "react-responsive": "^10.0.0", + "react-router-dom": "^6.26.2", + "remark-gfm": "^4.0.0", "rollup-plugin-visualizer": "^5.12.0", "sass": "^1.79.4", + "semver": "^7.6.3", + "solarxr-protocol": "file:../solarxr-protocol", "spdx-satisfies": "^5.0.1", "tailwind-gradient-mask-image": "^1.2.0", "tailwindcss": "^3.4.13", + "three": "^0.163.0", + "ts-pattern": "^5.4.0", + "typescript": "^5.6.3", "typescript-eslint": "^8.46.2", - "vite": "^5.4.8" + "use-double-tap": "^1.3.6", + "uuid": "^13.0.0", + "vite": "^5.4.8", + "yup": "^1.4.0" }, "main": "./out/main/index.js" } diff --git a/gui/src/components/widgets/IMUVisualizerWidget.tsx b/gui/src/components/widgets/IMUVisualizerWidget.tsx index 6d22ba9fa..15a968dca 100644 --- a/gui/src/components/widgets/IMUVisualizerWidget.tsx +++ b/gui/src/components/widgets/IMUVisualizerWidget.tsx @@ -1,32 +1,170 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { TrackerDataT } from 'solarxr-protocol'; import { useTracker } from '@/hooks/tracker'; import { Typography } from '@/components/commons/Typography'; import { formatVector3 } from '@/utils/formatting'; -import { Canvas } from '@react-three/fiber'; -import * as THREE from 'three'; -import { PerspectiveCamera, Vector3 } from 'three'; +import { + AmbientLight, + ArrowHelper, + AxesHelper, + Color, + DoubleSide, + Group, + Mesh, + MeshBasicMaterial, + PerspectiveCamera, + PlaneGeometry, + Scene, + SpotLight, + Vector3, + WebGLRenderer, +} from 'three'; +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'; import { Button } from '@/components/commons/Button'; import { QuatObject } from '@/maths/quaternion'; import { useLocalization } from '@fluent/react'; import { Vector3Object, Vector3FromVec3fT } from '@/maths/vector3'; -import { Gltf } from '@react-three/drei'; import { ErrorBoundary } from 'react-error-boundary'; import { StayAlignedInfo } from '@/components/stay-aligned/StayAlignedInfo'; -const groundColor = '#4444aa'; +const GROUND_COLOR = '#4444aa'; +const MODEL_SCALE = 6.5; +const CANVAS_HEIGHT = 200; -const scale = 6.5; +// Three.js context - isolated from React +type IMUVisualizerContext = { + scene: Scene; + camera: PerspectiveCamera; + renderer: WebGLRenderer; + trackerGroup: Group; + accelArrow: ArrowHelper; + magArrow: ArrowHelper; + animationId: number | null; + update: (quat: QuatObject, vec: Vector3Object, mag: Vector3Object) => void; + dispose: () => void; +}; -export function TrackerModel({ model }: { model: string }) { - return ( - - - +async function initializeIMUVisualizer( + canvas: HTMLCanvasElement, + modelPath: string +): Promise { + const scene = new Scene(); + + const camera = new PerspectiveCamera( + 60, + canvas.clientWidth / CANVAS_HEIGHT, + 0.1, + 1000 ); + camera.position.set(0, 0, 7); + + const renderer = new WebGLRenderer({ canvas, alpha: true, antialias: true }); + renderer.setSize(canvas.clientWidth, CANVAS_HEIGHT); + + const ambientLight = new AmbientLight(0xffffff, 0.5 * Math.PI); + scene.add(ambientLight); + + const spotLight = new SpotLight(0xffffff, 4000); + spotLight.position.set(20, 20, 20); + spotLight.angle = 0.09; + spotLight.penumbra = 1; + scene.add(spotLight); + + const trackerGroup = new Group(); + scene.add(trackerGroup); + + const loader = new GLTFLoader(); + const gltf = await loader.loadAsync(modelPath); + const modelGroup = new Group(); + modelGroup.scale.setScalar(MODEL_SCALE); + modelGroup.rotation.x = Math.PI / 2; + modelGroup.add(gltf.scene); + trackerGroup.add(modelGroup); + + const axesHelper = new AxesHelper(10); + trackerGroup.add(axesHelper); + + const accelArrow = new ArrowHelper( + new Vector3(0, 1, 0), + new Vector3(0, 0, 0), + 1, + 0xffff00 + ); + scene.add(accelArrow); + + const magArrow = new ArrowHelper( + new Vector3(0, 1, 0), + new Vector3(0, 0, 0), + 1, + Color.NAMES.aqua + ); + scene.add(magArrow); + + const groundGeometry = new PlaneGeometry(50, 50, 10, 10); + const groundMaterial = new MeshBasicMaterial({ + wireframe: true, + color: GROUND_COLOR, + transparent: true, + opacity: 0.2, + side: DoubleSide, + }); + const ground = new Mesh(groundGeometry, groundMaterial); + ground.position.set(0, -3, 0); + ground.rotation.x = -Math.PI / 2; + scene.add(ground); + + let animationId: number | null = null; + const animate = () => { + animationId = requestAnimationFrame(animate); + renderer.render(scene, camera); + }; + animate(); + + const update = (quat: QuatObject, vec: Vector3Object, mag: Vector3Object) => { + trackerGroup.quaternion.set(quat.x, quat.y, quat.z, quat.w); + + const accelVec = Vector3FromVec3fT(vec); + const accelLength = accelVec.length(); + if (accelLength > 0) { + accelArrow.setDirection(accelVec.normalize()); + accelArrow.setLength(Math.sqrt(accelLength) * 2); + } + + const magVec = new Vector3(mag.x, mag.y, mag.z); + const magLen = magVec.length(); + const magMag = Math.sqrt(magLen / 100); + if (magLen > 0) { + const magDir = magVec.clone().normalize(); + magArrow.position.copy(magDir.clone().multiplyScalar(-magMag)); + magArrow.setDirection(magDir); + magArrow.setLength(2 * magMag); + } + }; + + const dispose = () => { + if (animationId !== null) { + cancelAnimationFrame(animationId); + } + renderer.dispose(); + groundGeometry.dispose(); + groundMaterial.dispose(); + scene.clear(); + }; + + return { + scene, + camera, + renderer, + trackerGroup, + accelArrow, + magArrow, + animationId, + update, + dispose, + }; } -function SceneRenderer({ +function IMUVisualizerCanvas({ quat, vec, mag, @@ -37,58 +175,53 @@ function SceneRenderer({ mag: Vector3Object; model: string; }) { - const magDir = new Vector3(mag.x, mag.y, mag.z); - const magLen = magDir.length(); - const magMag = Math.sqrt(magLen / 100); // normalize magnituge - if (magLen > 0) magDir.multiplyScalar(1 / magLen); + const canvasRef = useRef(null); + const contextRef = useRef(null); + const [error, setError] = useState(null); + + useEffect(() => { + if (!canvasRef.current) return; + + let mounted = true; + + initializeIMUVisualizer(canvasRef.current, model) + .then((ctx) => { + if (mounted) { + contextRef.current = ctx; + ctx.update(quat, vec, mag); + } else { + ctx.dispose(); + } + }) + .catch((err) => { + if (mounted) { + setError(err); + } + }); + + return () => { + mounted = false; + contextRef.current?.dispose(); + contextRef.current = null; + }; + }, [model]); + + useEffect(() => { + if (contextRef.current) { + contextRef.current.update(quat, vec, mag); + } + }, [quat, vec, mag]); + + if (error) { + throw error; + } return ( - { - (camera as PerspectiveCamera).fov = 60; - }} - > - - - - - - - - - - - - - - - + style={{ width: '100%', height: CANVAS_HEIGHT, background: 'transparent' }} + /> ); } @@ -110,15 +243,30 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) { const rotationRaw = useRawRotationEulerDegrees(); const rotationIdent = useIdentAdjRotationEulerDegrees() || rotationRaw; - const quat = - tracker?.rotationIdentityAdjusted || - tracker?.rotation || - new THREE.Quaternion(); - const vec = - tracker?.linearAcceleration || - tracker?.rawAcceleration || - new THREE.Vector3(); - const mag = tracker?.rawMagneticVector || new THREE.Vector3(); + + const quat = useMemo( + () => + tracker?.rotationIdentityAdjusted || + tracker?.rotation || { x: 0, y: 0, z: 0, w: 1 }, + [tracker?.rotationIdentityAdjusted, tracker?.rotation] + ); + + const vec = useMemo( + () => + tracker?.linearAcceleration || + tracker?.rawAcceleration || { x: 0, y: 0, z: 0 }, + [tracker?.linearAcceleration, tracker?.rawAcceleration] + ); + + const mag = useMemo( + () => tracker?.rawMagneticVector || { x: 0, y: 0, z: 0 }, + [tracker?.rawMagneticVector] + ); + + const model = useMemo( + () => (isExtension ? '/models/extension.gltf' : '/models/tracker.gltf'), + [isExtension] + ); return (
@@ -207,13 +355,11 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) { } > - diff --git a/gui/src/components/widgets/SkeletonVisualizerWidget.tsx b/gui/src/components/widgets/SkeletonVisualizerWidget.tsx index f60b2e30e..a89ef862c 100644 --- a/gui/src/components/widgets/SkeletonVisualizerWidget.tsx +++ b/gui/src/components/widgets/SkeletonVisualizerWidget.tsx @@ -6,7 +6,7 @@ import { createChildren, BasedSkeletonHelper, } from '@/utils/skeletonHelper'; -import * as THREE from 'three'; +import { Bone, GridHelper, Group, PerspectiveCamera, Quaternion, Scene, Vector2, Vector3, WebGLRenderer } from 'three'; import { BodyPart, BoneT } from 'solarxr-protocol'; import { QuaternionFromQuatT, isIdentity } from '@/maths/quaternion'; import classNames from 'classnames'; @@ -37,36 +37,36 @@ export type SkeletonPreviewView = { bottom: number; width: number; height: number; - camera: THREE.PerspectiveCamera; + camera: PerspectiveCamera; controls: OrbitControls; hidden: boolean; - tween: Tween; + tween: Tween; onHeightChange: (view: SkeletonPreviewView, newHeight: number) => void; }; function initializePreview( canvas: HTMLCanvasElement, - skeleton: (BoneKind | THREE.Bone)[] + skeleton: (BoneKind | Bone)[] ) { let lastRenderTimeRef = 0; let frameInterval = 0; const views: SkeletonPreviewView[] = []; - const resolution = new THREE.Vector2(canvas.clientWidth, canvas.clientHeight); - const scene = new THREE.Scene(); - let renderer: THREE.WebGLRenderer | null = new THREE.WebGLRenderer({ + const resolution = new Vector2(canvas.clientWidth, canvas.clientHeight); + const scene = new Scene(); + let renderer: WebGLRenderer | null = new WebGLRenderer({ canvas, alpha: true, antialias: true, }); renderer.setSize(canvas.clientWidth, canvas.clientHeight); - const grid = new THREE.GridHelper(10, 50, GROUND_COLOR, GROUND_COLOR); + const grid = new GridHelper(10, 50, GROUND_COLOR, GROUND_COLOR); grid.position.set(0, 0, 0); scene.add(grid); - const skeletonGroup = new THREE.Group(); + const skeletonGroup = new Group(); let skeletonHelper = new BasedSkeletonHelper(skeleton[0]); skeletonHelper.resolution.copy(resolution); skeletonGroup.add(skeletonHelper); @@ -78,7 +78,7 @@ function initializePreview( let skeletonOffset = 0; const rebuildSkeleton = ( - newSkeleton: (BoneKind | THREE.Bone)[], + newSkeleton: (BoneKind | Bone)[], bones: Map ) => { skeletonGroup.remove(skeletonHelper); @@ -100,11 +100,11 @@ function initializePreview( : QuaternionFromQuatT(hmd?.rotationG).normalize().invert(); // Project quat to (0x, 1y, 0z) - const VEC_Y = new THREE.Vector3(0, 1, 0); + const VEC_Y = new Vector3(0, 1, 0); const vec = VEC_Y.multiplyScalar( - new THREE.Vector3(quat.x, quat.y, quat.z).dot(VEC_Y) / VEC_Y.lengthSq() + new Vector3(quat.x, quat.y, quat.z).dot(VEC_Y) / VEC_Y.lengthSq() ); - const yawReset = new THREE.Quaternion( + const yawReset = new Quaternion( vec.x, vec.y, vec.z, @@ -241,13 +241,13 @@ function initializePreview( bottom: number; width: number; height: number; - position: THREE.Vector3; + position: Vector3; hidden?: boolean; onHeightChange: (view: SkeletonPreviewView, newHeight: number) => void; }) => { if (!renderer) return; - const camera = new THREE.PerspectiveCamera( + const camera = new PerspectiveCamera( 20, resolution.width / resolution.height, 0.1, @@ -390,7 +390,7 @@ export function SkeletonVisualizerWidget({ bottom: 0, width: 1, height: 1, - position: new THREE.Vector3(3, 2.5, -3), + position: new Vector3(3, 2.5, -3), onHeightChange(v, newHeight) { v.controls.target.set(0, newHeight / 2, 0); const scale = Math.max(1, newHeight) / 1.5; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38c2db920..83b989691 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,28 @@ importers: gui: dependencies: + commander: + specifier: ^14.0.3 + version: 14.0.3 + open: + specifier: ^11.0.0 + version: 11.0.0 + pino: + specifier: ^10.3.1 + version: 10.3.1 + pino-pretty: + specifier: ^13.1.3 + version: 13.1.3 + pino-roll: + specifier: ^4.0.0 + version: 4.0.0 + devDependencies: + '@dword-design/eslint-plugin-import-alias': + specifier: ^4.0.9 + version: 4.0.9 + '@electron/asar': + specifier: ^4.0.1 + version: 4.0.1 '@fluent/bundle': specifier: ^0.18.0 version: 0.18.0 @@ -32,6 +54,12 @@ importers: '@hookform/resolvers': specifier: ^3.6.0 version: 3.6.0(react-hook-form@7.66.0(react@18.3.1)) + '@openapi-codegen/cli': + specifier: ^3.1.0 + version: 3.1.0(encoding@0.1.13) + '@openapi-codegen/typescript': + specifier: ^8.0.2 + version: 8.0.2 '@react-hookz/deep-equal': specifier: ^3.0.3 version: 3.0.3 @@ -47,6 +75,12 @@ importers: '@sentry/vite-plugin': specifier: ^2.22.7 version: 2.22.7(encoding@0.1.13) + '@stylistic/eslint-plugin': + specifier: ^5.5.0 + version: 5.5.0(eslint@9.39.1(jiti@2.6.1)) + '@tailwindcss/forms': + specifier: ^0.5.9 + version: 0.5.9(tailwindcss@3.4.14(ts-node@9.1.1(typescript@5.6.3))) '@tailwindcss/typography': specifier: ^0.5.15 version: 0.5.15(tailwindcss@3.4.14(ts-node@9.1.1(typescript@5.6.3))) @@ -59,124 +93,6 @@ importers: '@twemoji/svg': specifier: ^15.0.0 version: 15.0.0 - ajv: - specifier: ^8.17.1 - version: 8.17.1 - browser-fs-access: - specifier: ^0.35.0 - version: 0.35.0 - classnames: - specifier: ^2.5.1 - version: 2.5.1 - commander: - specifier: ^14.0.3 - version: 14.0.3 - concurrently: - specifier: ^9.2.1 - version: 9.2.1 - convert: - specifier: ^5.12.0 - version: 5.13.1 - flatbuffers: - specifier: 22.10.26 - version: 22.10.26 - intl-pluralrules: - specifier: ^2.0.1 - version: 2.0.1 - ip-num: - specifier: ^1.5.1 - version: 1.5.1 - jotai: - specifier: ^2.12.2 - version: 2.12.2(@types/react@18.3.11)(react@18.3.1) - open: - specifier: ^11.0.0 - version: 11.0.0 - pino: - specifier: ^10.3.1 - version: 10.3.1 - pino-pretty: - specifier: ^13.1.3 - version: 13.1.3 - pino-roll: - specifier: ^4.0.0 - version: 4.0.0 - prompts: - specifier: ^2.4.2 - version: 2.4.2 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - react-error-boundary: - specifier: ^4.0.13 - version: 4.0.13(react@18.3.1) - react-helmet: - specifier: ^6.1.0 - version: 6.1.0(react@18.3.1) - react-hook-form: - specifier: ^7.63.0 - version: 7.66.0(react@18.3.1) - react-markdown: - specifier: ^9.0.1 - version: 9.0.1(@types/react@18.3.11)(react@18.3.1) - react-modal: - specifier: ^3.16.1 - version: 3.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-responsive: - specifier: ^10.0.0 - version: 10.0.0(react@18.3.1) - react-router-dom: - specifier: ^6.26.2 - version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - remark-gfm: - specifier: ^4.0.0 - version: 4.0.0 - semver: - specifier: ^7.6.3 - version: 7.6.3 - solarxr-protocol: - specifier: file:../solarxr-protocol - version: link:../solarxr-protocol - three: - specifier: ^0.163.0 - version: 0.163.0 - ts-pattern: - specifier: ^5.4.0 - version: 5.5.0 - typescript: - specifier: ^5.6.3 - version: 5.6.3 - use-double-tap: - specifier: ^1.3.6 - version: 1.3.6(react@18.3.1) - uuid: - specifier: ^13.0.0 - version: 13.0.0 - yup: - specifier: ^1.4.0 - version: 1.4.0 - devDependencies: - '@dword-design/eslint-plugin-import-alias': - specifier: ^4.0.9 - version: 4.0.9 - '@electron/asar': - specifier: ^4.0.1 - version: 4.0.1 - '@openapi-codegen/cli': - specifier: ^3.1.0 - version: 3.1.0(encoding@0.1.13) - '@openapi-codegen/typescript': - specifier: ^8.0.2 - version: 8.0.2 - '@stylistic/eslint-plugin': - specifier: ^5.5.0 - version: 5.5.0(eslint@9.39.1(jiti@2.6.1)) - '@tailwindcss/forms': - specifier: ^0.5.9 - version: 0.5.9(tailwindcss@3.4.14(ts-node@9.1.1(typescript@5.6.3))) '@types/file-saver': specifier: ^2.0.7 version: 2.0.7 @@ -210,9 +126,24 @@ importers: '@vitejs/plugin-react': specifier: ^4.3.2 version: 4.3.2(vite@5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1)) + ajv: + specifier: ^8.17.1 + version: 8.17.1 autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.38) + browser-fs-access: + specifier: ^0.35.0 + version: 0.35.0 + classnames: + specifier: ^2.5.1 + version: 2.5.1 + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + convert: + specifier: ^5.12.0 + version: 5.13.1 cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -249,18 +180,69 @@ importers: eslint-plugin-react-hooks: specifier: ^7.0.1 version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) + flatbuffers: + specifier: 22.10.26 + version: 22.10.26 globals: specifier: ^15.10.0 version: 15.10.0 + intl-pluralrules: + specifier: ^2.0.1 + version: 2.0.1 + ip-num: + specifier: ^1.5.1 + version: 1.5.1 + jotai: + specifier: ^2.12.2 + version: 2.12.2(@types/react@18.3.11)(react@18.3.1) prettier: specifier: ^3.3.3 version: 3.3.3 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-error-boundary: + specifier: ^4.0.13 + version: 4.0.13(react@18.3.1) + react-helmet: + specifier: ^6.1.0 + version: 6.1.0(react@18.3.1) + react-hook-form: + specifier: ^7.63.0 + version: 7.66.0(react@18.3.1) + react-markdown: + specifier: ^9.0.1 + version: 9.0.1(@types/react@18.3.11)(react@18.3.1) + react-modal: + specifier: ^3.16.1 + version: 3.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-responsive: + specifier: ^10.0.0 + version: 10.0.0(react@18.3.1) + react-router-dom: + specifier: ^6.26.2 + version: 6.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + remark-gfm: + specifier: ^4.0.0 + version: 4.0.0 rollup-plugin-visualizer: specifier: ^5.12.0 version: 5.12.0(rollup@4.24.0) sass: specifier: ^1.79.4 version: 1.80.2 + semver: + specifier: ^7.6.3 + version: 7.6.3 + solarxr-protocol: + specifier: file:../solarxr-protocol + version: link:../solarxr-protocol spdx-satisfies: specifier: ^5.0.1 version: 5.0.1 @@ -270,12 +252,30 @@ importers: tailwindcss: specifier: ^3.4.13 version: 3.4.14(ts-node@9.1.1(typescript@5.6.3)) + three: + specifier: ^0.163.0 + version: 0.163.0 + ts-pattern: + specifier: ^5.4.0 + version: 5.5.0 + typescript: + specifier: ^5.6.3 + version: 5.6.3 typescript-eslint: specifier: ^8.46.2 version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.6.3) + use-double-tap: + specifier: ^1.3.6 + version: 1.3.6(react@18.3.1) + uuid: + specifier: ^13.0.0 + version: 13.0.0 vite: specifier: ^5.4.8 version: 5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1) + yup: + specifier: ^1.4.0 + version: 1.4.0 solarxr-protocol: dependencies: From 29598583a981c37e3fba155af1132d984f669af9 Mon Sep 17 00:00:00 2001 From: loucass003 Date: Sat, 14 Feb 2026 01:38:18 +0100 Subject: [PATCH 006/103] Lockfile --- pnpm-lock.yaml | 575 ------------------------------------------------- 1 file changed, 575 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83b989691..8f9aa6165 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,12 +63,6 @@ importers: '@react-hookz/deep-equal': specifier: ^3.0.3 version: 3.0.3 - '@react-three/drei': - specifier: ^9.114.3 - version: 9.114.5(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0))(@types/react@18.3.11)(@types/three@0.163.0)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0) - '@react-three/fiber': - specifier: ^8.17.10 - version: 8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0) '@sentry/react': specifier: 10.29.0 version: 10.29.0(react@18.3.1) @@ -138,15 +132,9 @@ importers: classnames: specifier: ^2.5.1 version: 2.5.1 - concurrently: - specifier: ^9.2.1 - version: 9.2.1 convert: specifier: ^5.12.0 version: 5.13.1 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 dmg-license: specifier: ^1.0.11 version: 1.0.11 @@ -1073,18 +1061,10 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} - '@mediapipe/tasks-vision@0.10.8': - resolution: {integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==} - '@mgit-at/typescript-flatbuffers-codegen@0.1.3': resolution: {integrity: sha512-sf9vaoiR/SR0dpV568GhsoLbd6659StJ4Gl9jszZL/bsJJaF5VmLYbI57OSI4JDm+L6d3osVMl9mkchox9j6/g==} hasBin: true - '@monogrid/gainmap-js@3.0.5': - resolution: {integrity: sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==} - peerDependencies: - three: '>= 0.159.0' - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1225,70 +1205,6 @@ packages: engines: {node: '>=18.0.0'} deprecated: PACKAGE IS DEPRECATED AND WILL BE DETED SOON, USE @ver0/deep-equal INSTEAD - '@react-spring/animated@9.6.1': - resolution: {integrity: sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/core@9.6.1': - resolution: {integrity: sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/rafz@9.6.1': - resolution: {integrity: sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==} - - '@react-spring/shared@9.6.1': - resolution: {integrity: sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@react-spring/three@9.6.1': - resolution: {integrity: sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==} - peerDependencies: - '@react-three/fiber': '>=6.0' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - three: '>=0.126' - - '@react-spring/types@9.6.1': - resolution: {integrity: sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==} - - '@react-three/drei@9.114.5': - resolution: {integrity: sha512-nXD/wOwQVaaKF1WXG5Ah3ief+Mojm5YInlk91tanzEYdG+5Vhno34AFn3xt0XKMAaHA+Lkjfi+BpqnVama+JPA==} - peerDependencies: - '@react-three/fiber': '>=8.0' - react: '>=18.0' - react-dom: '>=18.0' - three: '>=0.137' - peerDependenciesMeta: - react-dom: - optional: true - - '@react-three/fiber@8.17.10': - resolution: {integrity: sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==} - peerDependencies: - expo: '>=43.0' - expo-asset: '>=8.4' - expo-file-system: '>=11.0' - expo-gl: '>=11.0' - react: '>=18.0' - react-dom: '>=18.0' - react-native: '>=0.64' - three: '>=0.133' - peerDependenciesMeta: - expo: - optional: true - expo-asset: - optional: true - expo-file-system: - optional: true - expo-gl: - optional: true - react-dom: - optional: true - react-native: - optional: true - '@remix-run/router@1.20.0': resolution: {integrity: sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==} engines: {node: '>=14.0.0'} @@ -1606,15 +1522,9 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/draco3d@1.4.10': - resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} - '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -1651,9 +1561,6 @@ packages: '@types/node@24.10.0': resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} - '@types/offscreencanvas@2019.7.3': - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -1669,12 +1576,6 @@ packages: '@types/react-modal@3.16.3': resolution: {integrity: sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==} - '@types/react-reconciler@0.26.7': - resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} - - '@types/react-reconciler@0.28.8': - resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} - '@types/react@18.3.11': resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} @@ -1921,14 +1822,6 @@ packages: cpu: [x64] os: [win32] - '@use-gesture/core@10.3.1': - resolution: {integrity: sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==} - - '@use-gesture/react@10.3.1': - resolution: {integrity: sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==} - peerDependencies: - react: '>= 16.8.0' - '@vitejs/plugin-react@4.3.2': resolution: {integrity: sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2154,9 +2047,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2204,9 +2094,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - builder-util-runtime@9.5.1: resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} engines: {node: '>=12.0.0'} @@ -2276,11 +2163,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camera-controls@2.8.5: - resolution: {integrity: sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==} - peerDependencies: - three: '>=0.126.1' - caniuse-lite@1.0.30001636: resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} @@ -2445,11 +2327,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@9.2.1: - resolution: {integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==} - engines: {node: '>=18'} - hasBin: true - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2468,11 +2345,6 @@ packages: cross-dirname@0.1.0: resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2525,9 +2397,6 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2624,9 +2493,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-gpu@5.0.38: - resolution: {integrity: sha512-36QeGHSXYcJ/RfrnPEScR8GDprbXFG4ZhXsfVNVHztZr38+fRxgHnJl3CjYXXjbeRUhu3ZZBJh6Lg0A9v0Qd8A==} - detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -2676,9 +2542,6 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - draco3d@1.5.7: - resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3037,9 +2900,6 @@ packages: picomatch: optional: true - fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -3249,9 +3109,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - glsl-noise@0.0.0: - resolution: {integrity: sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -3344,9 +3201,6 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - hls.js@1.5.17: - resolution: {integrity: sha512-wA66nnYFvQa1o4DO/BFgLNRKnBTVXpNeldGRBJ2Y0SvFtdwvFKCbqa9zhHoZLoxHhZ+jYsj3aIBkWQQCPNOhMw==} - hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -3419,12 +3273,6 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - immer@10.1.1: - resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} - immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} @@ -3623,9 +3471,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3727,11 +3572,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - its-fine@1.2.5: - resolution: {integrity: sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==} - peerDependencies: - react: '>=18.0' - jackspeak@3.4.0: resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} @@ -3841,9 +3681,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -3922,12 +3759,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - maath@0.10.7: - resolution: {integrity: sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==} - peerDependencies: - '@types/three': '>=0.144.0' - three: '>=0.144.0' - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -4008,11 +3839,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - meshline@3.3.1: - resolution: {integrity: sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==} - peerDependencies: - three: '>=0.137' - meshoptimizer@0.18.1: resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} @@ -4626,9 +4452,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - powershell-utils@0.1.0: resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} engines: {node: '>=20'} @@ -4657,9 +4480,6 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} - promise-worker-transferable@1.0.4: - resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -4696,11 +4516,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - react-composer@5.0.3: - resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -4744,12 +4559,6 @@ packages: react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 - react-reconciler@0.27.0: - resolution: {integrity: sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^18.0.0 - react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -4929,9 +4738,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -4974,9 +4780,6 @@ packages: resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} engines: {node: '>=11.0.0'} - scheduler@0.21.0: - resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} - scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -5031,10 +4834,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - should-equal@2.0.0: resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} @@ -5176,12 +4975,6 @@ packages: resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} engines: {node: '>= 6'} - stats-gl@2.2.8: - resolution: {integrity: sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==} - - stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} - stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} @@ -5287,19 +5080,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - suspend-react@0.1.3: - resolution: {integrity: sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==} - peerDependencies: - react: '>=17.0' - swagger2openapi@7.0.8: resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} hasBin: true @@ -5339,17 +5123,6 @@ packages: resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} engines: {node: '>=20'} - three-mesh-bvh@0.7.8: - resolution: {integrity: sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==} - deprecated: Deprecated due to three.js version incompatibility. Please use v0.8.0, instead. - peerDependencies: - three: '>= 0.151.0' - - three-stdlib@2.30.3: - resolution: {integrity: sha512-rYr8PqMljMza+Ct8kQk90Y7y+YcWoPu1thfYv5YGCp0hytNRbxSQWXY4GpdTGymCj3bDggEBpxso53C3pPwhIw==} - peerDependencies: - three: '>=0.128.0' - three@0.163.0: resolution: {integrity: sha512-HlMgCb2TF/dTLRtknBnjUTsR8FsDqBY43itYop2+Zg822I+Kd0Ua2vs8CvfBVefXkBdNDrLMoRTGCIIpfCuDew==} @@ -5387,26 +5160,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - troika-three-text@0.49.1: - resolution: {integrity: sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==} - peerDependencies: - three: '>=0.125.0' - - troika-three-utils@0.49.0: - resolution: {integrity: sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==} - peerDependencies: - three: '>=0.125.0' - - troika-worker-utils@0.49.0: - resolution: {integrity: sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -5447,9 +5203,6 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tunnel-rat@0.1.2: - resolution: {integrity: sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==} - typanion@3.14.0: resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} @@ -5597,29 +5350,16 @@ packages: peerDependencies: react: '>=16.8.0' - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utility-types@3.11.0: - resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} - engines: {node: '>= 4'} - uuid@13.0.0: resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - verror@1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} @@ -5667,12 +5407,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webgl-constants@1.1.1: - resolution: {integrity: sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==} - - webgl-sdf-generator@1.1.1: - resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -5817,30 +5551,6 @@ packages: zod@4.1.13: resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} - zustand@3.7.2: - resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - - zustand@4.5.2: - resolution: {integrity: sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0.6' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -6687,8 +6397,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@mediapipe/tasks-vision@0.10.8': {} - '@mgit-at/typescript-flatbuffers-codegen@0.1.3': dependencies: deep-equal: 2.2.3 @@ -6701,11 +6409,6 @@ snapshots: typescript: 4.8.4 yargs: 16.2.0 - '@monogrid/gainmap-js@3.0.5(three@0.163.0)': - dependencies: - promise-worker-transferable: 1.0.4 - three: 0.163.0 - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.7.0 @@ -6860,94 +6563,6 @@ snapshots: '@react-hookz/deep-equal@3.0.3': {} - '@react-spring/animated@9.6.1(react@18.3.1)': - dependencies: - '@react-spring/shared': 9.6.1(react@18.3.1) - '@react-spring/types': 9.6.1 - react: 18.3.1 - - '@react-spring/core@9.6.1(react@18.3.1)': - dependencies: - '@react-spring/animated': 9.6.1(react@18.3.1) - '@react-spring/rafz': 9.6.1 - '@react-spring/shared': 9.6.1(react@18.3.1) - '@react-spring/types': 9.6.1 - react: 18.3.1 - - '@react-spring/rafz@9.6.1': {} - - '@react-spring/shared@9.6.1(react@18.3.1)': - dependencies: - '@react-spring/rafz': 9.6.1 - '@react-spring/types': 9.6.1 - react: 18.3.1 - - '@react-spring/three@9.6.1(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0))(react@18.3.1)(three@0.163.0)': - dependencies: - '@react-spring/animated': 9.6.1(react@18.3.1) - '@react-spring/core': 9.6.1(react@18.3.1) - '@react-spring/shared': 9.6.1(react@18.3.1) - '@react-spring/types': 9.6.1 - '@react-three/fiber': 8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0) - react: 18.3.1 - three: 0.163.0 - - '@react-spring/types@9.6.1': {} - - '@react-three/drei@9.114.5(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0))(@types/react@18.3.11)(@types/three@0.163.0)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0)': - dependencies: - '@babel/runtime': 7.24.7 - '@mediapipe/tasks-vision': 0.10.8 - '@monogrid/gainmap-js': 3.0.5(three@0.163.0) - '@react-spring/three': 9.6.1(@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0))(react@18.3.1)(three@0.163.0) - '@react-three/fiber': 8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0) - '@use-gesture/react': 10.3.1(react@18.3.1) - camera-controls: 2.8.5(three@0.163.0) - cross-env: 7.0.3 - detect-gpu: 5.0.38 - glsl-noise: 0.0.0 - hls.js: 1.5.17 - maath: 0.10.7(@types/three@0.163.0)(three@0.163.0) - meshline: 3.3.1(three@0.163.0) - react: 18.3.1 - react-composer: 5.0.3(react@18.3.1) - stats-gl: 2.2.8 - stats.js: 0.17.0 - suspend-react: 0.1.3(react@18.3.1) - three: 0.163.0 - three-mesh-bvh: 0.7.8(three@0.163.0) - three-stdlib: 2.30.3(three@0.163.0) - troika-three-text: 0.49.1(three@0.163.0) - tunnel-rat: 0.1.2(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - utility-types: 3.11.0 - uuid: 9.0.1 - zustand: 3.7.2(react@18.3.1) - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - '@types/three' - - immer - - '@react-three/fiber@8.17.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(three@0.163.0)': - dependencies: - '@babel/runtime': 7.24.7 - '@types/debounce': 1.2.4 - '@types/react-reconciler': 0.26.7 - '@types/webxr': 0.5.16 - base64-js: 1.5.1 - buffer: 6.0.3 - debounce: 1.2.1 - its-fine: 1.2.5(react@18.3.1) - react: 18.3.1 - react-reconciler: 0.27.0(react@18.3.1) - scheduler: 0.21.0 - suspend-react: 0.1.3(react@18.3.1) - three: 0.163.0 - zustand: 3.7.2(react@18.3.1) - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) - '@remix-run/router@1.20.0': {} '@rollup/rollup-android-arm-eabi@4.24.0': @@ -7232,14 +6847,10 @@ snapshots: '@types/node': 24.10.0 '@types/responselike': 1.0.3 - '@types/debounce@1.2.4': {} - '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - '@types/draco3d@1.4.10': {} - '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -7276,8 +6887,6 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/offscreencanvas@2019.7.3': {} - '@types/plist@3.0.5': dependencies: '@types/node': 24.10.0 @@ -7297,14 +6906,6 @@ snapshots: dependencies: '@types/react': 18.3.11 - '@types/react-reconciler@0.26.7': - dependencies: - '@types/react': 18.3.11 - - '@types/react-reconciler@0.28.8': - dependencies: - '@types/react': 18.3.11 - '@types/react@18.3.11': dependencies: '@types/prop-types': 15.7.12 @@ -7585,13 +7186,6 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@use-gesture/core@10.3.1': {} - - '@use-gesture/react@10.3.1(react@18.3.1)': - dependencies: - '@use-gesture/core': 10.3.1 - react: 18.3.1 - '@vitejs/plugin-react@4.3.2(vite@5.4.9(@types/node@24.10.0)(sass@1.80.2)(terser@5.31.1))': dependencies: '@babel/core': 7.25.8 @@ -7881,10 +7475,6 @@ snapshots: base64-js@1.5.1: {} - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - binary-extensions@2.3.0: {} bl@4.1.0: @@ -7938,11 +7528,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - builder-util-runtime@9.5.1: dependencies: debug: 4.4.3 @@ -8054,10 +7639,6 @@ snapshots: camelcase-css@2.0.1: {} - camera-controls@2.8.5(three@0.163.0): - dependencies: - three: 0.163.0 - caniuse-lite@1.0.30001636: {} caniuse-lite@1.0.30001669: {} @@ -8204,15 +7785,6 @@ snapshots: concat-map@0.0.1: {} - concurrently@9.2.1: - dependencies: - chalk: 4.1.2 - rxjs: 7.8.2 - shell-quote: 1.8.3 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 - convert-source-map@2.0.0: {} convert@5.13.1: {} @@ -8228,10 +7800,6 @@ snapshots: cross-dirname@0.1.0: optional: true - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.3 - cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -8292,8 +7860,6 @@ snapshots: dateformat@4.6.3: {} - debounce@1.2.1: {} - debug@3.2.7: dependencies: ms: 2.1.3 @@ -8378,10 +7944,6 @@ snapshots: dequal@2.0.3: {} - detect-gpu@5.0.38: - dependencies: - webgl-constants: 1.1.1 - detect-libc@1.0.3: {} detect-libc@2.1.2: {} @@ -8438,8 +8000,6 @@ snapshots: dotenv@16.4.5: {} - draco3d@1.5.7: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9074,8 +8634,6 @@ snapshots: optionalDependencies: picomatch: 4.0.3 - fflate@0.6.10: {} - fflate@0.8.2: {} file-entry-cache@8.0.0: @@ -9330,8 +8888,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - glsl-noise@0.0.0: {} - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -9444,8 +9000,6 @@ snapshots: highlight.js@10.7.3: {} - hls.js@1.5.17: {} - hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -9514,11 +9068,6 @@ snapshots: ignore@7.0.5: {} - immediate@3.0.6: {} - - immer@10.1.1: - optional: true - immutable@4.3.6: {} import-fresh@3.3.0: @@ -9700,8 +9249,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@2.2.2: {} - is-regex@1.1.4: dependencies: call-bind: 1.0.2 @@ -9799,11 +9346,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - its-fine@1.2.5(react@18.3.1): - dependencies: - '@types/react-reconciler': 0.28.8 - react: 18.3.1 - jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 @@ -9894,10 +9436,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lie@3.3.0: - dependencies: - immediate: 3.0.6 - lilconfig@2.1.0: {} lilconfig@3.1.2: {} @@ -9980,11 +9518,6 @@ snapshots: dependencies: yallist: 4.0.0 - maath@0.10.7(@types/three@0.163.0)(three@0.163.0): - dependencies: - '@types/three': 0.163.0 - three: 0.163.0 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -10181,10 +9714,6 @@ snapshots: merge2@1.4.1: {} - meshline@3.3.1(three@0.163.0): - dependencies: - three: 0.163.0 - meshoptimizer@0.18.1: {} micromark-core-commonmark@2.0.1: @@ -10916,8 +10445,6 @@ snapshots: commander: 9.5.0 optional: true - potpack@1.0.2: {} - powershell-utils@0.1.0: {} prelude-ls@1.2.1: {} @@ -10935,11 +10462,6 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 - promise-worker-transferable@1.0.4: - dependencies: - is-promise: 2.2.2 - lie: 3.3.0 - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -10976,11 +10498,6 @@ snapshots: quick-lru@5.1.1: {} - react-composer@5.0.3(react@18.3.1): - dependencies: - prop-types: 15.8.1 - react: 18.3.1 - react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -11036,12 +10553,6 @@ snapshots: react-lifecycles-compat: 3.0.4 warning: 4.0.3 - react-reconciler@0.27.0(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.21.0 - react-refresh@0.14.2: {} react-responsive@10.0.0(react@18.3.1): @@ -11274,10 +10785,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.2: - dependencies: - tslib: 2.6.3 - safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -11329,10 +10836,6 @@ snapshots: sax@1.4.4: {} - scheduler@0.21.0: - dependencies: - loose-envify: 1.4.0 - scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -11385,8 +10888,6 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} - should-equal@2.0.0: dependencies: should-type: 1.4.0 @@ -11546,12 +11047,6 @@ snapshots: stat-mode@1.0.0: {} - stats-gl@2.2.8: - dependencies: - '@types/three': 0.163.0 - - stats.js@0.17.0: {} - stop-iteration-iterator@1.0.0: dependencies: internal-slot: 1.0.7 @@ -11693,16 +11188,8 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - suspend-react@0.1.3(react@18.3.1): - dependencies: - react: 18.3.1 - swagger2openapi@7.0.8(encoding@0.1.13): dependencies: call-me-maybe: 1.0.2 @@ -11786,20 +11273,6 @@ snapshots: dependencies: real-require: 0.2.0 - three-mesh-bvh@0.7.8(three@0.163.0): - dependencies: - three: 0.163.0 - - three-stdlib@2.30.3(three@0.163.0): - dependencies: - '@types/draco3d': 1.4.10 - '@types/offscreencanvas': 2019.7.3 - '@types/webxr': 0.5.16 - draco3d: 1.5.7 - fflate: 0.6.10 - potpack: 1.0.2 - three: 0.163.0 - three@0.163.0: {} tiny-async-pool@1.3.0: @@ -11831,24 +11304,8 @@ snapshots: tr46@0.0.3: {} - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} - troika-three-text@0.49.1(three@0.163.0): - dependencies: - bidi-js: 1.0.3 - three: 0.163.0 - troika-three-utils: 0.49.0(three@0.163.0) - troika-worker-utils: 0.49.0 - webgl-sdf-generator: 1.1.1 - - troika-three-utils@0.49.0(three@0.163.0): - dependencies: - three: 0.163.0 - - troika-worker-utils@0.49.0: {} - trough@2.2.0: {} truncate-utf8-bytes@1.0.2: @@ -11900,14 +11357,6 @@ snapshots: tslib: 1.14.1 typescript: 4.8.2 - tunnel-rat@0.1.2(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1): - dependencies: - zustand: 4.5.2(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - react - typanion@3.14.0: {} type-check@0.4.0: @@ -12117,20 +11566,12 @@ snapshots: dependencies: react: 18.3.1 - use-sync-external-store@1.2.0(react@18.3.1): - dependencies: - react: 18.3.1 - utf8-byte-length@1.0.5: {} util-deprecate@1.0.2: {} - utility-types@3.11.0: {} - uuid@13.0.0: {} - uuid@9.0.1: {} - verror@1.10.1: dependencies: assert-plus: 1.0.0 @@ -12166,10 +11607,6 @@ snapshots: dependencies: defaults: 1.0.4 - webgl-constants@1.1.1: {} - - webgl-sdf-generator@1.1.1: {} - webidl-conversions@3.0.1: {} webpack-sources@3.2.3: {} @@ -12350,16 +11787,4 @@ snapshots: zod@4.1.13: {} - zustand@3.7.2(react@18.3.1): - optionalDependencies: - react: 18.3.1 - - zustand@4.5.2(@types/react@18.3.11)(immer@10.1.1)(react@18.3.1): - dependencies: - use-sync-external-store: 1.2.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - immer: 10.1.1 - react: 18.3.1 - zwitch@2.0.4: {} From 50a2be81f761df391b17a86d12b62e9f9b91b6dd Mon Sep 17 00:00:00 2001 From: loucass003 Date: Sat, 14 Feb 2026 03:04:40 +0100 Subject: [PATCH 007/103] Progress --- .github/workflows/build-gui.yml | 22 +++++++++++----------- gui/electron/main/utils.ts | 3 ++- gui/src/vite-env.d.ts | 5 +++++ server/android/build.gradle.kts | 2 +- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-gui.yml b/.github/workflows/build-gui.yml index 8053ab0f1..2b42d1d49 100644 --- a/.github/workflows/build-gui.yml +++ b/.github/workflows/build-gui.yml @@ -63,17 +63,17 @@ jobs: with: submodules: recursive - - if: startsWith(matrix.os, 'ubuntu') - name: Set up Linux dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.6.0 - with: - packages: libgtk-3-dev libappindicator3-dev librsvg2-dev patchelf - # Increment to invalidate the cache - version: ${{ format('v1.1-{0}', env.BUILD_ARCH) }} - # Enables a workaround to attempt to run pre and post install scripts - execute_install_scripts: true - # Disables uploading logs as a build artifact - debug: false + # - if: startsWith(matrix.os, 'ubuntu') + # name: Set up Linux dependencies + # uses: awalsh128/cache-apt-pkgs-action@v1.6.0 + # with: + # packages: libgtk-3-dev libappindicator3-dev librsvg2-dev patchelf + # # Increment to invalidate the cache + # version: ${{ format('v2-{0}', env.BUILD_ARCH) }} + # # Enables a workaround to attempt to run pre and post install scripts + # execute_install_scripts: true + # # Disables uploading logs as a build artifact + # debug: false - uses: pnpm/action-setup@v4 - name: Use Node.js diff --git a/gui/electron/main/utils.ts b/gui/electron/main/utils.ts index 3444fbfa1..03259368c 100644 --- a/gui/electron/main/utils.ts +++ b/gui/electron/main/utils.ts @@ -25,6 +25,7 @@ export function handleIpc( ) => ReturnType ) { ipcMain.handle(channel, (event, ...args) => { - return handler(event, ...args); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return handler(event, ...args as any); }); } diff --git a/gui/src/vite-env.d.ts b/gui/src/vite-env.d.ts index 843b46429..0b12fd0e4 100644 --- a/gui/src/vite-env.d.ts +++ b/gui/src/vite-env.d.ts @@ -14,3 +14,8 @@ interface Window { } declare module 'tailwind-gradient-mask-image'; + +declare module '*?asset' { + const content: string; + export default content; +} diff --git a/server/android/build.gradle.kts b/server/android/build.gradle.kts index 1c2628c14..d46ce2ad5 100644 --- a/server/android/build.gradle.kts +++ b/server/android/build.gradle.kts @@ -34,7 +34,7 @@ java { val copyGuiAssets = tasks.register("copyGuiAssets") { val target = layout.projectDirectory.dir("src/main/assets/web-gui") delete(target) - from(rootProject.layout.projectDirectory.dir("gui/dist")) + from(rootProject.layout.projectDirectory.dir("gui/out/renderer")) into(target) if (inputs.sourceFiles.isEmpty) { throw GradleException("You need to run \"pnpm run build\" on the gui folder first!") From d1387508e6bf53aa90ed8664c2dc51d4bba4a770 Mon Sep 17 00:00:00 2001 From: loucass003 Date: Mon, 16 Feb 2026 14:11:19 +0100 Subject: [PATCH 008/103] Progress --- flake.nix | 2 + gui/electron/main/index.ts | 38 +++++++++++------ gui/electron/preload/index.ts | 4 +- gui/electron/preload/interface.d.ts | 41 +++++++++++++------ gui/electron/shared.ts | 25 ++++++++--- gui/src/App.tsx | 12 +----- gui/src/components/TopBar.tsx | 2 - gui/src/components/VersionUpdateModal.tsx | 11 ++--- gui/src/components/commons/A.tsx | 4 +- .../components/commons/SystemFileInput.tsx | 5 +-- .../onboarding/pages/ConnectionLost.tsx | 8 ++-- .../settings/pages/AdvancedSettings.tsx | 5 +-- .../settings/pages/InterfaceSettings.tsx | 2 +- .../widgets/IMUVisualizerWidget.tsx | 6 ++- .../widgets/SkeletonVisualizerWidget.tsx | 19 +++++---- gui/src/hooks/breakpoint.ts | 1 - gui/src/hooks/bvh.ts | 4 +- gui/src/hooks/cache.ts | 2 +- gui/src/hooks/config.ts | 3 +- gui/src/hooks/crossplatform.ts | 3 +- gui/src/hooks/discord-presence.ts | 1 + gui/src/hooks/firmware-update.ts | 20 +++++---- gui/src/index.scss | 3 +- gui/src/index.tsx | 2 +- 24 files changed, 129 insertions(+), 94 deletions(-) diff --git a/flake.nix b/flake.nix index 2e9077fe0..96eb23e64 100644 --- a/flake.nix +++ b/flake.nix @@ -152,6 +152,8 @@ name = "slimevr-electron"; buildInputs = with pkgs; [ + jdk17 + kotlin nodejs_22 pnpm pkg-config diff --git a/gui/electron/main/index.ts b/gui/electron/main/index.ts index 4fb2c951a..7cb2ed648 100644 --- a/gui/electron/main/index.ts +++ b/gui/electron/main/index.ts @@ -48,13 +48,31 @@ protocol.registerSchemesAsPrivileged([ standard: true, secure: true, supportFetchAPI: true, - corsEnabled: true - } - } + corsEnabled: true, + }, + }, ]); let mainWindow: BrowserWindow | null = null; +handleIpc(IPC_CHANNELS.GH_FETCH, async (e, options) => { + console.log(options) + if (options.type === 'fw-releases') { + return fetch( + 'https://api.github.com/repos/SlimeVR/SlimeVR-Tracker-ESP/releases' + ).then((res) => res.json()); + } + if (options.type === 'asset') { + if ( + !options.url.startsWith( + 'https://github.com/SlimeVR/SlimeVR-Tracker-ESP/releases/download' + ) + ) + return null; + return fetch(options.url).then((res) => res.json()); + } +}); + handleIpc(IPC_CHANNELS.OS_STATS, async () => { return { type: getPlatform(), @@ -335,7 +353,7 @@ const checkEnvironmentVariables = () => { const findServerJar = () => { const paths = [ options.path, - // AppImage passes the fakeroot in `APPDIR` env var. + // AppImage passes the fakeroot in `APPDIR` env var. process.env['APPDIR'] ? path.resolve(join(process.env['APPDIR'], 'usr/share/slimevr/')) : undefined, @@ -351,8 +369,7 @@ const findServerJar = () => { .find((p) => existsSync(p)); }; -const validJavaPaths = () => { -} +const validJavaPaths = () => {}; const findJavaBin = (sharedDir: string) => { const javaBin = getPlatform() === 'windows' ? 'java.exe' : 'java'; @@ -360,14 +377,10 @@ const findJavaBin = (sharedDir: string) => { if (!existsSync(jre)) { return validJavaPaths(); } - - - -} +}; const spawnServer = () => { - - const serverJar = findServerJar() + const serverJar = findServerJar(); if (!serverJar) { return false; } @@ -375,7 +388,6 @@ const spawnServer = () => { const javaBin = findJavaBin(sharedDir); logger.info({ serverJar }, 'found server jar'); - }; app.whenReady().then(() => { diff --git a/gui/electron/preload/index.ts b/gui/electron/preload/index.ts index d0d778df0..5d132d296 100644 --- a/gui/electron/preload/index.ts +++ b/gui/electron/preload/index.ts @@ -1,7 +1,6 @@ import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron'; import { IElectronAPI, ServerStatusEvent } from './interface'; import { IPC_CHANNELS } from '../shared'; -// import { getGuiDataFolder, getLogsFolder } from 'electron/main/paths'; contextBridge.exposeInMainWorld('electronAPI', { onServerStatus: (callback) => { @@ -34,5 +33,6 @@ contextBridge.exposeInMainWorld('electronAPI', { saveDialog: (options) => ipcRenderer.invoke(IPC_CHANNELS.SAVE_DIALOG, options), openConfigFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'config')), openLogsFolder: async () => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, await ipcRenderer.invoke(IPC_CHANNELS.GET_FOLDER, 'logs')), - openFile: (path) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, path) + openFile: (path) => ipcRenderer.invoke(IPC_CHANNELS.OPEN_FILE, path), + ghGet: (req) => ipcRenderer.invoke(IPC_CHANNELS.GH_FETCH, req), } satisfies IElectronAPI); diff --git a/gui/electron/preload/interface.d.ts b/gui/electron/preload/interface.d.ts index e536ba87e..eb834186b 100644 --- a/gui/electron/preload/interface.d.ts +++ b/gui/electron/preload/interface.d.ts @@ -1,13 +1,18 @@ -import { OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from "electron"; +import { + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from 'electron'; export type ServerStatusEvent = { type: 'stdout' | 'stderr' | 'error' | 'terminated' | 'other'; message: string; -} +}; export type OSStats = { type: 'linux' | 'windows' | 'macos' | 'unknown'; -} +}; export interface CrossStorage { set(key: string, value: unknown): Promise; @@ -16,14 +21,25 @@ export interface CrossStorage { save(): Promise; } +export type GHGet = { type: 'fw-releases' } | { type: 'asset'; url: string }; +export type GHReturn = { + asset: [number, string][] | null; + ['fw-releases']: + | { + assets: { browser_download_url: string; name: string; digest: string }[]; + prerelease: boolean; + tag_name: string; + body: string; + }[] + | null; +}; + export interface IElectronAPI { - onServerStatus: ( - cb: (data: ServerStatusEvent) => void - ) => () => void; - openUrl: (url: string) => Promise - osStats: () => Promise, - openLogsFolder: () => Promise, - openConfigFolder: () => Promise, + onServerStatus: (cb: (data: ServerStatusEvent) => void) => () => void; + openUrl: (url: string) => Promise; + osStats: () => Promise; + openLogsFolder: () => Promise; + openConfigFolder: () => Promise; close: () => void; minimize: () => void; maximize: () => void; @@ -31,10 +47,11 @@ export interface IElectronAPI { setTranslations: (translations: Record) => void; i18nOverride: () => Promise; getStorage: (type: 'settings' | 'cache') => Promise; - openDialog: (options: OpenDialogOptions) => Promise - saveDialog: (options: SaveDialogOptions) => Promise + openDialog: (options: OpenDialogOptions) => Promise; + saveDialog: (options: SaveDialogOptions) => Promise; log: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void; openFile: (path: string) => void; + ghGet: (options: T) => Promise; } declare global { diff --git a/gui/electron/shared.ts b/gui/electron/shared.ts index b3e5b7323..8218ef4c1 100644 --- a/gui/electron/shared.ts +++ b/gui/electron/shared.ts @@ -1,5 +1,10 @@ -import { OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from 'electron'; -import { OSStats, ServerStatusEvent } from './preload/interface'; +import { + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from 'electron'; +import { GHGet, GHReturn, OSStats, ServerStatusEvent } from './preload/interface'; export const IPC_CHANNELS = { SERVER_STATUS: 'server-status', @@ -13,6 +18,7 @@ export const IPC_CHANNELS = { I18N_OVERRIDE: 'i18n-override', OPEN_FILE: 'open-file', GET_FOLDER: 'get-folder', + GH_FETCH: 'gh-fetch', } as const; export interface IpcInvokeMap { @@ -20,17 +26,24 @@ export interface IpcInvokeMap { [IPC_CHANNELS.OS_STATS]: () => Promise; [IPC_CHANNELS.WINDOW_ACTIONS]: (action: 'close' | 'minimize' | 'maximize') => void; [IPC_CHANNELS.LOG]: (type: 'info' | 'error' | 'warn', ...args: unknown[]) => void; - [IPC_CHANNELS.OPEN_DIALOG]: (options: OpenDialogOptions) => Promise; - [IPC_CHANNELS.SAVE_DIALOG]: (options: SaveDialogOptions) => Promise; - [IPC_CHANNELS.I18N_OVERRIDE]: () => Promise, + [IPC_CHANNELS.OPEN_DIALOG]: ( + options: OpenDialogOptions + ) => Promise; + [IPC_CHANNELS.SAVE_DIALOG]: ( + options: SaveDialogOptions + ) => Promise; + [IPC_CHANNELS.I18N_OVERRIDE]: () => Promise; [IPC_CHANNELS.STORAGE]: (args: { type: 'settings' | 'cache'; method: 'get' | 'set' | 'delete' | 'save'; key?: string; - value?: unknown + value?: unknown; }) => Promise; [IPC_CHANNELS.OPEN_FILE]: (path: string) => void; [IPC_CHANNELS.GET_FOLDER]: (folder: 'config' | 'logs') => string; + [IPC_CHANNELS.GH_FETCH]: ( + options: T + ) => Promise; } /** diff --git a/gui/src/App.tsx b/gui/src/App.tsx index c7fc0410b..ce318f74e 100644 --- a/gui/src/App.tsx +++ b/gui/src/App.tsx @@ -1,10 +1,5 @@ import { createContext, useEffect, useState } from 'react'; -import { - HashRouter as Router, - Outlet, - Route, - Routes, -} from 'react-router-dom'; +import { HashRouter as Router, Outlet, Route, Routes } from 'react-router-dom'; import { Home } from './components/home/Home'; import { MainLayout } from './components/MainLayout'; import { AppContextProvider } from './components/providers/AppContext'; @@ -55,10 +50,7 @@ import { StayAlignedSetup } from './components/onboarding/pages/stay-aligned/Sta import { TrackingChecklistProvider } from './components/tracking-checklist/TrackingChecklistProvider'; import { HomeScreenSettings } from './components/settings/pages/HomeScreenSettings'; import { ChecklistPage } from './components/tracking-checklist/TrackingChecklist'; -import { - ElectronContextC, - provideElectron, -} from './hooks/electron'; +import { ElectronContextC, provideElectron } from './hooks/electron'; import { AppLocalizationProvider } from './i18n/config'; import { openUrl } from './hooks/crossplatform'; diff --git a/gui/src/components/TopBar.tsx b/gui/src/components/TopBar.tsx index 28febfffc..e15006485 100644 --- a/gui/src/components/TopBar.tsx +++ b/gui/src/components/TopBar.tsx @@ -22,7 +22,6 @@ import { GearIcon } from './commons/icon/GearIcon'; import { TrackersStillOnModal } from './TrackersStillOnModal'; import { useConfig } from '@/hooks/config'; import { TrayOrExitModal } from './TrayOrExitModal'; -import { useDoubleTap } from 'use-double-tap'; import { ErrorConsentModal } from './ErrorConsentModal'; import { useAtomValue } from 'jotai'; import { connectedIMUTrackersAtom } from '@/store/app-store'; @@ -95,7 +94,6 @@ export function TopBar({ } }; - // useEffect(() => { // if (!electron.isElectron) return; diff --git a/gui/src/components/VersionUpdateModal.tsx b/gui/src/components/VersionUpdateModal.tsx index c66fc27d4..6abbeefec 100644 --- a/gui/src/components/VersionUpdateModal.tsx +++ b/gui/src/components/VersionUpdateModal.tsx @@ -10,7 +10,7 @@ import { useElectron } from '@/hooks/electron'; import { openUrl } from '@/hooks/crossplatform'; export function VersionUpdateModal() { - const electron = useElectron() + const electron = useElectron(); const { l10n } = useLocalization(); const newVersion = useContext(VersionContext); const [forceClose, setForceClose] = useState(false); @@ -53,10 +53,11 @@ export function VersionUpdateModal() { +
+
+
{udevContent}
+
+
+
+
+ setDontShowAgain(e.currentTarget.checked)} + /> +
+
+ + ); +} diff --git a/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx b/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx new file mode 100755 index 000000000..67b7c7776 --- /dev/null +++ b/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx @@ -0,0 +1,51 @@ +import { Localized, useLocalization } from '@fluent/react'; +import { Typography } from '@/components/commons/Typography'; +import { Button } from '@/components/commons/Button'; +import { useConfig } from '@/hooks/config'; + +export function ErrorCollectingConsentPage() { + const { setConfig } = useConfig(); + + const accept = () => { + setConfig({ errorTracking: true }); + }; + + const cancel = () => { + setConfig({ errorTracking: false }); + }; + + const { l10n } = useLocalization(); + return ( +
+
+
+ + , + h1: , + }} + > + + +
+
+ +
+
+
+ ); +} diff --git a/gui/src/components/onboarding/pages/Home.tsx b/gui/src/components/onboarding/pages/Home.tsx index 019943a0e..c70163dce 100644 --- a/gui/src/components/onboarding/pages/Home.tsx +++ b/gui/src/components/onboarding/pages/Home.tsx @@ -19,7 +19,7 @@ export function HomePage() { {l10n.getString('onboarding-home')} -
diff --git a/gui/src/hooks/config.ts b/gui/src/hooks/config.ts index 03e0de6b7..39cc7cfab 100644 --- a/gui/src/hooks/config.ts +++ b/gui/src/hooks/config.ts @@ -48,6 +48,7 @@ export interface Config { homeLayout: 'default' | 'table'; skeletonPreview: boolean; lastUsedProportions: 'manual' | 'autobone' | 'scaled' | null; + dontShowUdevModal: boolean; } export interface ConfigContext { @@ -79,6 +80,7 @@ export const defaultConfig: Config = { homeLayout: 'default', skeletonPreview: true, lastUsedProportions: null, + dontShowUdevModal: false, }; const localStore: CrossStorage = { diff --git a/gui/src/utils/sentry.ts b/gui/src/utils/sentry.ts index 087d3f1e0..215119434 100644 --- a/gui/src/utils/sentry.ts +++ b/gui/src/utils/sentry.ts @@ -11,8 +11,12 @@ import { DeviceDataT } from 'solarxr-protocol'; export function getSentryOrCompute(enabled = false, uuid: string) { Sentry.setUser({ id: uuid }); + // if sentry is already initialized - SKIP - if (enabled && Sentry.isInitialized()) return; + if (enabled && Sentry.isInitialized()) { + log('Sentry already enabled, skipping initialization'); + return; + } const client = Sentry.getClient(); if (client) { diff --git a/solarxr-protocol b/solarxr-protocol index fa2895b19..5cd10bd96 160000 --- a/solarxr-protocol +++ b/solarxr-protocol @@ -1 +1 @@ -Subproject commit fa2895b19a53d9b1686de8c2a6efe2b3e9ca4fc6 +Subproject commit 5cd10bd96ad7ffbc511ea0706eaf42bc3d48f55f From a0e8e356bbc0bfb96aa9c2251f5fe31e93bb6b06 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Fri, 27 Feb 2026 18:12:47 +0100 Subject: [PATCH 035/103] PR Suggestions --- .../dev/slimevr/desktop/install/drivers/InstallDrivers.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt index 5b66c1088..3613d7daf 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt @@ -1,5 +1,7 @@ package dev.slimevr.desktop.install.drivers +import io.eiren.util.logging.LogManager + class InstallDrivers { val os = System.getProperty("os.name").lowercase() @@ -11,13 +13,11 @@ class InstallDrivers { val linuxFlavour = executeShellCommand("uname", "-n") linuxUpdater.updateLinux() } else if (os.contains("windows")) { - println("Running windows updater") + LogManager.info("Running windows updater") val windowsUpdater = Windows() windowsUpdater.updateWindows() - } else if (os.contains("darwin")) { - println("I dunno") } else { - println("guess I'll die") + println("Unsupported Operating System") } return } From 7e7e67631e433529eb09b54e611db37b4a5f896e Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Mon, 2 Mar 2026 10:53:24 +0100 Subject: [PATCH 036/103] Remove duplicate Updater.kt Added specific Nix and SteamOS configs. Updated Feeder install function on Linux. Update Feeder install function on Windows. Lint. --- .../rpc/installinfo/RPCInstallInfoHandler.kt | 13 ++------ .../desktop/install/drivers/InstallDrivers.kt | 14 ++++++-- .../desktop/install/drivers/InstallerUtils.kt | 33 +------------------ .../slimevr/desktop/install/drivers/Linux.kt | 21 ++++++++---- .../desktop/install/drivers/Updater.kt | 26 --------------- .../desktop/install/drivers/Windows.kt | 15 +++++---- 6 files changed, 37 insertions(+), 85 deletions(-) delete mode 100644 server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Updater.kt diff --git a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt index 1a70c30cb..fbcc62e0e 100644 --- a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt +++ b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt @@ -10,21 +10,14 @@ import solarxr_protocol.rpc.RpcMessage import solarxr_protocol.rpc.RpcMessageHeader import java.io.IOException -class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI){ +class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { init { rpcHandler.registerPacketListener(RpcMessage.InstalledInfoRequest, ::onInstalledInfoRequest) } fun onInstalledInfoRequest(conn: GenericConnection, messageHeader: RpcMessageHeader?) { val udevResponse = executeShellCommand("udevadm", "cat") - var response = false - if (udevResponse.contains("slime")) { - response = true - } - else { - response = false - } - + val response = udevResponse.contains("slime") val fbb = FlatBufferBuilder(1024) val outbound = this.rpcHandler.createRPCMessage( fbb, @@ -35,8 +28,6 @@ class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI){ conn.send(fbb.dataBuffer()) } - - private fun executeShellCommand(vararg command: String): String = try { val process = ProcessBuilder(*command) .redirectErrorStream(true) diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt index 3613d7daf..158fd8ab3 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt @@ -7,11 +7,19 @@ class InstallDrivers { val os = System.getProperty("os.name").lowercase() fun runUpdater() { - if (os.contains("linux")) { val linuxUpdater = Linux() - val linuxFlavour = executeShellCommand("uname", "-n") - linuxUpdater.updateLinux() + val linuxFlavour = executeShellCommand("cat", "/proc/version") + if (linuxFlavour.lowercase().contains("nix")) { + LogManager.warning("Running on NixOS, server will not install itself.") + return + } + if (linuxFlavour.lowercase().contains("steam")) { + LogManager.info("Running on steamos, skipping installation of udev rules") + linuxUpdater.updateSteamOS() + } else { + linuxUpdater.updateLinux() + } } else if (os.contains("windows")) { LogManager.info("Running windows updater") val windowsUpdater = Windows() diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt index 242e500ba..2220d2c7e 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt @@ -1,38 +1,7 @@ package dev.slimevr.desktop.install.drivers import io.eiren.util.logging.LogManager -import io.ktor.client.HttpClient -import io.ktor.client.call.body -import io.ktor.client.engine.cio.CIO -import io.ktor.client.plugins.contentnegotiation.ContentNegotiation -import io.ktor.client.plugins.onDownload -import io.ktor.client.plugins.timeout -import io.ktor.client.request.get -import io.ktor.client.request.prepareGet -import io.ktor.client.statement.bodyAsChannel -import io.ktor.http.contentLength -import io.ktor.serialization.kotlinx.json.json -import io.ktor.utils.io.jvm.javaio.copyTo -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.sync.Semaphore -import kotlinx.coroutines.sync.withPermit -import kotlinx.coroutines.withContext -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.JsonArray -import java.io.File -import java.io.FileOutputStream import java.io.IOException -import java.lang.Exception -import java.math.BigInteger -import java.nio.file.Files -import java.nio.file.Paths -import java.security.MessageDigest -import java.util.zip.ZipEntry -import java.util.zip.ZipFile -import kotlin.time.Duration.Companion.seconds fun executeShellCommand(vararg command: String): String = try { val process = ProcessBuilder(*command) @@ -43,5 +12,5 @@ fun executeShellCommand(vararg command: String): String = try { } } catch (e: IOException) { LogManager.warning("Error executing shell command: ${e.message}") - "Error executing shell command: ${e.message}" + "" } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt index 96a31f2af..1c9e9f3a3 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt @@ -15,6 +15,11 @@ class Linux { updateUdev() } + fun updateSteamOS() { + updateLinuxSteamVRDriver() + feeder() + } + fun updateLinuxSteamVRDriver() { val vrPathRegContents = executeShellCommand("${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh") val isDriverRegistered = vrPathRegContents.contains("slimevr") @@ -22,7 +27,7 @@ class Linux { executeShellCommand( "${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh", "adddriver", - "$path/$LINUXSTEAMVRDRIVERDIRECTORY/slimevr", + "$path/$LINUXSTEAMDRIVERDIRECTORY/slimevr", ) } else { LogManager.info("steamVR driver is already registered. Skipping...") @@ -31,8 +36,13 @@ class Linux { fun feeder() { executeShellCommand("chmod", "+x", "$path/$LINUXFEEDERDIRECTORY/SlimeVR-Feeder-App") - executeShellCommand("$path/$LINUXFEEDERDIRECTORY/SlimeVR-Feeder-App", "--install") - LogManager.info("feeder is registered.") + val feederOutput = executeShellCommand("$path/$LINUXFEEDERDIRECTORY/SlimeVR-Feeder-App", "--install") + LogManager.info(feederOutput) + if (feederOutput.lowercase().contains("manifest is not installed")) { + LogManager.warning("Could not install feeder application") + } else { + LogManager.info("Successfully installed feeder application") + } } fun updateUdev() { @@ -42,6 +52,7 @@ class Linux { return } val res = executeShellCommand("pkexec", "cp", "$path/69-slimevr-devices.rules", "/etc/udev/rules.d/69-slimevr-devices.rules") + LogManager.info(res) if (res.contains("Error")) { LogManager.warning("Error installing udev rules") } else { @@ -50,9 +61,7 @@ class Linux { } companion object { - // Linux URLs - private const val LINUXSTEAMVRDRIVERDIRECTORY = "slimevr-openvr-driver-x64-linux" + private const val LINUXSTEAMDRIVERDIRECTORY = "slimevr-openvr-driver-x64-linux" private const val LINUXFEEDERDIRECTORY = "SlimeVR-Feeder-App-Linux" - } } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Updater.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Updater.kt deleted file mode 100644 index cfb956f12..000000000 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Updater.kt +++ /dev/null @@ -1,26 +0,0 @@ -package dev.slimevr.desktop.install.drivers - -import io.eiren.util.logging.LogManager - - -class Updater { - - val os = System.getProperty("os.name").lowercase() - - fun runUpdater() { - if (os.contains("linux")) { - LogManager.info("Running linux updater") - val linuxUpdater = Linux() - val linuxFlavour = executeShellCommand("uname", "-n") - linuxUpdater.updateLinux() - } else if (os.contains("windows")) { - LogManager.info("Running windows updater") - val windowsUpdater = Windows() - windowsUpdater.updateWindows() - } else if (os.contains("darwin")) { - LogManager.info("I dunno") - } else { - LogManager.info("guess I'll die") - } - } -} diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt index 9b1418ccf..0324128aa 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt @@ -8,14 +8,12 @@ class Windows { val path = Paths.get("").toAbsolutePath().toString() fun updateWindows() { - // First check if everything is already installed. Install it if it isn't usbDrivers() steamVRDriver() feeder() } fun usbDrivers() { - val installedDriversList = executeShellCommand("powershell.exe", "pnputil /enum-drivers") val ch341ser = installedDriversList.contains("ch341ser.inf") val ch343ser = installedDriversList.contains("ch343ser.inf") @@ -26,13 +24,17 @@ class Windows { return } LogManager.info("Cannot find one of the drivers, installing drivers") - val driverinstallOutput = executeShellCommand("$path\\installusbdrivers.bat") - LogManager.info(driverinstallOutput) + val driverInstallOutput = executeShellCommand("$path\\installusbdrivers.bat") + LogManager.info(driverInstallOutput) } - fun feeder() { - executeShellCommand("${path}\\${WINDOWSFEEDERDIRECTORY}\\SlimeVR-Feeder-App.exe", "--install") + val feederOutput = executeShellCommand("${path}\\${WINDOWSFEEDERDIRECTORY}\\SlimeVR-Feeder-App.exe", "--install") + if (feederOutput.lowercase().contains("manifest is not installed")) { + LogManager.warning("Could not install feeder application") + } else { + LogManager.info("Successfully installed feeder application") + } } fun steamVRDriver() { @@ -61,6 +63,5 @@ class Windows { companion object { private const val WINDOWSSTEAMVRDRIVERDIRECTORY = "slimevr-openvr-driver-win64" private const val WINDOWSFEEDERDIRECTORY = "SlimeVR-Feeder-App-win64" - } } From c2f2fc219b128cb1f95d3f511a5223ec114ee0e3 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Mon, 2 Mar 2026 11:12:18 +0100 Subject: [PATCH 037/103] Revert ProtobufBridge.kt ProtobufMessages.java SteamVRBridge.kt. Remove wrong return string from executeShellCommand in RPCInstallInfoHandler.kt --- .../rpc/installinfo/RPCInstallInfoHandler.kt | 2 +- .../desktop/platform/ProtobufBridge.kt | 6 + .../desktop/platform/ProtobufMessages.java | 220 ++++++++++++++++-- .../slimevr/desktop/platform/SteamVRBridge.kt | 18 +- 4 files changed, 208 insertions(+), 38 deletions(-) diff --git a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt index fbcc62e0e..e8a98a8ea 100644 --- a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt +++ b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt @@ -37,6 +37,6 @@ class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { } } catch (e: IOException) { LogManager.warning("Error executing shell command: ${e.message}") - "Error executing shell command: ${e.message}" + "" } } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufBridge.kt b/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufBridge.kt index 4729d7aab..fdbee0672 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufBridge.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufBridge.kt @@ -7,6 +7,7 @@ import dev.slimevr.desktop.platform.ProtobufMessages.* import dev.slimevr.tracking.trackers.Tracker import dev.slimevr.tracking.trackers.TrackerStatus import dev.slimevr.tracking.trackers.TrackerStatus.Companion.getById +import dev.slimevr.tracking.trackers.TrackerUtils import dev.slimevr.util.ann.VRServerThread import io.eiren.util.ann.Synchronize import io.eiren.util.ann.ThreadSafe @@ -218,6 +219,11 @@ abstract class ProtobufBridge(@JvmField protected val bridgeName: String) : ISte "mounting_reset" -> instance.resetTrackersMounting(resetSourceName) + "feet_mounting_reset" -> instance.resetTrackersMounting( + resetSourceName, + TrackerUtils.feetsBodyParts, + ) + "pause_tracking" -> instance .togglePauseTracking(resetSourceName) diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufMessages.java b/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufMessages.java index 360dad4a2..ebb8e0f03 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufMessages.java +++ b/server/desktop/src/main/java/dev/slimevr/desktop/platform/ProtobufMessages.java @@ -3558,6 +3558,20 @@ public final class ProtobufMessages { * @return The trackerRole. */ int getTrackerRole(); + + /** + * string manufacturer = 5; + * + * @return The manufacturer. + */ + java.lang.String getManufacturer(); + + /** + * string manufacturer = 5; + * + * @return The bytes for manufacturer. + */ + com.google.protobuf.ByteString getManufacturerBytes(); } /** @@ -3588,6 +3602,7 @@ public final class ProtobufMessages { private TrackerAdded() { trackerSerial_ = ""; trackerName_ = ""; + manufacturer_ = ""; } public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { @@ -3713,6 +3728,48 @@ public final class ProtobufMessages { return trackerRole_; } + public static final int MANUFACTURER_FIELD_NUMBER = 5; + @SuppressWarnings("serial") + private volatile java.lang.Object manufacturer_ = ""; + + /** + * string manufacturer = 5; + * + * @return The manufacturer. + */ + @java.lang.Override + public java.lang.String getManufacturer() { + java.lang.Object ref = manufacturer_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + manufacturer_ = s; + return s; + } + } + + /** + * string manufacturer = 5; + * + * @return The bytes for manufacturer. + */ + @java.lang.Override + public com.google.protobuf.ByteString getManufacturerBytes() { + java.lang.Object ref = manufacturer_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString + .copyFromUtf8( + (java.lang.String) ref + ); + manufacturer_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -3742,6 +3799,9 @@ public final class ProtobufMessages { if (trackerRole_ != 0) { output.writeInt32(4, trackerRole_); } + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(manufacturer_)) { + com.google.protobuf.GeneratedMessage.writeString(output, 5, manufacturer_); + } getUnknownFields().writeTo(output); } @@ -3766,6 +3826,9 @@ public final class ProtobufMessages { size += com.google.protobuf.CodedOutputStream .computeInt32Size(4, trackerRole_); } + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(manufacturer_)) { + size += com.google.protobuf.GeneratedMessage.computeStringSize(5, manufacturer_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -3801,6 +3864,11 @@ public final class ProtobufMessages { != other.getTrackerRole() ) return false; + if ( + !getManufacturer() + .equals(other.getManufacturer()) + ) + return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; @@ -3821,6 +3889,8 @@ public final class ProtobufMessages { hash = (53 * hash) + getTrackerName().hashCode(); hash = (37 * hash) + TRACKER_ROLE_FIELD_NUMBER; hash = (53 * hash) + getTrackerRole(); + hash = (37 * hash) + MANUFACTURER_FIELD_NUMBER; + hash = (53 * hash) + getManufacturer().hashCode(); hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -3993,6 +4063,7 @@ public final class ProtobufMessages { trackerSerial_ = ""; trackerName_ = ""; trackerRole_ = 0; + manufacturer_ = ""; return this; } @@ -4044,6 +4115,9 @@ public final class ProtobufMessages { if (((from_bitField0_ & 0x00000008) != 0)) { result.trackerRole_ = trackerRole_; } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.manufacturer_ = manufacturer_; + } } @java.lang.Override @@ -4083,6 +4157,11 @@ public final class ProtobufMessages { if (other.getTrackerRole() != 0) { setTrackerRole(other.getTrackerRole()); } + if (!other.getManufacturer().isEmpty()) { + manufacturer_ = other.manufacturer_; + bitField0_ |= 0x00000010; + onChanged(); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -4130,6 +4209,11 @@ public final class ProtobufMessages { bitField0_ |= 0x00000008; break; } // case 32 + case 42: { + manufacturer_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } // case 42 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -4398,6 +4482,93 @@ public final class ProtobufMessages { return this; } + private java.lang.Object manufacturer_ = ""; + + /** + * string manufacturer = 5; + * + * @return The manufacturer. + */ + public java.lang.String getManufacturer() { + java.lang.Object ref = manufacturer_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + manufacturer_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string manufacturer = 5; + * + * @return The bytes for manufacturer. + */ + public com.google.protobuf.ByteString getManufacturerBytes() { + java.lang.Object ref = manufacturer_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = com.google.protobuf.ByteString + .copyFromUtf8( + (java.lang.String) ref + ); + manufacturer_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string manufacturer = 5; + * + * @param value The manufacturer to set. + * @return This builder for chaining. + */ + public Builder setManufacturer( + java.lang.String value + ) { + if (value == null) { + throw new NullPointerException(); + } + manufacturer_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + /** + * string manufacturer = 5; + * + * @return This builder for chaining. + */ + public Builder clearManufacturer() { + manufacturer_ = getDefaultInstance().getManufacturer(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + + /** + * string manufacturer = 5; + * + * @param value The bytes for manufacturer to set. + * @return This builder for chaining. + */ + public Builder setManufacturerBytes( + com.google.protobuf.ByteString value + ) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + manufacturer_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:messages.TrackerAdded) } @@ -8872,53 +9043,55 @@ public final class ProtobufMessages { + "ctionArgumentsEntry\0326\n\024ActionArgumentsEn" + - "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"f\n\014T" + "try\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"|\n\014T" + "rackerAdded\022\022\n\ntracker_id\030\001 \001(\005\022\026\n\016track" + "er_serial\030\002 \001(\t\022\024\n\014tracker_name\030\003 \001(\t\022\024\n" + - "\014tracker_role\030\004 \001(\005\"\374\002\n\rTrackerStatus\022\022\n" + "\014tracker_role\030\004 \001(\005\022\024\n\014manufacturer\030\005 \001(" + - "\ntracker_id\030\001 \001(\005\022.\n\006status\030\002 \001(\0162\036.mess" + "\t\"\374\002\n\rTrackerStatus\022\022\n\ntracker_id\030\001 \001(\005\022" + - "ages.TrackerStatus.Status\0221\n\005extra\030\003 \003(\013" + ".\n\006status\030\002 \001(\0162\036.messages.TrackerStatus" + - "2\".messages.TrackerStatus.ExtraEntry\022;\n\n" + ".Status\0221\n\005extra\030\003 \003(\0132\".messages.Tracke" + - "confidence\030\004 \001(\0162\".messages.TrackerStatu" + "rStatus.ExtraEntry\022;\n\nconfidence\030\004 \001(\0162\"" + - "s.ConfidenceH\000\210\001\001\032,\n\nExtraEntry\022\013\n\003key\030\001" + ".messages.TrackerStatus.ConfidenceH\000\210\001\001\032" + - " \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"E\n\006Status\022\020\n\014DIS" + ",\n\nExtraEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(" + - "CONNECTED\020\000\022\006\n\002OK\020\001\022\010\n\004BUSY\020\002\022\t\n\005ERROR\020\003" + "\t:\0028\001\"E\n\006Status\022\020\n\014DISCONNECTED\020\000\022\006\n\002OK\020" + - "\022\014\n\010OCCLUDED\020\004\"3\n\nConfidence\022\006\n\002NO\020\000\022\007\n\003" + "\001\022\010\n\004BUSY\020\002\022\t\n\005ERROR\020\003\022\014\n\010OCCLUDED\020\004\"3\n\n" + - "LOW\020\001\022\n\n\006MEDIUM\020\005\022\010\n\004HIGH\020\nB\r\n\013_confiden" + "Confidence\022\006\n\002NO\020\000\022\007\n\003LOW\020\001\022\n\n\006MEDIUM\020\005\022" + - "ce\"I\n\007Battery\022\022\n\ntracker_id\030\001 \001(\005\022\025\n\rbat" + "\010\n\004HIGH\020\nB\r\n\013_confidence\"I\n\007Battery\022\022\n\nt" + - "tery_level\030\002 \001(\002\022\023\n\013is_charging\030\003 \001(\010\"\241\002" + "racker_id\030\001 \001(\005\022\025\n\rbattery_level\030\002 \001(\002\022\023" + - "\n\017ProtobufMessage\022&\n\010position\030\001 \001(\0132\022.me" + "\n\013is_charging\030\003 \001(\010\"\241\002\n\017ProtobufMessage\022" + - "ssages.PositionH\000\022+\n\013user_action\030\002 \001(\0132\024" + "&\n\010position\030\001 \001(\0132\022.messages.PositionH\000\022" + - ".messages.UserActionH\000\022/\n\rtracker_added\030" + "+\n\013user_action\030\002 \001(\0132\024.messages.UserActi" + - "\003 \001(\0132\026.messages.TrackerAddedH\000\0221\n\016track" + "onH\000\022/\n\rtracker_added\030\003 \001(\0132\026.messages.T" + - "er_status\030\004 \001(\0132\027.messages.TrackerStatus" + "rackerAddedH\000\0221\n\016tracker_status\030\004 \001(\0132\027." + - "H\000\022$\n\007battery\030\005 \001(\0132\021.messages.BatteryH\000" + "messages.TrackerStatusH\000\022$\n\007battery\030\005 \001(" + - "\022$\n\007version\030\006 \001(\0132\021.messages.VersionH\000B\t" + "\0132\021.messages.BatteryH\000\022$\n\007version\030\006 \001(\0132" + - "\n\007messageB2\n\034dev.slimevr.desktop.platfor" + "\021.messages.VersionH\000B\t\n\007messageB2\n\034dev.s" + - "mB\020ProtobufMessagesH\003b\006proto3" + "limevr.desktop.platformB\020ProtobufMessage" + + + "sH\003b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom( @@ -8957,7 +9130,8 @@ public final class ProtobufMessages { internal_static_messages_TrackerAdded_descriptor = getDescriptor().getMessageTypes().get(4); internal_static_messages_TrackerAdded_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_messages_TrackerAdded_descriptor, - new java.lang.String[] { "TrackerId", "TrackerSerial", "TrackerName", "TrackerRole", } + new java.lang.String[] { "TrackerId", "TrackerSerial", "TrackerName", "TrackerRole", + "Manufacturer", } ); internal_static_messages_TrackerStatus_descriptor = getDescriptor() .getMessageTypes() diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/platform/SteamVRBridge.kt b/server/desktop/src/main/java/dev/slimevr/desktop/platform/SteamVRBridge.kt index 8a369ba34..62d97964f 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/platform/SteamVRBridge.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/platform/SteamVRBridge.kt @@ -147,23 +147,13 @@ abstract class SteamVRBridge( val device = instance.deviceManager .createDevice( trackerAdded.trackerName, - trackerAdded.trackerSerial, - "OpenVR", // TODO : We need the manufacturer + null, + trackerAdded.manufacturer.ifEmpty { "OpenVR" }, ) // Display name, needsReset and isHmd - val displayName: String - val isHmd = if (trackerAdded.trackerId == 0) { - displayName = if (trackerAdded.trackerName == "HMD") { - "SteamVR Driver HMD" - } else { - "Feeder App HMD" - } - true - } else { - displayName = trackerAdded.trackerName - false - } + val displayName: String = trackerAdded.trackerName + val isHmd = trackerAdded.trackerId == 0 // trackerPosition val role = getById(trackerAdded.trackerRole) From 72d193e5e91ba3b56141abd2640e3c7917ba411f Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Tue, 3 Mar 2026 10:54:11 +0100 Subject: [PATCH 038/103] update Logging Skip Installation of drivers if user is not using the steam version. --- server/desktop/src/main/java/dev/slimevr/desktop/Main.kt | 9 +++++++-- .../slimevr/desktop/install/drivers/InstallDrivers.kt | 2 +- .../java/dev/slimevr/desktop/install/drivers/Windows.kt | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt b/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt index bce7ed172..3b86f55ab 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt @@ -100,8 +100,13 @@ fun main(args: Array) { return } - val installDrivers = InstallDrivers() - installDrivers.runUpdater() + // Only install automate install of drivers when running in steam + val path = System.getProperty("user.dir").lowercase() + LogManager.info(path) + if (path.contains("steam")) { + val installDrivers = InstallDrivers() + installDrivers.runInstaller() + } val configDir = resolveConfig() LogManager.info("Using config dir: $configDir") diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt index 158fd8ab3..ad15943d4 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt @@ -6,7 +6,7 @@ class InstallDrivers { val os = System.getProperty("os.name").lowercase() - fun runUpdater() { + fun runInstaller() { if (os.contains("linux")) { val linuxUpdater = Linux() val linuxFlavour = executeShellCommand("cat", "/proc/version") diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt index 0324128aa..16d461399 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt @@ -14,7 +14,7 @@ class Windows { } fun usbDrivers() { - val installedDriversList = executeShellCommand("powershell.exe", "pnputil /enum-drivers") + val installedDriversList = executeShellCommand("powershell.exe", "pnputil", "/enum-drivers") val ch341ser = installedDriversList.contains("ch341ser.inf") val ch343ser = installedDriversList.contains("ch343ser.inf") val silabser = installedDriversList.contains("silabser.inf") @@ -23,7 +23,7 @@ class Windows { LogManager.info("drivers already installed!") return } - LogManager.info("Cannot find one of the drivers, installing drivers") + LogManager.info("USB drivers not found, installing") val driverInstallOutput = executeShellCommand("$path\\installusbdrivers.bat") LogManager.info(driverInstallOutput) } From fd29f412762d2099970517043ee7e0b0f7387aa5 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Tue, 3 Mar 2026 13:51:56 +0100 Subject: [PATCH 039/103] update steamvr driver install Update logging messages --- .../slimevr/desktop/install/drivers/Linux.kt | 26 ++++++++++++------- .../desktop/install/drivers/Windows.kt | 20 +++++++++----- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt index 1c9e9f3a3..535cc80ca 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt @@ -21,17 +21,25 @@ class Linux { } fun updateLinuxSteamVRDriver() { - val vrPathRegContents = executeShellCommand("${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh") - val isDriverRegistered = vrPathRegContents.contains("slimevr") - if (!isDriverRegistered) { - executeShellCommand( - "${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh", - "adddriver", - "$path/$LINUXSTEAMDRIVERDIRECTORY/slimevr", - ) - } else { + var vrPathRegContents = executeShellCommand("${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh") + var isDriverRegistered = vrPathRegContents.contains("slimevr") + if (isDriverRegistered) { LogManager.info("steamVR driver is already registered. Skipping...") + return } + executeShellCommand( + "${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh", + "adddriver", + "$path/${LINUXSTEAMDRIVERDIRECTORY}", + ) + + vrPathRegContents = executeShellCommand("${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh") + isDriverRegistered = vrPathRegContents.contains("slimevr") + if (!isDriverRegistered) { + LogManager.warning("Server couldn't install SlimeVR driver.") + return + } + LogManager.info("SteamVR driver successfully installed.") } fun feeder() { diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt index 0324128aa..ad35ea51d 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt @@ -14,16 +14,16 @@ class Windows { } fun usbDrivers() { - val installedDriversList = executeShellCommand("powershell.exe", "pnputil /enum-drivers") + val installedDriversList = executeShellCommand("powershell.exe", "pnputil", "/enum-drivers") val ch341ser = installedDriversList.contains("ch341ser.inf") val ch343ser = installedDriversList.contains("ch343ser.inf") val silabser = installedDriversList.contains("silabser.inf") if (ch341ser && ch343ser && silabser) { - LogManager.info("drivers already installed!") + LogManager.info("USB drivers already installed!") return } - LogManager.info("Cannot find one of the drivers, installing drivers") + LogManager.info("USB drivers not found, installing") val driverInstallOutput = executeShellCommand("$path\\installusbdrivers.bat") LogManager.info(driverInstallOutput) } @@ -43,12 +43,13 @@ class Windows { LogManager.warning("SteamVR not installed, cannot install SlimeVR Steam driver.") return } - val vrPathRegContents = executeShellCommand("${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "finddriver", "slimevr") - val isDriverRegistered = vrPathRegContents.contains("WINDOWSSTEAMVRDRIVERDIRECTORY") + var vrPathRegContents = executeShellCommand("${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "finddriver", "slimevr") + var isDriverRegistered = vrPathRegContents.contains("slimevr") if (isDriverRegistered) { LogManager.info("steamVR driver is already registered. Skipping...") return } + LogManager.info("Installing SteamVR Driver") executeShellCommand( "${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "adddriver", @@ -56,8 +57,15 @@ class Windows { Paths.get( "", ).toAbsolutePath() - }\\${WINDOWSSTEAMVRDRIVERDIRECTORY}\\slimevr", + }\\${WINDOWSSTEAMVRDRIVERDIRECTORY}", ) + vrPathRegContents = executeShellCommand("${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "finddriver", "slimevr") + isDriverRegistered = vrPathRegContents.contains("slimevr") + if (!isDriverRegistered) { + LogManager.warning("Server couldn't install SlimeVR driver.") + return + } + LogManager.info("SteamVR driver successfully installed.") } companion object { From be3494cdf842991f4793ab8c1bec002c379ba8f7 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Tue, 3 Mar 2026 16:09:15 +0100 Subject: [PATCH 040/103] Applied PR feedback Added system env variable to disable installer --- .../pages/ErrorCollectingConstent.tsx | 8 ++-- gui/src/components/onboarding/pages/Home.tsx | 8 ++-- .../rpc/installinfo/RPCInstallInfoHandler.kt | 8 +++- .../src/main/java/dev/slimevr/desktop/Main.kt | 5 +-- .../desktop/install/drivers/InstallDrivers.kt | 7 +++- .../desktop/install/drivers/InstallerUtils.kt | 4 +- .../slimevr/desktop/install/drivers/Linux.kt | 29 +++++++++++---- .../desktop/install/drivers/Windows.kt | 37 +++++++++++++------ 8 files changed, 72 insertions(+), 34 deletions(-) diff --git a/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx b/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx index 67b7c7776..d4fe90e99 100755 --- a/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx +++ b/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx @@ -1,4 +1,4 @@ -import { Localized, useLocalization } from '@fluent/react'; +import { Localized } from '@fluent/react'; import { Typography } from '@/components/commons/Typography'; import { Button } from '@/components/commons/Button'; import { useConfig } from '@/hooks/config'; @@ -14,7 +14,6 @@ export function ErrorCollectingConsentPage() { setConfig({ errorTracking: false }); }; - const { l10n } = useLocalization(); return (
@@ -41,9 +40,8 @@ export function ErrorCollectingConsentPage() { variant="primary" to="/onboarding/wifi-creds" onClick={accept} - > - {l10n.getString('error_collection_modal-confirm')} - + id="error_collection_modal-confirm" + />
diff --git a/gui/src/components/onboarding/pages/Home.tsx b/gui/src/components/onboarding/pages/Home.tsx index c70163dce..bff43dce0 100644 --- a/gui/src/components/onboarding/pages/Home.tsx +++ b/gui/src/components/onboarding/pages/Home.tsx @@ -19,9 +19,11 @@ export function HomePage() { {l10n.getString('onboarding-home')} - +
diff --git a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt index e8a98a8ea..cb9eafd83 100644 --- a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt +++ b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt @@ -17,6 +17,10 @@ class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { fun onInstalledInfoRequest(conn: GenericConnection, messageHeader: RpcMessageHeader?) { val udevResponse = executeShellCommand("udevadm", "cat") + if (udevResponse == null) { + LogManager.info("Server couldn't verify if udev is installed") + return + } val response = udevResponse.contains("slime") val fbb = FlatBufferBuilder(1024) val outbound = this.rpcHandler.createRPCMessage( @@ -28,7 +32,7 @@ class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { conn.send(fbb.dataBuffer()) } - private fun executeShellCommand(vararg command: String): String = try { + private fun executeShellCommand(vararg command: String): String? = try { val process = ProcessBuilder(*command) .redirectErrorStream(true) .start() @@ -37,6 +41,6 @@ class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { } } catch (e: IOException) { LogManager.warning("Error executing shell command: ${e.message}") - "" + null } } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt b/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt index 3b86f55ab..243acdde8 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt @@ -100,10 +100,9 @@ fun main(args: Array) { return } - // Only install automate install of drivers when running in steam + val isInstallDisabled = System.getenv("SLIME_SERVER_DISABLE_INSTALLER").toInt() val path = System.getProperty("user.dir").lowercase() - LogManager.info(path) - if (path.contains("steam")) { + if (path.contains("steam") || isInstallDisabled != 1) { val installDrivers = InstallDrivers() installDrivers.runInstaller() } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt index ad15943d4..32b568bca 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallDrivers.kt @@ -3,6 +3,7 @@ package dev.slimevr.desktop.install.drivers import io.eiren.util.logging.LogManager class InstallDrivers { + // TODO: Add enviroment variable to bypass driver install val os = System.getProperty("os.name").lowercase() @@ -10,6 +11,10 @@ class InstallDrivers { if (os.contains("linux")) { val linuxUpdater = Linux() val linuxFlavour = executeShellCommand("cat", "/proc/version") + if (linuxFlavour == null) { + LogManager.warning("Error running driver isntaller") + return + } if (linuxFlavour.lowercase().contains("nix")) { LogManager.warning("Running on NixOS, server will not install itself.") return @@ -25,7 +30,7 @@ class InstallDrivers { val windowsUpdater = Windows() windowsUpdater.updateWindows() } else { - println("Unsupported Operating System") + LogManager.info("Unsupported Operating System") } return } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt index 2220d2c7e..9ad47037f 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/InstallerUtils.kt @@ -3,7 +3,7 @@ package dev.slimevr.desktop.install.drivers import io.eiren.util.logging.LogManager import java.io.IOException -fun executeShellCommand(vararg command: String): String = try { +fun executeShellCommand(vararg command: String): String? = try { val process = ProcessBuilder(*command) .redirectErrorStream(true) .start() @@ -12,5 +12,5 @@ fun executeShellCommand(vararg command: String): String = try { } } catch (e: IOException) { LogManager.warning("Error executing shell command: ${e.message}") - "" + null } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt index 535cc80ca..638377a30 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Linux.kt @@ -1,13 +1,12 @@ package dev.slimevr.desktop.install.drivers import io.eiren.util.logging.LogManager -import java.nio.file.Paths import kotlin.io.path.Path import kotlin.io.path.exists class Linux { - val path = Paths.get("").toAbsolutePath().toString() + val path: String? = System.getProperty("user.dir") fun updateLinux() { updateLinuxSteamVRDriver() @@ -22,6 +21,10 @@ class Linux { fun updateLinuxSteamVRDriver() { var vrPathRegContents = executeShellCommand("${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh") + if (vrPathRegContents == null) { + LogManager.warning("Error installing SteamVR driver.") + return + } var isDriverRegistered = vrPathRegContents.contains("slimevr") if (isDriverRegistered) { LogManager.info("steamVR driver is already registered. Skipping...") @@ -30,10 +33,14 @@ class Linux { executeShellCommand( "${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh", "adddriver", - "$path/${LINUXSTEAMDRIVERDIRECTORY}", + "$path/${LINUX_STEAM_DRIVER_DIRECTORY}", ) vrPathRegContents = executeShellCommand("${System.getProperty("user.home")}/.steam/steam/steamapps/common/SteamVR/bin/vrpathreg.sh") + if (vrPathRegContents == null) { + LogManager.warning("Error installing SteamVR driver.") + return + } isDriverRegistered = vrPathRegContents.contains("slimevr") if (!isDriverRegistered) { LogManager.warning("Server couldn't install SlimeVR driver.") @@ -43,8 +50,12 @@ class Linux { } fun feeder() { - executeShellCommand("chmod", "+x", "$path/$LINUXFEEDERDIRECTORY/SlimeVR-Feeder-App") - val feederOutput = executeShellCommand("$path/$LINUXFEEDERDIRECTORY/SlimeVR-Feeder-App", "--install") + executeShellCommand("chmod", "+x", "$path/$LINUX_FEEDER_DIRECTORY/SlimeVR-Feeder-App") + val feederOutput = executeShellCommand("$path/$LINUX_FEEDER_DIRECTORY/SlimeVR-Feeder-App", "--install") + if (feederOutput == null) { + LogManager.warning("Error installing feeder") + return + } LogManager.info(feederOutput) if (feederOutput.lowercase().contains("manifest is not installed")) { LogManager.warning("Could not install feeder application") @@ -61,6 +72,10 @@ class Linux { } val res = executeShellCommand("pkexec", "cp", "$path/69-slimevr-devices.rules", "/etc/udev/rules.d/69-slimevr-devices.rules") LogManager.info(res) + if (res == null) { + LogManager.warning("Error during udev step") + return + } if (res.contains("Error")) { LogManager.warning("Error installing udev rules") } else { @@ -69,7 +84,7 @@ class Linux { } companion object { - private const val LINUXSTEAMDRIVERDIRECTORY = "slimevr-openvr-driver-x64-linux" - private const val LINUXFEEDERDIRECTORY = "SlimeVR-Feeder-App-Linux" + private const val LINUX_STEAM_DRIVER_DIRECTORY = "slimevr-openvr-driver-x64-linux" + private const val LINUX_FEEDER_DIRECTORY = "SlimeVR-Feeder-App-Linux" } } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt index ad35ea51d..115d73511 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt @@ -1,11 +1,10 @@ package dev.slimevr.desktop.install.drivers import io.eiren.util.logging.LogManager -import java.nio.file.Paths class Windows { - val path = Paths.get("").toAbsolutePath().toString() + val path = System.getProperty("user.dir") fun updateWindows() { usbDrivers() @@ -15,6 +14,10 @@ class Windows { fun usbDrivers() { val installedDriversList = executeShellCommand("powershell.exe", "pnputil", "/enum-drivers") + if (installedDriversList == null) { + LogManager.warning("Error installing usb drivers") + return + } val ch341ser = installedDriversList.contains("ch341ser.inf") val ch343ser = installedDriversList.contains("ch343ser.inf") val silabser = installedDriversList.contains("silabser.inf") @@ -29,7 +32,11 @@ class Windows { } fun feeder() { - val feederOutput = executeShellCommand("${path}\\${WINDOWSFEEDERDIRECTORY}\\SlimeVR-Feeder-App.exe", "--install") + val feederOutput = executeShellCommand("${path}\\${WINDOWS_FEEDER_DIRECTORY}\\SlimeVR-Feeder-App.exe", "--install") + if (feederOutput == null) { + LogManager.warning("Error installing feeder") + return + } if (feederOutput.lowercase().contains("manifest is not installed")) { LogManager.warning("Could not install feeder application") } else { @@ -38,12 +45,20 @@ class Windows { } fun steamVRDriver() { - val steamVRLocation = executeShellCommand("powershell.exe", "-Command", "(Get-ItemProperty \'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Steam App 250820\').InstallLocation").trim() + val steamVRLocation = executeShellCommand("powershell.exe", "-Command", "(Get-ItemProperty \'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Steam App 250820\').InstallLocation")?.trim() + if (steamVRLocation == null) { + LogManager.warning("Error installing SteamVR driver.") + return + } if (!steamVRLocation.contains("SteamVR")) { LogManager.warning("SteamVR not installed, cannot install SlimeVR Steam driver.") return } var vrPathRegContents = executeShellCommand("${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "finddriver", "slimevr") + if (vrPathRegContents == null) { + LogManager.warning("Error installing SteamVR driver.") + return + } var isDriverRegistered = vrPathRegContents.contains("slimevr") if (isDriverRegistered) { LogManager.info("steamVR driver is already registered. Skipping...") @@ -53,13 +68,13 @@ class Windows { executeShellCommand( "${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "adddriver", - "${ - Paths.get( - "", - ).toAbsolutePath() - }\\${WINDOWSSTEAMVRDRIVERDIRECTORY}", + "${path}\\${WINDOWS_STEAMVR_DRIVER_DIRECTORY}", ) vrPathRegContents = executeShellCommand("${steamVRLocation}\\bin\\win64\\vrpathreg.exe", "finddriver", "slimevr") + if (vrPathRegContents == null) { + LogManager.warning("Error installing SteamVR driver.") + return + } isDriverRegistered = vrPathRegContents.contains("slimevr") if (!isDriverRegistered) { LogManager.warning("Server couldn't install SlimeVR driver.") @@ -69,7 +84,7 @@ class Windows { } companion object { - private const val WINDOWSSTEAMVRDRIVERDIRECTORY = "slimevr-openvr-driver-win64" - private const val WINDOWSFEEDERDIRECTORY = "SlimeVR-Feeder-App-win64" + private const val WINDOWS_STEAMVR_DRIVER_DIRECTORY = "slimevr-openvr-driver-win64" + private const val WINDOWS_FEEDER_DIRECTORY = "SlimeVR-Feeder-App-win64" } } From 2247725ba599a05927cbe957a79d808d54eda6d0 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Tue, 3 Mar 2026 16:22:58 +0100 Subject: [PATCH 041/103] revert package.json in solarXR --- solarxr-protocol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solarxr-protocol b/solarxr-protocol index 5cd10bd96..f1d338b51 160000 --- a/solarxr-protocol +++ b/solarxr-protocol @@ -1 +1 @@ -Subproject commit 5cd10bd96ad7ffbc511ea0706eaf42bc3d48f55f +Subproject commit f1d338b51244fa1e4907af8e3cd48e516d19e4d0 From 6b227f83247c9d248542b42a92f7459b071506e7 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Tue, 3 Mar 2026 16:28:23 +0100 Subject: [PATCH 042/103] lint --- gui/src/index.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/src/index.scss b/gui/src/index.scss index c6284b01e..cdfad8519 100644 --- a/gui/src/index.scss +++ b/gui/src/index.scss @@ -46,7 +46,8 @@ body { } @font-face { - src: url('/fonts/noto-sans-v42-latin-regular.woff2') format('woff2-variations'); + src: url('/fonts/noto-sans-v42-latin-regular.woff2') + format('woff2-variations'); font-family: 'Noto Sans'; font-style: normal; font-weight: 400; From 2a4a72eaf75e6de29d22054435ff2a167c6f50d2 Mon Sep 17 00:00:00 2001 From: HannahPadd Date: Wed, 4 Mar 2026 10:39:09 +0100 Subject: [PATCH 043/103] PR feedback Fixed mistake with disabling installer. Update Windows usb driver install to read log from pnputil. --- gui/electron/main/index.ts | 15 +++++++-------- gui/public/i18n/en/translation.ftl | 1 + gui/src/components/onboarding/UdevRulesModal.tsx | 16 ++++++---------- .../rpc/installinfo/RPCInstallInfoHandler.kt | 2 +- .../src/main/java/dev/slimevr/desktop/Main.kt | 4 ++-- .../slimevr/desktop/install/drivers/Windows.kt | 10 ++++++++-- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/gui/electron/main/index.ts b/gui/electron/main/index.ts index dbd5d9db1..7342106f8 100644 --- a/gui/electron/main/index.ts +++ b/gui/electron/main/index.ts @@ -20,9 +20,9 @@ import { getPlatform, handleIpc, isPortAvailable } from './utils'; import { findServerJar, findSystemJRE, + getExeFolder, getGuiDataFolder, getLogsFolder, - getExeFolder, getServerDataFolder, getWindowStateFile, } from './paths'; @@ -112,15 +112,15 @@ handleIpc(IPC_CHANNELS.LOG, (e, type, ...args) => { }); handleIpc(IPC_CHANNELS.OPEN_URL, (e, url) => { - const allowsd_urls = [ + const allowed_urls = [ /steam:\/\/.*/, /ms-settings:network$/, /https:\/\/.*\.slimevr\.dev.*/, /https:\/\/github\.com\/.*/, /https:\/\/discord\.gg\/slimevr$/, ]; - if (allowsd_urls.find((a) => url.match(a))) open(url); - else logger.error({ url }, 'trying to open non allowed url'); + if (allowed_urls.find((a) => url.match(a))) open(url); + else logger.error({ url }, 'attempted to open non-whitelisted URL'); }); handleIpc(IPC_CHANNELS.STORAGE, async (e, { type, method, key, value }) => { @@ -339,10 +339,11 @@ const isServerRunning = async () => !await isPortAvailable(21110) const spawnServer = async () => { if (options.skipServerIfRunning && await isServerRunning()) { - logger.info({ skipServerIfRunning: options.skipServerIfRunning }, 'Server alredy running, skipping'); + logger.info({ skipServerIfRunning: options.skipServerIfRunning }, 'Server is already running, skipping server start'); return; } + const serverJar = findServerJar(); if (!serverJar) { logger.info('server jar not found, skipping'); @@ -359,8 +360,7 @@ const spawnServer = async () => { return; } - logger.info({ serverJar }, 'found server jar'); - + logger.info({ javaBin, serverJar }, 'Found Java and server jar'); const process = spawn(javaBin, ['-Xmx128M', '-jar', serverJar, 'run']); @@ -395,7 +395,6 @@ app.whenReady().then(async () => { }); checkEnvironmentVariables(); - const server = await spawnServer(); createWindow(); diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index b8111c60e..fb72ca8a9 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -984,6 +984,7 @@ onboarding-reset_tutorial-2 = Tap the highlighted tracker { $taps } times to tri install-info_udev-rules_modal_title = UDEV Rules not found install-info_udev-rules_warning = Please make sure your udev rules are setup correctly. So you can connect trackers and dongle to USB install-info_udev-rules_modal_button = Close +install-info_udev-rules_modal-dont-show-again_checkbox = Don't show again ## Setup start onboarding-home = Welcome to SlimeVR onboarding-home-start = Let's get set up! diff --git a/gui/src/components/onboarding/UdevRulesModal.tsx b/gui/src/components/onboarding/UdevRulesModal.tsx index c44d7e4bf..0fca6d684 100644 --- a/gui/src/components/onboarding/UdevRulesModal.tsx +++ b/gui/src/components/onboarding/UdevRulesModal.tsx @@ -25,7 +25,7 @@ export function UdevRulesModal() { setExeDir(dir); const rulesDir = `${exeDir}/69-slimevr-devices.rules`; setUdevContent( - `cat ${rulesDir} | sudo tee /etc/udev/rules.d/69-slimevr-devices.rules pn>/dev/null` + `cat ${rulesDir} | sudo tee /etc/udev/rules.d/69-slimevr-devices.rules >/dev/null` ); } }; @@ -43,11 +43,7 @@ export function UdevRulesModal() { const notHiddenThisSession = !dontShowThisSession; const shouldShow = isLinux && udevMissing && notHiddenGlobally && notHiddenThisSession; - if (shouldShow) { - setShowUdevWarning(true); - } else { - setShowUdevWarning(false); - } + setShowUdevWarning(shouldShow); } }, [config, isUdevInstalledResponse, dontShowThisSession]); @@ -65,7 +61,7 @@ export function UdevRulesModal() { } ); - const handleModalCose = () => { + const handleModalClose = () => { if (!config) throw 'Invalid State!'; setConfig({ dontShowUdevModal: dontShowAgain }); setDontShowThisSession(true); @@ -99,16 +95,16 @@ export function UdevRulesModal() {
setDontShowAgain(e.currentTarget.checked)} />
diff --git a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt index cb9eafd83..8743364e7 100644 --- a/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt +++ b/server/core/src/main/java/dev/slimevr/protocol/rpc/installinfo/RPCInstallInfoHandler.kt @@ -18,7 +18,7 @@ class RPCInstallInfoHandler(var rpcHandler: RPCHandler, var api: ProtocolAPI) { fun onInstalledInfoRequest(conn: GenericConnection, messageHeader: RpcMessageHeader?) { val udevResponse = executeShellCommand("udevadm", "cat") if (udevResponse == null) { - LogManager.info("Server couldn't verify if udev is installed") + LogManager.warning("Server couldn't verify if udev is installed") return } val response = udevResponse.contains("slime") diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt b/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt index 243acdde8..1408064a3 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/Main.kt @@ -100,9 +100,9 @@ fun main(args: Array) { return } - val isInstallDisabled = System.getenv("SLIME_SERVER_DISABLE_INSTALLER").toInt() + val isInstallDisabled = System.getenv("SLIME_SERVER_DISABLE_INSTALLER")?.toInt() val path = System.getProperty("user.dir").lowercase() - if (path.contains("steam") || isInstallDisabled != 1) { + if (path.contains("steam") && isInstallDisabled != 1) { val installDrivers = InstallDrivers() installDrivers.runInstaller() } diff --git a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt index 115d73511..d05cdd64b 100644 --- a/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt +++ b/server/desktop/src/main/java/dev/slimevr/desktop/install/drivers/Windows.kt @@ -1,6 +1,7 @@ package dev.slimevr.desktop.install.drivers import io.eiren.util.logging.LogManager +import java.io.File class Windows { @@ -27,8 +28,13 @@ class Windows { return } LogManager.info("USB drivers not found, installing") - val driverInstallOutput = executeShellCommand("$path\\installusbdrivers.bat") - LogManager.info(driverInstallOutput) + executeShellCommand("$path\\installusbdrivers.bat") + try { + val usbDriversLog = File("driver_install.log").readText() + LogManager.info(usbDriversLog) + } catch (e: Error) { + LogManager.warning("Error reading driver installation log, $e") + } } fun feeder() { From 1ee4e79b4ee085cd6b4676f330d2bbb7df4602a4 Mon Sep 17 00:00:00 2001 From: Hannah <57945088+HannahPadd@users.noreply.github.com> Date: Thu, 5 Mar 2026 10:50:05 +0100 Subject: [PATCH 044/103] Apply suggestions from code review Co-authored-by: Sapphire --- gui/public/i18n/en/translation.ftl | 4 ++-- gui/src/components/onboarding/UdevRulesModal.tsx | 9 ++++----- .../slimevr/desktop/install/drivers/InstallDrivers.kt | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index fb72ca8a9..fd626d792 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -981,8 +981,8 @@ onboarding-reset_tutorial-2 = Tap the highlighted tracker { $taps } times to tri You need to be in a pose like you are skiing as shown in the Automatic Mounting wizard, and you have a 3 second delay (configurable) before it gets triggered. ## Install info -install-info_udev-rules_modal_title = UDEV Rules not found -install-info_udev-rules_warning = Please make sure your udev rules are setup correctly. So you can connect trackers and dongle to USB +install-info_udev-rules_modal_title = Hardware udev access rules not found +install-info_udev-rules_warning = Access rules via udev are required for serial console access & dongle connection. Paste the following command into your terminal to add the udev rules. install-info_udev-rules_modal_button = Close install-info_udev-rules_modal-dont-show-again_checkbox = Don't show again ## Setup start diff --git a/gui/src/components/onboarding/UdevRulesModal.tsx b/gui/src/components/onboarding/UdevRulesModal.tsx index 0fca6d684..ab6fea64b 100644 --- a/gui/src/components/onboarding/UdevRulesModal.tsx +++ b/gui/src/components/onboarding/UdevRulesModal.tsx @@ -25,7 +25,7 @@ export function UdevRulesModal() { setExeDir(dir); const rulesDir = `${exeDir}/69-slimevr-devices.rules`; setUdevContent( - `cat ${rulesDir} | sudo tee /etc/udev/rules.d/69-slimevr-devices.rules >/dev/null` + `cat ${rulesDir} | sudo sh -c 'tee /etc/udev/rules.d/69-slimevr-devices.rules >/dev/null && udevadm control --reload-rules && udevadm trigger'` ); } }; @@ -95,11 +95,10 @@ export function UdevRulesModal() {
setDontShowAgain(e.currentTarget.checked)} /> - - -
- - ); -} diff --git a/gui/src/components/onboarding/UdevRulesModal.tsx b/gui/src/components/onboarding/UdevRulesModal.tsx index f64d21420..02bb85732 100644 --- a/gui/src/components/onboarding/UdevRulesModal.tsx +++ b/gui/src/components/onboarding/UdevRulesModal.tsx @@ -14,7 +14,7 @@ export function UdevRulesModal() { const { useRPCPacket, sendRPCPacket } = useWebsocketAPI(); const electron = useElectron(); const [udevContent, setUdevContent] = useState(''); - const [isUdevInstalledResponse, setIsUdevInstalledResponse] = useState(false); + const [isUdevInstalledResponse, setIsUdevInstalledResponse] = useState(true); const [showUdevWarning, setShowUdevWarning] = useState(false); const [dontShowThisSession, setDontShowThisSession] = useState(false); const [dontShowAgain, setDontShowAgain] = useState(false); @@ -26,16 +26,16 @@ export function UdevRulesModal() { if (electron.isElectron) { const dir = await electron.api.getInstallDir(); setExeDir(dir); - const rulesDir = `${exeDir}/69-slimevr-devices.rules`; + const rulesPath = `${exeDir}/69-slimevr-devices.rules`; setUdevContent( - `cat ${rulesDir} | sudo sh -c 'tee /etc/udev/rules.d/69-slimevr-devices.rules >/dev/null && udevadm control --reload-rules && udevadm trigger'` + `cat ${rulesPath} | sudo sh -c 'tee /etc/udev/rules.d/69-slimevr-devices.rules >/dev/null && udevadm control --reload-rules && udevadm trigger'` ); } }; useEffect(() => { handleUdevContent(); - }, [exeDir]); + }, []); useEffect(() => { if (!config) throw 'Invalid state!'; diff --git a/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx b/gui/src/components/onboarding/pages/ErrorCollectingConsent.tsx similarity index 91% rename from gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx rename to gui/src/components/onboarding/pages/ErrorCollectingConsent.tsx index d4fe90e99..5be6404e5 100755 --- a/gui/src/components/onboarding/pages/ErrorCollectingConstent.tsx +++ b/gui/src/components/onboarding/pages/ErrorCollectingConsent.tsx @@ -20,7 +20,7 @@ export function ErrorCollectingConsentPage() {
, h1: , @@ -29,7 +29,7 @@ export function ErrorCollectingConsentPage() {
-
+