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 index 2bd0a7617..970b297dc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -17,8 +17,7 @@ /gui/src/components/settings/ @Erimelowo @loucass003 # Rust part of the GUI -/gui/src-tauri/ @loucass003 -/Cargo.lock @loucass003 +/gui/electron/ @loucass003 # Some server code~ /server/ @ButterscotchV @Eirenliel @Erimelowo diff --git a/.github/workflows/build-gui.yml b/.github/workflows/build-gui.yml deleted file mode 100644 index 7723254d5..000000000 --- a/.github/workflows/build-gui.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: Build GUI - -on: - push: - branches: - - main - paths: - - .github/workflows/build-gui.yml - - gui/** - - package*.json - pull_request: - paths: - - .github/workflows/build-gui.yml - - gui/** - - package*.json - workflow_dispatch: - create: - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - uses: pnpm/action-setup@v4 - - name: Use Node.js - uses: actions/setup-node@v6 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - - name: Build - run: | - pnpm i - cd gui - pnpm run lint - - build: - strategy: - fail-fast: false - matrix: - os: - [ - ubuntu-22.04, - windows-latest, - macos-latest, - ubuntu-22.04-arm, - windows-11-arm, - ] - - runs-on: ${{ matrix.os }} - - env: - # Don't mark warnings as errors - CI: false - BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'aarch64' || 'amd64' }} - - steps: - - uses: actions/checkout@v6 - 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 webkit2gtk-4.1 libappindicator3-dev librsvg2-dev patchelf - # Increment to invalidate the cache - version: ${{ format('v1.0-{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: 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 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - - name: Install dependencies - shell: bash - run: pnpm i - - - name: Build - shell: bash - 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 ) - - - 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 - - - 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 - - - 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 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..2d9160c1b --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,257 @@ +name: SlimeVR Full Build + +on: + push: + branches: [main] + tags: ["v*"] + pull_request: + workflow_dispatch: + +jobs: + setup-matrix: + name: Configure Build Matrix + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - id: set-matrix + shell: bash + run: | + BASE='[{"os":"ubuntu-22.04","platform":"linux"},{"os":"windows-latest","platform":"windows"},{"os":"macos-latest","platform":"macos"}]' + EXTRA='[{"os":"ubuntu-22.04-arm","platform":"linux"},{"os":"windows-11-arm","platform":"windows"}]' + + if [[ "${{ github.ref }}" == refs/tags/v* || "${{ github.ref }}" == refs/heads/main || "${{ github.event_name }}" == "workflow_dispatch" ]]; then + RESULT=$(echo "$BASE $EXTRA" | jq -c -s 'add') + else + RESULT=$(echo "$BASE" | jq -c '.') + fi + echo "matrix={\"include\":$RESULT}" >> "$GITHUB_OUTPUT" + gui-checks: + name: Gui Checks + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + - name: Setup PNPM + uses: pnpm/action-setup@v4 + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version-file: '.node-version' + cache: 'pnpm' + - name: GUI Lint + run: pnpm i && cd gui && pnpm run lint + + java-checks: + name: Java Checks + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + java-version: '17' + distribution: 'adopt' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + - name: Java Spotless Check + run: ./gradlew spotlessCheck --build-cache + + + build-server-jar: + name: Build Desktop Server + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + java-version: '17' + distribution: 'adopt' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + - name: Build ShadowJar + run: ./gradlew :server:desktop:shadowJar --build-cache + - name: Test with Gradle + run: ./gradlew :server:desktop:test + - name: Upload Server Jar + uses: actions/upload-artifact@v6 + with: + name: server-jar + path: server/desktop/build/libs/slimevr.jar + + build-gui-frontend: + name: Build GUI Assets + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + - name: Setup PNPM + uses: pnpm/action-setup@v4 + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version-file: '.node-version' + cache: 'pnpm' + - name: Build JS + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + run: pnpm i && cd gui && pnpm run build + - name: Tar GUI Dist + run: tar -czf slimevr-gui-dist.tar.gz -C gui/out . + - name: Upload GUI Dist + uses: actions/upload-artifact@v6 + with: + name: gui-dist + path: slimevr-gui-dist.tar.gz + + package-desktop: + name: Package Desktop (${{ matrix.platform }} - ${{ matrix.os }}) + needs: [setup-matrix, build-server-jar, build-gui-frontend] + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix) }} + runs-on: ${{ matrix.os }} + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + - name: Setup PNPM + uses: pnpm/action-setup@v4 + - name: Setup Node + uses: actions/setup-node@v6 + with: + node-version-file: '.node-version' + cache: 'pnpm' + - name: Download Server Jar + uses: actions/download-artifact@v6 + with: + name: server-jar + path: server/desktop/build/libs/ + - name: Download GUI Dist + uses: actions/download-artifact@v6 + with: + name: gui-dist + - name: Extract GUI for Electron + shell: bash + run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out + - name: Run Electron Builder + shell: bash + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + run: | + mkdir -p gui/dist/artifacts/linux/ \ + gui/dist/artifacts/win \ + gui/dist/artifacts/mac + cd gui + pnpm i + pnpm exec electron-builder --${{ matrix.platform }} ${{ matrix.platform == 'macos' && '--universal' || '' }} --publish never + - name: Collect and Rename Artifacts + shell: bash + run: | + SRC_DIR="${{ github.workspace }}/gui/dist/artifacts" + DEST_DIR="${{ github.workspace }}/release-out" + mkdir -p "$DEST_DIR" + + if [ "${{ matrix.platform }}" == "windows" ]; then + [[ "${{ matrix.os }}" == *"arm"* ]] && SUFFIX="win-aarch64" || SUFFIX="win64" + cp "$SRC_DIR"/win/*.exe "$DEST_DIR/SlimeVR-$SUFFIX.zip" + + elif [ "${{ matrix.platform }}" == "linux" ]; then + for f in "$SRC_DIR"/linux/*; do + [ -d "$f" ] && continue + BASE=$(basename "$f") + NEW_NAME=$(echo "$BASE" | sed -e 's/x86_64/amd64/g' -e 's/arm64/aarch64/g') + cp "$f" "$DEST_DIR/$NEW_NAME" + done + + elif [ "${{ matrix.platform }}" == "macos" ]; then + cp "$SRC_DIR"/mac/*.dmg "$DEST_DIR/SlimeVR-mac.dmg" + fi + + echo "Collected files:" + ls -lh "$DEST_DIR" + - name: Upload For Release + uses: actions/upload-artifact@v6 + with: + name: release-${{ matrix.platform }}-${{ matrix.os }} + path: release-out/* + + bundle-android: + name: Build Android APK + needs: [build-gui-frontend] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + java-version: '17' + distribution: 'adopt' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + - name: Download GUI Dist + uses: actions/download-artifact@v6 + with: + name: gui-dist + - name: Extract GUI for Android + run: mkdir -p gui/out && tar -xzf slimevr-gui-dist.tar.gz -C gui/out + - name: Build APK + run: ./gradlew :server:android:build --build-cache + env: + ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }} + ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }} + ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }} + - name: Test with Gradle + run: ./gradlew test + - name: Prepare APK + run: cp server/android/build/outputs/apk/release/*.apk ./SlimeVR-android.apk + - name: Upload APK + uses: actions/upload-artifact@v6 + with: + name: release-android + path: SlimeVR-android.apk + + create-release: + name: Finalize Release Draft + needs: [package-desktop, bundle-android, build-server-jar, build-gui-frontend] + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + steps: + - name: Download All Release Artifacts + uses: actions/download-artifact@v6 + with: + pattern: release-* + merge-multiple: true + - name: Download Server Jar + uses: actions/download-artifact@v6 + with: + name: server-jar + - name: Download GUI Dist + uses: actions/download-artifact@v6 + with: + name: gui-dist + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + draft: true + generate_release_notes: true + files: | + release-out/* + server/desktop/build/libs/slimevr.jar + slimevr-gui-dist.tar.gz diff --git a/.github/workflows/gradle.yaml b/.github/workflows/gradle.yaml deleted file mode 100644 index 7a7b9f1c0..000000000 --- a/.github/workflows/gradle.yaml +++ /dev/null @@ -1,413 +0,0 @@ -# This workflow will build a Java project with Gradle -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle - -name: SlimeVR Server - -on: - push: - branches: - - main - pull_request: - workflow_dispatch: - create: - -jobs: - test: - strategy: - matrix: - os: [ubuntu-latest, windows-latest] - runs-on: ${{ matrix.os }} - - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - name: Get tags - run: git fetch --tags origin --recurse-submodules=no --force - - - name: Set up JDK 17 - uses: actions/setup-java@v5 - with: - java-version: '17' - distribution: 'adopt' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 - - - run: mkdir ./gui/dist && touch ./gui/dist/somefile - shell: bash - - - name: Check code formatting - run: ./gradlew spotlessCheck - - - name: Test with Gradle - run: ./gradlew test - - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - name: Get tags - run: git fetch --tags origin --recurse-submodules=no --force - - - name: Set up JDK 17 - uses: actions/setup-java@v5 - with: - java-version: '17' - distribution: 'adopt' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 - - - name: Build with Gradle - run: ./gradlew :server:desktop:shadowJar - - - name: Upload the Server JAR as a Build Artifact - uses: actions/upload-artifact@v6 - with: - # Artifact name - name: 'SlimeVR-Server' # optional, default is artifact - # A file, directory or wildcard pattern that describes what to upload - path: server/desktop/build/libs/slimevr.jar - - - name: Upload to draft release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - generate_release_notes: true - files: | - server/desktop/build/libs/slimevr.jar - - bundle-android: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - name: Get tags - run: git fetch --tags origin --recurse-submodules=no --force - - - name: Set up JDK 17 - uses: actions/setup-java@v5 - with: - java-version: '17' - distribution: 'adopt' - - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 - - - uses: pnpm/action-setup@v4 - - name: Use Node.js - uses: actions/setup-node@v6 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - - name: Install dependencies - run: pnpm i - - - name: Build GUI - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - run: cd gui && pnpm run build - - - name: Build with Gradle - run: ./gradlew :server:android:build - env: - ANDROID_STORE_FILE: ${{ secrets.ANDROID_STORE_FILE }} - ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_STORE_PASSWD }} - ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} - ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_KEY_PASSWD }} - - - name: Upload the Android build artifact - uses: actions/upload-artifact@v6 - with: - # Artifact name - name: 'SlimeVR-Android' # optional, default is artifact - # A file, directory or wildcard pattern that describes what to upload - path: server/android/build/outputs/apk/* - - - name: Prepare for release - if: startsWith(github.ref, 'refs/tags/') - run: | - cp server/android/build/outputs/apk/release/android-release.apk ./SlimeVR-android.apk - - - name: Upload to draft release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - generate_release_notes: true - files: | - ./SlimeVR-android.apk - - - name: Build Google Play release bundle - if: startsWith(github.ref, 'refs/tags/') - run: ./gradlew :server:android:bundleRelease - env: - ANDROID_STORE_FILE: ${{ secrets.ANDROID_GPLAY_STORE_FILE }} - ANDROID_STORE_PASSWD: ${{ secrets.ANDROID_GPLAY_STORE_PASSWD }} - ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_GPLAY_KEY_ALIAS }} - ANDROID_KEY_PASSWD: ${{ secrets.ANDROID_GPLAY_KEY_PASSWD }} - - - name: Upload the Google Play artifact - uses: actions/upload-artifact@v6 - if: startsWith(github.ref, 'refs/tags/') - with: - # Artifact name - name: 'SlimeVR-Android-GPDev' # optional, default is artifact - # A file, directory or wildcard pattern that describes what to upload - path: server/android/build/outputs/bundle/release/* - - bundle-linux: - strategy: - matrix: - os: [ubuntu-latest, ubuntu-24.04-arm] - runs-on: ${{ matrix.os }} - needs: [build, test] - if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name) - - env: - BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'aarch64' || 'amd64' }} - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - uses: actions/download-artifact@v7 - with: - name: 'SlimeVR-Server' - path: server/desktop/build/libs/ - - - name: Set up Linux dependencies - 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 - # Increment to invalidate the cache - version: ${{ format('v1.0-{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; - - - name: Cache cargo dependencies - uses: Swatinem/rust-cache@v2 - - - uses: pnpm/action-setup@v4 - - name: Use Node.js - uses: actions/setup-node@v6 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - - name: Install dependencies - run: pnpm i - - - name: Build - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - run: pnpm run tauri build --config $( ./gui/scripts/gitversion.mjs ) - - - name: Make GUI tarball - run: | - tar czf slimevr-gui-dist.tar.gz -C gui/dist/ . - - - uses: actions/upload-artifact@v6 - if: matrix.os == 'ubuntu-latest' - with: - name: SlimeVR-GUI-Dist - path: ./slimevr-gui-dist.tar.gz - - - uses: actions/upload-artifact@v6 - with: - name: ${{ format('SlimeVR-GUI-Deb-{0}', env.BUILD_ARCH) }} - path: target/release/bundle/deb/slimevr*.deb - - - uses: actions/upload-artifact@v6 - with: - name: ${{ format('SlimeVR-GUI-AppImage-{0}', env.BUILD_ARCH) }} - path: target/release/bundle/appimage/slimevr*.AppImage - - - uses: actions/upload-artifact@v6 - with: - name: ${{ format('SlimeVR-GUI-RPM-{0}', env.BUILD_ARCH) }} - path: target/release/bundle/rpm/slimevr*.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" - - - name: Upload to draft release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - generate_release_notes: true - files: | - ./slimevr-gui-dist.tar.gz - ./SlimeVR-*.appimage - ./SlimeVR-*.deb - ./SlimeVR-*.rpm - - bundle-mac: - runs-on: macos-latest - needs: [build, test] - if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name) - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - uses: actions/download-artifact@v7 - with: - 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 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - - name: Install dependencies - run: | - rustup target add x86_64-apple-darwin - pnpm i - - - name: Build - 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 - - - uses: actions/upload-artifact@v6 - with: - name: SlimeVR-GUI-MacApp - path: target/universal-apple-darwin/release/bundle/macos/SlimeVR*.app - - - uses: actions/upload-artifact@v6 - with: - name: SlimeVR-GUI-MacDmg - path: target/universal-apple-darwin/release/bundle/dmg/slimevr.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 - - - name: Upload to draft release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - generate_release_notes: true - files: | - ./SlimeVR-mac.dmg - - bundle-windows: - strategy: - matrix: - os: [windows-latest, windows-11-arm] - runs-on: ${{ matrix.os }} - needs: [build, test] - if: contains(fromJSON('["workflow_dispatch", "create"]'), github.event_name) - - env: - BUILD_ARCH: ${{ endsWith(matrix.os, 'arm') && 'win-aarch64' || 'win64' }} - steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - - uses: actions/download-artifact@v7 - with: - 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 - uses: actions/setup-node@v6 - with: - node-version-file: '.node-version' - cache: 'pnpm' - - - name: Install dependencies - shell: bash - run: pnpm i - - - name: Build - shell: bash - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - run: pnpm run skipbundler --config $( ./gui/scripts/gitversion.mjs ) - - - name: Bundle to zips - shell: bash - run: | - mkdir SlimeVR - cp gui/src-tauri/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 - with: - name: ${{ format('SlimeVR-GUI-Windows-{0}', env.BUILD_ARCH) }} - path: ./SlimeVR*.zip - - - name: Upload to draft release - uses: softprops/action-gh-release@v2 - if: startsWith(github.ref, 'refs/tags/') - with: - draft: true - generate_release_notes: true - files: ./SlimeVR-*.zip 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 a9622fa88..64c75649d 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,13 @@ 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 package:build`. The result +will be at `dist/artifacts/` content will change depending of the platform. ## Code style @@ -84,7 +82,7 @@ Import the formatting settings defined in `spotless.xml`, like this: Eclipse will only do a subset of the checks in `spotless`, so you may still want to do `./gradlew spotlessApply` if you ever see an error from spotless. -### Tauri (gui) +### Electron (gui) We use ESLint and Prettier to format GUI code. - First, go into the GUI's directory with your terminal by running `cd gui`. 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..ca7ccdf1e 100644 --- a/flake.nix +++ b/flake.nix @@ -1,74 +1,50 @@ { - description = "Affordable full-body tracking for VR!"; + description = "SlimeVR Server & GUI"; 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" ]; + systems = [ "x86_64-linux" ]; - perSystem = { system, lib, ... }: + perSystem = { pkgs, ... }: let - pkgs = import nixpkgs { inherit system; }; + runtimeLibs = pkgs: (with pkgs; [ + jdk17 - rust_toolchain = lib.importTOML ./rust-toolchain.toml; - fenixPkgs = fenix.packages.${system}; + alsa-lib at-spi2-atk at-spi2-core cairo cups dbus expat + gdk-pixbuf glib gtk3 libdrm libgbm libglvnd 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 libusb1 udev libxcrypt-legacy + rpm fpm - rustToolchainSet = fenixPkgs.fromToolchainName { - name = rust_toolchain.toolchain.channel; - sha256 = "sha256-+9FmLhAOezBZCOziO0Qct1NOrfpjNsXxc/8I0c7BdKE="; - }; - in { + wine + zlib squashfsTools fakeroot libarchive icu + nodejs_22 pnpm pkg-config python3 gcc gnumake binutils git + pkgs.nodePackages.node-gyp-build + ]); - devShells.default = pkgs.mkShell { - name = "slimevr"; + slimeShell = pkgs.buildFHSEnv { + name = "slimevr-env"; + targetPkgs = runtimeLibs; + profile = '' + export JAVA_HOME=${pkgs.jdk17} + export PATH="${pkgs.jdk17}/bin:$PATH" - 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"; - - 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" - - # 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" + # Tell electron-builder to use system tools instead of downloading them + export USE_SYSTEM_FPM=true + export USE_SYSTEM_MKSQUASHFS=true ''; + runScript = "bash"; }; + in + { + devShells.default = slimeShell.env; }; }; } diff --git a/gui/.gitignore b/gui/.gitignore index bfcd0c9c7..77383db18 100644 --- a/gui/.gitignore +++ b/gui/.gitignore @@ -29,9 +29,13 @@ 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/ diff --git a/gui/electron-builder.yml b/gui/electron-builder.yml new file mode 100644 index 000000000..68020e864 --- /dev/null +++ b/gui/electron-builder.yml @@ -0,0 +1,64 @@ +appId: dev.slimevr.SlimeVR +productName: SlimeVR +# Global naming pattern +artifactName: "${productName}-${version}-${os}-${arch}.${ext}" + +directories: + output: dist/artifacts/${os} + +asar: true +asarUnpack: + - out/main/chunks/*.jar + +electronLanguages: + - en-US + +files: + - out/**/* + - index.html + - package.json + - node_modules/** + - "!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" + + +linux: + category: Game + artifactName: "${productName}-${arch}.${ext}" + target: + - target: AppImage + - target: deb + - target: rpm + extraFiles: + - from: "../server/desktop/build/libs/slimevr.jar" + to: "." + - from: "./electron/resources/69-slimevr-devices.rules" + to: "." + icon: "./electron/resources/icons" + +deb: + depends: [openjdk-17-jre-headless, udev] + afterInstall: "./electron/resources/scripts/postinstall.sh" + afterRemove: "./electron/resources/scripts/postremove.sh" + +rpm: + depends: [java-latest-openjdk, udev] + afterInstall: "./electron/resources/scripts/postinstall.sh" + afterRemove: "./electron/resources/scripts/postremove.sh" + +win: + artifactName: "${productName}-${os}-${arch}.${ext}" + target: [target: portable] + icon: "./electron/resources/icons/icon.ico" + +mac: + target: dmg + artifactName: "SlimeVR-mac.${ext}" + x64ArchFiles: "**/register-protocol-handler.node" + icon: "./electron/resources/icons/icon.icns" + extraFiles: + - from: "../server/desktop/build/libs/slimevr.jar" + to: "." diff --git a/gui/electron.vite.config.ts b/gui/electron.vite.config.ts new file mode 100644 index 000000000..f9d7b3773 --- /dev/null +++ b/gui/electron.vite.config.ts @@ -0,0 +1,47 @@ +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'), + external: [ + 'pino', + 'pino-pretty', + 'pino-roll', + 'commander', + 'open' + ] + } + } + }, + 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: { + ...rendererConfig, + 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 new file mode 100644 index 000000000..e09ca8766 --- /dev/null +++ b/gui/electron/.gitignore @@ -0,0 +1 @@ +resources/java-version/JavaVersion.class diff --git a/gui/electron/main/cli.ts b/gui/electron/main/cli.ts new file mode 100644 index 000000000..3171baee4 --- /dev/null +++ b/gui/electron/main/cli.ts @@ -0,0 +1,12 @@ +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); +export const options = program.opts(); diff --git a/gui/electron/main/index.ts b/gui/electron/main/index.ts new file mode 100644 index 000000000..826f89ce9 --- /dev/null +++ b/gui/electron/main/index.ts @@ -0,0 +1,444 @@ +import { + app, + BrowserWindow, + dialog, + Menu, + nativeImage, + net, + protocol, + screen, + shell, + Tray, +} from 'electron'; +import { IPC_CHANNELS } from '../shared'; +import path, { dirname, join } from 'path'; +import open from 'open'; +import trayIcon from '../resources/icons/icon.png?asset'; +import appleTrayIcon from '../resources/icons/appleTrayIcon.png?asset'; +import { readFile, stat } from 'fs/promises'; +import { getPlatform, handleIpc, isPortAvailable } from './utils'; +import { + findServerJar, + findSystemJRE, + getGuiDataFolder, + getLogsFolder, + getServerDataFolder, + getWindowStateFile, +} from './paths'; +import { stores } from './store'; +import { logger } from './logger'; +import { writeFileSync } from 'node:fs'; + +import { spawn } from 'node:child_process'; +import { discordPresence } from './presence'; +import { options } from './cli'; +import { ServerStatusEvent } from 'electron/preload/interface'; +import { mkdir } from 'node:fs/promises'; +import { MenuItem } from 'electron/main'; + +// 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.GH_FETCH, async (e, 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(), + }; +}); + +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 allowed_urls = [ + /steam:\/\/.*/, + /ms-settings:network$/, + /https:\/\/.*\.slimevr\.dev.*/, + /https:\/\/github\.com\/.*/, + /https:\/\/discord\.gg\/slimevr$/, + ]; + 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 }) => { + 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.DISCORD_PRESENCE, async (e, options) => { + if (options.enable && !discordPresence.state.ready) { + await discordPresence.connect(); + discordPresence.updateActivity(options.activity); + } else if (!options.enable && discordPresence.state.ready) { + discordPresence.destroy(); + } +}); + +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.includes('..') && !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; +} = { + width: 1289.0, + height: 709.0, + x: undefined, + y: undefined, +}; +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; +} + +const saveWindowState = async () => { + await mkdir(dirname(getWindowStateFile()), { recursive: true }); + writeFileSync(getWindowStateFile(), JSON.stringify(windowState)); +}; + +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, + devTools: true, + }, + }); + + if (process.env.ELECTRON_RENDERER_URL) { + mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL); + mainWindow.webContents.openDevTools(); + } else { + mainWindow.loadURL('app://./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); + + mainWindow.webContents.on('context-menu', (event, params) => { + const menu = new Menu(); + + menu.append( + new MenuItem({ + label: 'Inspect Element', + click: () => { + mainWindow?.webContents.inspectElement(params.x, params.y); + }, + }) + ); + + menu.append(new MenuItem({ type: 'separator' })); + menu.append(new MenuItem({ label: 'Copy', role: 'copy' })); + menu.append(new MenuItem({ label: 'Paste', role: 'paste' })); + + if (mainWindow) + menu.popup({ window: mainWindow }); + }); +} + +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); + } +}; + +const isServerRunning = async () => !(await isPortAvailable(21110)); + +const spawnServer = async () => { + if (options.skipServerIfRunning && (await isServerRunning())) { + 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'); + return; + } + const sharedDir = dirname(serverJar); + const javaBin = await findSystemJRE(sharedDir); + if (!javaBin) { + dialog.showErrorBox( + 'SlimeVR', + `Couldn't find a compatible Java version, please download Java 17 or higher` + ); + app.exit(0); + return; + } + + logger.info({ javaBin, serverJar }, 'Found Java and server jar'); + + const process = spawn(javaBin, ['-Xmx128M', '-jar', serverJar, 'run']); + + process.stdout?.on('data', (message) => { + mainWindow?.webContents.send(IPC_CHANNELS.SERVER_STATUS, { + message: message.toString(), + type: 'stdout', + } satisfies ServerStatusEvent); + }); + + process.stderr?.on('data', (message) => { + mainWindow?.webContents.send(IPC_CHANNELS.SERVER_STATUS, { + message: message.toString(), + type: 'stderr', + } satisfies ServerStatusEvent); + }); + + return { + process: process, + close: () => { + process.kill('SIGTERM'); + }, + }; +}; + +app.whenReady().then(async () => { + // 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(); + const server = await spawnServer(); + + createWindow(); + + logger.info('SlimeVR started!'); + + app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } + }); + + process.on('exit', () => { + server?.close(); + }); + + app.on('before-quit', async () => { + logger.info('App quitting, saving...'); + server?.close(); + stores.settings.save(); + stores.cache.save(); + + discordPresence.destroy(); + + await saveWindowState(); + }); +}); 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..437901022 --- /dev/null +++ b/gui/electron/main/paths.ts @@ -0,0 +1,120 @@ +import { app } from 'electron'; +import path, { join } from 'node:path'; +import { getPlatform } from './utils'; +import { glob } from 'glob'; +import { spawn } from 'node:child_process'; +import javaVersionJar from '../resources/java-version/JavaVersion.jar?asset&asarUnpack'; +import { existsSync } from 'node:fs'; +import { options } from './cli'; + +const javaBin = getPlatform() === 'windows' ? 'java.exe' : 'java'; +export const CONFIG_IDENTIFIER = 'dev.slimevr.SlimeVR'; + +export const getGuiDataFolder = () => { + const platform = getPlatform(); + + switch (platform) { + case 'linux': + if (process.env['XDG_DATA_HOME']) + return join(process.env['XDG_DATA_HOME'], CONFIG_IDENTIFIER); + 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'); + +const localJavaBin = (sharedDir: string) => { + const jre = join(sharedDir, 'jre/bin', javaBin); + return jre; +}; + +const javaHomeBin = () => { + const javaHome = process.env['JAVA_HOME']; + if (!javaHome) return null; + const javaHomeJre = join(javaHome, 'bin', javaBin); + return javaHomeJre; +}; + +export const findSystemJRE = async (sharedDir: string) => { + const paths = [ + localJavaBin(sharedDir), + javaHomeBin(), + ...(await glob('/usr/lib/jvm/*/bin/' + javaBin)), + ...(await glob('/Library/Java/JavaVirtualMachines/*/Contents/Home/bin/' + javaBin)), + ]; + + for (const path of paths) { + if (!path) continue; + + const version = await new Promise((resolve) => { + const process = spawn(path, ['-jar', javaVersionJar], {}); + + let version: number | null = null; + + process.stdout?.once('data', (data) => { + try { + version = parseFloat(data.toString()); + } catch { + version = null; + } + }); + + process.on('error', () => { + resolve(null); + }); + + process.on('exit', () => { + resolve(version); + }); + }); + if (version && version >= 17) return path; + } + return null; +}; + +export const findServerJar = () => { + const paths = [ + options.path ? path.resolve(options.path) : undefined, + // AppImage passes the fakeroot in `APPDIR` env var. + process.env['APPDIR'] + ? path.resolve(join(process.env['APPDIR'], 'usr/share/slimevr/')) + : undefined, + path.dirname(app.getPath('exe')), + + // For flatpack container + 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)); +}; diff --git a/gui/electron/main/presence.ts b/gui/electron/main/presence.ts new file mode 100644 index 000000000..13ba5861a --- /dev/null +++ b/gui/electron/main/presence.ts @@ -0,0 +1,49 @@ +import { Client } from '@xhayper/discord-rpc'; +import { logger } from './logger'; + +export const richPresence = () => { + const initialState = () => ({ ready: false, start: Date.now() }); + + const state = initialState(); + + const client = new Client({ + clientId: '1237970689009647639', + transport: { type: 'ipc' }, + }); + client.on('ready', () => { + state.ready = true; + }); + + client.on('disconnected', () => { + state.ready = false; + }); + + return { + state, + connect: async () => { + try { + await client.login(); + } catch (e) { + logger.error(e, 'unable to connect to discord rpc'); + } + }, + updateActivity: (content: string) => { + if (!state.ready) return; + client.user + ?.setActivity({ + state: content, + largeImageKey: 'icon', + startTimestamp: state.start, + }) + .catch((e) => { + logger.error(e, 'unable to update rpc activity'); + }); + }, + destroy: () => { + client.destroy(); + Object.assign(state, initialState()); + }, + }; +}; + +export const discordPresence = richPresence(); diff --git a/gui/electron/main/store.ts b/gui/electron/main/store.ts new file mode 100644 index 000000000..24195a4b3 --- /dev/null +++ b/gui/electron/main/store.ts @@ -0,0 +1,76 @@ +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(); + } + + 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..1253d7980 --- /dev/null +++ b/gui/electron/main/utils.ts @@ -0,0 +1,50 @@ +import os from 'os' +import { OSStats } from "../preload/interface"; +import { ipcMain, IpcMainInvokeEvent } from 'electron'; +import { IpcInvokeMap } from '../shared'; +import net from 'net' + +export const getPlatform = (): OSStats['type'] => { + switch (os.platform()) { + case 'darwin': + return 'macos'; + case 'win32': + return 'windows'; + case 'linux': + return 'linux'; + default: + return 'unknown'; + } +}; + +export const isPortAvailable = (port: number) => { + return new Promise((resolve) => { + const s = net.createServer(); + s.once('error', (err) => { + s.close(); + if ("code" in err && err["code"] == "EADDRINUSE") { + resolve(false); + } else { + resolve(false); + } + }); + s.once('listening', () => { + resolve(true); + s.close(); + }); + s.listen(port); + }); +}; + +export function handleIpc( + channel: K, + handler: ( + event: IpcMainInvokeEvent, + ...args: Parameters + ) => ReturnType +) { + ipcMain.handle(channel, (event, ...args) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return handler(event, ...args as any); + }); +} diff --git a/gui/electron/preload/index.ts b/gui/electron/preload/index.ts new file mode 100644 index 000000000..e9682ca0d --- /dev/null +++ b/gui/electron/preload/index.ts @@ -0,0 +1,39 @@ +import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron'; +import { IElectronAPI, ServerStatusEvent } from './interface'; +import { IPC_CHANNELS } from '../shared'; + +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), + ghGet: (req) => ipcRenderer.invoke(IPC_CHANNELS.GH_FETCH, req), + setPresence: (options) => ipcRenderer.invoke(IPC_CHANNELS.DISCORD_PRESENCE, options) +} satisfies IElectronAPI); diff --git a/gui/electron/preload/interface.d.ts b/gui/electron/preload/interface.d.ts new file mode 100644 index 000000000..03c47a1f7 --- /dev/null +++ b/gui/electron/preload/interface.d.ts @@ -0,0 +1,64 @@ +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 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 type DiscordPresence = { enable: false } | { enable: true, activity: string } + +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; + ghGet: (options: T) => Promise; + setPresence: (options: DiscordPresence) => void; +} + +declare global { + interface Window { + electronAPI: IElectronAPI; + } +} diff --git a/gui/src-tauri/69-slimevr-devices.rules b/gui/electron/resources/69-slimevr-devices.rules similarity index 100% rename from gui/src-tauri/69-slimevr-devices.rules rename to gui/electron/resources/69-slimevr-devices.rules diff --git a/gui/src-tauri/icons/128x128.png b/gui/electron/resources/icons/128x128.png similarity index 100% rename from gui/src-tauri/icons/128x128.png rename to gui/electron/resources/icons/128x128.png diff --git a/gui/src-tauri/icons/128x128@2x.png b/gui/electron/resources/icons/128x128@2x.png similarity index 100% rename from gui/src-tauri/icons/128x128@2x.png rename to gui/electron/resources/icons/128x128@2x.png diff --git a/gui/src-tauri/icons/32x32.png b/gui/electron/resources/icons/32x32.png similarity index 100% rename from gui/src-tauri/icons/32x32.png rename to gui/electron/resources/icons/32x32.png diff --git a/gui/src-tauri/icons/Square107x107Logo.png b/gui/electron/resources/icons/Square107x107Logo.png similarity index 100% rename from gui/src-tauri/icons/Square107x107Logo.png rename to gui/electron/resources/icons/Square107x107Logo.png diff --git a/gui/src-tauri/icons/Square142x142Logo.png b/gui/electron/resources/icons/Square142x142Logo.png similarity index 100% rename from gui/src-tauri/icons/Square142x142Logo.png rename to gui/electron/resources/icons/Square142x142Logo.png diff --git a/gui/src-tauri/icons/Square150x150Logo.png b/gui/electron/resources/icons/Square150x150Logo.png similarity index 100% rename from gui/src-tauri/icons/Square150x150Logo.png rename to gui/electron/resources/icons/Square150x150Logo.png diff --git a/gui/src-tauri/icons/Square284x284Logo.png b/gui/electron/resources/icons/Square284x284Logo.png similarity index 100% rename from gui/src-tauri/icons/Square284x284Logo.png rename to gui/electron/resources/icons/Square284x284Logo.png diff --git a/gui/src-tauri/icons/Square30x30Logo.png b/gui/electron/resources/icons/Square30x30Logo.png similarity index 100% rename from gui/src-tauri/icons/Square30x30Logo.png rename to gui/electron/resources/icons/Square30x30Logo.png diff --git a/gui/src-tauri/icons/Square310x310Logo.png b/gui/electron/resources/icons/Square310x310Logo.png similarity index 100% rename from gui/src-tauri/icons/Square310x310Logo.png rename to gui/electron/resources/icons/Square310x310Logo.png diff --git a/gui/src-tauri/icons/Square44x44Logo.png b/gui/electron/resources/icons/Square44x44Logo.png similarity index 100% rename from gui/src-tauri/icons/Square44x44Logo.png rename to gui/electron/resources/icons/Square44x44Logo.png diff --git a/gui/src-tauri/icons/Square71x71Logo.png b/gui/electron/resources/icons/Square71x71Logo.png similarity index 100% rename from gui/src-tauri/icons/Square71x71Logo.png rename to gui/electron/resources/icons/Square71x71Logo.png diff --git a/gui/src-tauri/icons/Square89x89Logo.png b/gui/electron/resources/icons/Square89x89Logo.png similarity index 100% rename from gui/src-tauri/icons/Square89x89Logo.png rename to gui/electron/resources/icons/Square89x89Logo.png diff --git a/gui/src-tauri/icons/StoreLogo.png b/gui/electron/resources/icons/StoreLogo.png similarity index 100% rename from gui/src-tauri/icons/StoreLogo.png rename to gui/electron/resources/icons/StoreLogo.png diff --git a/gui/src-tauri/icons/appleTrayIcon.png b/gui/electron/resources/icons/appleTrayIcon.png similarity index 100% rename from gui/src-tauri/icons/appleTrayIcon.png rename to gui/electron/resources/icons/appleTrayIcon.png diff --git a/gui/src-tauri/icons/icon.icns b/gui/electron/resources/icons/icon.icns similarity index 100% rename from gui/src-tauri/icons/icon.icns rename to gui/electron/resources/icons/icon.icns diff --git a/gui/src-tauri/icons/icon.ico b/gui/electron/resources/icons/icon.ico similarity index 100% rename from gui/src-tauri/icons/icon.ico rename to gui/electron/resources/icons/icon.ico diff --git a/gui/src-tauri/icons/icon.png b/gui/electron/resources/icons/icon.png similarity index 100% rename from gui/src-tauri/icons/icon.png rename to gui/electron/resources/icons/icon.png diff --git a/gui/src-tauri/icons/icon.svg b/gui/electron/resources/icons/icon.svg similarity index 100% rename from gui/src-tauri/icons/icon.svg rename to gui/electron/resources/icons/icon.svg diff --git a/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png b/gui/electron/resources/icons/ios/AppIcon-20x20@1x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-20x20@1x.png rename to gui/electron/resources/icons/ios/AppIcon-20x20@1x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/gui/electron/resources/icons/ios/AppIcon-20x20@2x-1.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png rename to gui/electron/resources/icons/ios/AppIcon-20x20@2x-1.png diff --git a/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png b/gui/electron/resources/icons/ios/AppIcon-20x20@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-20x20@2x.png rename to gui/electron/resources/icons/ios/AppIcon-20x20@2x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png b/gui/electron/resources/icons/ios/AppIcon-20x20@3x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-20x20@3x.png rename to gui/electron/resources/icons/ios/AppIcon-20x20@3x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png b/gui/electron/resources/icons/ios/AppIcon-29x29@1x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-29x29@1x.png rename to gui/electron/resources/icons/ios/AppIcon-29x29@1x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/gui/electron/resources/icons/ios/AppIcon-29x29@2x-1.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png rename to gui/electron/resources/icons/ios/AppIcon-29x29@2x-1.png diff --git a/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png b/gui/electron/resources/icons/ios/AppIcon-29x29@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-29x29@2x.png rename to gui/electron/resources/icons/ios/AppIcon-29x29@2x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png b/gui/electron/resources/icons/ios/AppIcon-29x29@3x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-29x29@3x.png rename to gui/electron/resources/icons/ios/AppIcon-29x29@3x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png b/gui/electron/resources/icons/ios/AppIcon-40x40@1x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-40x40@1x.png rename to gui/electron/resources/icons/ios/AppIcon-40x40@1x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/gui/electron/resources/icons/ios/AppIcon-40x40@2x-1.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png rename to gui/electron/resources/icons/ios/AppIcon-40x40@2x-1.png diff --git a/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png b/gui/electron/resources/icons/ios/AppIcon-40x40@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-40x40@2x.png rename to gui/electron/resources/icons/ios/AppIcon-40x40@2x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png b/gui/electron/resources/icons/ios/AppIcon-40x40@3x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-40x40@3x.png rename to gui/electron/resources/icons/ios/AppIcon-40x40@3x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-512@2x.png b/gui/electron/resources/icons/ios/AppIcon-512@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-512@2x.png rename to gui/electron/resources/icons/ios/AppIcon-512@2x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png b/gui/electron/resources/icons/ios/AppIcon-60x60@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-60x60@2x.png rename to gui/electron/resources/icons/ios/AppIcon-60x60@2x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png b/gui/electron/resources/icons/ios/AppIcon-60x60@3x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-60x60@3x.png rename to gui/electron/resources/icons/ios/AppIcon-60x60@3x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png b/gui/electron/resources/icons/ios/AppIcon-76x76@1x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-76x76@1x.png rename to gui/electron/resources/icons/ios/AppIcon-76x76@1x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png b/gui/electron/resources/icons/ios/AppIcon-76x76@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-76x76@2x.png rename to gui/electron/resources/icons/ios/AppIcon-76x76@2x.png diff --git a/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/gui/electron/resources/icons/ios/AppIcon-83.5x83.5@2x.png similarity index 100% rename from gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png rename to gui/electron/resources/icons/ios/AppIcon-83.5x83.5@2x.png diff --git a/gui/electron/resources/java-version/JavaVersion.jar b/gui/electron/resources/java-version/JavaVersion.jar new file mode 100644 index 000000000..693f240a8 Binary files /dev/null and b/gui/electron/resources/java-version/JavaVersion.jar differ diff --git a/gui/src-tauri/src/JavaVersion.java b/gui/electron/resources/java-version/JavaVersion.java similarity index 79% rename from gui/src-tauri/src/JavaVersion.java rename to gui/electron/resources/java-version/JavaVersion.java index 338c2a43f..086f2e8bb 100644 --- a/gui/src-tauri/src/JavaVersion.java +++ b/gui/electron/resources/java-version/JavaVersion.java @@ -1,8 +1,8 @@ public class JavaVersion { - + public static void main(String[] args) { var version = Runtime.version().version().get(0); - System.exit(version); + System.out.println(version); } } diff --git a/gui/electron/resources/scripts/postinstall.sh b/gui/electron/resources/scripts/postinstall.sh new file mode 100644 index 000000000..48015b616 --- /dev/null +++ b/gui/electron/resources/scripts/postinstall.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +SRC="/opt/SlimeVR/69-slimevr-devices.rules" +DESTDIRS=("/lib" "/usr/lib") + +if [[ ! -f "$SRC" ]]; then + echo "SlimeVR udev rules not found, serial console and dongles may not work" >&2 + exit 0 +fi + +echo "Configuring SlimeVR udev rules..." + +for DIR in "${DESTDIRS[@]}"; do + if [[ -d "$DIR" && ! -h "$DIR" ]]; then + echo "Copying rules to $DIR" + install -Dm644 "$SRC" "$DIR/udev/rules.d/69-slimevr-devices.rules" + + if command -v udevadm >/dev/null 2>&1; then + udevadm control --reload-rules + udevadm trigger + fi + exit 0 + fi +done + +echo "Couldn't copy SlimeVR udev rules, serial console and dongles may not work" >&2 diff --git a/gui/electron/resources/scripts/postremove.sh b/gui/electron/resources/scripts/postremove.sh new file mode 100644 index 000000000..ddd8ff38a --- /dev/null +++ b/gui/electron/resources/scripts/postremove.sh @@ -0,0 +1,8 @@ +#!/bin/bash +echo "Removing SlimeVR udev rules..." +rm -f "/lib/udev/rules.d/69-slimevr-devices.rules" +rm -f "/usr/lib/udev/rules.d/69-slimevr-devices.rules" + +if command -v udevadm >/dev/null 2>&1; then + udevadm control --reload-rules +fi diff --git a/gui/electron/shared.ts b/gui/electron/shared.ts new file mode 100644 index 000000000..1364550bd --- /dev/null +++ b/gui/electron/shared.ts @@ -0,0 +1,49 @@ +import { + OpenDialogOptions, + OpenDialogReturnValue, + SaveDialogOptions, + SaveDialogReturnValue, +} from 'electron'; +import { DiscordPresence, GHGet, GHReturn, OSStats } from './preload/interface'; + +export const IPC_CHANNELS = { + SERVER_STATUS: 'server-status', + OPEN_URL: 'open-url', + OS_STATS: 'os-stats', + WINDOW_ACTIONS: 'window-actions', + LOG: 'log', + STORAGE: 'storage', + OPEN_DIALOG: 'open-dialog', + SAVE_DIALOG: 'save-dialog', + I18N_OVERRIDE: 'i18n-override', + OPEN_FILE: 'open-file', + GET_FOLDER: 'get-folder', + GH_FETCH: 'gh-fetch', + DISCORD_PRESENCE: 'discord-presence' +} as const; + +export interface IpcInvokeMap { + [IPC_CHANNELS.OPEN_URL]: (url: string) => 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; + [IPC_CHANNELS.GH_FETCH]: ( + options: T + ) => Promise; + [IPC_CHANNELS.DISCORD_PRESENCE]: (options: DiscordPresence) => void; +} diff --git a/gui/package.json b/gui/package.json index 14722794b..1657a509c 100644 --- a/gui/package.json +++ b/gui/package.json @@ -1,82 +1,54 @@ { - "name": "slimevr-ui", - "version": "0.5.1", - "private": true, + "name": "slimevr", + "version": "0.0.0", + "author": "SlimeVR Team ", + "homepage": "https://slimevr.dev", "type": "module", "dependencies": { + "@ryuziii/discord-rpc": "1.0.1-rc.1", + "@xhayper/discord-rpc": "^1.3.0", + "commander": "^14.0.3", + "discord-rich-presence": "^0.0.8", + "glob": "^13.0.3", + "open": "^11.0.0", + "pino": "^10.3.1", + "pino-pretty": "^13.1.3", + "pino-roll": "^4.0.0" + }, + "scripts": { + "start": "vite --force", + "gui": "electron-vite dev --config electron.vite.config.ts --watch", + "build": "electron-vite build --config electron.vite.config.ts", + "package": "electron-builder", + "package:build": "pnpm build && pnpm package", + "preview": "electron-vite preview --config electron.vite.config.ts", + "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}\"", + "javaversion-build": "cd electron/resources/java-version/ && javac JavaVersion.java && jar cvfe JavaVersion.jar JavaVersion JavaVersion.class", + "gen:javaversion": "cd electron/resources/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", + "@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", - "@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", - "@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", - "convert": "^5.12.0", - "flatbuffers": "22.10.26", - "intl-pluralrules": "^2.0.1", - "ip-num": "^1.5.1", - "jotai": "^2.12.2", - "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" - }, - "scripts": { - "start": "vite --force", - "build": "vite build", - "dev": "tauri dev", - "skipbundler": "tauri build --no-bundle", - "tauri": "tauri", - "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" - }, - "devDependencies": { - "@dword-design/eslint-plugin-import-alias": "^4.0.9", "@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", - "@tauri-apps/cli": "~2", + "@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", @@ -88,23 +60,54 @@ "@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", + "electron-builder": "^26.7.0", + "electron-vite": "^5.0.0", "eslint": "^9.39.1", "eslint-import-resolver-typescript": "^3.10.1", "eslint-plugin-import": "^2.32.0", "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/public/fonts/NotoSansCJK-VF.otf.woff2 b/gui/public/fonts/NotoSansCJK-VF.otf.woff2 deleted file mode 100644 index 042a981b4..000000000 Binary files a/gui/public/fonts/NotoSansCJK-VF.otf.woff2 and /dev/null differ diff --git a/gui/public/fonts/noto-sans-v42-latin-regular.woff2 b/gui/public/fonts/noto-sans-v42-latin-regular.woff2 new file mode 100644 index 000000000..f9e0a65f8 Binary files /dev/null and b/gui/public/fonts/noto-sans-v42-latin-regular.woff2 differ diff --git a/gui/public/images/relaxed_pose_flat.webp b/gui/public/images/relaxed_pose_flat.webp deleted file mode 100644 index fbff001a4..000000000 Binary files a/gui/public/images/relaxed_pose_flat.webp and /dev/null differ diff --git a/gui/public/images/relaxed_pose_sitting.webp b/gui/public/images/relaxed_pose_sitting.webp deleted file mode 100644 index c092cbf83..000000000 Binary files a/gui/public/images/relaxed_pose_sitting.webp and /dev/null differ diff --git a/gui/public/images/relaxed_pose_standing.webp b/gui/public/images/relaxed_pose_standing.webp deleted file mode 100644 index 11cde3a81..000000000 Binary files a/gui/public/images/relaxed_pose_standing.webp and /dev/null differ diff --git a/gui/src-tauri/.gitignore b/gui/src-tauri/.gitignore deleted file mode 100644 index 13c9c209e..000000000 --- a/gui/src-tauri/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ -WixTools -src/JavaVersion.class -/gen/schemas 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/build.rs b/gui/src-tauri/build.rs deleted file mode 100644 index d505de07e..000000000 --- a/gui/src-tauri/build.rs +++ /dev/null @@ -1,15 +0,0 @@ -use cfg_aliases::cfg_aliases; - -fn main() -> shadow_rs::SdResult<()> { - // Bypass for Nix script having libudev-zero and Tauri not liking it - if let Some(path) = option_env!("SLIMEVR_RUST_LD_LIBRARY_PATH") { - println!("cargo:rustc-env=LD_LIBRARY_PATH={path}"); - } - - tauri_build::build(); - cfg_aliases! { - mobile: { any(target_os = "ios", target_os = "android") }, - desktop: { not(any(target_os = "ios", target_os = "android")) } - } - shadow_rs::new() -} 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/dev.slimevr.SlimeVR.desktop b/gui/src-tauri/dev.slimevr.SlimeVR.desktop deleted file mode 100644 index c0a905e36..000000000 --- a/gui/src-tauri/dev.slimevr.SlimeVR.desktop +++ /dev/null @@ -1,13 +0,0 @@ -[Desktop Entry] -Version=1.5 -Categories=Game;GTK; -Exec={{exec}} -Icon={{icon}} - -Name=SlimeVR -GenericName=Full-body tracking -Comment=An app for facilitating full-body tracking in virtual reality -Keywords=FBT;VR;Steam;VRChat;IMU - -Terminal=false -Type=Application diff --git a/gui/src-tauri/dev.slimevr.SlimeVR.metainfo.xml b/gui/src-tauri/dev.slimevr.SlimeVR.metainfo.xml deleted file mode 100644 index 18f6ebca2..000000000 --- a/gui/src-tauri/dev.slimevr.SlimeVR.metainfo.xml +++ /dev/null @@ -1,139 +0,0 @@ - - - - dev.slimevr.SlimeVR - - SlimeVR - Accessible full-body tracking in VR - SlimeVR Team - - - CC0-1.0 - MIT OR Apache-2.0 - - - https://slimevr.dev/ - https://github.com/SlimeVR/SlimeVR-Server/issues - https://docs.slimevr.dev/slimevr101.html - https://github.com/sponsors/SlimeVR - https://github.com/SlimeVR/SlimeVR-Server - https://i18n.slimevr.dev - https://docs.slimevr.dev/server-setup/slimevr-setup.html - https://github.com/SlimeVR/SlimeVR-Server/blob/main/CONTRIBUTING.md - https://discord.gg/SlimeVR - - 300 - - - pointing - keyboard - touch - - - - #BB8AE5 - #663499 - - - -

- SlimeVR is a set of open hardware sensors and open source software that facilitates full-body - tracking (FBT) in virtual reality. With no base station required, SlimeVR makes wireless - VR FBT affordable and comfortable. -

-
- - dev.slimevr.SlimeVR.desktop - safe-mode.dev.slimevr.SlimeVR.desktop - - - The onboarding for the GUI - https://raw.githubusercontent.com/SlimeVR/SlimeVR-Server/main/assets/img/onboarding.png - - - - - slimevr - - - - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.1-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.16.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.4 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.15.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.14.0-rc1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.1-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.4 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.13.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.4 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.12.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.11.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.1-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.10.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.4 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.1-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.9.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.2-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.8.0-rc.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.7.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.3 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.2 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.6.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.5.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.4.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.3.0 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.1 - https://github.com/SlimeVR/SlimeVR-Server/releases/tag/v0.2.0 - -
diff --git a/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 3977b7971..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png and /dev/null differ 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 02819a923..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ 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 3977b7971..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png and /dev/null differ 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 30bd847b1..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png and /dev/null differ 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 ea3fa0e0c..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 30bd847b1..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png and /dev/null differ 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 61b2afdbf..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 52f07b904..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 61b2afdbf..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index ebad2842f..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png and /dev/null differ 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 fb1cf7f6a..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index ebad2842f..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ 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 1ac9089da..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ 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 09e6959fc..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ 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 1ac9089da..000000000 Binary files a/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ 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-tauri/safe-mode.dev.slimevr.SlimeVR.desktop b/gui/src-tauri/safe-mode.dev.slimevr.SlimeVR.desktop deleted file mode 100644 index 6ec75b914..000000000 --- a/gui/src-tauri/safe-mode.dev.slimevr.SlimeVR.desktop +++ /dev/null @@ -1,13 +0,0 @@ -[Desktop Entry] -Version=1.5 -Categories=Game;GTK; -Exec=bash -c "WEBKIT_DISABLE_DMABUF_RENDERER=1 WAYLAND_DISPLAY=0 slimevr" -Icon=slimevr - -Name=SlimeVR (safe mode) -GenericName=Full-body tracking -Comment=An app for facilitating full-body tracking in virtual reality -Keywords=FBT;VR;Steam;VRChat;IMU - -Terminal=false -Type=Application diff --git a/gui/src-tauri/src/JavaVersion.jar b/gui/src-tauri/src/JavaVersion.jar deleted file mode 100644 index 4fe8fe33c..000000000 Binary files a/gui/src-tauri/src/JavaVersion.jar and /dev/null differ diff --git a/gui/src-tauri/src/main.rs b/gui/src-tauri/src/main.rs deleted file mode 100644 index b64e6974b..000000000 --- a/gui/src-tauri/src/main.rs +++ /dev/null @@ -1,443 +0,0 @@ -#![cfg_attr(all(not(debug_assertions), windows), windows_subsystem = "windows")] -use std::env; -use std::panic; -use std::path::Path; -use std::path::PathBuf; -use std::sync::atomic::AtomicBool; -use std::sync::atomic::Ordering; -use std::sync::Arc; -use std::sync::Mutex; -use std::thread; -use std::time::Duration; -use std::time::Instant; - -use clap::Parser; -use color_eyre::Result; -use state::WindowState; -use tauri::Emitter; -use tauri::WindowEvent; -use tauri::{Manager, RunEvent}; -use tauri_plugin_shell::process::CommandChild; -use util::get_log_dir; - -use crate::util::{show_error, valid_java_paths, Cli, JAVA_BIN, MINIMUM_JAVA_VERSION}; - -mod presence; -mod state; -mod tray; -mod util; - -#[tauri::command] -fn update_window_state( - window: tauri::Window, - state: tauri::State>, -) -> Result<(), String> { - let mut lock = state.lock().unwrap(); - lock.update_state(&window, false) - .map_err(|e| format!("{:?}", e))?; - if window.is_maximized().map_err(|e| e.to_string())? { - window.unmaximize().map_err(|e| e.to_string())?; - lock.update_state(&window, true) - .map_err(|e| format!("{:?}", e))?; - } - Ok(()) -} - -#[tauri::command] -fn open_config_folder(app_handle: tauri::AppHandle) { - let path = app_handle - .path() - .app_config_dir() - .unwrap_or_else(|_| Path::new(".").to_path_buf()); - - if let Err(err) = open::that(path) { - log::error!("Failed to open config folder: {}", err); - } -} - -#[tauri::command] -fn open_logs_folder(app_handle: tauri::AppHandle) { - #[cfg(windows)] - let path = app_handle.path().app_data_dir().map(|dir| dir.join("logs")); - - #[cfg(unix)] - let path = app_handle.path().app_log_dir(); - - if let Err(err) = - open::that(path.unwrap_or_else(|_| Path::new("./logs/").to_path_buf())) - { - log::error!("Failed to open logs folder: {}", err); - } -} - -fn main() -> Result<()> { - log_panics::init(); - let hook = panic::take_hook(); - // Make an error dialog box when panicking - panic::set_hook(Box::new(move |panic_info| { - show_error(&panic_info.to_string()); - hook(panic_info); - })); - - let cli = Cli::parse(); - let tauri_context = tauri::generate_context!(); - - // Ensure child processes die when spawned on windows - // and then check for WebView2's existence - #[cfg(windows)] - setup_webview2()?; - - // Check for environment variables that can affect the server, and if so, warn in log and GUI - check_environment_variables(); - - // Spawn server process - let exit_flag = Arc::new(AtomicBool::new(false)); - let backend = Arc::new(Mutex::new(Option::::None)); - let build_result = - setup_tauri(cli, tauri_context, exit_flag.clone(), backend.clone()); - - tauri_build_result(build_result, exit_flag, backend); - - Ok(()) -} - -#[cfg(windows)] -fn setup_webview2() -> Result<()> { - use crate::util::webview2_exists; - use win32job::{ExtendedLimitInfo, Job}; - - let mut info = ExtendedLimitInfo::new(); - info.limit_kill_on_job_close(); - let job = Job::create_with_limit_info(&mut info).expect("Failed to create Job"); - job.assign_current_process() - .expect("Failed to assign current process to Job"); - - // We don't do anything with the job anymore, but we shouldn't drop it because that would - // terminate our process tree. So we intentionally leak it instead. - std::mem::forget(job); - - if !webview2_exists() { - // This makes a dialog appear which let's you press Ok or Cancel - // If you press Ok it will open the SlimeVR installer documentation - use rfd::{MessageButtons, MessageDialog, MessageDialogResult, MessageLevel}; - - let confirm = MessageDialog::new() - .set_title("SlimeVR") - .set_description("Couldn't find WebView2 installed. You can install it with the SlimeVR installer") - .set_buttons(MessageButtons::OkCancel) - .set_level(MessageLevel::Error) - .show(); - if confirm == MessageDialogResult::Ok { - open::that("https://docs.slimevr.dev/server-setup/installing-and-connecting.html#install-the-latest-slimevr-installer").unwrap(); - } - } - Ok(()) -} - -fn check_environment_variables() { - use itertools::Itertools; - const ENVS_TO_CHECK: &[&str] = &["_JAVA_OPTIONS", "JAVA_TOOL_OPTIONS"]; - let checked_envs = ENVS_TO_CHECK - .into_iter() - .filter_map(|e| { - let Ok(data) = env::var(e) else { - return None; - }; - log::warn!("{e} is set to: {data}"); - Some(e) - }) - .join(", "); - - if !checked_envs.is_empty() { - rfd::MessageDialog::new() - .set_title("SlimeVR") - .set_description(format!("You have environment variables {} set, which may cause the SlimeVR Server to fail to launch properly.", checked_envs)) - .set_level(rfd::MessageLevel::Warning) - .show(); - } -} - -fn find_java_bin>(shared_dir: P) -> Option { - let shared_dir = shared_dir.as_ref(); - // Check if any Java already installed is compatible - let jre = shared_dir.join("jre/bin").join(JAVA_BIN); - let java_bin = jre - .exists() - .then(|| jre.into_os_string()) - .or_else(|| valid_java_paths().first().map(|x| x.0.to_owned()))?; - Some(PathBuf::from(java_bin)) -} - -fn find_server_jar(cli: &Cli) -> Option { - let paths = [ - cli.launch_from_path.clone(), - // AppImage passes the fakeroot in `APPDIR` env var. - env::var_os("APPDIR").map(|a| PathBuf::from(a).join("usr/share/slimevr/")), - env::current_dir().ok(), - // getcwd in Mac can't be trusted, so let's get the executable's path - env::current_exe() - .map(|mut f| { - f.pop(); - f - }) - .ok(), - // For development - #[cfg(debug_assertions)] - Some(PathBuf::from(env!("CARGO_MANIFEST_DIR"))), - // For flatpak container - Some(PathBuf::from("/app/share/slimevr/")), - Some(PathBuf::from("/usr/share/slimevr/")), - ]; - - paths - .into_iter() - .flatten() - .map(|x| x.join("slimevr.jar")) - .find(|x| x.exists()) -} - -fn server_running() -> bool { - std::net::TcpListener::bind("127.0.0.1:21110").is_err() -} - -fn setup_tauri( - cli: Cli, - context: tauri::Context, - exit_flag: Arc, - backend: Arc>>, -) -> Result { - let exit_flag_terminated = exit_flag.clone(); - tauri::Builder::default() - .plugin( - tauri_plugin_log::Builder::new() - .target(tauri_plugin_log::Target::new( - tauri_plugin_log::TargetKind::Folder { - path: get_log_dir(&context)?, - file_name: Some("slimevr".to_string()), - }, - )) - .max_file_size(30_000 /* bytes */) - .rotation_strategy(tauri_plugin_log::RotationStrategy::KeepSome(3)) - .build(), - ) - .plugin(tauri_plugin_opener::init()) - .plugin(tauri_plugin_dialog::init()) - .plugin(tauri_plugin_fs::init()) - .plugin(tauri_plugin_os::init()) - .plugin(tauri_plugin_shell::init()) - .plugin(tauri_plugin_store::Builder::default().build()) - .plugin(tauri_plugin_http::init()) - .invoke_handler(tauri::generate_handler![ - update_window_state, - open_config_folder, - open_logs_folder, - tray::update_translations, - tray::update_tray_text, - tray::is_tray_available, - presence::discord_client_exists, - presence::update_presence, - presence::clear_presence, - presence::create_discord_client, - ]) - .setup(move |app| { - log::info!("SlimeVR started!"); - let window_state = - WindowState::open_state(app.path().app_config_dir().unwrap()) - .unwrap_or_default(); - - let window = tauri::WebviewWindowBuilder::new( - app, - "main", - tauri::WebviewUrl::App("index.html".into()), - ) - .title("SlimeVR") - .inner_size(1289.0, 709.0) - .min_inner_size(util::MIN_WINDOW_SIZE_WIDTH, util::MIN_WINDOW_SIZE_HEIGHT) - .resizable(true) - .visible(true) - .decorations(false) - .fullscreen(false) - // This allows drag & drop via HTML5 for Windows - .disable_drag_drop_handler() - .build()?; - if window_state.is_old() { - window_state.update_window(&window.as_ref().window(), false)?; - } - - if cfg!(desktop) { - let handle = app.handle(); - tray::create_tray(handle)?; - presence::create_presence(handle)?; - } else { - app.manage(tray::TrayAvailable(false)); - } - - app.manage(Mutex::new(window_state)); - - if cli.skip_server_start_if_running && server_running() { - log::info!("Skipping server start: server is already running."); - return Ok(()); - } - - struct ServerStartInfo { - server_jar: PathBuf, - java_bin: PathBuf, - } - - let start_server = move |start_info: ServerStartInfo| { - let app_handle = app.app_handle().clone(); - tauri::async_runtime::spawn(async move { - use tauri_plugin_shell::{process::CommandEvent, ShellExt}; - - let (mut rx, child) = app_handle - .shell() - .command(start_info.java_bin.to_str().unwrap()) - .current_dir(start_info.server_jar.parent().unwrap()) - .args([ - "-Xmx128M", - "-jar", - start_info.server_jar.to_str().unwrap(), - "run", - ]) - .spawn() - .expect("Unable to start the server jar"); - - { - let mut lock = backend.lock().unwrap(); - *lock = Some(child) - } - - while let Some(cmd_event) = rx.recv().await { - let emit_me = match cmd_event { - CommandEvent::Stderr(v) => { - ("stderr", String::from_utf8(v).unwrap_or_default()) - } - CommandEvent::Stdout(v) => { - ("stdout", String::from_utf8(v).unwrap_or_default()) - } - CommandEvent::Error(s) => ("error", s), - CommandEvent::Terminated(s) => { - exit_flag_terminated.store(true, Ordering::Relaxed); - ("terminated", format!("{s:?}")) - } - _ => ("other", "".to_string()), - }; - app_handle - .emit("server-status", emit_me) - .expect("Check server log files. \nFailed to emit"); - } - log::error!("Java server receiver died"); - app_handle - .emit("server-status", ("other", "receiver cancelled")) - .expect("Failed to emit"); - }); - }; - - let find_server = || -> Option { - use const_format::formatcp; - - let server_jar = find_server_jar(&cli)?; - log::info!("Server found on path: {}", server_jar.to_str().unwrap()); - - let shared_dir = server_jar.parent().unwrap(); - let Some(java_bin) = find_java_bin(shared_dir) else { - show_error(formatcp!( - "Couldn't find a compatible Java version, please download Java {} or higher", - MINIMUM_JAVA_VERSION - )); - return None; - }; - log::info!("Using Java binary: {:?}", java_bin); - - Some(ServerStartInfo { - server_jar, - java_bin, - }) - }; - - if let Some(start_info) = find_server() { - start_server(start_info); - } else { - log::warn!("No server found. We will not start the server."); - } - - Ok(()) - }) - .on_window_event(|w, e| match e { - WindowEvent::CloseRequested { .. } => { - let window_state = w.state::>(); - if let Err(e) = update_window_state(w.clone(), window_state) { - log::error!("failed to update window state {}", e) - } - } - // See https://github.com/tauri-apps/tauri/issues/4012#issuecomment-1449499149 - // #[cfg(windows)] - // WindowEvent::Resized(_) => std::thread::sleep(std::time::Duration::from_nanos(1)), - _ => (), - }) - .build(context) -} - -fn tauri_build_result( - build_result: Result, - exit_flag: Arc, - backend: Arc>>, -) { - match build_result { - Ok(app) => { - app.run(move |app_handle, event| match event { - RunEvent::Exit => { - let window_state = app_handle.state::>(); - let lock = window_state.lock().unwrap(); - let config_dir = app_handle.path().app_config_dir().unwrap(); - let window_state_res = lock.save_state(config_dir); - match window_state_res { - Ok(()) => log::info!("saved window state"), - Err(e) => log::error!("failed to save window state: {}", e), - } - - let mut lock = backend.lock().unwrap(); - let Some(ref mut child) = *lock else { return }; - let write_result = child.write(b"exit\n"); - match write_result { - Ok(()) => log::info!("send exit to backend"), - Err(_) => log::error!("fail to send exit to backend"), - } - let ten_seconds = Duration::from_secs(10); - let start_time = Instant::now(); - while start_time.elapsed() < ten_seconds { - if exit_flag.load(Ordering::Relaxed) { - break; - } - thread::sleep(Duration::from_secs(1)); - } - } - _ => {} - }); - } - #[cfg(windows)] - // Often triggered when the user doesn't have webview2 installed - Err(tauri::Error::Runtime(tauri_runtime::Error::CreateWebview(error))) => { - // I should log this anyways, don't want to dig a grave by not logging the error. - log::error!("CreateWebview error {}", error); - - use rfd::{ - MessageButtons, MessageDialog, MessageDialogResult, MessageLevel, - }; - - let confirm = MessageDialog::new() - .set_title("SlimeVR") - .set_description("You seem to have a faulty installation of WebView2. You can check a guide on how to fix that in the docs!") - .set_buttons(MessageButtons::OkCancel) - .set_level(MessageLevel::Error) - .show(); - if confirm == MessageDialogResult::Ok { - open::that("https://docs.slimevr.dev/common-issues.html#webview2-is-missing--slimevr-gui-crashes-immediately--panicked-at--webview2error").unwrap(); - } - } - Err(error) => { - log::error!("tauri build error {}", error); - show_error(&error.to_string()); - } - } -} diff --git a/gui/src-tauri/src/presence.rs b/gui/src-tauri/src/presence.rs deleted file mode 100644 index accc0061c..000000000 --- a/gui/src-tauri/src/presence.rs +++ /dev/null @@ -1,212 +0,0 @@ -use std::time::{Duration, SystemTime}; - -use color_eyre::{eyre::bail, Result}; -use discord_sdk as ds; -use ds::wheel::{UserSpoke, UserState}; -use tauri::{async_runtime::Mutex, AppHandle, Manager, Runtime, State}; - -const APP_ID: ds::AppId = 1237970689009647639; - -pub struct DiscordClient { - pub discord: ds::Discord, - pub wheel: ds::wheel::Wheel, -} - -pub struct DiscordTimestamp(SystemTime); - -pub struct ExposedClient(Mutex>); - -async fn make_client(subs: ds::Subscriptions) -> Result> { - let (wheel, handler) = ds::wheel::Wheel::new(Box::new(|err| { - log::error!(target: "discord_presence", "encountered a discord presence error: {err}"); - })); - - let mut user = wheel.user(); - - let discord = - ds::Discord::new(ds::DiscordApp::PlainId(APP_ID), subs, Box::new(handler))?; - - log::debug!(target: "discord_presence", "waiting for handshake..."); - let Ok(e) = tokio::time::timeout(Duration::from_secs(5), user.0.changed()).await - else { - return Ok(None); - }; - e?; - - let _ = match &*user.0.borrow() { - ds::wheel::UserState::Connected(user) => user.clone(), - ds::wheel::UserState::Disconnected(err) => { - bail!("failed to connect to Discord: {err}"); - } - }; - - log::info!(target: "discord_presence", "connected to Discord!"); - - Ok(Some(DiscordClient { discord, wheel })) -} - -async fn client_exists(client: &State<'_, ExposedClient>) -> bool { - let lock = client.0.lock().await; - lock.is_some() -} - -#[tauri::command] -pub async fn discord_client_exists( - client: State<'_, ExposedClient>, -) -> Result { - Ok(client_exists(&client).await) -} - -#[tauri::command] -pub async fn update_presence( - client: State<'_, ExposedClient>, - timestamp: State<'_, DiscordTimestamp>, - details: String, - state: Option, - small_icon: Option<(String, String)>, - button: Option, -) -> Result<(), ()> { - if !client_exists(&client).await { - return Err(()); - } - - let rp = ds::activity::ActivityBuilder::default() - .details(details) - .start_timestamp(timestamp.0); - let rp = if let Some(state) = state { - rp.state(state) - } else { - rp - }; - let rp = if let Some((id, desc)) = small_icon { - rp.assets( - ds::activity::Assets::default() - .large("icon".to_owned(), Some("SlimeVR".to_owned())) - .small(id, Some(desc)), - ) - } else { - rp.assets( - ds::activity::Assets::default() - .large("icon".to_owned(), Some("SlimeVR".to_owned())), - ) - }; - let rp = if let Some(button) = button { - rp.button(button) - } else { - rp - }; - - let lock = client.0.lock().await; - lock.as_ref() - .unwrap() - .discord - .update_activity(rp) - .await - .map_err(|_e| ())?; - - Ok(()) -} - -#[tauri::command] -pub async fn clear_presence(client: State<'_, ExposedClient>) -> Result<(), String> { - if !client_exists(&client).await { - return Err("Missing discord client".to_owned()); - } - - let lock = client.0.lock().await; - lock.as_ref() - .unwrap() - .discord - .clear_activity() - .await - .map_err(|e| e.to_string())?; - - Ok(()) -} - -#[tauri::command] -pub async fn create_discord_client( - app: AppHandle, - client: State<'_, ExposedClient>, -) -> Result<(), String> { - if client_exists(&client).await { - return Err("Trying to create a client when there is one already".to_owned()); - } - - let Some(discord_client) = make_client(ds::Subscriptions::ACTIVITY) - .await - .map_err(|e| e.to_string())? - else { - log::debug!(target: "discord_presence", "discord took too long to answer (probably not open)"); - return Ok(()); - }; - let user_wheel = discord_client.wheel.user(); - { - let mut lock = client.0.lock().await; - *lock = Some(discord_client); - } - - tauri::async_runtime::spawn(async move { - drop_client_on_loss(app, user_wheel).await; - }); - Ok(()) -} - -async fn drop_client_on_loss( - app: tauri::AppHandle, - mut user_wheel: UserSpoke, -) { - while let Ok(_) = user_wheel.0.changed().await { - if let UserState::Disconnected(e) = &*user_wheel.0.borrow() { - match e { - ds::Error::NoConnection - | ds::Error::TimedOut - | ds::Error::Close(_) - | ds::Error::CorruptConnection => break, - _ => { - log::error!(target: "discord_presence", "unhandled discord error: {e}") - } - } - } - } - log::info!(target: "discord_presence", "lost connection to discord, dropping client..."); - let mutex = app.state::(); - let opt = { - let mut lock = mutex.0.lock().await; - lock.take() - }; - let Some(client) = opt else { - return; - }; - client.discord.disconnect().await; -} - -pub fn create_presence(app: &tauri::AppHandle) -> tauri::Result<()> { - app.manage(ExposedClient(Mutex::new(None))); - app.manage(DiscordTimestamp(SystemTime::now())); - { - let app = app.clone(); - tauri::async_runtime::spawn(async move { - let client = make_client(ds::Subscriptions::ACTIVITY).await; - if let Err(e) = client { - log::error!(target: "discord_presence", "couldn't initialize discord client: {e}"); - return; - } - let Some(client) = client.unwrap() else { - log::debug!(target: "discord_presence", "discord took too long to answer (probably not open)"); - return; - }; - let user_wheel = client.wheel.user(); - { - let mutex = app.state::(); - let mut lock = mutex.0.lock().await; - *lock = Some(client) - } - tauri::async_runtime::spawn(async move { - drop_client_on_loss(app, user_wheel).await; - }); - }); - } - - Ok(()) -} diff --git a/gui/src-tauri/src/state.rs b/gui/src-tauri/src/state.rs deleted file mode 100644 index 7295778cd..000000000 --- a/gui/src-tauri/src/state.rs +++ /dev/null @@ -1,140 +0,0 @@ -use std::{fs, path::PathBuf}; - -use color_eyre::Result; -use serde::{Deserialize, Serialize}; -use tauri::{LogicalSize, Monitor, PhysicalPosition, PhysicalSize, Window}; - -use crate::util; - -static STATE_FILENAME: &str = ".window-state.json"; - -#[derive(Serialize, Deserialize, Debug, Default)] -pub struct WindowState { - maximized: bool, - width: f64, - height: f64, - x: i32, - y: i32, - decorated: bool, - #[serde(skip)] - old: bool, -} - -impl WindowState { - pub fn open_state(path: PathBuf) -> Option { - if let Ok(file) = fs::File::open(path.join(STATE_FILENAME)) { - return serde_json::from_reader(file) - .map(|mut s: WindowState| { - s.old = true; - s - }) - .ok(); - } - None - } - - pub fn is_old(&self) -> bool { - self.old - } - - pub fn save_state(&self, path: PathBuf) -> Result<()> { - if !path.exists() { - fs::create_dir(&path)? - } - let file = fs::File::create(path.join(STATE_FILENAME))?; - serde_json::to_writer(file, self)?; - Ok(()) - } - - pub fn update_state( - &mut self, - window: &Window, - ignore_maximized: bool, - ) -> Result<()> { - self.decorated = window.is_decorated()?; - - let maximized = window.is_maximized()?; - self.maximized = maximized || (self.maximized && ignore_maximized); - // We early return when it's maximized because we dont have to save the state - // of the rest of the window when it's maximized. - if maximized { - return Ok(()); - } - let scale_factor = window.scale_factor()?; - let size = window.outer_size()?.to_logical::(scale_factor); - let pos = window.outer_position()?; - - self.width = size.width; - self.height = size.height; - - self.x = pos.x; - self.y = pos.y; - Ok(()) - } - - pub fn update_window(&self, window: &Window, ignore_maximized: bool) -> Result<()> { - window.set_decorations(self.decorated)?; - - let maximized = !ignore_maximized && window.is_maximized()?; - if maximized && !self.maximized { - window.unmaximize()?; - } - - let size = if self.width >= util::MIN_WINDOW_SIZE_WIDTH - && self.height >= util::MIN_WINDOW_SIZE_HEIGHT - { - Some(LogicalSize::new(self.width, self.height)) - } else { - None - }; - - let pos = PhysicalPosition::new(self.x, self.y); - let monitor = window - .available_monitors()? - .into_iter() - .find(|x| x.contains(pos)) - .map(|m| (m, true)) - .or(window.current_monitor()?.map(|m| (m, false))); - - // Don't surpass the monitor's size - if let Some((monitor, is_old)) = monitor { - let monitor_size = *monitor.size(); - let window_size = size - .map(|s| s.to_physical(monitor.scale_factor())) - .unwrap_or(window.outer_size()?); - window.set_size(PhysicalSize::new( - u32::min(monitor_size.width, window_size.width), - u32::min(monitor_size.height, window_size.height), - ))?; - - // If the position of the window was previously in the config - if is_old { - window.set_position(pos)?; - } - } - - if !ignore_maximized && !maximized && self.maximized { - window.maximize()?; - } - - Ok(()) - } -} - -pub trait MonitorExt { - fn contains(&self, position: PhysicalPosition) -> bool; -} - -/// Allowed amount to overflow out of the screen -const ALLOWED_OVERFLOW: i32 = 16; -impl MonitorExt for Monitor { - fn contains(&self, position: PhysicalPosition) -> bool { - let PhysicalPosition { x, y } = *self.position(); - let PhysicalSize { width, height } = *self.size(); - - (x < position.x + ALLOWED_OVERFLOW) as _ - && (position.x - ALLOWED_OVERFLOW) < (x + width as i32) - && (y - ALLOWED_OVERFLOW) < position.y as _ - && (position.y + ALLOWED_OVERFLOW) < (y + height as i32) - } -} diff --git a/gui/src-tauri/src/tray.rs b/gui/src-tauri/src/tray.rs deleted file mode 100644 index 66777777e..000000000 --- a/gui/src-tauri/src/tray.rs +++ /dev/null @@ -1,159 +0,0 @@ -use std::{collections::HashMap, sync::Mutex}; - -use tauri::{ - include_image, - menu::{Menu, MenuBuilder, MenuItemBuilder, MenuItemKind}, - tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, - AppHandle, Emitter, Manager, Runtime, State, -}; - -pub struct TrayMenu(Menu); -pub struct TrayAvailable(pub bool); - -pub struct TrayTranslations { - store: Mutex>, -} - -impl TrayTranslations { - fn get(&self, key: &str) -> String { - let lock = self.store.lock().unwrap(); - lock.get(key) - .map_or_else(|| key.to_string(), |v| v.to_string()) - } -} - -#[tauri::command] -pub fn is_tray_available(tray_available: State) -> bool { - tray_available.0 -} - -#[tauri::command] -pub fn update_translations( - app: AppHandle, - i18n: State, - menu: State>>, - new_i18n: HashMap, -) -> color_eyre::Result<(), String> { - { - let mut lock = i18n.store.lock().map_err(|e| e.to_string())?; - for (new_key, new_value) in new_i18n { - lock.insert(new_key, new_value); - } - } - - update_tray_text(app, i18n, menu)?; - - Ok(()) -} - -#[tauri::command] -pub fn update_tray_text( - app: AppHandle, - i18n: State, - menu: State>>, -) -> color_eyre::Result<(), String> { - let Some(menu) = menu.as_ref() else { - return Ok(()); - }; - if let Some((window, MenuItemKind::MenuItem(toggle_i))) = - app.get_webview_window("main").zip(menu.0.get("toggle")) - { - let new_title = if window.is_visible().unwrap_or_default() { - i18n.get("tray_menu-hide") - } else { - i18n.get("tray_menu-show") - }; - toggle_i.set_text(new_title).map_err(|e| e.to_string())?; - } - - if let Some(MenuItemKind::MenuItem(quit_i)) = menu.0.get("quit") { - quit_i - .set_text(i18n.get("tray_menu-quit")) - .map_err(|e| e.to_string())?; - } - - Ok(()) -} - -pub fn create_tray(app: &tauri::AppHandle) -> tauri::Result<()> { - #[cfg(target_os = "linux")] - unsafe { - const LIBS_TO_CHECK: &[&str] = &[ - "libayatana-appindicator3.so.1", - "libappindicator3.so.1", - "libayatana-appindicator3.so", - "libappindicator3.so", - ]; - let found = LIBS_TO_CHECK - .iter() - .any(|lib| libloading::Library::new(lib).is_ok()); - if !found { - log::warn!( - "libappindicator couldn't be found so tray support has been disabled!" - ); - app.manage(TrayAvailable(false)); - return Ok(()); - } - } - - let toggle_i = MenuItemBuilder::with_id("toggle", "Hide").build(app)?; - let quit_i = MenuItemBuilder::with_id("quit", "Quit").build(app)?; - let menu1 = MenuBuilder::new(app).items(&[&toggle_i, &quit_i]).build()?; - - let _ = TrayIconBuilder::with_id("tray-1") - .menu(&menu1) - .title("SlimeVR") - .tooltip("SlimeVR") - .icon_as_template(true) - .show_menu_on_left_click(false) - .icon(if cfg!(target_os = "macos") { - include_image!("icons/appleTrayIcon.png") - } else { - include_image!("icons/128x128.png") - }) - .on_menu_event(move |app, event| match event.id.as_ref() { - "quit" => app.emit("try-close", "tray").unwrap(), - "toggle" => { - let i18n = app.state::(); - if let Some(window) = app.get_webview_window("main") { - let new_title = if window.is_visible().unwrap_or_default() { - let _ = window.hide(); - i18n.get("tray_menu-show") - } else { - let _ = window.show(); - let _ = window.set_focus(); - i18n.get("tray_menu-hide") - }; - toggle_i.set_text(new_title).unwrap(); - } - } - _ => {} - }) - .on_tray_icon_event(|tray, event| match event { - TrayIconEvent::Click { - button, - button_state, - .. - } if button == MouseButton::Left - && button_state == MouseButtonState::Up => - { - let app = tray.app_handle(); - if let Some(window) = app.get_webview_window("main") { - let _ = window.show(); - let _ = window.set_focus(); - } - } - _ => {} - }) - // We don't want this as we open the window on left click - .show_menu_on_left_click(false) - .build(app)?; - - app.manage(TrayAvailable(true)); - app.manage(Some(TrayMenu(menu1))); - app.manage(TrayTranslations { - store: Default::default(), - }); - - Ok(()) -} diff --git a/gui/src-tauri/src/util.rs b/gui/src-tauri/src/util.rs deleted file mode 100644 index cb0abd52b..000000000 --- a/gui/src-tauri/src/util.rs +++ /dev/null @@ -1,208 +0,0 @@ -#[cfg(windows)] -use std::os::windows::process::CommandExt; -use std::{ - ffi::{OsStr, OsString}, - io::Write, - path::PathBuf, - process::{Child, Stdio}, -}; - -use clap::Parser; -use const_format::concatcp; -use shadow_rs::shadow; -use tempfile::Builder; - -#[cfg(windows)] -/// For Commands on Windows so they dont create terminals -const CREATE_NO_WINDOW: u32 = 0x0800_0000; -/// It's an i32 because we check it through exit codes of the process -pub const MINIMUM_JAVA_VERSION: i32 = 17; -pub const JAVA_BIN: &str = if cfg!(windows) { "java.exe" } else { "java" }; -pub static POSSIBLE_TITLES: &[&str] = &[ - "Panicking situation", - "looking for spatula", - "never gonna give you up", - "never gonna let you down", - "uwu sowwy", -]; -pub const MIN_WINDOW_SIZE_WIDTH: f64 = 393.0; -pub const MIN_WINDOW_SIZE_HEIGHT: f64 = 667.0; - -shadow!(build); -// Tauri has a way to return the package.json version, but it's not a constant... -const VERSION: &str = if build::TAG.is_empty() { - build::SHORT_COMMIT -} else { - build::TAG -}; -const MODIFIED: &str = if build::GIT_CLEAN { "" } else { "-dirty" }; - -#[derive(Debug, Parser)] -#[clap( - version = concatcp!(VERSION, MODIFIED), - about -)] -pub struct Cli { - #[clap(short, long)] - pub display_console: bool, - #[clap(long)] - pub launch_from_path: Option, - #[clap(long)] - pub skip_server_start_if_running: bool, - #[clap(flatten)] - verbose: clap_verbosity_flag::Verbosity, -} - -pub fn spawn_java(java: &OsStr, java_version: &OsStr) -> std::io::Result { - let mut cmd = std::process::Command::new(java); - - #[cfg(windows)] - cmd.creation_flags(CREATE_NO_WINDOW); - - cmd.arg("-jar") - .arg(java_version) - .stdin(Stdio::null()) - .stderr(Stdio::null()) - .stdout(Stdio::null()) - .spawn() -} - -#[cfg(desktop)] -pub fn show_error(text: &str) -> bool { - use rand::{seq::SliceRandom, thread_rng}; - use rfd::{MessageButtons, MessageDialog, MessageDialogResult, MessageLevel}; - - MessageDialog::new() - .set_title(format!( - "SlimeVR GUI crashed - {}", - POSSIBLE_TITLES.choose(&mut thread_rng()).unwrap() - )) - .set_description(text) - .set_buttons(MessageButtons::Ok) - .set_level(MessageLevel::Error) - .show() - == MessageDialogResult::Ok -} - -pub fn get_log_dir(context: &tauri::Context) -> tauri::Result { - use tauri::Error; - #[cfg(target_os = "macos")] - let path = dirs_next::home_dir() - .ok_or(Error::UnknownPath) - .map(|dir| dir.join("Library/Logs").join(&context.config().identifier))?; - - #[cfg(not(target_os = "macos"))] - let path = dirs_next::data_dir() - .ok_or(Error::UnknownPath) - .map(|dir| dir.join(&context.config().identifier).join("logs"))?; - - Ok(path) -} - -#[cfg(mobile)] -pub fn show_error(text: &str) -> bool { - // needs to do native stuff on mobile - false -} - -#[cfg(windows)] -/// Check if WebView2 exists -pub fn webview2_exists() -> bool { - use winreg::enums::*; - use winreg::RegKey; - - // First on the machine itself - let machine: Option = RegKey::predef(HKEY_LOCAL_MACHINE) - .open_subkey(r"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}") - .map(|r| r.get_value("pv").ok()).ok().flatten(); - let mut exists = false; - if let Some(version) = machine { - exists = version.split('.').any(|x| x != "0"); - } - // Then in the current user - if !exists { - let user: Option = RegKey::predef(HKEY_CURRENT_USER) - .open_subkey( - r"Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}", - ) - .map(|r| r.get_value("pv").ok()) - .ok() - .flatten(); - if let Some(version) = user { - exists = version.split('.').any(|x| x != "0"); - } - } - exists -} - -pub fn valid_java_paths() -> Vec<(OsString, i32)> { - let mut file = Builder::new() - .suffix(".jar") - .tempfile() - .expect("Couldn't generate .jar file"); - file.write_all(include_bytes!("JavaVersion.jar")) - .expect("Couldn't write to .jar file"); - let java_version = file.into_temp_path(); - - // Check if main Java is a supported version - let main_java = if let Ok(java_home) = std::env::var("JAVA_HOME") { - PathBuf::from(java_home) - .join("bin") - .join(JAVA_BIN) - .into_os_string() - } else { - JAVA_BIN.into() - }; - if let Some(main_child) = spawn_java(&main_java, java_version.as_os_str()) - .expect("Couldn't spawn the main Java binary") - .wait() - .expect("Couldn't execute the main Java binary") - .code() - { - if main_child >= MINIMUM_JAVA_VERSION { - return vec![(main_java, main_child)]; - } - } - - // Otherwise check if anything else is a supported version - let mut childs = vec![]; - cfg_if::cfg_if! { - if #[cfg(target_os = "macos")] { - // macOS JVMs are saved on multiple possible places, - // /Library/Java/JavaVirtualMachines are the ones installed by an admin - // /Users/$USER/Library/Java/JavaVirtualMachines are the ones installed locally by the user - let libs = glob::glob(concatcp!("/Library/Java/JavaVirtualMachines/*/Contents/Home/bin/", JAVA_BIN)) - .unwrap() - .filter_map(|res| res.ok()); - } else if #[cfg(unix)] { - // Linux JVMs are saved on /usr/lib/jvm from what I found out, - // there is usually a default dir and a default-runtime dir also which are linked - // to the current default runtime and the current default JDK (I think it's JDK) - let libs = glob::glob(concatcp!("/usr/lib/jvm/*/bin/", JAVA_BIN)) - .unwrap() - .filter_map(|res| res.ok()); - } else { - let libs = which::which_all(JAVA_BIN).unwrap(); - } - } - - for java in libs { - let res = spawn_java(java.as_os_str(), java_version.as_os_str()); - - match res { - Ok(child) => childs.push((java.into_os_string(), child)), - Err(e) => println!("Error on trying to spawn a Java executable: {}", e), - } - } - - childs - .into_iter() - .filter_map(|(p, mut c)| { - c.wait() - .expect("Failed on executing a Java executable") - .code() - .map(|code| (p, code)) - .filter(|(_p, code)| *code >= MINIMUM_JAVA_VERSION) - }) - .collect() -} diff --git a/gui/src-tauri/tauri.conf.json b/gui/src-tauri/tauri.conf.json deleted file mode 100644 index 614365dec..000000000 --- a/gui/src-tauri/tauri.conf.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "build": { - "beforeBuildCommand": "pnpm run build", - "beforeDevCommand": "pnpm run start", - "frontendDist": "../dist", - "devUrl": "http://localhost:5173" - }, - "bundle": { - "active": true, - "linux": { - "deb": { - "depends": [ - "openjdk-17-jre-headless", - "udev" - ], - "files": { - "/usr/share/slimevr/slimevr.jar": "../../server/desktop/build/libs/slimevr.jar", - "/lib/udev/rules.d/69-slimevr.rules": "./69-slimevr-devices.rules", - "/usr/share/applications/safe-mode.dev.slimevr.SlimeVR.desktop": "./safe-mode.dev.slimevr.SlimeVR.desktop" - }, - "desktopTemplate": "./dev.slimevr.SlimeVR.desktop", - "section": "contrib/games" - }, - "appimage": { - "bundleMediaFramework": true, - "files": { - "/usr/share/slimevr/slimevr.jar": "../../server/desktop/build/libs/slimevr.jar" - } - }, - "rpm": { - "depends": [ - "java-latest-openjdk", - "udev" - ], - "files": { - "/usr/share/slimevr/slimevr.jar": "../../server/desktop/build/libs/slimevr.jar", - "/usr/lib/udev/rules.d/69-slimevr.rules": "./69-slimevr-devices.rules", - "/usr/share/applications/safe-mode.dev.slimevr.SlimeVR.desktop": "./safe-mode.dev.slimevr.SlimeVR.desktop" - }, - "desktopTemplate": "./dev.slimevr.SlimeVR.desktop" - } - }, - "category": "DeveloperTool", - "copyright": "", - "targets": "all", - "externalBin": [], - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ], - "windows": { - "certificateThumbprint": null, - "digestAlgorithm": "sha256", - "timestampUrl": "" - }, - "longDescription": "", - "macOS": { - "entitlements": null, - "exceptionDomain": "localhost", - "frameworks": [], - "signingIdentity": null, - "providerShortName": null - }, - "resources": [], - "shortDescription": "", - "licenseFile": "../../LICENSE-MIT" - }, - "productName": "slimevr", - "version": "../package.json", - "identifier": "dev.slimevr.SlimeVR", - "app": { - "security": { - "csp": null - } - } -} diff --git a/gui/src/App.tsx b/gui/src/App.tsx index f7a79770e..5b55a9061 100644 --- a/gui/src/App.tsx +++ b/gui/src/App.tsx @@ -1,10 +1,5 @@ import { createContext, useEffect, useState } from 'react'; -import { - BrowserRouter 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'; @@ -16,7 +11,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 +27,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 +50,9 @@ 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 +177,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) { @@ -202,17 +197,26 @@ export default function App() { useEffect(() => { // don't show update stuff when on android - if (window.__ANDROID__?.isThere()) { - setUpdateFound(''); + if (window.__ANDROID__?.isThere()) return; + + if (!semver.valid(__VERSION_TAG__)) { + log( + { version: __VERSION_TAG__ || 'development' }, + 'Non semver version, skipping the server update check' + ); return; } + async function fetchReleases() { const releases = await fetch( `https://api.github.com/repos/${GH_REPO}/releases` ) .then((res) => res.json()) + .catch(() => null) .then((json: any[]) => json.filter((rl) => rl?.prerelease === false)); + if (!releases) return; + if (typeof releases[0].tag_name !== 'string') return; const version = semver.coerce(releases[0].tag_name); @@ -221,56 +225,44 @@ export default function App() { setUpdateFound(releases[0].tag_name); } } - fetchReleases().catch(() => error('failed to fetch releases')); + fetchReleases().catch((e) => error(e, '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 +270,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 +279,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..e15006485 100644 --- a/gui/src/components/TopBar.tsx +++ b/gui/src/components/TopBar.tsx @@ -14,28 +14,19 @@ 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 +38,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 +52,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 +61,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 +94,36 @@ export function TopBar({ } }; - const showVersionBind = useDoubleTap(() => setShowVersionMobile(true)); - const unshowVersionBind = useDoubleTap(() => setShowVersionMobile(false)); + // useEffect(() => { + // if (!electron.isElectron) return; - useEffect(() => { - if (!isTauri) 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 +140,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 +189,13 @@ export function TopBar({
{!isMobile && ( <>
{progress !== undefined && ( @@ -227,29 +203,11 @@ export function TopBar({
)} - - {!isTauri && !showVersionMobile && !config?.decorations && ( -
-
- SlimeVR -
-
- )}
-
+
@@ -261,27 +219,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 +254,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') - ? 'https://slimevr.dev/download' - : `https://github.com/${GH_REPO}/releases/latest`; - await openUrl(url).catch(() => window.open(url, '_blank')); + const url = + electron.isElectron && electron.data().os.type === 'windows' + ? 'https://slimevr.dev/download' + : `https://github.com/${GH_REPO}/releases/latest`; + await openUrl(url); closeModal(); }} > diff --git a/gui/src/components/commons/A.tsx b/gui/src/components/commons/A.tsx index 834f0abca..c4ed0e064 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,11 @@ 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 70% rename from gui/src/components/commons/TauriFileInput.tsx rename to gui/src/components/commons/SystemFileInput.tsx index b858b85c3..e5151baf0 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 InnerSystemFileInput({ label, value, onChange, @@ -20,8 +20,23 @@ 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 +48,7 @@ export function InnerTauriFileInput({ ); } -export function TauriFileInput({ +export function SystemFileInput({ control, rules, name, @@ -56,7 +71,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..358fc8a79 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: @@ -81,7 +79,7 @@ export function InterfaceSettings() { { label: l10n.getString('settings-interface-appearance-font-slime_font'), value: 'poppins', - fontName: 'poppins, Noto Sans CJK', + fontName: 'poppins, Noto Sans', }, { label: 'OpenDyslexic', @@ -91,9 +89,9 @@ export function InterfaceSettings() { { label: 'Lexend', value: 'Lexend', fontName: 'Lexend' }, { label: 'Ubuntu', value: 'Ubuntu', fontName: 'Ubuntu' }, { - label: 'Noto Sans (CJK)', - value: 'Noto Sans CJK', - fontName: 'Noto Sans CJK', + label: 'Noto Sans', + value: 'Noto Sans', + fontName: 'Noto Sans', }, { label: l10n.getString('settings-interface-appearance-font-os_font'), @@ -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/components/widgets/IMUVisualizerWidget.tsx b/gui/src/components/widgets/IMUVisualizerWidget.tsx index 6d22ba9fa..1d9c1ae1d 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,57 @@ 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 +247,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 +359,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..3954b6523 100644 --- a/gui/src/components/widgets/SkeletonVisualizerWidget.tsx +++ b/gui/src/components/widgets/SkeletonVisualizerWidget.tsx @@ -6,7 +6,17 @@ 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 +47,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 +88,7 @@ function initializePreview( let skeletonOffset = 0; const rebuildSkeleton = ( - newSkeleton: (BoneKind | THREE.Bone)[], + newSkeleton: (BoneKind | Bone)[], bones: Map ) => { skeletonGroup.remove(skeletonHelper); @@ -100,16 +110,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( - vec.x, - vec.y, - vec.z, - quat.w - ).normalize(); + const yawReset = new Quaternion(vec.x, vec.y, vec.z, quat.w).normalize(); skeletonGroup.rotation.setFromQuaternion(yawReset); }; @@ -241,13 +246,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 +395,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/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..716080709 100644 --- a/gui/src/hooks/breakpoint.ts +++ b/gui/src/hooks/breakpoint.ts @@ -21,7 +21,3 @@ export function useBreakpoint(breakpointKey: K) { [`is${capitalizedKey}`]: bool, } as Record; } - -export function useIsTauri() { - return window.isTauri; -} diff --git a/gui/src/hooks/bvh.ts b/gui/src/hooks/bvh.ts index e9202d432..08c5f3f93 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: [ { @@ -34,6 +34,7 @@ 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..2299a310e 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..03e0de6b7 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,18 @@ 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 { @@ -106,15 +103,6 @@ function fallbackToDefaults(loadedConfig: any): Config { // allows to load everything before the first render export const loadConfig = async () => { try { - const migrated = await store.get('configMigratedToTauri'); - if (!migrated) { - const oldConfig = localStorage.getItem('config.json'); - - if (oldConfig) await store.set('config.json', oldConfig); - - store.set('configMigratedToTauri', 'true'); - } - const json = await store.get('config.json'); if (!json) throw new Error('Config has ceased existing for some reason'); @@ -138,7 +126,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 +147,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 +184,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..563b01cfb --- /dev/null +++ b/gui/src/hooks/crossplatform.ts @@ -0,0 +1,7 @@ +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..fab155665 100644 --- a/gui/src/hooks/discord-presence.ts +++ b/gui/src/hooks/discord-presence.ts @@ -1,75 +1,31 @@ -import { useEffect } from 'react'; +import { useEffect, useMemo } from 'react'; import { useConfig } from './config'; -import { useInterval } from './timeout'; -import { invoke } from '@tauri-apps/api/core'; -import { warn } from '@/utils/logging'; import { useLocalization } from '@fluent/react'; import { connectedIMUTrackersAtom } from '@/store/app-store'; -import { getDefaultStore } from 'jotai'; +import { useAtomValue } from 'jotai'; +import { useElectron } from './electron'; export function useDiscordPresence() { const { config } = useConfig(); const { l10n } = useLocalization(); + const electron = useElectron(); + const imuTrackers = useAtomValue(connectedIMUTrackersAtom); + const imuTrackersCount = useMemo(() => imuTrackers.length, [imuTrackers.length]); - // Update presence every 6.9 seconds - useInterval( - () => { - (async () => { - try { - // Better to do this instead of useAtomValue as we are doing polling with the interval - // useAtomValue can trigger re render of the dom and this hook is top level, so this - // would be really bad - const imuTrackers = getDefaultStore().get(connectedIMUTrackersAtom); - if (await checkDiscordClient()) { - // If discord client exists, try updating presence - await updateDiscordPresence({ - details: l10n.getString( - 'settings-general-interface-discord_presence-message', - { amount: imuTrackers.length } - ), - }); - } else { - // else, try creating a discord client - await createDiscordClient(); - } - } catch (e) { - warn(`failed to update presence, error: ${e}`); - } - })(); - }, - config?.discordPresence ? 6900 : null - ); - - // Clear presence on config being disabled useEffect(() => { - if (config?.discordPresence !== false) return; + if (config?.discordPresence === false) return; - (async () => { - if (!(await checkDiscordClient())) return; - clearDiscordPresence().catch((e) => - warn(`failed to clear discord presence, error: ${e}`) - ); - })(); - }, [config?.discordPresence]); -} + if (!electron.isElectron) return; + electron.api.setPresence({ + enable: true, + activity: l10n.getString('settings-general-interface-discord_presence-message', { + amount: imuTrackersCount, + }), + }); -export function checkDiscordClient(): Promise { - return invoke('discord_client_exists'); -} - -export function createDiscordClient(): Promise { - return invoke('create_discord_client'); -} - -export function clearDiscordPresence(): Promise { - return invoke('clear_presence'); -} - -export function updateDiscordPresence(obj: { - details: string; - state?: string; - small_icon?: [string, string]; - button?: { label: string; url: string }; -}): Promise { - return invoke('update_presence', obj); + return () => { + if (!electron.isElectron) return; + electron.api.setPresence({ enable: false }); + }; + }, [config?.discordPresence, imuTrackersCount]); } 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 60bb5ca53..515a6a168 100644 --- a/gui/src/hooks/firmware-update.ts +++ b/gui/src/hooks/firmware-update.ts @@ -1,5 +1,4 @@ import { BoardType, DeviceDataT } from 'solarxr-protocol'; -import { fetch as tauriFetch } from '@tauri-apps/plugin-http'; import { cacheWrap } from './cache'; import semver from 'semver'; import { normalizedHash } from './crypto'; @@ -27,10 +26,10 @@ const checkUserCanUpdate = async (uuid: string, url: string, fwVersion: string) const deployDataJson = JSON.parse( (await cacheWrap( `firmware-${fwVersion}-deploy`, - () => - tauriFetch(url) - .then((res) => res.text()) - .catch(() => null), + async () => + JSON.stringify( + await window.electronAPI.ghGet({ type: 'asset', url }).catch(() => null) + ), 60 * 60 * 1000 )) || 'null' ); @@ -62,13 +61,15 @@ const checkUserCanUpdate = async (uuid: string, url: string, fwVersion: string) export async function fetchCurrentFirmwareRelease( uuid: string ): Promise { + if (!window.electronAPI) return null; + const releases: any[] | null = JSON.parse( (await cacheWrap( 'firmware-releases', - () => - fetch('https://api.github.com/repos/SlimeVR/SlimeVR-Tracker-ESP/releases') - .then((res) => res.text()) - .catch(() => null), + async () => + JSON.stringify( + await window.electronAPI.ghGet({ type: 'fw-releases' }).catch(() => null) + ), 60 * 60 * 1000 )) || 'null' ); 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..cdfad8519 100644 --- a/gui/src/index.scss +++ b/gui/src/index.scss @@ -46,11 +46,12 @@ body { } @font-face { - font-family: 'Noto Sans CJK'; - src: url('/fonts/NotoSansCJK-VF.otf.woff2') format('woff2-variations'); - font-weight: 125 950; - font-stretch: 75% 125%; - font-style: oblique 0deg 20deg; + src: url('/fonts/noto-sans-v42-latin-regular.woff2') + format('woff2-variations'); + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; } @font-face { @@ -421,3 +422,7 @@ 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..bc3ef54fe 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..1b4825861 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; @@ -15,3 +14,13 @@ interface Window { } declare module 'tailwind-gradient-mask-image'; + +declare module '*?asset' { + const content: string; + export default content; +} + +declare module '*?asset&asarUnpack' { + const content: string; + export default content; +} 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" }] } diff --git a/package.json b/package.json index f3204639d..51a7f9726 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": [ @@ -8,10 +8,10 @@ "gui" ], "scripts": { - "gui": "pnpm run update-solarxr && cd gui && pnpm run dev", - "tauri": "cd gui && pnpm run tauri", + "gui": "pnpm run update-solarxr && cd gui && pnpm run gui", + "lint:fix": "cd gui && pnpm lint:fix", "skipbundler": "cd gui && pnpm run skipbundler", - "build": "pnpm run tauri build", + "build": "cd gui && pnpm build", "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..48926911a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,40 @@ importers: gui: dependencies: + '@ryuziii/discord-rpc': + specifier: 1.0.1-rc.1 + version: 1.0.1-rc.1 + '@xhayper/discord-rpc': + specifier: ^1.3.0 + version: 1.3.0 + commander: + specifier: ^14.0.3 + version: 14.0.3 + discord-rich-presence: + specifier: ^0.0.8 + version: 0.0.8(encoding@0.1.13) + glob: + specifier: ^13.0.3 + version: 13.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,63 +66,78 @@ 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 - '@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) '@sentry/vite-plugin': specifier: ^2.22.7 - version: 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))) '@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 '@twemoji/svg': specifier: ^15.0.0 version: 15.0.0 + '@types/file-saver': + specifier: ^2.0.7 + version: 2.0.7 + '@types/node': + specifier: ^24.3.1 + version: 24.10.0 + '@types/react': + specifier: ^18.3.11 + version: 18.3.11 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@types/react-helmet': + specifier: ^6.1.11 + version: 6.1.11 + '@types/react-modal': + specifier: 3.16.3 + version: 3.16.3 + '@types/semver': + specifier: ^7.5.8 + version: 7.5.8 + '@types/three': + specifier: ^0.163.0 + 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@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@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)) 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 @@ -98,9 +147,45 @@ importers: convert: specifier: ^5.12.0 version: 5.13.1 + 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@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@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@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@2.6.1)) + eslint-plugin-react: + specifier: ^7.37.5 + 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@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 @@ -110,6 +195,9 @@ importers: 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 @@ -143,121 +231,18 @@ importers: 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 - '@openapi-codegen/cli': - specifier: ^3.1.0 - version: 3.1.0 - '@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)) - '@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 - '@types/node': - specifier: ^24.3.1 - version: 24.10.0 - '@types/react': - specifier: ^18.3.11 - version: 18.3.11 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 - '@types/react-helmet': - specifier: ^6.1.11 - version: 6.1.11 - '@types/react-modal': - specifier: 3.16.3 - version: 3.16.3 - '@types/semver': - specifier: ^7.5.8 - version: 7.5.8 - '@types/three': - specifier: ^0.163.0 - 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) - '@typescript-eslint/parser': - specifier: ^8.48.1 - version: 8.48.1(eslint@9.39.1(jiti@1.21.6))(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)) - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.38) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - eslint: - specifier: ^9.39.1 - version: 9.39.1(jiti@1.21.6) - 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)) - 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)) - eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@9.39.1(jiti@1.21.6)) - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.1(jiti@1.21.6)) - eslint-plugin-react-hooks: - specifier: ^7.0.1 - version: 7.0.1(eslint@9.39.1(jiti@1.21.6)) - globals: - specifier: ^15.10.0 - version: 15.10.0 - prettier: - specifier: ^3.3.3 - version: 3.3.3 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 @@ -267,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@1.21.6))(typescript@5.6.3) + 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: @@ -289,6 +292,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 +311,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 +323,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 +335,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 +347,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 +359,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 +371,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 +387,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 +403,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 +437,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 +449,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 +461,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 +473,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 +495,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 +530,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 +542,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 +554,32 @@ 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'} + + '@discordjs/collection@2.1.1': + resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} + engines: {node: '>=18'} + + '@discordjs/rest@2.6.0': + resolution: {integrity: sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==} + engines: {node: '>=18'} + + '@discordjs/util@1.2.0': + resolution: {integrity: sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==} + engines: {node: '>=18'} + '@dword-design/dedent@0.7.0': resolution: {integrity: sha512-OFmAmzKiDUh9m7WRMYcoEOPI7b5tS5hdqQmtKDwF+ZssVJv8a+GHo9VOtFsmlw3h8Roh/9QzFWIsjSFZyQUMdg==} @@ -496,6 +595,51 @@ 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/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 + + '@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 +655,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 +1036,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 +1051,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,18 +1077,18 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@mediapipe/tasks-vision@0.10.8': - resolution: {integrity: sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==} + '@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'} '@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==} @@ -797,6 +1108,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 +1217,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'} @@ -907,70 +1229,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'} @@ -1058,6 +1316,17 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@ryuziii/discord-rpc@1.0.1-rc.1': + resolution: {integrity: sha512-q9YgU8Rj9To1LWzo4u8cXOHUorEkB5KZ5cdW80KoYtAUx+nQy7wYCEFiNh8kcmqFqQ8m3Fsx1IXx3UpVymkaSw==} + + '@sapphire/async-queue@1.5.5': + resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/snowflake@3.5.5': + resolution: {integrity: sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + '@sentry-internal/browser-utils@10.29.0': resolution: {integrity: sha512-M3kycMY6f3KY9a8jDYac+yG0E3ZgWVWSxlOEC5MhYyX+g7mqxkwrb3LFQyuxSm/m+CCgMTCaPOOaB2twXP6EQg==} engines: {node: '>=18'} @@ -1146,6 +1415,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 +1504,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 +1530,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,15 +1554,12 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/debounce@1.2.4': - resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} '@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==} @@ -1393,6 +1569,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 +1584,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==} @@ -1414,8 +1596,8 @@ 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==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} @@ -1429,15 +1611,12 @@ 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==} + '@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 +1632,18 @@ 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/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@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} @@ -1672,20 +1860,28 @@ 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} peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@vladfrangu/async_event_emitter@2.4.7': + resolution: {integrity: sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@xhayper/discord-rpc@1.3.0': + resolution: {integrity: sha512-0NmUTiODl7u3UEjmO6y0Syp3dmgVLAt2EHrH4QKTQcXRwtF8Wl7Eipdn/GSSZ8HkDwxQFvcDGJMxT9VWB0pH8g==} + engines: {node: '>=18.20.7'} + + '@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 +1901,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 +1947,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 +2026,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,22 +2086,37 @@ 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==} - 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'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + 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,11 +2134,37 @@ 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@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + 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==} @@ -1892,6 +2174,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'} @@ -1926,11 +2212,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==} @@ -1976,9 +2257,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 +2288,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 +2312,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 +2335,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 +2346,14 @@ 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'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2034,6 +2361,18 @@ 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==} @@ -2043,13 +2382,17 @@ packages: 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-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -2097,8 +2440,11 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -2153,6 +2499,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 +2522,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,18 +2534,26 @@ 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'} - 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'} 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,20 +2564,43 @@ 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==} + + discord-api-types@0.38.39: + resolution: {integrity: sha512-XRdDQvZvID1XvcFftjSmd4dcmMi/RL/jSy5sduBDAvCGFcNFHThdIQXCEBDZFe52lCNEzuIL0QJoKYAmRmxLUA==} + + discord-rich-presence@0.0.8: + resolution: {integrity: sha512-IpVMPjv15C9UvppxvrrGdv6bzQHOW1P1vLoMH15HvdJwGJ3dBd2bnrJ63Uy36YRUfrAMxGLiwUDHncvC8AuPaQ==} + + discord-rpc@https://codeload.github.com/discordjs/rpc/tar.gz/9e7de2a6d917591f10a66389e62e1dc053c04fec: + resolution: {tarball: https://codeload.github.com/discordjs/rpc/tar.gz/9e7de2a6d917591f10a66389e62e1dc053c04fec} + version: 4.0.1 + 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'} - 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'} @@ -2223,12 +2615,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 +2666,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 +2741,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 +2752,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 +2901,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 +2947,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'} @@ -2495,9 +2959,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==} @@ -2505,6 +2966,12 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + 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'} @@ -2544,10 +3011,18 @@ 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'} + 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 +3030,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 +3133,31 @@ 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@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@13.0.3: + resolution: {integrity: sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==} + engines: {node: 20 || >=22} + + 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==} @@ -2660,9 +3175,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==} @@ -2677,6 +3189,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 +3255,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==} @@ -2748,21 +3267,30 @@ 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==} + 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 +3299,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 +3319,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==} @@ -2798,12 +3339,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==} @@ -2815,6 +3350,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 +3371,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 +3461,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 +3500,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'} @@ -2973,9 +3537,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'} @@ -3028,6 +3589,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,29 +3612,53 @@ 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'} - 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'} + 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 +3671,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 +3704,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 +3716,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,13 +3740,13 @@ 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'} - 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'} @@ -3188,6 +3787,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 +3802,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} @@ -3207,14 +3814,22 @@ 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==} - maath@0.10.7: - resolution: {integrity: sha512-zQ2xd7dNOIVTjAS+hj22fyj1EFYmOJX6tzKjZ92r6WDoq8hyFxjuGA2q950tmR4iC/EKXoMQdSipkaJVuUHDTg==} - peerDependencies: - '@types/three': '>=0.144.0' - three: '>=0.144.0' + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-bytes.js@1.13.0: + resolution: {integrity: sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} magic-string@0.30.8: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} @@ -3223,9 +3838,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==} @@ -3285,11 +3908,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==} @@ -3385,6 +4003,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 +4028,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 +4044,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 +4066,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 +4098,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 +4128,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 +4158,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 +4172,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 +4185,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 +4271,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 +4290,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 +4305,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,10 +4337,17 @@ 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'} + 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'} @@ -3646,6 +4372,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 +4391,22 @@ 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'} + 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 +4430,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 +4455,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,8 +4516,14 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} - potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true + + 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==} @@ -3766,12 +4534,20 @@ 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-worker-transferable@1.0.4: - resolution: {integrity: sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==} + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -3780,6 +4556,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,15 +4578,13 @@ 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'} - 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: @@ -3851,12 +4628,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'} @@ -3889,9 +4660,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 +4679,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'} @@ -3922,6 +4705,10 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + register-scheme@https://codeload.github.com/devsnek/node-register-scheme/tar.gz/e7cc9a63a1f512565da44cb57316d9fb10750e17: + resolution: {tarball: https://codeload.github.com/devsnek/node-register-scheme/tar.gz/e7cc9a63a1f512565da44cb57316d9fb10750e17} + version: 0.0.2 + remark-gfm@4.0.0: resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} @@ -3942,6 +4729,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 +4754,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 +4780,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,6 +4804,10 @@ 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==} @@ -4004,6 +4819,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 +4834,38 @@ 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 - scheduler@0.21.0: - resolution: {integrity: sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} 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 +4880,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'} @@ -4109,6 +4952,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 +4963,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 +4975,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,14 +5030,23 @@ 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==} - stats-gl@2.2.8: - resolution: {integrity: sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==} - - stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} + stat-mode@1.0.0: + resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} + engines: {node: '>= 6'} stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} @@ -4224,6 +5099,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 +5129,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 +5141,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'} @@ -4271,11 +5157,6 @@ packages: 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 @@ -4288,6 +5169,18 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + deprecated: Old versions of tar 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 + + 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,20 +5193,16 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - 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' + thread-stream@4.0.0: + resolution: {integrity: sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==} + engines: {node: '>=20'} 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 +5213,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'} @@ -4341,22 +5237,12 @@ packages: 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==} + 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'} @@ -4391,9 +5277,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==} @@ -4401,6 +5284,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'} @@ -4474,9 +5361,21 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + engines: {node: '>=18.17'} + 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 +5394,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'} @@ -4525,25 +5428,19 @@ 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'} vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -4585,11 +5482,8 @@ packages: warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - 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==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -4636,6 +5530,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 +5554,38 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + 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 +5593,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 +5630,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'} @@ -4712,35 +5653,13 @@ 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==} snapshots: + 7zip-bin@5.2.0: {} + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -4758,10 +5677,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 +5729,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 +5763,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 +5787,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 +5824,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 +5852,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 +5881,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 +5911,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 +5938,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 +5973,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 +6006,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 +6030,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 +6046,29 @@ 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) + + '@discordjs/collection@2.1.1': {} + + '@discordjs/rest@2.6.0': + dependencies: + '@discordjs/collection': 2.1.1 + '@discordjs/util': 1.2.0 + '@sapphire/async-queue': 1.5.5 + '@sapphire/snowflake': 3.5.5 + '@vladfrangu/async_event_emitter': 2.4.7 + discord-api-types: 0.38.39 + magic-bytes.js: 1.13.0 + tslib: 2.6.3 + undici: 6.21.3 + + '@discordjs/util@1.2.0': + dependencies: + discord-api-types: 0.38.39 + '@dword-design/dedent@0.7.0': dependencies: babel-plugin-add-module-exports: 1.0.4 @@ -5047,6 +6096,112 @@ 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/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 + 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 +6221,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 +6458,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 +6475,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,21 +6492,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 - '@mediapipe/tasks-vision@0.10.8': {} + '@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 '@mgit-at/typescript-flatbuffers-codegen@0.1.3': dependencies: @@ -5277,11 +6529,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 @@ -5303,6 +6550,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 +6587,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 +6602,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,99 +6676,13 @@ 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 '@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': @@ -5560,6 +6735,18 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@ryuziii/discord-rpc@1.0.1-rc.1': + dependencies: + '@types/ws': 8.18.1 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@sapphire/async-queue@1.5.5': {} + + '@sapphire/snowflake@3.5.5': {} + '@sentry-internal/browser-utils@10.29.0': dependencies: '@sentry/core': 10.29.0 @@ -5588,11 +6775,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 +6810,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 +6838,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 +6912,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 +6940,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,14 +6972,17 @@ snapshots: dependencies: '@babel/types': 7.24.7 - '@types/debounce@1.2.4': {} + '@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/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 @@ -5876,6 +6991,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 +7005,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 @@ -5896,7 +7019,10 @@ snapshots: dependencies: undici-types: 7.16.0 - '@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': {} @@ -5912,19 +7038,15 @@ 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 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 +7063,28 @@ 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/ws@8.18.1': + dependencies: + '@types/node': 24.10.0 + + '@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 +7093,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 +7110,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 +7170,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 +7229,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 @@ -6189,13 +7322,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 @@ -6207,6 +7333,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@vladfrangu/async_event_emitter@2.4.7': {} + + '@xhayper/discord-rpc@1.3.0': + dependencies: + '@discordjs/rest': 2.6.0 + '@vladfrangu/async_event_emitter': 2.4.7 + discord-api-types: 0.38.39 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@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 +7363,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 +7408,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 +7569,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,14 +7617,28 @@ 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: - dependencies: - require-from-string: 2.0.2 - binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + optional: true + + 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 +7648,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 +7672,66 @@ 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@6.0.3: + buffer@5.7.1: 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 +7744,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: @@ -6504,10 +7792,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: {} @@ -6553,8 +7837,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 +7864,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 +7892,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,26 +7912,46 @@ 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@13.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: {} 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-env@7.0.3: - dependencies: - cross-spawn: 7.0.3 + cross-dirname@0.1.0: + optional: true cross-spawn@7.0.3: dependencies: @@ -6680,7 +8009,9 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debounce@1.2.1: {} + date-fns@4.1.0: {} + + dateformat@4.6.3: {} debug@3.2.7: dependencies: @@ -6731,6 +8062,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 +8083,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,14 +8093,17 @@ snapshots: delay@5.0.0: {} + delayed-stream@1.0.0: {} + 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: {} + + detect-node@2.1.0: + optional: true + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -6765,15 +8112,67 @@ snapshots: diff@4.0.2: {} + dir-compare@4.2.0: + dependencies: + minimatch: 3.1.2 + p-limit: 3.1.0 + + discord-api-types@0.38.39: {} + + discord-rich-presence@0.0.8(encoding@0.1.13): + dependencies: + discord-rpc: https://codeload.github.com/discordjs/rpc/tar.gz/9e7de2a6d917591f10a66389e62e1dc053c04fec(encoding@0.1.13) + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + discord-rpc@https://codeload.github.com/discordjs/rpc/tar.gz/9e7de2a6d917591f10a66389e62e1dc053c04fec(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + ws: 7.5.10 + optionalDependencies: + register-scheme: https://codeload.github.com/devsnek/node-register-scheme/tar.gz/e7cc9a63a1f512565da44cb57316d9fb10750e17 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + 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@16.4.5: {} + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.4.5 - draco3d@1.5.7: {} + dotenv@16.4.5: {} dunder-proto@1.0.1: dependencies: @@ -6787,22 +8186,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 +8473,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 +8504,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 +8551,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 +8586,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 +8600,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 +8616,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 +8625,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 +8644,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 +8667,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 +8704,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 +8756,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,18 +8800,27 @@ 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 - fflate@0.6.10: {} - fflate@0.8.2: {} file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 + file-uri-to-path@1.0.0: + optional: true + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7322,8 +8863,21 @@ 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: + 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 +8886,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 +9019,30 @@ 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@13.0.3: + dependencies: + minimatch: 10.2.0 + minipass: 7.1.2 + path-scurry: 2.0.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 +9050,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: {} @@ -7454,8 +9071,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 @@ -7466,6 +9081,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 +9173,8 @@ snapshots: dependencies: '@types/hast': 3.0.4 + help-me@5.0.0: {} + hermes-estree@0.25.1: {} hermes-parser@0.25.1: @@ -7552,18 +9183,32 @@ snapshots: highlight.js@10.7.3: {} - hls.js@1.5.17: {} - hoist-non-react-statics@3.3.2: 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 +9221,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,17 +9236,21 @@ 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: {} ignore@7.0.5: {} - immediate@3.0.6: {} - - immer@10.1.1: - optional: true - immutable@4.3.6: {} import-fresh@3.3.0: @@ -7604,6 +9260,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 +9283,8 @@ snapshots: intl-pluralrules@2.0.1: {} + ip-address@10.1.0: {} + ip-num@1.5.1: {} is-alphabetical@2.0.1: {} @@ -7712,6 +9377,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: @@ -7740,6 +9407,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: {} @@ -7757,8 +9432,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-promise@2.2.2: {} - is-regex@1.1.4: dependencies: call-bind: 1.0.2 @@ -7812,6 +9485,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 +9506,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 @@ -7844,24 +9529,33 @@ 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 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 +9574,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,15 +9612,13 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 + lazy-val@1.0.5: {} + levn@0.4.1: dependencies: 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: {} @@ -7967,6 +9666,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,18 +9685,27 @@ snapshots: dependencies: js-tokens: 4.0.0 + lowercase-keys@2.0.0: {} + lowercase-keys@3.0.0: {} lru-cache@10.2.2: {} + lru-cache@11.2.6: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - maath@0.10.7(@types/three@0.163.0)(three@0.163.0): + lru-cache@6.0.0: dependencies: - '@types/three': 0.163.0 - three: 0.163.0 + yallist: 4.0.0 + + magic-bytes.js@1.13.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 magic-string@0.30.8: dependencies: @@ -8000,8 +9713,29 @@ snapshots: 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 @@ -8165,10 +9899,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: @@ -8343,7 +10073,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 +10102,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 +10146,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 +10202,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 +10249,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 +10366,8 @@ snapshots: objectorarray@1.0.5: {} + on-exit-leak-free@2.1.2: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -8563,6 +10384,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 +10412,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,8 +10450,12 @@ snapshots: dependencies: p-limit: 3.1.0 + p-map@7.0.4: {} + p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -8635,6 +10483,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 +10496,17 @@ 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: {} + pend@1.2.0: {} + picocolors@1.0.1: {} picocolors@1.1.1: {} @@ -8660,12 +10519,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,18 +10625,27 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - potpack@1.0.2: {} + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true + + 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-worker-transferable@1.0.4: + promise-retry@2.0.1: dependencies: - is-promise: 2.2.2 - lie: 3.3.0 + err-code: 2.0.3 + retry: 0.12.0 prompts@2.4.2: dependencies: @@ -8743,6 +10658,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,12 +10679,9 @@ snapshots: queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} + quick-format-unescaped@4.0.4: {} - react-composer@5.0.3(react@18.3.1): - dependencies: - prop-types: 15.8.1 - react: 18.3.1 + quick-lru@5.1.1: {} react-dom@18.3.1(react@18.3.1): dependencies: @@ -8820,12 +10738,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): @@ -8856,16 +10768,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 @@ -8907,6 +10833,12 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + register-scheme@https://codeload.github.com/devsnek/node-register-scheme/tar.gz/e7cc9a63a1f512565da44cb57316d9fb10750e17: + dependencies: + bindings: 1.5.0 + node-addon-api: 1.7.2 + optional: true + remark-gfm@4.0.0: dependencies: '@types/mdast': 4.0.4 @@ -8945,6 +10877,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 +10901,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,6 +10970,8 @@ 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 @@ -9028,6 +10991,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 +11010,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,20 +11025,30 @@ snapshots: immutable: 4.3.6 source-map-js: 1.2.0 - scheduler@0.21.0: - dependencies: - loose-envify: 1.4.0 + sax@1.4.4: {} scheduler@0.23.2: 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 @@ -9161,10 +11144,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 +11168,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,13 +11225,18 @@ 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: {} - stats-gl@2.2.8: - dependencies: - '@types/three': 0.163.0 - - stats.js@0.17.0: {} + stat-mode@1.0.0: {} stop-iteration-iterator@1.0.0: dependencies: @@ -9307,6 +11324,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 +11349,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 +11365,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 @@ -9352,14 +11381,10 @@ snapshots: 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 +11426,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,22 +11460,16 @@ snapshots: dependencies: any-promise: 1.3.0 - three-mesh-bvh@0.7.8(three@0.163.0): + thread-stream@4.0.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 + real-require: 0.2.0 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 +11479,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: @@ -9454,22 +11497,12 @@ snapshots: 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: + dependencies: + utf8-byte-length: 1.0.5 + ts-api-utils@2.1.0(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -9515,20 +11548,15 @@ 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: 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 +11624,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 @@ -9631,6 +11659,8 @@ snapshots: undici-types@7.16.0: {} + undici@6.21.3: {} + unified@11.0.5: dependencies: '@types/unist': 3.0.3 @@ -9641,6 +11671,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 +11704,8 @@ snapshots: universal-user-agent@7.0.3: {} + universalify@0.1.2: {} + universalify@2.0.1: {} unplugin@1.0.1: @@ -9702,8 +11742,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: @@ -9719,17 +11759,17 @@ 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 + core-util-is: 1.0.2 + extsprintf: 1.4.1 vfile-message@4.0.2: dependencies: @@ -9756,9 +11796,9 @@ snapshots: dependencies: loose-envify: 1.4.0 - webgl-constants@1.1.1: {} - - webgl-sdf-generator@1.1.1: {} + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 webidl-conversions@3.0.1: {} @@ -9847,6 +11887,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 +11913,25 @@ snapshots: wrappy@1.0.2: {} + ws@7.5.10: {} + + ws@8.19.0: {} + + 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 +11955,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: {} @@ -9920,16 +11984,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: {} 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 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!")