diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0c07fe8..bd615d9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,9 +67,47 @@ jobs: permissions: contents: read + # Empacota ANTES da tag: config de empacotamento quebrada não pode deixar uma + # tag publicada sem binário. Se este job falhar, nada foi criado ainda. + empacotar: + name: Empacotar + needs: [preparar, ci] + runs-on: windows-latest + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 24 + cache: npm + + - run: npm ci + + - name: Garantir o binário do Electron + shell: pwsh + run: | + if (-not (Test-Path node_modules/electron/dist/electron.exe)) { + node node_modules/electron/install.js + } + + - name: Instalador e portátil + run: npm run dist + + # O E2E roda contra out/; só aqui o asar, o koffi desempacotado e a DLL em + # resources/ existem para ser testados. + - name: Fumaça no app empacotado + run: node --disable-warning=MODULE_TYPELESS_PACKAGE_JSON scripts/fumaca-empacotado.ts "dist/win-unpacked/WSLC UI.exe" + + - uses: actions/upload-artifact@v7 + with: + name: instaladores + path: dist/*.exe + if-no-files-found: error + retention-days: 7 + publicar: name: Publicar - needs: [preparar, ci] + needs: [preparar, ci, empacotar] runs-on: ubuntu-latest permissions: contents: write @@ -85,6 +123,11 @@ jobs: - name: Gerar as notas run: npm run patchnotes -- --notas --saida notas.md + - uses: actions/download-artifact@v7 + with: + name: instaladores + path: dist + - name: Criar a tag anotada env: TAG: ${{ needs.preparar.outputs.tag }} @@ -103,5 +146,5 @@ jobs: extra=() # Versão com sufixo (0.2.0-rc.1) sai marcada como pré-lançamento. if [[ "$VERSAO" == *-* ]]; then extra+=(--prerelease); fi - gh release create "$TAG" --title "$TAG" --notes-file notas.md --verify-tag "${extra[@]}" + gh release create "$TAG" --title "$TAG" --notes-file notas.md --verify-tag "${extra[@]}" dist/*.exe echo "[$TAG](https://github.com/$GITHUB_REPOSITORY/releases/tag/$TAG) publicada." >> "$GITHUB_STEP_SUMMARY" diff --git a/.gitignore b/.gitignore index 4436a83..ea683a9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,8 +10,3 @@ playwright-report/ # Artefatos de build incremental do TypeScript / TanStack Router *.tsbuildinfo .tanstack/ - -# SDK da Microsoft vendorizado — não redistribuído aqui. -# Baixe o .nupkg Microsoft.WSL.Containers: ver vendor/wslcsdk/README.md -vendor/wslcsdk/include/ -vendor/wslcsdk/win-x64/ diff --git a/README.md b/README.md index 7616200..4f3a887 100644 --- a/README.md +++ b/README.md @@ -102,10 +102,32 @@ UI: o app já mostra o ID e tem terminal próprio). Detalhes na regra 18 do ROAD ## Motor nativo (wslcsdk via FFI) -Além da CLI, o app carrega a **API C nativa** (`wslcsdk.dll`, vendorizada do NuGet -`Microsoft.WSL.Containers` em `vendor/wslcsdk/`) via **koffi**: toda a superfície do header está -vinculada em `src/main/services/wslc/native/bindings.ts`, e a view Sistema mostra o status do SDK -(versão, DLL, componentes faltando). +Além da CLI, o app carrega a **API C nativa** (`wslcsdk.dll`, do NuGet `Microsoft.WSL.Containers`) +via **koffi**: toda a superfície do header está vinculada em +`src/main/services/wslc/native/bindings.ts`, e a view Sistema mostra o status do SDK. + +### A DLL vem junto — e são duas + +O app **empacota** o SDK (`vendor/wslcsdk/`, licença MIT da Microsoft) e escolhe qual usar em tempo +de execução, porque a versão do SDK precisa **casar** com a do WSL instalado. Isso foi medido nesta +máquina, nas duas direções: + +| | WSL 2.9.4 | WSL 2.9.9 | +| --------- | ------------------------------------------------ | ------------------------------------------------- | +| SDK 2.9.3 | funciona | `WSLC_E_SDK_UPDATE_NEEDED` já no `WslcGetVersion` | +| SDK 2.9.9 | **segfault** em `WslcGetSessionTerminationEvent` | funciona | + +SDK novo demais é o caso perigoso: **nada no header denuncia** — a declaração da função que quebra é +byte a byte idêntica nas duas versões, e os 18 structs também. Não há binding que se defenda; o +processo simplesmente morre. Daí a regra em `native/bundled.ts`: usar a DLL mais nova que **não +passe** da versão do WSL. Quem quiser outra escolhe o arquivo na aba **Sistema** — o app sonda a DLL +(carrega, lê, descarrega) antes de aceitar, e a troca vale ao reabrir, porque a sessão viva segura +handles da atual. + +A 2.9.9 também mudou **duas assinaturas** sem mudar nada visível (`WslcSessionAuthenticate` ganhou +`tokenType`; `WslcInstallWithDependencies` ganhou `components` e `options`), o que corromperia login +em registry e instalação guiada em silêncio. O `bindings.ts` detecta a ABI pela presença do símbolo +`WslcOpenContainer` e adapta as chamadas. **Fases 1 a 7 (roadmap completo + cobertura 100%):** toggle **Motor: CLI / Nativo** em Sistema (persistido em `settings.json`). No motor nativo o app mantém uma sessão própria (`WslcUi`, @@ -276,6 +298,7 @@ npm test # vitest (test:watch, test:coverage) npm run test:e2e # build + Playwright contra o app Electron (e2e/) npm run check # typecheck + lint + format:check + test + patchnotes npm run patchnotes # valida o patchnotes.json (--notas gera as notas da release) +npm run dist # instalador NSIS + portátil em dist/ (electron-builder) npm run cenario:nativo # povoa a sessão nativa com o cenário de teste (app fechado) ``` @@ -486,8 +509,15 @@ Publicar uma versão é **subir o `version` do `package.json` e escrever as nota 3. roda o CI inteiro no estado da `main` que vai virar tag; 4. cria a tag anotada `v` e publica a release com o corpo gerado do `patchnotes.json`. -Versão com sufixo (`0.2.0-rc.1`) sai marcada como pré-lançamento. A release leva as notas e a tag, -sem instalador: a `wslcsdk.dll` da Microsoft não é redistribuída aqui (ver [Licença](#licença)). +Entre o passo 3 e o 4 o workflow **empacota** (instalador NSIS e portátil) e roda um teste de fumaça +que abre o `.exe` de verdade — asar, koffi desempacotado e DLL em `resources/` são três coisas que só +existem no app empacotado e que o E2E, rodando contra `out/`, nunca tocaria. Empacotar antes de criar +a tag é de propósito: uma config quebrada não pode deixar uma tag publicada sem binário. + +Os dois `.exe` sobem como assets da release. **Não são assinados**: o SmartScreen vai avisar "editor +desconhecido" e exigir _Mais informações → Executar assim mesmo_. + +Versão com sufixo (`0.2.0-rc.1`) sai marcada como pré-lançamento. ## Licença @@ -495,8 +525,9 @@ Código deste repositório: **MIT** — ver [LICENSE](LICENSE). ### Componentes de terceiros -- **`Microsoft.WSL.Containers`** (`wslcsdk.dll` / `wslcsdk.h`) — SDK da Microsoft, em preview, sob a - licença do próprio pacote NuGet. **Não é redistribuído aqui**; baixe conforme +- **`Microsoft.WSL.Containers`** (`wslcsdk.dll`) — SDK da Microsoft, em preview, sob licença **MIT** + (© Microsoft Corporation). É **redistribuído aqui**, no repositório e dentro do instalador, com + `LICENSE.txt` e `NOTICE.txt` do próprio pacote — ver [`vendor/wslcsdk/README.md`](vendor/wslcsdk/README.md). - **`wslc.exe`** — parte do WSL, distribuída pela Microsoft. Este projeto apenas o consome; não o inclui nem o modifica. diff --git a/ROADMAP.md b/ROADMAP.md index 948f3aa..61608fa 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -350,6 +350,23 @@ Electron é por pasta de dados). No caminho, uma brecha real foi fechada: o `setWindowOpenHandler` chamava `shell.openExternal` direto, fora do IPC — os links de referência em Sistema abririam o navegador até em modo demo. +### O que a 2.9.9 do SDK mudou (medido) + +`WslcOpenContainer` **levanta a limitação principal** documentada acima: um container criado numa +execução do app pode ser reaberto por nome ou ID em outra. Medido: soltar a sessão derruba o +container para EXITED, mas o registro fica; reabrir devolve um handle utilizável, e `Start` o põe +de volta em RUNNING. O app passou a lembrar em disco (`native/known.ts`) os containers que criou e a +reabri-los, em vez de apagá-los ao fechar — o que só era necessário porque, sem abrir por ID, eles +virariam órfãos invisíveis. Na ABI 2.9.3 o comportamento antigo continua. + +Continua **não havendo enumeração** de containers: o único jeito de reencontrá-los é o app lembrar +os nomes. + +E há uma armadilha nova, já tratada em `native/bundled.ts`: o SDK precisa CASAR com a versão do WSL. +SDK novo demais dá segfault (`WslcGetSessionTerminationEvent` num WSL mais antigo); SDK velho demais +é recusado com `WSLC_E_SDK_UPDATE_NEEDED` em qualquer chamada. Duas assinaturas também mudaram sem +mudança visível no header — ver `SdkAbi`. + **Cobertura 100% da superfície do wslc 2.9.4 (CLI e SDK)** — tudo que a CLI e o wslcsdk.h expõem está na UI, implementado nos dois motores quando possível, ou documentado com o motivo quando não: `session enter/run/shell` (interativos diff --git a/build/icon.ico b/build/icon.ico new file mode 100644 index 0000000..e96ac40 Binary files /dev/null and b/build/icon.ico differ diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000..56ef653 Binary files /dev/null and b/build/icon.png differ diff --git a/build/icon.svg b/build/icon.svg new file mode 100644 index 0000000..ae33757 --- /dev/null +++ b/build/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/e2e/system.spec.ts b/e2e/system.spec.ts index 55e29f4..22574f5 100644 --- a/e2e/system.spec.ts +++ b/e2e/system.spec.ts @@ -74,7 +74,8 @@ test.describe('Sistema · motor de execução', () => { await expect(page.getByText('disponível', { exact: true })).toBeVisible() await expect(page.getByText('0.9.0')).toBeVisible() - await expect(page.getByText(/wslcsdk\.dll/)).toBeVisible() + // Específico: "wslcsdk.dll" sozinho casa também com o título da seção da DLL. + await expect(page.getByText(/demo.*wslcsdk\.dll/)).toBeVisible() }) test('troca da CLI para o nativo e volta', async ({ page }) => { @@ -256,3 +257,64 @@ test.describe('Sistema · caminhos tristes', () => { }) }) }) + +test.describe('Sistema · escolha da wslcsdk.dll', () => { + test('mostra a DLL empacotada, com origem e ABI', async ({ page }) => { + await goToSystem(page) + + await expect(page.getByText('empacotada com o app')).toBeVisible() + await expect(page.getByText('2.9.9+', { exact: true })).toBeVisible() + await expect(page.getByRole('button', { name: /Escolher outra DLL/ })).toBeVisible() + // Sem escolha própria, não há o que desfazer. + await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden() + }) + + test.describe('escolhendo uma DLL válida', () => { + test.use({ pick: 'D:\\baixado\\wslcsdk.dll' }) + + test('sonda, aceita e avisa que vale ao reabrir', async ({ page }) => { + await goToSystem(page) + await page.getByRole('button', { name: /Escolher outra DLL/ }).click() + + await expectToast(page, /2\.9\.9\+ escolhida.*[Rr]eabra/) + await expect(page.getByText('D:\\baixado\\wslcsdk.dll')).toBeVisible() + await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeVisible() + }) + + test('voltar para a empacotada limpa a escolha', async ({ page }) => { + await goToSystem(page) + await page.getByRole('button', { name: /Escolher outra DLL/ }).click() + await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeVisible() + + await page.getByRole('button', { name: 'Usar a empacotada' }).click() + await expectToast(page, /Voltando para a DLL empacotada/) + await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden() + }) + }) + + // O ponto do seletor: recusar ANTES de gravar. Sem isso, o erro só apareceria + // na próxima abertura do app, com o motor nativo fora do ar e sem pista. + test.describe('escolhendo um arquivo que não serve', () => { + test.use({ pick: 'C:\\Downloads\\leia-me.txt' }) + + test('recusa e não grava a escolha', async ({ page }) => { + await goToSystem(page) + await page.getByRole('button', { name: /Escolher outra DLL/ }).click() + + await expectToast(page, /Não é uma wslcsdk.dll utilizável/) + await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden() + }) + }) + + test.describe('cancelando o diálogo', () => { + test.use({ pick: 'cancel' }) + + test('não muda nada', async ({ page }) => { + await goToSystem(page) + await page.getByRole('button', { name: /Escolher outra DLL/ }).click() + + await expect(page.getByText('empacotada com o app')).toBeVisible() + await expect(page.getByRole('button', { name: 'Usar a empacotada' })).toBeHidden() + }) + }) +}) diff --git a/electron-builder.yml b/electron-builder.yml new file mode 100644 index 0000000..a8ac972 --- /dev/null +++ b/electron-builder.yml @@ -0,0 +1,67 @@ +appId: com.blackfoxsoftware.wslc-ui +productName: WSLC UI +copyright: © 2026 Rafael de Souza Sell + +directories: + output: dist + buildResources: build + +# O padrão do electron-builder já é "tudo menos o óbvio"; aqui só tiramos o que +# é de desenvolvimento. `vendor` sai porque as DLLs entram por extraResources — +# incluí-las nos dois lugares custaria 10 MB à toa. +files: + - '!.github/**' + - '!e2e/**' + - '!scripts/**' + - '!src/**' + - '!vendor/**' + - '!coverage/**' + - '!test-results/**' + - '!playwright-report/**' + - '!{electron.vite.config.ts,playwright.config.ts,vitest.config.ts}' + - '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json,tsconfig.e2e.json}' + - '!{.oxlintrc.json,.oxfmtrc.jsonc,skills-lock.json,patchnotes.json}' + - '!{README.md,ROADMAP.md,CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md}' + +# koffi carrega um .node por dlopen: dentro do asar ele não existe como arquivo +# de verdade, e o require falha em tempo de execução. +asarUnpack: + - '**/node_modules/koffi/**' + +# As duas wslcsdk.dll vão para resources/, de onde o locate as procura no app +# instalado (process.resourcesPath). LICENSE e NOTICE acompanham porque o +# pacote é MIT: redistribuir exige carregar os avisos junto. +extraResources: + - from: vendor/wslcsdk/win-x64 + to: vendor/wslcsdk/win-x64 + - from: vendor/wslcsdk/LICENSE.txt + to: vendor/wslcsdk/LICENSE.txt + - from: vendor/wslcsdk/NOTICE.txt + to: vendor/wslcsdk/NOTICE.txt + +win: + icon: build/icon.ico + target: + - target: nsis + arch: [x64] + - target: portable + arch: [x64] + # Sem certificado: o SmartScreen vai avisar "editor desconhecido". Assinar + # depois não exige refazer nada aqui além de apontar o .pfx. + signAndEditExecutable: true + +nsis: + oneClick: false + perMachine: false + allowToChangeInstallationDirectory: true + createDesktopShortcut: true + createStartMenuShortcut: true + shortcutName: WSLC UI + artifactName: ${name}-${version}-setup.${ext} + uninstallDisplayName: WSLC UI ${version} + +portable: + artifactName: ${name}-${version}-portable.${ext} + +# Não publica sozinho: quem cria a release é o workflow, a partir da tag. +publish: null diff --git a/package-lock.json b/package-lock.json index 7ee2d53..29acf0a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,27 +7,17 @@ "": { "name": "wslc-ui", "version": "0.1.0", + "license": "MIT", "dependencies": { - "@heroui/react": "^3.2.4", - "@heroui/styles": "^3.2.4", - "@tailwindcss/vite": "^4.3.3", - "@tanstack/react-router": "^1.170.32", - "@xterm/addon-fit": "^0.11.0", - "@xterm/xterm": "^6.0.0", - "clsx": "^2.1.1", "koffi": "^3.1.6", - "lucide-react": "^1.33.0", - "react": "^19.2.8", - "react-aria": "^3.52.0", - "react-aria-components": "^1.21.0", - "react-dom": "^19.2.8", - "tailwind-merge": "^3.6.0", - "tailwindcss": "^4.3.3", - "zod": "^4.4.3", - "zustand": "^5.0.15" + "zod": "^4.4.3" }, "devDependencies": { + "@heroui/react": "^3.2.4", + "@heroui/styles": "^3.2.4", "@playwright/test": "^1.62.1", + "@tailwindcss/vite": "^4.3.3", + "@tanstack/react-router": "^1.170.32", "@tanstack/router-plugin": "^1.168.35", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.6", @@ -36,20 +26,33 @@ "@types/react-dom": "^19.2.4", "@vitejs/plugin-react": "^5.2.0", "@vitest/coverage-v8": "^4.1.10", + "@xterm/addon-fit": "^0.11.0", + "@xterm/xterm": "^6.0.0", + "clsx": "^2.1.1", "electron": "^43.4.1", + "electron-builder": "^26.15.3", "electron-vite": "^5.0.0", "happy-dom": "^20.11.6", + "lucide-react": "^1.33.0", "oxfmt": "^0.64.0", "oxlint": "^1.79.0", + "react": "^19.2.8", + "react-aria": "^3.52.0", + "react-aria-components": "^1.21.0", + "react-dom": "^19.2.8", + "tailwind-merge": "^3.6.0", + "tailwindcss": "^4.3.3", "typescript": "^7.0.2", "vite": "^7.3.6", - "vitest": "^4.1.10" + "vitest": "^4.1.10", + "zustand": "^5.0.15" } }, "node_modules/@adobe/react-spectrum": { "version": "3.47.4", "resolved": "https://registry.npmjs.org/@adobe/react-spectrum/-/react-spectrum-3.47.4.tgz", "integrity": "sha512-SK5Wh1HhuI2sAL5/uZ6Cr3MucbvL49VQAfxmXIw6Uy++icifMVM02QVdouYdKzgYAEc3gKsgCQ8voTFED6PHXA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@internationalized/date": "^3.12.4", @@ -74,6 +77,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-ui/-/react-spectrum-ui-1.2.1.tgz", "integrity": "sha512-wcrbEE2O/9WnEn6avBnaVRRx88S5PLFsPLr4wffzlbMfXeQsy+RMQwaJd3cbzrn18/j04Isit7f7Emfn0dhrJA==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", @@ -84,6 +88,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@adobe/react-spectrum-workflow/-/react-spectrum-workflow-2.3.5.tgz", "integrity": "sha512-b53VIPwPWKb/T5gzE3qs+QlGP5gVrw/LnWV3xMksDU+CRl3rzOKUwxIGiZO8ICyYh1WiyqY4myGlPU/nAynBUg==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0", @@ -344,6 +349,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -417,6 +423,86 @@ "node": ">=22.12.0" } }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@electron/get": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", @@ -451,6 +537,199 @@ "node": ">=10" } }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", + "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -897,6 +1176,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz", "integrity": "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -910,6 +1190,7 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -920,6 +1201,7 @@ "version": "2.11.4", "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz", "integrity": "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -932,6 +1214,7 @@ "version": "1.8.16", "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz", "integrity": "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -943,6 +1226,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz", "integrity": "sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==", + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -953,6 +1237,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/@heroui/react/-/react-3.2.4.tgz", "integrity": "sha512-ZXCTyz1G7bgCdHVxRPy4vIRI/wdb0ZvzEUJGG7CAEp0zqQsKrTH1o9i3Ns8yM6EidtAyfMosULN29gFA3wegBA==", + "dev": true, "license": "MIT", "dependencies": { "@heroui/styles": "3.2.4", @@ -979,6 +1264,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", + "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-context": "1.1.3", @@ -1006,6 +1292,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1021,6 +1308,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1036,6 +1324,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-slot": "1.2.4" @@ -1059,6 +1348,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "dev": true, "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -1077,6 +1367,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1092,6 +1383,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "dev": true, "license": "MIT", "dependencies": { "use-sync-external-store": "^1.5.0" @@ -1110,6 +1402,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1125,6 +1418,7 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "dev": true, "license": "MIT", "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", @@ -1135,6 +1429,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -1145,6 +1440,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/@heroui/styles/-/styles-3.2.4.tgz", "integrity": "sha512-tjiT7VFUSjw7TA6ZjeT+D3oX62+D27l7dhPwW+emwPnkdkRoKALFJEPBsxpmEI/x18uNkKFIoTk85bICyOO8Vg==", + "dev": true, "license": "MIT", "dependencies": { "tailwind-variants": "3.3.1", @@ -1158,6 +1454,7 @@ "version": "3.12.4", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.4.tgz", "integrity": "sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1167,6 +1464,7 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.10.tgz", "integrity": "sha512-nc0Or6EdWHqZRcsXb6P9hBIpLsfSl/ILh0rk5h/OVBpzmhdExXtPy2cQtWsq8XKRBpRHwDNnAHt4OpolcB7dog==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -1178,6 +1476,7 @@ "version": "3.6.8", "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.8.tgz", "integrity": "sha512-8UmMFia46DUt+k97zKd9fKWXcWHR+k8ae3eYzILETuT2KbIvLyOfac7zesw+sJdRAAZ7Q9pM1Mk22aXp2LD0Ig==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -1187,15 +1486,30 @@ "version": "3.2.10", "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.10.tgz", "integrity": "sha512-PDx6//vHSpRnHfxqMqto11zQvhsaU74O3mKv2F/0eicGZcl9NLjQmGlbHz/LsJh5tLKp4A4L7ZVTzN1/MmMTvA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1206,6 +1520,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -1216,6 +1531,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1225,12 +1541,14 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1477,6 +1795,61 @@ "url": "https://liberapay.com/Koromix" } }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@napi-rs/lzma-linux-x64-gnu": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", @@ -1484,6 +1857,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -1496,6 +1870,19 @@ "node": "^22.20 || ^24.12 || >=25" } }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@oxfmt/binding-android-arm-eabi": { "version": "0.64.0", "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.64.0.tgz", @@ -2190,14 +2577,69 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@playwright/test": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", - "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", + "node_modules/@peculiar/asn1-schema": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz", + "integrity": "sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "playwright": "1.62.1" + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", + "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.62.1" }, "bin": { "playwright": "cli.js" @@ -2210,6 +2652,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/@react-aria/color/-/color-3.2.1.tgz", "integrity": "sha512-v/pZh1yBNeayQ5Kio0xRIX0gBf6uu+KjCRW4QSydTyRpmhvk6sMzHT9i9/vIMdaDHaYHBXlXF+Tp/mvS9CG4Zw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0", @@ -2224,6 +2667,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.13.1.tgz", "integrity": "sha512-z56ZYcbfpNmMyiGLhyEjytpmEfoTlBaksk84q4kds3HvNkf7QWKj+DJVfVDrJX+c1LyuBsszLSX7yxJRiHsYKQ==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2242,6 +2686,7 @@ "version": "3.10.1", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.10.1.tgz", "integrity": "sha512-jn038/ZYmu6DpfXJ6r2U9zFFppjbc9wnApPJSCxao2RZVEqep4YyoniHSy8qv6V21/xyS4IV7W9a+X2jOjSuag==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2260,6 +2705,7 @@ "version": "3.34.1", "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.34.1.tgz", "integrity": "sha512-H6+rGZL+0f58bBNaUMfctEnT+NogqwAk+nHiB8sR3K+YlQ37GTuCijy2U/pPvQtFMS5mURrjZeBH5JNNXsx14A==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2276,6 +2722,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/@react-spectrum/color/-/color-3.2.1.tgz", "integrity": "sha512-FbB+GaVufsN+obNJmUAe8XGZTeJjEWvEf/k/7nxDxoDCBdg/o6eEPONAZyID5Dj1f8BZKNym8VURxDZx7IIyuQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@adobe/react-spectrum": "^3.47.0", @@ -2291,6 +2738,7 @@ "version": "3.11.1", "resolved": "https://registry.npmjs.org/@react-spectrum/provider/-/provider-3.11.1.tgz", "integrity": "sha512-TsoNdVdmlQ7L+75ILq5Yb3+wp/I1AtIeat0o+Y+ZBxP+TtWpwT1ZtCB5l3cplFVzHzOpZlzO0VaDrDP9ElGYDw==", + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -2306,6 +2754,7 @@ "version": "3.10.1", "resolved": "https://registry.npmjs.org/@react-stately/color/-/color-3.10.1.tgz", "integrity": "sha512-v4YlLa/oRQpPa/M9Yq1e0Bl8Z7xzGZdNDAIbfIMZuiJtacaOKriPW+AOgjjT/Ab0fNX2YDbwIYvkiMOJBnTi5A==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0", @@ -2320,6 +2769,7 @@ "version": "3.12.1", "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.12.1.tgz", "integrity": "sha512-NqKfzrknpfwiewx7R2vk1P+CneClInPDsIhw15+jOcUYSEfej0nta4cJywuKQJ2gsPwqX/ojDNixedCve9FWGw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0", @@ -2334,6 +2784,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@react-types/color/-/color-3.2.0.tgz", "integrity": "sha512-beV3vz80nzZ1EuYUM7296Kyi3AHcMrbQw0qub/9yzHWVTKKc5sy/e4dCMKcWL/ArkeAyc7jDOiui190RQ4l0Fw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@react-aria/color": "^3.2.0", @@ -2350,6 +2801,7 @@ "version": "3.36.1", "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.36.1.tgz", "integrity": "sha512-AzsuD9OfxTOZMMvTRhlN3oHBwOmFN7tDh27LzqmHt4+uOgPhJT7ZM7/kVs/8/o0WxayMUIk3hBmCFRHv1FUoag==", + "dev": true, "license": "Apache-2.0", "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" @@ -2369,6 +2821,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2382,6 +2835,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2395,6 +2849,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2408,6 +2863,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2421,6 +2877,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2434,6 +2891,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2447,6 +2905,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": [ "glibc" ], @@ -2463,6 +2922,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": [ "musl" ], @@ -2479,6 +2939,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -2495,6 +2956,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -2511,6 +2973,7 @@ "cpu": [ "loong64" ], + "dev": true, "libc": [ "glibc" ], @@ -2527,6 +2990,7 @@ "cpu": [ "loong64" ], + "dev": true, "libc": [ "musl" ], @@ -2543,6 +3007,7 @@ "cpu": [ "ppc64" ], + "dev": true, "libc": [ "glibc" ], @@ -2559,6 +3024,7 @@ "cpu": [ "ppc64" ], + "dev": true, "libc": [ "musl" ], @@ -2575,6 +3041,7 @@ "cpu": [ "riscv64" ], + "dev": true, "libc": [ "glibc" ], @@ -2591,6 +3058,7 @@ "cpu": [ "riscv64" ], + "dev": true, "libc": [ "musl" ], @@ -2607,6 +3075,7 @@ "cpu": [ "s390x" ], + "dev": true, "libc": [ "glibc" ], @@ -2623,6 +3092,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -2639,6 +3109,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -2655,6 +3126,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2668,6 +3140,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2681,6 +3154,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2694,6 +3168,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2707,6 +3182,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2720,16 +3196,31 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@spectrum-icons/ui": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/@spectrum-icons/ui/-/ui-3.7.2.tgz", "integrity": "sha512-7IuSHO+Ck8gJUIGIXqDcDIU4R8RHRUZhlfz8AwN1rSdCEvdgp6DWYN0LDTMrWh7TN/H5hrJ7oDO/gUpR3TnBjw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@adobe/react-spectrum-ui": "1.2.1", @@ -2746,6 +3237,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/@spectrum-icons/workflow/-/workflow-4.3.2.tgz", "integrity": "sha512-UkVg8Kp9rInjfqtG27in9p7RWfN9JFSvZr7ZOpN2n9jkrQ1y88hZpK8dKce8lgVb7jALXtsi2p0rjyaWzO0QsA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@adobe/react-spectrum-workflow": "2.3.5", @@ -2768,15 +3260,30 @@ "version": "0.5.23", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tailwindcss/node": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", @@ -2792,6 +3299,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 20" @@ -2818,6 +3326,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2834,6 +3343,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2850,6 +3360,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2866,6 +3377,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2882,6 +3394,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2898,6 +3411,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -2917,6 +3431,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -2936,6 +3451,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -2955,6 +3471,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -2982,6 +3499,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -3003,6 +3521,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3019,6 +3538,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3032,6 +3552,7 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, "license": "MIT", "dependencies": { "@tailwindcss/node": "4.3.3", @@ -3046,6 +3567,7 @@ "version": "1.162.1", "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.162.1.tgz", "integrity": "sha512-DR9t6lfLVdrjgCwpglrR9DR7Ok8/HlXjcOE+goWXF3zyuLUO/ug7vMbSFxTqrQTtbRghJfyhmIZ0S6LhPIy44w==", + "dev": true, "license": "MIT", "engines": { "node": ">=20.19" @@ -3059,6 +3581,7 @@ "version": "1.170.32", "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.170.32.tgz", "integrity": "sha512-SIpxvaTKco100a5ZR3ePmArbhtm3XOx+w1dpGYY9gxHDta4iXSKDdQuhLonwJbIMkVJsU1rwXf0UDHMrF/1snw==", + "dev": true, "license": "MIT", "dependencies": { "@tanstack/history": "1.162.1", @@ -3082,6 +3605,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz", "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==", + "dev": true, "license": "MIT", "dependencies": { "@tanstack/store": "0.9.3", @@ -3100,6 +3624,7 @@ "version": "1.171.27", "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.171.27.tgz", "integrity": "sha512-wDwSLvoLwIaNcnx9UNcN9Mb7Y8QwCYq1U1RQZwyN186gnkIoIYI2SOxy8VqH1vFigbkHkk4FmwMAQlghPgDK2g==", + "dev": true, "license": "MIT", "dependencies": { "@tanstack/history": "1.162.1", @@ -3216,6 +3741,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz", "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -3352,6 +3878,19 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -3363,6 +3902,16 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -3374,13 +3923,48 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "26.2.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~8.3.0" @@ -3390,7 +3974,7 @@ "version": "19.2.18", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -3400,12 +3984,22 @@ "version": "19.2.4", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", - "devOptional": true, + "dev": true, "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" } }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/whatwg-mimetype": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", @@ -3928,28 +4522,76 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", + "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xterm/addon-fit": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.11.0.tgz", "integrity": "sha512-jYcgT6xtVYhnhgxh3QgYDnnNMYTcf8ElbxxFzX0IZo+vabQqSPAjC3c1wJrKB5E19VwQei89QCiZZP86DCPF7g==", + "dev": true, "license": "MIT" }, "node_modules/@xterm/xterm": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-6.0.0.tgz", "integrity": "sha512-TQwDdQGtwwDt+2cgKDLn0IRaSxYu1tSUjgKarSDkUM0ZNiSRXFpjxEsvc/Zgc5kq5omJ+V0a8/kIM2WD3sMOYg==", + "dev": true, "license": "MIT", "workspaces": [ "addons/*" ] }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3978,73 +4620,331 @@ "node": ">=14" } }, - "node_modules/aria-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "node_modules/app-builder-lib": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", + "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.0" + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.15.3", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" } }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" } }, - "node_modules/ast-v8-to-istanbul": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", - "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/babel-dead-code-elimination": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", - "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==", + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "engines": { + "node": ">=6" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.18", + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", + "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.12.tgz", + "integrity": "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.18", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.18.tgz", "integrity": "sha512-1iEmLEYSiE1SeBoAfPo/Mnx3PzfzHUkDK61ASkCpuk3YXugYLH5DYK1SzqV55F8FMI6s0F+/tCP7Polz1QRjxw==", "dev": true, @@ -4056,6 +4956,35 @@ "node": ">=6.0.0" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/browserslist": { "version": "4.28.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", @@ -4090,6 +5019,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/buffer-image-size": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz", @@ -4103,6 +5039,56 @@ "node": ">=4.0" } }, + "node_modules/builder-util": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4113,6 +5099,49 @@ "node": ">=8" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001809", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", @@ -4144,6 +5173,39 @@ "node": ">=18" } }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -4160,38 +5222,217 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, "license": "MIT" }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "dev": true, "license": "MIT" }, - "node_modules/cookie-es": { + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie-es": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, "license": "MIT" }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, "license": "MIT" }, "node_modules/debug": { @@ -4216,9 +5457,97 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, "license": "MIT", "peer": true }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -4234,11 +5563,20 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/diff": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", @@ -4249,6 +5587,61 @@ "node": ">=0.3.1" } }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -4261,12 +5654,83 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron": { "version": "43.4.1", "resolved": "https://registry.npmjs.org/electron/-/electron-43.4.1.tgz", @@ -4286,6 +5750,63 @@ "node": ">= 22.12.0" } }, + "node_modules/electron-builder": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.3", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", + "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-publish": { + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.412", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.412.tgz", @@ -4323,10 +5844,70 @@ } } }, - "node_modules/electron/node_modules/@types/node": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", - "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4340,10 +5921,28 @@ "dev": true, "license": "MIT" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.24.5", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -4379,6 +5978,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", @@ -4386,6 +6012,43 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -4428,81 +6091,426 @@ "@esbuild/win32-x64": "0.25.12" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz", + "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, "dependencies": { - "@types/estree": "^1.0.0" + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" } }, - "node_modules/expect-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", - "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "node_modules/global-agent/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=12.0.0" + "node": ">=10" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/happy-dom": { @@ -4534,6 +6542,95 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4541,10 +6638,79 @@ "dev": true, "license": "MIT" }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/intl-messageformat": { "version": "10.7.18", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.18.tgz", "integrity": "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==", + "dev": true, "license": "BSD-3-Clause", "peer": true, "dependencies": { @@ -4554,15 +6720,56 @@ "tslib": "^2.8.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, "node_modules/isbot": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.2.1.tgz", "integrity": "sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==", + "dev": true, "license": "Unlicense", "engines": { "node": ">=18" } }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -4602,10 +6809,29 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jiti": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -4615,8 +6841,32 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -4630,6 +6880,28 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -4643,6 +6915,29 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/koffi": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/koffi/-/koffi-3.1.6.tgz", @@ -4670,10 +6965,18 @@ "@koromix/koffi-win32-x64": "3.1.6" } }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -4706,6 +7009,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4726,6 +7030,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4746,6 +7051,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4766,6 +7072,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4786,6 +7093,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4806,6 +7114,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -4829,6 +7138,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -4852,6 +7162,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -4875,6 +7186,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -4898,6 +7210,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4918,6 +7231,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -4931,10 +7245,18 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4943,6 +7265,16 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -4957,6 +7289,7 @@ "version": "1.33.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.33.0.tgz", "integrity": "sha512-MTRwMy0ZlL8Ur/vOAiJ9XGHE+kFPC7brq6MxAm0GiGXEBj0qy0jA/pG4N675oSzciO/UCdX8T+5yUQdmDeTLxg==", + "dev": true, "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4977,6 +7310,7 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -5023,6 +7357,139 @@ "node": ">=10" } }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5034,6 +7501,7 @@ "version": "3.3.18", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, "funding": [ { "type": "github", @@ -5048,6 +7516,146 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-abi": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.35.0.tgz", + "integrity": "sha512-ymk4aIzxdPopw2giv8Fs1Ec6vybGkjmyxUwVqhkI4MCy2tVfXdkOGGWieWVjL0THgH+7a8lRdevyupoYj3Js/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.53", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", @@ -5058,15 +7666,56 @@ "node": ">=18" } }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/obug": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", @@ -5081,6 +7730,16 @@ "node": ">=12.20.0" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/oxfmt": { "version": "0.64.0", "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.64.0.tgz", @@ -5182,6 +7841,52 @@ } } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -5189,16 +7894,33 @@ "dev": true, "license": "MIT" }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -5207,6 +7929,37 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/playwright": { "version": "1.62.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", @@ -5254,10 +8007,26 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/postcss": { "version": "8.5.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -5282,6 +8051,36 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prettier": { "version": "3.9.6", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", @@ -5314,6 +8113,23 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -5324,10 +8140,25 @@ "node": ">=0.4.0" } }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -5339,12 +8170,70 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, "license": "MIT" }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react": { "version": "19.2.8", "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5354,6 +8243,7 @@ "version": "3.52.0", "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.52.0.tgz", "integrity": "sha512-eGU8GOqT6Stn4Se/X3esz0Wum6TqSwQJBbK3jSLJIbFAS7XkvpICCVwmqZQG1/siXuCgB9DBRq9CttI+K9HPTA==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@internationalized/date": "^3.12.4", @@ -5375,6 +8265,7 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.21.0.tgz", "integrity": "sha512-jbUPSvy3S3XhToxl+Ta5TGVnLTqr5lnWafN8JWqvmVps8KQOdUareZ8IzjU0XQtdIncSv6oxGkn6nQBG26CSCw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@internationalized/date": "^3.12.4", @@ -5394,6 +8285,7 @@ "version": "19.2.8", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -5424,6 +8316,7 @@ "version": "3.50.0", "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.50.0.tgz", "integrity": "sha512-TnckvpDQGU0672wEaLZqdzvhuSeXWjgW6vijMWxiKOxc8CosQUfPGISdcZyfHqjX3XMjEtRxj4w9HumvX4h4mw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@internationalized/date": "^3.12.4", @@ -5441,6 +8334,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", @@ -5453,6 +8347,35 @@ "react-dom": ">=16.6.0" } }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/readdirp": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", @@ -5467,10 +8390,113 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/rollup": { "version": "4.62.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.5.tgz", "integrity": "sha512-/tqMfgP7GPA3PHhCmuiS4vIjrSVhHLgY++i+dhbG462euyAj7FpM4D9uq1X3BgjlqRdpcOrYhcQtfiQLNc8tqw==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.9" @@ -5512,10 +8538,38 @@ "fsevents": "~2.3.2" } }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -5528,10 +8582,36 @@ "semver": "bin/semver.js" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/seroval": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.6.3.tgz", "integrity": "sha512-5PwLbVPpT4DEki1hYVSSsoxWY6xCNMVucAVLK/CH0mXSDfp/I4KaAex72q80GNt5hpn7CCMGdSpIg4YGqH/wXQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -5541,30 +8621,117 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.6.3.tgz", "integrity": "sha512-zQIy62HW683pMIUOKv9yKueQmOr+xMjpP2eH/qEPhr6nTAC+pJTh508md571Oduf/K/QpAoyeWpOhOp1+RFeDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "seroval": "^1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "seroval": "^1.0" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "ISC" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5572,6 +8739,16 @@ "dev": true, "license": "MIT" }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/std-env": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", @@ -5579,6 +8756,44 @@ "dev": true, "license": "MIT" }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -5609,6 +8824,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "dev": true, "license": "MIT", "funding": { "type": "github", @@ -5619,6 +8835,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.3.1.tgz", "integrity": "sha512-4pAvwUtM4HKBiRZftncAbpn6V9Hhwoa5Fl7O2u5zbp7Z5Cvu+/o/6+176WY3WCEES209543quG8zFIcXCsc5Jw==", + "dev": true, "license": "MIT", "engines": { "node": ">=16.9.x", @@ -5641,12 +8858,14 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, "license": "MIT" }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -5656,6 +8875,79 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -5677,6 +8969,7 @@ "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -5709,21 +9002,67 @@ "node": ">=14.0.0" } }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, "license": "0BSD" }, "node_modules/tw-animate-css": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/Wombosvideo" } }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", @@ -5774,9 +9113,19 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unplugin": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.3.0.tgz", @@ -5832,6 +9181,35 @@ } } }, + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/update-browserslist-db": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", @@ -5867,15 +9245,31 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "dev": true, "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "7.3.6", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", @@ -5953,6 +9347,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5969,6 +9364,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5985,6 +9381,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6001,6 +9398,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6017,6 +9415,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6033,6 +9432,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6049,6 +9449,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6065,6 +9466,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6081,6 +9483,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6097,6 +9500,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6113,6 +9517,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6129,6 +9534,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6145,6 +9551,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6161,6 +9568,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6177,6 +9585,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6193,6 +9602,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6209,6 +9619,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6225,6 +9636,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6241,6 +9653,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6257,6 +9670,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6273,6 +9687,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6289,6 +9704,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6305,6 +9721,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6321,6 +9738,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6337,6 +9755,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6353,6 +9772,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -6366,6 +9786,7 @@ "version": "0.28.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -6493,6 +9914,20 @@ } } }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", @@ -6510,6 +9945,22 @@ "node": ">=12" } }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -6527,6 +9978,47 @@ "node": ">=8" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { "version": "8.21.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", @@ -6549,6 +10041,26 @@ } } }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -6556,6 +10068,48 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", @@ -6569,6 +10123,7 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.15.tgz", "integrity": "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.20.0" diff --git a/package.json b/package.json index ffddc5d..aecc4c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wslc-ui", - "version": "0.1.0", + "version": "0.2.0", "private": true, "description": "UI desktop para WSL Containers (wslc) — Electron + Vite", "license": "MIT", @@ -25,29 +25,20 @@ "typecheck:e2e": "tsc --noEmit -p tsconfig.e2e.json", "test:e2e": "npm run build && playwright test", "test:e2e:headed": "npm run build && playwright test --headed", + "dist": "npm run build && electron-builder --win --config electron-builder.yml", + "dist:dir": "npm run build && electron-builder --win --dir --config electron-builder.yml", "cenario:nativo": "esbuild scripts/cenario-nativo.ts --bundle --platform=node --format=esm --packages=external --outfile=node_modules/.cache/cenario-nativo.mjs --log-level=warning && node node_modules/.cache/cenario-nativo.mjs" }, "dependencies": { - "@heroui/react": "^3.2.4", - "@heroui/styles": "^3.2.4", - "@tailwindcss/vite": "^4.3.3", - "@tanstack/react-router": "^1.170.32", - "@xterm/addon-fit": "^0.11.0", - "@xterm/xterm": "^6.0.0", - "clsx": "^2.1.1", "koffi": "^3.1.6", - "lucide-react": "^1.33.0", - "react": "^19.2.8", - "react-aria": "^3.52.0", - "react-aria-components": "^1.21.0", - "react-dom": "^19.2.8", - "tailwind-merge": "^3.6.0", - "tailwindcss": "^4.3.3", - "zod": "^4.4.3", - "zustand": "^5.0.15" + "zod": "^4.4.3" }, "devDependencies": { + "@heroui/react": "^3.2.4", + "@heroui/styles": "^3.2.4", "@playwright/test": "^1.62.1", + "@tailwindcss/vite": "^4.3.3", + "@tanstack/react-router": "^1.170.32", "@tanstack/router-plugin": "^1.168.35", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.6", @@ -56,14 +47,26 @@ "@types/react-dom": "^19.2.4", "@vitejs/plugin-react": "^5.2.0", "@vitest/coverage-v8": "^4.1.10", + "@xterm/addon-fit": "^0.11.0", + "@xterm/xterm": "^6.0.0", + "clsx": "^2.1.1", "electron": "^43.4.1", + "electron-builder": "^26.15.3", "electron-vite": "^5.0.0", "happy-dom": "^20.11.6", + "lucide-react": "^1.33.0", "oxfmt": "^0.64.0", "oxlint": "^1.79.0", + "react": "^19.2.8", + "react-aria": "^3.52.0", + "react-aria-components": "^1.21.0", + "react-dom": "^19.2.8", + "tailwind-merge": "^3.6.0", + "tailwindcss": "^4.3.3", "typescript": "^7.0.2", "vite": "^7.3.6", - "vitest": "^4.1.10" + "vitest": "^4.1.10", + "zustand": "^5.0.15" }, "allowScripts": { "electron@43.4.1": true, diff --git a/patchnotes.json b/patchnotes.json index a7d3ce7..fbe9bb4 100644 --- a/patchnotes.json +++ b/patchnotes.json @@ -1,5 +1,27 @@ { "versoes": [ + { + "versao": "0.2.0", + "data": "2026-09-01", + "titulo": "O app agora tem instalador, e leva o SDK do WSL consigo.", + "mudancas": { + "adicionado": [ + "Instalador (NSIS) e versão portátil para Windows x64, publicados como assets da release. Não são assinados: o SmartScreen avisa 'editor desconhecido'.", + "A wslcsdk.dll vai empacotada com o app — duas versões, 2.9.3 e 2.9.9, com a escolha feita em tempo de execução pela versão do WSL instalado.", + "Seletor de wslcsdk.dll na aba Sistema, para apontar uma DLL própria. O arquivo é sondado antes de ser aceito: versão, ABI e SHA-256 são lidos na hora, e o que não serve é recusado ali.", + "A aba Sistema passa a mostrar a origem da DLL em uso (empacotada, escolhida, do WSL ou de variável de ambiente), a ABI detectada e o tamanho do binário.", + "Ícone próprio do app." + ], + "alterado": [ + "Containers nativos SOBREVIVEM ao fechamento do app quando o SDK é 2.9.9+: eles param e são reabertos por nome na execução seguinte, em vez de serem apagados na saída.", + "O campo que a aba Sistema chamava de 'SDK' virou 'WSL (pelo SDK)': medindo, WslcGetVersion devolve a versão do WSL instalado, não a da DLL — binários diferentes respondem o mesmo número.", + "O app ficou ~100 MB menor: tudo o que só o renderer usa saiu de dependencies, onde viajava duas vezes (embutido no bundle e de novo em node_modules)." + ], + "corrigido": [ + "Login em registry e instalação guiada não corrompem mais a chamada quando a DLL é 2.9.9: as duas funções mudaram de assinatura sem mudar o header de forma detectável, e o app agora identifica a ABI e se adapta." + ] + } + }, { "versao": "0.1.0", "data": "2026-09-01", diff --git a/scripts/fumaca-empacotado.ts b/scripts/fumaca-empacotado.ts new file mode 100644 index 0000000..5646803 --- /dev/null +++ b/scripts/fumaca-empacotado.ts @@ -0,0 +1,61 @@ +import { mkdtempSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { _electron as electron } from '@playwright/test' +import type { WslcApi } from '../src/shared/ipc/api' + +/** + * Teste de fumaça do app EMPACOTADO — o que a suíte E2E não cobre. + * + * O E2E roda contra `out/`, com o Electron do node_modules e o projeto inteiro + * no disco. O instalador é outro mundo: o código vive dentro do asar, o koffi + * precisa estar desempacotado para o dlopen funcionar, e a wslcsdk.dll deixa de + * estar em `vendor/` para estar em `resources/`. Cada uma dessas três coisas + * quebra sozinha, sem quebrar nada no E2E. + * + * Então este script abre o .exe de verdade e confere justamente isso: que o + * motor nativo achou a DLL, e que ela veio de dentro do pacote. + * + * node scripts/fumaca-empacotado.ts "dist/win-unpacked/WSLC UI.exe" + */ + +const exe = process.argv[2] +if (!exe) { + console.error('uso: node scripts/fumaca-empacotado.ts ') + process.exit(1) +} + +const app = await electron.launch({ + executablePath: exe, + args: [`--user-data-dir=${mkdtempSync(join(tmpdir(), 'wslc-fumaca-'))}`] +}) + +try { + const page = await app.firstWindow() + await page.waitForLoadState('domcontentloaded') + + // `globalThis` e não `window`: este script é typechecado com a lib de node, + // que não conhece DOM. O código roda no renderer de qualquer forma. + const status = await page.evaluate(() => + (globalThis as unknown as { wslcApi: WslcApi }).wslcApi.getNativeStatus() + ) + console.log(JSON.stringify(status, null, 2)) + + const problemas: string[] = [] + if (!status.available) problemas.push(`SDK indisponível: ${status.detail}`) + if (status.source !== 'bundled') problemas.push(`DLL veio de "${status.source}", não do pacote`) + if (status.dllPath !== null && !/resources/i.test(status.dllPath)) { + problemas.push(`DLL fora de resources/: ${status.dllPath}`) + } + if (status.abi === null) problemas.push('ABI não detectada') + + if (problemas.length > 0) { + console.error(`\nFumaça falhou (${problemas.length}):`) + for (const p of problemas) console.error(` - ${p}`) + process.exitCode = 1 + } else { + console.log(`\nOK: app empacotado abriu, DLL ${status.abi} carregada de resources/.`) + } +} finally { + await app.close().catch(() => undefined) +} diff --git a/src/main/ipc/index.ts b/src/main/ipc/index.ts index 50f1b29..7bb8e91 100644 --- a/src/main/ipc/index.ts +++ b/src/main/ipc/index.ts @@ -1,6 +1,6 @@ import { app, BrowserWindow } from 'electron' import { clearLogEntries, getLogEntries, logsDirectory, setOnLogEntry } from '../services/logger' -import { readNativeTuning, settingsFilePath, writeNativeTuning } from '../settings' +import { readNativeTuning, readSdkPath, settingsFilePath, writeNativeTuning, writeSdkPath } from '../settings' import { resolveWslcService } from '../services/wslc' import { currentEngine, getEngineStatus, setEngine } from '../services/wslc/engine' import { ops } from '../services/wslc/ops' @@ -20,6 +20,11 @@ export function registerIpc(): void { // Tuning persistido da sessão nativa → aplicado quando a sessão for criada. native.setTuning(readNativeTuning(settingsFile())) + // DLL escolhida na aba Sistema. Injetada ANTES de qualquer consulta ao motor + // nativo — é por isso que trocar de DLL só vale ao reabrir o app: quem já + // carregou a anterior tem handles dela. + native.setSdkPath(readSdkPath(settingsFile())) + // Sessão nativa terminou por fora (WSL desligado/crash) → avisa todas as janelas. native.setOnSessionEnded((reason) => { for (const win of BrowserWindow.getAllWindows()) { @@ -174,6 +179,18 @@ export function registerIpc(): void { native.setTuning(tuning) }, 'system:restart-native': () => native.restartSession(), + 'system:sdk-path': () => native.getSdkPath(), + // Escolher a DLL é: diálogo -> sonda -> grava. A sonda é a parte que + // importa: sem ela a pessoa só descobriria que errou o arquivo na próxima + // vez que abrisse o app, com o motor nativo indisponível e sem pista. + 'system:pick-sdk': async (_input, { event }) => { + const picked = await host.pickFile(BrowserWindow.fromWebContents(event.sender), 'wslcsdk.dll', ['dll']) + return picked === null ? null : native.probeSdk(picked) + }, + 'system:set-sdk-path': ({ path }) => { + writeSdkPath(settingsFile(), path) + native.setSdkPath(path) + }, 'system:native-status': () => native.status(), 'system:get-engine': () => getEngineStatus(), 'system:set-engine': ({ engine }) => setEngine(engine), diff --git a/src/main/ipc/router.test.ts b/src/main/ipc/router.test.ts index 4c54ced..a12f27b 100644 --- a/src/main/ipc/router.test.ts +++ b/src/main/ipc/router.test.ts @@ -74,10 +74,16 @@ function makeHandlers(overrides: Partial = {}): InvokeHandlers { 'system:native-status': async () => ({ available: false, dllPath: null, - sdkVersion: null, + source: null, + wslVersion: null, + abi: null, + sizeBytes: null, missingComponents: [], detail: 'teste' }), + 'system:sdk-path': async () => null, + 'system:pick-sdk': async () => null, + 'system:set-sdk-path': () => undefined, 'system:get-engine': async () => ({ engine: 'cli' as const, sessionActive: false, detail: 'teste' }), 'system:set-engine': async () => ({ engine: 'cli' as const, sessionActive: false, detail: 'teste' }), 'system:reset-native': async () => okResult, diff --git a/src/main/services/wslc/mock-ops.ts b/src/main/services/wslc/mock-ops.ts index e8c0378..3776f1f 100644 --- a/src/main/services/wslc/mock-ops.ts +++ b/src/main/services/wslc/mock-ops.ts @@ -11,6 +11,7 @@ import type { NativeTuning, RegistryImage, RunContainerOptions, + SdkProbe, VhdVolumeOptions, VolumeInfo } from '@shared/schemas' @@ -28,7 +29,8 @@ import type { HostOps, NativeOps, Ops, StreamOps } from './ops' * * A sessão nativa aqui imita as regras REAIS que a UI observa: ela tem * storage próprio (as listas não são as mesmas do motor CLI), reiniciar - * mantém as imagens e perde os containers, e resetar perde os dois. + * mantém as imagens e derruba os containers para exited (a ABI 2.9.9 os + * reabre), e resetar perde os dois. */ const ok = (stdout = ''): CommandResult => ({ ok: true, code: 0, stdout, stderr: '' }) @@ -194,6 +196,9 @@ const world: NativeWorld = { let onEnded: (reason: NativeSessionEndedEvent['reason']) => void = () => {} let onCrash: (ev: NativeCrashDumpEvent) => void = () => {} +/** DLL escolhida na aba Sistema; null = a "empacotada" do modo demonstração. */ +let mockSdkPath: string | null = null + const findContainer = (id: string): ContainerInfo | undefined => world.containers.find((c) => c.id === id || c.name === id) @@ -242,13 +247,18 @@ const nativeOps: NativeOps = { if (shouldFail('system:restart-native')) { return failure('system:restart-native', 'Falha ao reiniciar a sessão nativa.') } - // Reiniciar perde os containers e MANTÉM as imagens (regra do SDK real). - world.containers = [] + // Com a ABI 2.9.9 os containers NÃO se perdem: soltar a sessão os derruba + // para exited, e o app os reabre por nome (WslcOpenContainer). As imagens + // ficam, como sempre. Medido no SDK real. + for (const c of world.containers) { + Object.assign(c, { state: 'exited', status: 'Exited (0) agora' }) + } world.active = true return ok('Sessão nativa reiniciada com as novas configurações (as imagens foram mantidas).') }, cleanupContainers: async () => { - world.containers = [] + // Fechar o app não apaga mais nada na ABI 2.9.9 — os containers são + // reabertos na execução seguinte. }, setTuning: (tuning) => { world.tuning = tuning @@ -264,17 +274,57 @@ const nativeOps: NativeOps = { ? { available: false, dllPath: null, - sdkVersion: null, + source: null, + wslVersion: null, + abi: null, + sizeBytes: null, missingComponents: ['Virtual Machine Platform'], detail: '(demo) wslcsdk.dll não encontrada nesta máquina.' } : { available: true, - dllPath: 'C:\\demo\\vendor\\wslcsdk\\wslcsdk.dll', - sdkVersion: '0.9.0', + dllPath: mockSdkPath ?? 'C:\\demo\\vendor\\wslcsdk\\win-x64\\wslcsdk.dll', + source: mockSdkPath === null ? 'bundled' : 'custom', + wslVersion: '0.9.0', + abi: '2.9.9+', + sizeBytes: 4_929_888, missingComponents: [], detail: '(demo) SDK simulado carregado; todos os componentes presentes.' }, + getSdkPath: () => mockSdkPath, + setSdkPath: (path: string | null) => { + mockSdkPath = path + }, + // A sonda dublada lê o NOME do arquivo: um caminho com "2.9.3" devolve a ABI + // antiga, e qualquer coisa que não termine em .dll é recusada. É o bastante + // para o E2E exercitar escolher, recusar e voltar para a empacotada. + probeSdk: (path: string): SdkProbe => { + if (!path.toLowerCase().endsWith('.dll')) { + return { + path, + ok: false, + wslVersion: null, + abi: null, + sizeBytes: null, + sha256: null, + missingComponents: [], + detail: '(demo) Não é uma wslcsdk.dll utilizável: assinatura não reconhecida.' + } + } + const antiga = path.includes('2.9.3') + return { + path, + ok: true, + wslVersion: '0.9.0', + abi: antiga ? '2.9.3' : '2.9.9+', + sizeBytes: antiga ? 5_406_520 : 4_929_888, + sha256: antiga + ? 'a3881e7d239be9944a64868c323046aa0292d4806c289cb31c50c8df8d5dc68d' + : '8d4d55d4283fb32a5909b57e78b576d01363d7b28bb9b2595115e80faf61db5b', + missingComponents: [], + detail: `(demo) DLL válida, ABI ${antiga ? '2.9.3' : '2.9.9+'}.` + } + }, install: async (onProgress: (ev: InstallProgressEvent) => void) => { const ms = tickMs() const components = ['Virtual Machine Platform', 'Pacote WSL'] diff --git a/src/main/services/wslc/native/bindings.ts b/src/main/services/wslc/native/bindings.ts index f3e5984..5d07317 100644 --- a/src/main/services/wslc/native/bindings.ts +++ b/src/main/services/wslc/native/bindings.ts @@ -23,12 +23,48 @@ export const WSLC_COMPONENT_FLAGS = { SDK_NEEDS_UPDATE: 4 } as const +/** + * O serviço recusou a DLL por ser velha demais para o WSL instalado. Chega em + * QUALQUER chamada, inclusive WslcGetVersion — ver bundled.ts. + */ +export const HR_SDK_UPDATE_NEEDED = '0x8004060B' + +/** WslcInstallOptions — só existe na ABI 2.9.9+. REPAIR reinstala o que já está lá. */ +export const WSLC_INSTALL_OPTIONS = { + NONE: 0, + REPAIR: 1 +} as const + export interface NativeVersion { major: number minor: number revision: number } +/** + * Qual ABI da wslcsdk.dll está carregada. + * + * Por que isto existe: entre 2.9.3 e 2.9.9 a Microsoft mudou DUAS assinaturas + * sem mudar nenhum tamanho de struct — `WslcSessionAuthenticate` ganhou um + * `tokenType` ANTES do `errorMessage`, e `WslcInstallWithDependencies` ganhou + * `components` e `options` na frente. Chamar a DLL com a aridade errada não dá + * erro de link: passa ponteiro no lugar de enum e corrompe silenciosamente. + * + * E não dá para perguntar a versão ao SDK: `WslcGetVersion` devolve a versão do + * **WSL instalado** (medido: 2.9.3 e 2.9.9 respondem igual na mesma máquina), e + * a DLL não traz metadados de versão de arquivo. Sobra detectar por símbolo — + * `WslcOpenContainer` só existe a partir da 2.9.9, e nasceu junto com as duas + * assinaturas novas. É o que `modern` decide. + * + * Isso não é zelo teórico: a aba Sistema deixa escolher qualquer DLL do disco. + */ +export interface SdkAbi { + /** ABI 2.9.9+ (símbolo WslcOpenContainer presente). */ + modern: boolean + /** Rótulo curto, para a UI e o log. */ + label: string +} + /** Assinatura genérica das funções nativas vinculadas (retornam HRESULT). */ export interface NativeFn { (...args: unknown[]): number @@ -107,6 +143,8 @@ export function decodeBytes(ptr: unknown, length: number): Buffer { // eslint típico: assinaturas centralizadas em um objeto para uso nas fases seguintes. export interface WslcSdk { dllPath: string + /** ABI detectada por símbolo — ver SdkAbi. */ + abi: SdkAbi version(): NativeVersion missingComponents(): number /** Handles/funções cruas para as próximas fases (sessão, containers, processos, imagens). */ @@ -190,13 +228,17 @@ export function hrHex(hr: number): string { return `0x${(hr >>> 0).toString(16).toUpperCase()}` } -/** Carrega a DLL e vincula toda a superfície do wslcsdk.h. Idempotente por caminho. */ -export function loadWslcSdk(dllPath: string): WslcSdk { - if (cached && cached.dllPath === dllPath) return cached - initCom() - - const lib = koffi.load(dllPath) - +/** + * Tipos koffi do wslcsdk.h, registrados UMA vez por processo. + * + * koffi registra struct/proto por NOME, num namespace global: repetir o + * registro lança. Como o app pode carregar uma segunda DLL — a aba Sistema + * sonda a candidata que a pessoa escolheu antes de adotá-la —, o registro não + * pode morar dentro do load. Os tipos descrevem o header, não o binário, então + * compartilhá-los entre DLLs é correto: o que muda entre 2.9.3 e 2.9.9 são + * assinaturas de função, tratadas em SdkAbi. + */ +function buildTypes() { const WslcVersion = koffi.struct('WslcVersion', { major: 'uint32', minor: 'uint32', revision: 'uint32' }) const SessionSettings = koffi.struct('WslcSessionSettings', { _opaque: koffi.array('uint64', SESSION_OPTIONS_U64) @@ -285,15 +327,104 @@ export function loadWslcSdk(dllPath: string): WslcSdk { const P = koffi.pointer(ProcessSettings) const outHandle = koffi.out(koffi.pointer(HANDLE)) const outErr = koffi.out(koffi.pointer('str16')) + return { + WslcVersion, + SessionSettings, + ContainerSettings, + ProcessSettings, + VhdRequirements, + PortMapping, + ContainerVolume, + NamedVolume, + ImageInfo, + PullImageOptions, + ImageProgressDetail, + ImageProgressMessage, + ImportImageOptions, + TagImageOptions, + PushImageOptions, + ProcessCallbacks, + CrashDumpInfo, + StdIOCallback, + ProcessExitCallback, + ImageProgressCallback, + InstallCallback, + CrashDumpCallback, + S, + C, + P, + outHandle, + outErr + } +} + +type SdkTypes = ReturnType + +let sdkTypes: SdkTypes | null = null + +function types(): SdkTypes { + sdkTypes ??= buildTypes() + return sdkTypes +} + +/** Vincula toda a superfície do wslcsdk.h a partir de uma DLL, sem cache. */ +function build(dllPath: string): { sdk: WslcSdk; lib: ReturnType } { + initCom() + + const lib = koffi.load(dllPath) + + const t = types() + // Só o que este corpo usa; o registro completo vai em `sdk.types`, de + // onde as fases nativas puxam os protótipos de callback. + const { + WslcVersion, + VhdRequirements, + PortMapping, + ContainerVolume, + NamedVolume, + ImageInfo, + PullImageOptions, + ImageProgressMessage, + ImportImageOptions, + TagImageOptions, + PushImageOptions, + ProcessCallbacks, + CrashDumpInfo, + InstallCallback, + CrashDumpCallback, + S, + C, + P, + outHandle, + outErr + } = t + + /** Vincula um símbolo opcional; devolve null se ele não existir nesta DLL. */ + const optional = (name: string, ret: string, args: unknown[]): NativeFn | null => { + try { + return lib.func(name, ret, args as never[]) as NativeFn + } catch { + return null + } + } + + // Sonda da ABI — ver SdkAbi. WslcOpenContainer é o marcador da 2.9.9. + const openContainer = optional('WslcOpenContainer', HR, [HANDLE, PTR, outHandle, outErr]) + const setInitProcessIO = optional('WslcSetContainerInitProcessIOCallbacks', HR, [ + HANDLE, + koffi.pointer(ProcessCallbacks), + PTR + ]) + const abi: SdkAbi = openContainer ? { modern: true, label: '2.9.9+' } : { modern: false, label: '2.9.3' } const raw: Record = { // Instalação / versão WslcGetVersion: lib.func('WslcGetVersion', HR, [koffi.out(koffi.pointer(WslcVersion))]), WslcGetMissingComponents: lib.func('WslcGetMissingComponents', HR, [koffi.out(koffi.pointer('uint32'))]), - WslcInstallWithDependencies: lib.func('WslcInstallWithDependencies', HR, [ - koffi.pointer(InstallCallback), - PTR - ]), + // 2.9.9 pôs `components` e `options` na frente (ver SdkAbi). + WslcInstallWithDependencies: abi.modern + ? lib.func('WslcInstallWithDependencies', HR, ['int32', 'int32', koffi.pointer(InstallCallback), PTR]) + : lib.func('WslcInstallWithDependencies', HR, [koffi.pointer(InstallCallback), PTR]), // Sessão WslcInitSessionSettings: lib.func('WslcInitSessionSettings', HR, [PTR, PTR, S]), @@ -321,14 +452,25 @@ export function loadWslcSdk(dllPath: string): WslcSdk { outErr ]), WslcReleaseCrashDumpSubscription: lib.func('WslcReleaseCrashDumpSubscription', HR, [HANDLE]), - WslcSessionAuthenticate: lib.func('WslcSessionAuthenticate', HR, [ - HANDLE, - PTR, - PTR, - PTR, - koffi.out(koffi.pointer('str')), - outErr - ]), + // 2.9.9 encaixou `tokenType` ANTES do errorMessage (ver SdkAbi). + WslcSessionAuthenticate: abi.modern + ? lib.func('WslcSessionAuthenticate', HR, [ + HANDLE, + PTR, + PTR, + PTR, + koffi.out(koffi.pointer('str')), + koffi.out(koffi.pointer('int32')), + outErr + ]) + : lib.func('WslcSessionAuthenticate', HR, [ + HANDLE, + PTR, + PTR, + PTR, + koffi.out(koffi.pointer('str')), + outErr + ]), // Container WslcInitContainerSettings: lib.func('WslcInitContainerSettings', HR, [PTR, C]), @@ -357,6 +499,9 @@ export function loadWslcSdk(dllPath: string): WslcSdk { 'uint32' ]), WslcCreateContainer: lib.func('WslcCreateContainer', HR, [HANDLE, C, outHandle, outErr]), + // Só existem na ABI 2.9.9+; quem usa precisa checar sdk.abi.modern antes. + ...(openContainer === null ? {} : { WslcOpenContainer: openContainer }), + ...(setInitProcessIO === null ? {} : { WslcSetContainerInitProcessIOCallbacks: setInitProcessIO }), WslcStartContainer: lib.func('WslcStartContainer', HR, [HANDLE, 'int32', outErr]), WslcCreateContainerProcess: lib.func('WslcCreateContainerProcess', HR, [HANDLE, P, outHandle, outErr]), // Recebe um Buffer.alloc(65) — o ID (64 hex + NUL) é escrito nele. @@ -450,6 +595,7 @@ export function loadWslcSdk(dllPath: string): WslcSdk { const sdk: WslcSdk = { dllPath, + abi, version: () => { const out: Partial = {} const hr = raw['WslcGetVersion'](out) @@ -466,31 +612,35 @@ export function loadWslcSdk(dllPath: string): WslcSdk { decodeImages: (ptr, count) => koffi.decode(ptr, koffi.array(ImageInfo, count)) as RawNativeImage[], decodeProgress: (ptr) => koffi.decode(ptr, ImageProgressMessage) as RawProgressMessage, decodeCrashDump: (ptr) => koffi.decode(ptr, CrashDumpInfo) as RawCrashDump, - types: { - WslcVersion, - SessionSettings, - ContainerSettings, - ProcessSettings, - VhdRequirements, - PortMapping, - ContainerVolume, - NamedVolume, - ImageInfo, - PullImageOptions, - ImageProgressMessage, - ImportImageOptions, - TagImageOptions, - PushImageOptions, - ProcessCallbacks, - StdIOCallback, - ProcessExitCallback, - ImageProgressCallback, - InstallCallback, - CrashDumpCallback, - CrashDumpInfo - }, + types: t, alloc: koffi.alloc } + return { sdk, lib } +} + +/** Carrega a DLL em uso. Idempotente por caminho. */ +export function loadWslcSdk(dllPath: string): WslcSdk { + if (cached && cached.dllPath === dllPath) return cached + const { sdk } = build(dllPath) cached = sdk return sdk } + +/** + * Carrega uma DLL CANDIDATA sem tocar no cache — é o que a aba Sistema usa + * para ler versão e ABI de um arquivo escolhido antes de adotá-lo. + * + * O `unload` recusa descarregar a DLL em uso: a sessão nativa viva tem handles + * dela, e puxar o tapete derrubaria o app. Sondar a que já está carregada é o + * caso comum (a pessoa reabre o diálogo e escolhe a mesma), então isso não é + * hipótese remota. + */ +export function probeWslcSdk(dllPath: string): { sdk: WslcSdk; unload: () => void } { + const { sdk, lib } = build(dllPath) + return { + sdk, + unload: () => { + if (cached?.dllPath !== dllPath) lib.unload() + } + } +} diff --git a/src/main/services/wslc/native/bundled.test.ts b/src/main/services/wslc/native/bundled.test.ts new file mode 100644 index 0000000..23efcb7 --- /dev/null +++ b/src/main/services/wslc/native/bundled.test.ts @@ -0,0 +1,60 @@ +import { describe, expect, it } from 'vitest' +import { BUNDLED_SDKS, bundledPath, compareVersions, pickBundledSdk } from './bundled' + +describe('compareVersions', () => { + it('compara campo a campo, numericamente', () => { + expect(compareVersions('2.9.10', '2.9.9')).toBeGreaterThan(0) + expect(compareVersions('2.9.3', '2.9.4')).toBeLessThan(0) + expect(compareVersions('2.9.4', '2.9.4')).toBe(0) + expect(compareVersions('2.10.0', '2.9.99')).toBeGreaterThan(0) + }) + + it('trata partes ausentes como zero', () => { + expect(compareVersions('2.9', '2.9.0')).toBe(0) + expect(compareVersions('3', '2.9.9')).toBeGreaterThan(0) + }) +}) + +describe('pickBundledSdk', () => { + // A regra existe porque o SDK 2.9.9 dá segfault num WSL 2.9.4 — medido em + // WslcGetSessionTerminationEvent. Nunca usar SDK mais novo que o WSL. + it('não escolhe SDK mais novo que o WSL instalado', () => { + expect(pickBundledSdk('2.9.4').version).toBe('2.9.3') + expect(pickBundledSdk('2.9.8').version).toBe('2.9.3') + }) + + it('usa a mais nova quando o WSL alcança', () => { + expect(pickBundledSdk('2.9.9').version).toBe('2.9.9') + expect(pickBundledSdk('2.10.0').version).toBe('2.9.9') + expect(pickBundledSdk('3.0.0').version).toBe('2.9.9') + }) + + // Errar para baixo custa recurso; errar para cima custa o processo. + it('sem saber a versão do WSL, fica na mais antiga', () => { + expect(pickBundledSdk(null).version).toBe('2.9.3') + }) + + it('WSL abaixo de todas ainda devolve a mais antiga', () => { + expect(pickBundledSdk('2.9.0').version).toBe('2.9.3') + }) +}) + +describe('BUNDLED_SDKS', () => { + it('está ordenada da mais antiga para a mais nova', () => { + const versoes = BUNDLED_SDKS.map((s) => s.version) + expect(versoes.toSorted(compareVersions)).toEqual(versoes) + }) + + it('aponta para dentro de vendor/, por versão', () => { + // Comparado por segmento: o separador é do sistema, e o que importa é a + // pasta da versão estar no caminho. + expect(bundledPath(BUNDLED_SDKS[0]!, 'raiz').split(/[\\/]/)).toEqual([ + 'raiz', + 'vendor', + 'wslcsdk', + 'win-x64', + '2.9.3', + 'wslcsdk.dll' + ]) + }) +}) diff --git a/src/main/services/wslc/native/bundled.ts b/src/main/services/wslc/native/bundled.ts new file mode 100644 index 0000000..aa7ca8d --- /dev/null +++ b/src/main/services/wslc/native/bundled.ts @@ -0,0 +1,119 @@ +import { existsSync } from 'node:fs' +import { join } from 'node:path' +import { probeWslcSdk } from './bindings' + +/** + * Qual wslcsdk.dll empacotada usar — decidido pela versão do WSL instalado. + * + * O app leva DUAS DLLs porque o SDK precisa CASAR com o WSL — nas duas + * direções, e ambas medidas nesta máquina: + * + * | | WSL 2.9.4 | WSL 2.9.9 | + * | SDK 2.9.3 | funciona | `WSLC_E_SDK_UPDATE_NEEDED` já no WslcGetVersion | + * | SDK 2.9.9 | segfault em WslcGetSessionTerminationEvent | funciona | + * + * SDK novo demais é o caso perigoso: nada no header denuncia: a declaração da + * função que quebra é byte a byte idêntica nas duas versões, e os 18 structs + * também. Não há binding que se defenda — o processo simplesmente morre. SDK + * velho demais é o caso educado: o serviço recusa toda chamada com um HRESULT + * legível. + * + * A regra: usa a DLL mais nova que **não passe** da versão do WSL instalado. + * Com WSL 2.9.4 isso dá a 2.9.3; com 2.9.9 ou mais, a 2.9.9, que traz + * `WslcOpenContainer` e as assinaturas novas (ver SdkAbi). + * + * Quem quiser fugir da regra escolhe a DLL na aba Sistema — e a detecção de + * ABI cuida do resto. + */ + +export interface BundledSdk { + /** Versão do pacote NuGet Microsoft.WSL.Containers. */ + version: string + /** Caminho relativo à raiz onde `vendor/` foi instalado. */ + relative: string[] +} + +/** Da mais antiga para a mais nova — a ordem que `pickBundledSdk` assume. */ +export const BUNDLED_SDKS: BundledSdk[] = [ + { version: '2.9.3', relative: ['vendor', 'wslcsdk', 'win-x64', '2.9.3', 'wslcsdk.dll'] }, + { version: '2.9.9', relative: ['vendor', 'wslcsdk', 'win-x64', '2.9.9', 'wslcsdk.dll'] } +] + +/** Compara "2.9.10" com "2.9.9" numericamente, campo a campo. */ +export function compareVersions(a: string, b: string): number { + const pa = a.split('.').map((n) => Number.parseInt(n, 10) || 0) + const pb = b.split('.').map((n) => Number.parseInt(n, 10) || 0) + for (let i = 0; i < Math.max(pa.length, pb.length); i++) { + const diff = (pa[i] ?? 0) - (pb[i] ?? 0) + if (diff !== 0) return diff + } + return 0 +} + +/** + * A DLL empacotada adequada ao WSL informado. + * + * `wslVersion` null (não deu para perguntar) cai na mais antiga: é a que + * funciona no WSL mínimo suportado, e errar para baixo custa recurso; errar + * para cima custa o processo. + */ +export function pickBundledSdk(wslVersion: string | null): BundledSdk { + const primeira = BUNDLED_SDKS[0] as BundledSdk + if (wslVersion === null) return primeira + let escolhida = primeira + for (const sdk of BUNDLED_SDKS) { + if (compareVersions(sdk.version, wslVersion) <= 0) escolhida = sdk + } + return escolhida +} + +/** Caminho absoluto de uma DLL empacotada, sob a raiz dada. */ +export function bundledPath(sdk: BundledSdk, root: string): string { + return join(root, ...sdk.relative) +} + +/** Memoizado: sondar a DLL custa carregar um binário de 5 MB. */ +let detected: string | null | undefined + +/** + * Versão do WSL instalado, perguntada à DLL empacotada mais NOVA que responder. + * + * Parece circular — carregar uma DLL para decidir qual DLL usar — mas não é. + * `WslcGetVersion` devolve a versão do WSL, não a da DLL, não abre sessão e é + * barato. O detalhe que importa é a ORDEM: da mais nova para a mais antiga. + * + * A primeira tentativa foi ao contrário, e a medição derrubou: num WSL 2.9.9, a + * DLL 2.9.3 recusa até o WslcGetVersion, com WSLC_E_SDK_UPDATE_NEEDED — perguntar + * à mais velha dava "não sei", caía na mais velha por precaução, e o app inteiro + * ficava sem motor nativo. A mais nova, ao contrário, responde a versão certa + * mesmo num WSL antigo (medido: a 2.9.9 respondeu 2.9.4 num WSL 2.9.4); ela só + * quebra depois, ao mexer na sessão — e é justamente disso que a regra protege. + */ +export function detectWslVersion( + roots: string[], + exists: (p: string) => boolean = existsSync +): string | null { + if (detected !== undefined) return detected + detected = null + for (const sdk of BUNDLED_SDKS.toReversed()) { + for (const root of roots) { + const path = bundledPath(sdk, root) + if (!exists(path)) continue + try { + const probe = probeWslcSdk(path) + const v = probe.sdk.version() + detected = `${v.major}.${v.minor}.${v.revision}` + probe.unload() + } catch { + // Esta DLL não fala com este WSL; tenta a próxima. + } + if (detected !== null) return detected + } + } + return detected +} + +/** Só para testes: esquece a versão detectada. */ +export function resetDetectedWslVersion(): void { + detected = undefined +} diff --git a/src/main/services/wslc/native/containers.test.ts b/src/main/services/wslc/native/containers.test.ts index 337b409..d959f7e 100644 --- a/src/main/services/wslc/native/containers.test.ts +++ b/src/main/services/wslc/native/containers.test.ts @@ -1,4 +1,4 @@ -import { afterAll, describe, expect, it } from 'vitest' +import { afterAll, beforeAll, describe, expect, it } from 'vitest' import { cleanupNativeContainers, execNativeContainer, @@ -11,8 +11,8 @@ import { runNativeContainer, streamNativeLogs } from './containers' -import { locateWslcSdk } from './locate' -import { releaseNativeSession, setNativeSessionTuning } from './session' +import { isNativeUsable } from './status' +import { acquireNativeSession, releaseNativeSession, setNativeSessionTuning } from './session' const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) @@ -22,13 +22,65 @@ const uniq = Date.now().toString(36) // oxlint-disable no-await-in-loop, no-unmodified-loop-condition -- polling intencional (callbacks mudam o estado) +/** + * Remove TUDO da sessão nativa. + * + * Precisa existir porque, na ABI 2.9.9, fechar o app deixou de apagar + * containers — eles são reabertos na execução seguinte, de propósito. Ótimo + * para quem usa, péssimo para um teste que conta containers: sem limpar + * ANTES, sobra de execução anterior entra na conta. + */ +const removerTodos = async (): Promise => { + for (const c of await listNativeContainers(true)) { + // oxlint-disable-next-line no-await-in-loop -- sequencial (handles nativos) + await nativeContainerAction('remove', c.id) + } +} + // Integração real: cria containers de verdade na sessão "WslcUi" (exige a // wslcsdk.dll e a imagem alpine:latest já puxada para a sessão nativa). -describe.skipIf(locateWslcSdk() === null)('containers nativos (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('containers nativos (integração real via FFI)', () => { + beforeAll(removerTodos, 60_000) + afterAll(async () => { + await removerTodos() await cleanupNativeContainers() releaseNativeSession() - }, 30_000) + }, 60_000) + + // A limitação levantada pela ABI 2.9.9: antes, fechar o app apagava os + // containers nativos, porque sem WslcOpenContainer eles virariam órfãos + // invisíveis. Aqui o ciclo inteiro é exercitado num processo só — + // cleanup solta os handles e esvazia o registro em memória, e a listagem + // seguinte precisa trazer o container de volta do arquivo. + it('container sobrevive ao fechamento do app e é reaberto', { timeout: 90_000 }, async () => { + const nome = `wslcuireabre${uniq}` + const res = await runNativeContainer({ + image: 'alpine:latest', + name: nome, + command: 'sh -c "sleep 60"', + detach: true, + rm: false + }) + expect(res.ok, res.stderr).toBe(true) + + const { sdk } = await acquireNativeSession() + if (!sdk.abi.modern) return // ABI 2.9.3: o comportamento correto é apagar mesmo + + // Fechar o app: com a ABI nova, isto NÃO apaga — só solta os handles. + await cleanupNativeContainers() + expect(nativeContainerCount()).toBe(0) + + // Próxima execução: a listagem reabre pelo que ficou lembrado em disco. + const depois = await listNativeContainers(true) + const reaberto = depois.find((c) => c.name === nome) + expect(reaberto, `container ${nome} não voltou: ${depois.map((c) => c.name).join(', ')}`).toBeDefined() + + // E dá para operá-lo de novo — reabrir sem poder agir seria inútil. + const removido = await nativeContainerAction('remove', nome) + expect(removido.ok, removido.stderr).toBe(true) + expect((await listNativeContainers(true)).some((c) => c.name === nome)).toBe(false) + }) it('run → logs por callback → estado exited com código → remove', { timeout: 60_000 }, async () => { const res = await runNativeContainer({ diff --git a/src/main/services/wslc/native/containers.ts b/src/main/services/wslc/native/containers.ts index bf76f42..bbd7c27 100644 --- a/src/main/services/wslc/native/containers.ts +++ b/src/main/services/wslc/native/containers.ts @@ -13,6 +13,7 @@ import { type WslcSdk } from './bindings' import { formatUnixDate } from './images' +import { forgetContainer, readKnownContainers, rememberContainer, type KnownContainer } from './known' import { formatPortsDisplay, mapNativeState, parsePortSpec, parseVolumeSpec } from './run-spec' import { acquireNativeSession, @@ -25,11 +26,17 @@ import { /** * Containers nativos (Fase 2 do ROADMAP). * - * O SDK preview NÃO tem enumeração nem "abrir por ID" — um container só é - * gerenciável pelo handle criado neste processo. Por isso o app mantém um - * registro em memória e REMOVE os containers nativos ao fechar (senão viram - * órfãos permanentes: os registros sobrevivem até ao terminate da sessão e - * só somem apagando o storage — ver resetNativeSession). + * O SDK não enumera containers em nenhuma versão, então o app mantém um + * registro EM MEMÓRIA dos que criou. O que muda com a ABI 2.9.9 é o resgate: + * `WslcOpenContainer` abre um container por nome ou ID, inclusive um criado + * por outra execução do app. Com ele, os containers passam a SOBREVIVER ao + * fechamento — o app lembra os nomes em disco (known.ts) e reabre na próxima + * subida, em vez de apagar tudo na saída. + * + * Na ABI 2.9.3 o comportamento antigo continua, e por necessidade: sem abrir + * por ID, um container deixado para trás vira órfão permanente (o registro + * sobrevive ao terminate da sessão e só some apagando o storage — ver + * resetNativeSession), então ali a saída do app apaga mesmo. * * Regras por probe (SDK 2.9.4): port mapping exige networking BRIDGED e só * TCP; init process com callbacks exige start com WSLC_CONTAINER_START_FLAG_ATTACH. @@ -309,6 +316,7 @@ export async function runNativeContainer(opts: RunContainerOptions): Promise { + const known = readKnownContainers() + if (known.length === 0) return + + const { sdk, handle: session } = await acquireNativeSession() + if (!sdk.abi.modern) return + + for (const k of known) { + if (registry.has(k.id)) continue + const out: unknown[] = [null] + const err: (string | null)[] = [null] + const keep = new Keep() + // oxlint-disable-next-line no-await-in-loop -- sequencial de propósito (handles nativos) + const hr = await callNative(sdk.raw['WslcOpenContainer'], session, keep.ansi(k.id), out, err) + if (!hrOk(hr) || !out[0]) { + forgetContainer(k.id) + continue + } + registry.set(k.id, fromKnown(sdk, out[0], k)) + logInfo('native', `Container ${k.id.slice(0, 12)} (${k.name}) reaberto de uma execução anterior`) + } +} + /** Lista os containers do registro com estado real (WslcGetContainerState). */ export async function listNativeContainers(all: boolean): Promise { + await reopenKnownContainers() const result: ContainerInfo[] = [] const newestFirst = Array.from(registry.values()).toSorted((a, b) => b.createdAt - a.createdAt) // oxlint-disable-next-line no-await-in-loop -- sequencial de propósito (handles nativos) @@ -344,7 +421,8 @@ export async function listNativeContainers(all: boolean): Promise { const all = [...registry.values()] if (all.length === 0) return + + const primeiro = all[0] as NativeContainer + if (primeiro.sdk.abi.modern) { + logInfo('native', `Mantendo ${all.length} container(s) nativo(s) — serão reabertos na próxima execução`) + await Promise.allSettled(all.map((c) => releaseLocal(c))) + return + } + logInfo('native', `Removendo ${all.length} container(s) nativo(s) no fechamento do app`) let cap: NodeJS.Timeout | undefined await Promise.race([ @@ -625,6 +721,8 @@ export async function resetNativeSession(): Promise { logWarn('native', 'Reset da sessão nativa solicitado (terminate + wipe do storage)') await Promise.allSettled(Array.from(registry.values()).map((c) => releaseLocal(c))) await terminateNativeSession() + // Apaga o storage inteiro: containers.json mora lá dentro, então a + // memória dos containers vai junto, que é o esperado num reset. const storage = sessionStoragePath() rmSync(storage, { recursive: true, force: true }) mkdirSync(storage, { recursive: true }) diff --git a/src/main/services/wslc/native/crash-dumps.test.ts b/src/main/services/wslc/native/crash-dumps.test.ts index c4a0738..f9f330d 100644 --- a/src/main/services/wslc/native/crash-dumps.test.ts +++ b/src/main/services/wslc/native/crash-dumps.test.ts @@ -8,7 +8,7 @@ import { runNativeContainer } from './containers' import { mapCrashDump, signalName } from './crash-dumps' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' import { releaseNativeSession, setOnNativeCrashDump } from './session' const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) @@ -52,7 +52,7 @@ describe('mapCrashDump (puro)', () => { // Integração real: crash de um processo dentro de um container da sessão // nativa (exige a wslcsdk.dll e a imagem alpine:latest já puxada). -describe.skipIf(locateWslcSdk() === null)('crash dumps (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('crash dumps (integração real via FFI)', () => { afterAll(async () => { setOnNativeCrashDump(() => {}) await cleanupNativeContainers() diff --git a/src/main/services/wslc/native/image-ops.test.ts b/src/main/services/wslc/native/image-ops.test.ts index 13552b7..45827b6 100644 --- a/src/main/services/wslc/native/image-ops.test.ts +++ b/src/main/services/wslc/native/image-ops.test.ts @@ -6,7 +6,7 @@ import { afterAll, beforeAll, describe, expect, it } from 'vitest' import type { StreamDataEvent, StreamExitEvent, StreamProgressEvent } from '@shared/schemas' import { stopStream, type StreamSink } from '../streams' import { importNativeImage, pullNativeImage, pushNativeImage, tagNativeImage } from './image-ops' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' import { listNativeImages, releaseNativeSession, removeNativeImage } from './session' const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) @@ -46,7 +46,7 @@ async function hasImage(name: string): Promise { // Integração real: pull com progresso estruturado, tag e import de tarball na // sessão nativa (exige a wslcsdk.dll e rede para o Docker Hub). -describe.skipIf(locateWslcSdk() === null)('imagens nativas (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('imagens nativas (integração real via FFI)', () => { beforeAll(async () => { // Sobra de execução anterior invalidaria o teste de cancelamento. await removeNativeImage('busybox:latest').catch(() => null) diff --git a/src/main/services/wslc/native/install.test.ts b/src/main/services/wslc/native/install.test.ts index 405cc55..7ed5e42 100644 --- a/src/main/services/wslc/native/install.test.ts +++ b/src/main/services/wslc/native/install.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import type { InstallProgressEvent } from '@shared/schemas' import { componentLabel, installNativeComponents } from './install' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' describe('componentLabel (puro)', () => { it('nomeia os componentes conhecidos', () => { @@ -17,7 +17,7 @@ describe('componentLabel (puro)', () => { // Integração real: nesta máquina (completa) a instalação guiada é um no-op // idempotente — S_OK sem nenhum callback de progresso (validado por probe). -describe.skipIf(locateWslcSdk() === null)('instalação guiada (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('instalação guiada (integração real via FFI)', () => { it('é idempotente em máquina completa (ok, sem progresso)', { timeout: 60_000 }, async () => { const events: InstallProgressEvent[] = [] const res = await installNativeComponents((ev) => events.push(ev)) diff --git a/src/main/services/wslc/native/install.ts b/src/main/services/wslc/native/install.ts index b34ff4c..22fc1b4 100644 --- a/src/main/services/wslc/native/install.ts +++ b/src/main/services/wslc/native/install.ts @@ -6,7 +6,8 @@ import { loadWslcSdk, registerCallback, unregisterCallback, - WSLC_COMPONENT_FLAGS + WSLC_COMPONENT_FLAGS, + WSLC_INSTALL_OPTIONS } from './bindings' import { locateWslcSdk } from './locate' import { callNative } from './session' @@ -59,7 +60,18 @@ export async function installNativeComponents( onProgress({ component: componentLabel(component), step, total }) } cbId = registerCallback(cb as never, sdk.types['InstallCallback']) - const hr = await callNative(sdk.raw['WslcInstallWithDependencies'], cbId, null) + // A ABI 2.9.9 pede quais componentes instalar (e opções) antes do callback. + // `before` são justamente os que faltam — com 0, a chamada vira no-op, que + // é o mesmo comportamento idempotente da 2.9.3 em máquina completa. + const hr = sdk.abi.modern + ? await callNative( + sdk.raw['WslcInstallWithDependencies'], + before, + WSLC_INSTALL_OPTIONS.NONE, + cbId, + null + ) + : await callNative(sdk.raw['WslcInstallWithDependencies'], cbId, null) if (!hrOk(hr)) { const message = diff --git a/src/main/services/wslc/native/known.test.ts b/src/main/services/wslc/native/known.test.ts new file mode 100644 index 0000000..ea16cf9 --- /dev/null +++ b/src/main/services/wslc/native/known.test.ts @@ -0,0 +1,91 @@ +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { + forgetAllContainers, + forgetContainer, + knownFilePath, + readKnownContainers, + rememberContainer, + type KnownContainer +} from './known' + +let dir: string +let file: string + +const container = (id: string, name = id): KnownContainer => ({ + id, + name, + image: 'alpine:latest', + command: 'sh', + createdAt: 1_700_000_000_000, + portsDisplay: '', + autoRemove: false +}) + +beforeEach(() => { + dir = mkdtempSync(join(tmpdir(), 'wslc-known-')) + file = knownFilePath(dir) +}) + +afterEach(() => { + rmSync(dir, { recursive: true, force: true }) +}) + +describe('readKnownContainers', () => { + it('devolve lista vazia quando o arquivo não existe', () => { + expect(readKnownContainers(file)).toEqual([]) + }) + + // O arquivo mora no storage da sessão, que o reset apaga inteiro — ler um + // resto corrompido não pode derrubar a listagem de containers. + it('devolve lista vazia com JSON podre', () => { + writeFileSync(file, '{isso não é json', 'utf8') + expect(readKnownContainers(file)).toEqual([]) + }) + + it('ignora entradas sem id ou nome', () => { + writeFileSync(file, JSON.stringify([container('abc'), { image: 'x' }, null, 'texto']), 'utf8') + expect(readKnownContainers(file).map((c) => c.id)).toEqual(['abc']) + }) +}) + +describe('rememberContainer', () => { + it('acrescenta e persiste', () => { + rememberContainer(container('a1'), file) + rememberContainer(container('b2'), file) + expect(readKnownContainers(file).map((c) => c.id)).toEqual(['a1', 'b2']) + expect(JSON.parse(readFileSync(file, 'utf8'))).toHaveLength(2) + }) + + it('substitui a entrada do mesmo id em vez de duplicar', () => { + rememberContainer(container('a1', 'antigo'), file) + rememberContainer(container('a1', 'novo'), file) + const lista = readKnownContainers(file) + expect(lista).toHaveLength(1) + expect(lista[0]?.name).toBe('novo') + }) +}) + +describe('forgetContainer', () => { + it('remove só o id pedido', () => { + rememberContainer(container('a1'), file) + rememberContainer(container('b2'), file) + forgetContainer('a1', file) + expect(readKnownContainers(file).map((c) => c.id)).toEqual(['b2']) + }) + + it('id inexistente não mexe no arquivo', () => { + rememberContainer(container('a1'), file) + const antes = readFileSync(file, 'utf8') + forgetContainer('nao-existe', file) + expect(readFileSync(file, 'utf8')).toBe(antes) + }) + + it('forgetAll esvazia', () => { + rememberContainer(container('a1'), file) + forgetAllContainers(file) + expect(readKnownContainers(file)).toEqual([]) + }) +}) diff --git a/src/main/services/wslc/native/known.ts b/src/main/services/wslc/native/known.ts new file mode 100644 index 0000000..6880e0b --- /dev/null +++ b/src/main/services/wslc/native/known.ts @@ -0,0 +1,80 @@ +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs' +import { dirname, join } from 'node:path' +import { sessionStoragePath } from './session' + +/** + * Containers nativos que este app criou, lembrados entre execuções. + * + * Por que um arquivo, e não só memória: o SDK **não enumera containers**. Nem + * na 2.9.9 — ela ganhou `WslcOpenContainer`, que abre um container por nome ou + * ID, mas continua não havendo "liste tudo". Então, para reencontrar o que o + * app criou, o app precisa lembrar os nomes. + * + * Isso é o que permite os containers nativos SOBREVIVEREM ao fechamento do app + * (na ABI 2.9.3 eles eram apagados na saída, senão viravam órfãos permanentes). + * Medido: soltar a sessão derruba os containers em execução para EXITED, mas o + * registro fica, `WslcOpenContainer` reabre por nome numa execução seguinte, e + * `WslcStartContainer` no handle reaberto os põe de volta em RUNNING. + * + * Mora dentro do storage da sessão, e não no settings.json, porque é estado + * DAQUELE storage: o reset da sessão apaga a pasta e leva este arquivo junto, + * que é exatamente o comportamento certo. + */ + +export interface KnownContainer { + /** ID completo (64 hex) — é por ele que o reopen tenta primeiro. */ + id: string + name: string + image: string + command: string + createdAt: number + portsDisplay: string + autoRemove: boolean +} + +export function knownFilePath(storage: string = sessionStoragePath()): string { + return join(storage, 'containers.json') +} + +export function readKnownContainers(file: string = knownFilePath()): KnownContainer[] { + try { + const parsed: unknown = JSON.parse(readFileSync(file, 'utf8')) + if (!Array.isArray(parsed)) return [] + return parsed.filter( + (c): c is KnownContainer => + typeof c === 'object' && + c !== null && + typeof (c as KnownContainer).id === 'string' && + typeof (c as KnownContainer).name === 'string' + ) + } catch { + // Sem arquivo, JSON podre ou storage recém-resetado: nada a lembrar. + return [] + } +} + +function write(list: KnownContainer[], file: string): void { + try { + mkdirSync(dirname(file), { recursive: true }) + writeFileSync(file, JSON.stringify(list, null, 2), 'utf8') + } catch { + // Lembrar é melhor-esforço: falhar aqui não pode derrubar a criação de um + // container que já existe de verdade no storage. + } +} + +export function rememberContainer(c: KnownContainer, file: string = knownFilePath()): void { + const list = readKnownContainers(file).filter((k) => k.id !== c.id) + list.push(c) + write(list, file) +} + +export function forgetContainer(id: string, file: string = knownFilePath()): void { + const list = readKnownContainers(file) + const restante = list.filter((k) => k.id !== id) + if (restante.length !== list.length) write(restante, file) +} + +export function forgetAllContainers(file: string = knownFilePath()): void { + write([], file) +} diff --git a/src/main/services/wslc/native/locate.test.ts b/src/main/services/wslc/native/locate.test.ts index 4b5a343..6bc27e5 100644 --- a/src/main/services/wslc/native/locate.test.ts +++ b/src/main/services/wslc/native/locate.test.ts @@ -1,26 +1,72 @@ -import { describe, expect, it } from 'vitest' -import { locateWslcSdk, sdkCandidates } from './locate' +import { afterEach, describe, expect, it } from 'vitest' +import { locateSdk, locateWslcSdk, sdkCandidates, setCustomSdkPath } from './locate' const ENV = { ProgramFiles: 'C:\\Program Files' } as NodeJS.ProcessEnv +const BASE = { env: ENV, appRoot: 'C:\\app', resourcesRoot: null } + +afterEach(() => { + setCustomSdkPath(null) +}) describe('sdkCandidates', () => { - it('prioriza o override, depois a DLL vendorizada, depois o Program Files', () => { - const candidates = sdkCandidates({ ...ENV, WSLC_SDK_DLL: 'D:\\custom\\wslcsdk.dll' }, 'C:\\app') + it('ordena: override, escolha da pessoa, empacotada, Program Files', () => { + const candidates = sdkCandidates({ + ...BASE, + env: { ...ENV, WSLC_SDK_DLL: 'D:\\dev\\wslcsdk.dll' }, + custom: 'E:\\baixada\\wslcsdk.dll' + }) expect(candidates).toEqual([ - 'D:\\custom\\wslcsdk.dll', - 'C:\\app\\vendor\\wslcsdk\\win-x64\\wslcsdk.dll', + { path: 'D:\\dev\\wslcsdk.dll', source: 'env' }, + { path: 'E:\\baixada\\wslcsdk.dll', source: 'custom' }, + { path: 'C:\\app\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll', source: 'bundled' }, + { path: 'C:\\Program Files\\WSL\\wslcsdk.dll', source: 'system' } + ]) + }) + + // No app instalado a DLL vai como extraResource, fora do asar. + it('procura em resources antes do diretório do projeto', () => { + const paths = sdkCandidates({ ...BASE, resourcesRoot: 'C:\\Program Files\\WSLC UI\\resources' }) + expect(paths.map((c) => c.path)).toEqual([ + 'C:\\Program Files\\WSLC UI\\resources\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll', + 'C:\\app\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll', 'C:\\Program Files\\WSL\\wslcsdk.dll' ]) }) + + it('usa o caminho escolhido guardado no módulo quando nenhum é passado', () => { + setCustomSdkPath('E:\\escolhida\\wslcsdk.dll') + expect(sdkCandidates(BASE)[0]).toEqual({ path: 'E:\\escolhida\\wslcsdk.dll', source: 'custom' }) + }) }) -describe('locateWslcSdk', () => { - it('retorna o primeiro candidato existente', () => { - const found = locateWslcSdk(ENV, 'C:\\app', (p) => p.includes('Program Files')) - expect(found).toBe('C:\\Program Files\\WSL\\wslcsdk.dll') +describe('locateSdk', () => { + it('devolve o primeiro que existe, com a origem', () => { + const found = locateSdk({ ...BASE, exists: (p) => p.includes('Program Files') }) + expect(found).toEqual({ path: 'C:\\Program Files\\WSL\\wslcsdk.dll', source: 'system' }) + }) + + it('devolve null quando nada existe', () => { + expect(locateSdk({ ...BASE, exists: () => false })).toBeNull() + expect(locateWslcSdk({ ...BASE, exists: () => false })).toBeNull() }) - it('retorna null quando nada existe', () => { - expect(locateWslcSdk(ENV, 'C:\\app', () => false)).toBeNull() + // A escolha da pessoa pode apontar para um arquivo que sumiu: cai para a + // empacotada em vez de deixar o motor nativo indisponível. + it('ignora a escolha que não existe mais e cai para a empacotada', () => { + setCustomSdkPath('E:\\sumiu\\wslcsdk.dll') + const found = locateSdk({ ...BASE, exists: (p) => p.startsWith('C:\\app') }) + expect(found).toEqual({ + path: 'C:\\app\\vendor\\wslcsdk\\win-x64\\2.9.3\\wslcsdk.dll', + source: 'bundled' + }) + }) +}) + +describe('escolha da DLL empacotada', () => { + it('acompanha a versão do WSL informada', () => { + const nova = sdkCandidates({ ...BASE, wslVersion: '2.9.9' }) + expect(nova.find((c) => c.source === 'bundled')?.path).toContain('2.9.9') + const antiga = sdkCandidates({ ...BASE, wslVersion: '2.9.4' }) + expect(antiga.find((c) => c.source === 'bundled')?.path).toContain('2.9.3') }) }) diff --git a/src/main/services/wslc/native/locate.ts b/src/main/services/wslc/native/locate.ts index 2565d24..c1850bb 100644 --- a/src/main/services/wslc/native/locate.ts +++ b/src/main/services/wslc/native/locate.ts @@ -1,28 +1,95 @@ import { existsSync } from 'node:fs' import { join } from 'node:path' +import type { SdkSource } from '@shared/schemas' +import { bundledPath, detectWslVersion, pickBundledSdk } from './bundled' /** - * Candidatos à wslcsdk.dll, em ordem de preferência: - * 1. Override explícito (WSLC_SDK_DLL) - * 2. DLL vendorizada com o app (vendor/wslcsdk, vinda do NuGet Microsoft.WSL.Containers) - * 3. Instalação do WSL em Program Files + * Onde achar a wslcsdk.dll, e de onde ela veio. + * + * A procedência importa porque a versão da DLL decide se o motor nativo + * funciona — e, pior, decide COMO chamá-la: entre 2.9.3 e 2.9.9 duas + * assinaturas mudaram (ver SdkAbi em bindings.ts). Por isso a aba Sistema + * mostra o caminho e a origem, e deixa escolher outra DLL. */ -export function sdkCandidates( - env: NodeJS.ProcessEnv = process.env, - appRoot: string = process.cwd() -): string[] { - const candidates: string[] = [] + +export interface SdkLocation { + path: string + source: SdkSource +} + +/** + * Caminho escolhido pela pessoa na aba Sistema (persistido no settings.json). + * + * Fica em módulo, e não em parâmetro, porque `locateWslcSdk()` é chamado de + * uma dúzia de lugares que não têm — nem deveriam ter — acesso às settings. + * O main injeta na subida e a cada troca. + */ +let customPath: string | null = null + +export function setCustomSdkPath(path: string | null): void { + customPath = path +} + +export function getCustomSdkPath(): string | null { + return customPath +} + +export interface LocateOptions { + env?: NodeJS.ProcessEnv + /** Raiz do projeto em desenvolvimento (cwd). */ + appRoot?: string + /** `process.resourcesPath` no app empacotado; a DLL vai como extraResource. */ + resourcesRoot?: string | null + /** Sobrepõe o caminho escolhido pela pessoa (testes). */ + custom?: string | null + /** + * Versão do WSL, que decide QUAL DLL empacotada usar (ver bundled.ts). + * Ausente = pergunta à DLL base, memoizado por processo. + */ + wslVersion?: string | null + exists?: (p: string) => boolean +} + +/** + * Candidatos, em ordem de precedência: + * 1. `WSLC_SDK_DLL` — override de desenvolvimento, usado por scripts e sondas + * 2. escolha da pessoa na aba Sistema + * 3. DLL empacotada com o app (resources no instalado, vendor/ no dev) + * 4. instalação do WSL em Program Files + */ +export function sdkCandidates(options: LocateOptions = {}): SdkLocation[] { + const { + env = process.env, + appRoot = process.cwd(), + resourcesRoot = (process as { resourcesPath?: string }).resourcesPath ?? null, + custom = customPath + } = options + + const candidates: SdkLocation[] = [] const override = env['WSLC_SDK_DLL'] - if (override) candidates.push(override) - candidates.push(join(appRoot, 'vendor', 'wslcsdk', 'win-x64', 'wslcsdk.dll')) - candidates.push(join(env['ProgramFiles'] ?? 'C:\\Program Files', 'WSL', 'wslcsdk.dll')) + if (override) candidates.push({ path: override, source: 'env' }) + if (custom) candidates.push({ path: custom, source: 'custom' }) + + // Empacotadas: QUAL delas depende da versão do WSL — ver bundled.ts. + const roots = resourcesRoot ? [resourcesRoot, appRoot] : [appRoot] + const wsl = options.wslVersion === undefined ? detectWslVersion(roots, options.exists) : options.wslVersion + const escolhida = pickBundledSdk(wsl) + for (const root of roots) candidates.push({ path: bundledPath(escolhida, root), source: 'bundled' }) + + candidates.push({ + path: join(env['ProgramFiles'] ?? 'C:\\Program Files', 'WSL', 'wslcsdk.dll'), + source: 'system' + }) return candidates } -export function locateWslcSdk( - env: NodeJS.ProcessEnv = process.env, - appRoot: string = process.cwd(), - exists: (p: string) => boolean = existsSync -): string | null { - return sdkCandidates(env, appRoot).find((p) => exists(p)) ?? null +/** Primeiro candidato que existe em disco, com a origem. */ +export function locateSdk(options: LocateOptions = {}): SdkLocation | null { + const exists = options.exists ?? existsSync + return sdkCandidates(options).find((c) => exists(c.path)) ?? null +} + +/** Só o caminho — a forma usada pela maior parte do código nativo. */ +export function locateWslcSdk(options: LocateOptions = {}): string | null { + return locateSdk(options)?.path ?? null } diff --git a/src/main/services/wslc/native/probe.ts b/src/main/services/wslc/native/probe.ts new file mode 100644 index 0000000..8adbe47 --- /dev/null +++ b/src/main/services/wslc/native/probe.ts @@ -0,0 +1,81 @@ +import { createHash } from 'node:crypto' +import { readFileSync, statSync } from 'node:fs' +import type { SdkProbe } from '@shared/schemas' +import { HR_SDK_UPDATE_NEEDED, probeWslcSdk } from './bindings' +import { missingComponentNames } from './status' + +/** + * Sonda uma wslcsdk.dll escolhida pela pessoa, antes de o app adotá-la. + * + * Existe porque a versão da DLL decide se o motor nativo funciona — e nem o + * SDK nem o arquivo dizem qual versão são: `WslcGetVersion` devolve a versão + * do WSL instalado (o mesmo número para binários diferentes) e a DLL não traz + * metadados. Então a sonda mede o que dá: o SHA-256 identifica o binário, e a + * ABI sai da presença do símbolo `WslcOpenContainer` (ver SdkAbi). + * + * Carregar uma DLL arbitrária é a parte arriscada, e por isso tudo aqui está + * sob try: arquivo que não é DLL, DLL que não é a wslcsdk, ou uma wslcsdk de + * uma versão que não exporta o que esperamos — os três viram `ok: false` com + * o motivo, nunca uma exceção subindo para o IPC. + */ +const noop = (): void => undefined + +export function probeSdkFile(path: string): SdkProbe { + const base: SdkProbe = { + path, + ok: false, + wslVersion: null, + abi: null, + sizeBytes: null, + sha256: null, + missingComponents: [], + detail: '' + } + + let sizeBytes: number | null = null + let sha256: string | null = null + try { + sizeBytes = statSync(path).size + sha256 = createHash('sha256').update(readFileSync(path)).digest('hex') + } catch (e) { + return { ...base, detail: `Não consegui ler o arquivo: ${(e as Error).message}` } + } + + let unload = noop + try { + const probe = probeWslcSdk(path) + unload = probe.unload + const version = probe.sdk.version() + const missing = missingComponentNames(probe.sdk.missingComponents()) + return { + path, + ok: true, + wslVersion: `${version.major}.${version.minor}.${version.revision}`, + abi: probe.sdk.abi.label, + sizeBytes, + sha256, + missingComponents: missing, + detail: + missing.length === 0 + ? `DLL válida, ABI ${probe.sdk.abi.label}.` + : `DLL válida (ABI ${probe.sdk.abi.label}), mas há componentes faltando.` + } + } catch (e) { + return { + ...base, + sizeBytes, + sha256, + detail: (e instanceof Error ? e.message : String(e)).includes(HR_SDK_UPDATE_NEEDED) + ? 'Esta DLL é antiga demais para o WSL instalado (WSLC_E_SDK_UPDATE_NEEDED).' + : `Não é uma wslcsdk.dll utilizável: ${e instanceof Error ? e.message : String(e)}` + } + } finally { + // Não deixa a candidata carregada no processo; a em uso é preservada + // pelo próprio unload (ver probeWslcSdk). + try { + unload() + } catch { + // descarregar é melhor-esforço: falhar aqui não invalida a sonda + } + } +} diff --git a/src/main/services/wslc/native/registry.test.ts b/src/main/services/wslc/native/registry.test.ts index b9bf475..86fc1ad 100644 --- a/src/main/services/wslc/native/registry.test.ts +++ b/src/main/services/wslc/native/registry.test.ts @@ -1,5 +1,5 @@ import { afterAll, describe, expect, it } from 'vitest' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' import { clearRegistryCredentials, DEFAULT_REGISTRY, @@ -65,7 +65,7 @@ describe('logoutNativeRegistry (memória, sem SDK)', () => { }) // Integração real: WslcSessionAuthenticate contra o Docker Hub (exige rede). -describe.skipIf(locateWslcSdk() === null)('login nativo (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('login nativo (integração real via FFI)', () => { afterAll(() => { clearRegistryCredentials() releaseNativeSession() diff --git a/src/main/services/wslc/native/registry.ts b/src/main/services/wslc/native/registry.ts index 15a4a27..a0976c5 100644 --- a/src/main/services/wslc/native/registry.ts +++ b/src/main/services/wslc/native/registry.ts @@ -100,6 +100,9 @@ export async function loginNativeRegistry( const { sdk, handle: session } = await acquireNativeSession() const tokenOut: (string | null)[] = [null] const errOut: (string | null)[] = [null] + // A ABI 2.9.9 encaixou `tokenType` entre o token e o errorMessage; sem este + // desvio, a DLL nova escreveria o enum onde mora o ponteiro de erro. + const tokenTypeOut = [0] const hr = await callNative( sdk.raw['WslcSessionAuthenticate'], session, @@ -107,6 +110,7 @@ export async function loginNativeRegistry( keep.ansi(username), keep.ansi(password), tokenOut, + ...(sdk.abi.modern ? [tokenTypeOut] : []), errOut ) if (!hrOk(hr)) { diff --git a/src/main/services/wslc/native/session.test.ts b/src/main/services/wslc/native/session.test.ts index c1b79eb..bdaba6d 100644 --- a/src/main/services/wslc/native/session.test.ts +++ b/src/main/services/wslc/native/session.test.ts @@ -1,6 +1,6 @@ import { afterAll, describe, expect, it } from 'vitest' import { imageSchema } from '@shared/schemas' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' import { ensureNativeSession, isNativeSessionActive, @@ -25,7 +25,7 @@ describe('sessionStoragePath', () => { // Integração real: roda apenas nas máquinas com a wslcsdk.dll (cria/solta a // sessão "WslcUi" de verdade — a mesma que o app usa). -describe.skipIf(locateWslcSdk() === null)('sessão nativa (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('sessão nativa (integração real via FFI)', () => { afterAll(() => { releaseNativeSession() }) diff --git a/src/main/services/wslc/native/status.test.ts b/src/main/services/wslc/native/status.test.ts index 7d23ba2..ee5834f 100644 --- a/src/main/services/wslc/native/status.test.ts +++ b/src/main/services/wslc/native/status.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { locateWslcSdk } from './locate' -import { getNativeStatus, missingComponentNames } from './status' +import { pickBundledSdk } from './bundled' +import { getNativeStatus, missingComponentNames, isNativeUsable } from './status' describe('missingComponentNames', () => { it('mapeia os flags para nomes amigáveis', () => { @@ -12,11 +12,22 @@ describe('missingComponentNames', () => { // Integração real com a wslcsdk.dll — roda apenas onde a DLL existir // (vendorizada no repo, então normalmente roda). -describe.skipIf(locateWslcSdk() === null)('wslcsdk via FFI (integração)', () => { +describe.skipIf(!isNativeUsable())('wslcsdk via FFI (integração)', () => { it('carrega a DLL, inicializa COM e lê versão/componentes', () => { const status = getNativeStatus() expect(status.available).toBe(true) - expect(status.sdkVersion).toMatch(/^\d+\.\d+\.\d+$/) + // É a versão do WSL instalado, não a da DLL — ver nativeStatusSchema. + expect(status.wslVersion).toMatch(/^\d+\.\d+\.\d+$/) expect(status.dllPath).toContain('wslcsdk.dll') + expect(status.sizeBytes).toBeGreaterThan(0) + }) + + // O app leva duas DLLs e escolhe pela versão do WSL (ver bundled.ts). O teste + // não fixa qual: fixa a REGRA, para valer em qualquer máquina. + it('usa a DLL empacotada compatível com o WSL desta máquina', () => { + const status = getNativeStatus() + const esperada = pickBundledSdk(status.wslVersion) + expect(status.dllPath).toContain(esperada.version) + expect(status.abi).toBe(esperada.version === '2.9.9' ? '2.9.9+' : '2.9.3') }) }) diff --git a/src/main/services/wslc/native/status.ts b/src/main/services/wslc/native/status.ts index 946a7ec..0469f67 100644 --- a/src/main/services/wslc/native/status.ts +++ b/src/main/services/wslc/native/status.ts @@ -1,6 +1,7 @@ +import { statSync } from 'node:fs' import type { NativeStatus } from '@shared/schemas' -import { hrHex, loadWslcSdk, WSLC_COMPONENT_FLAGS } from './bindings' -import { locateWslcSdk } from './locate' +import { HR_SDK_UPDATE_NEEDED, hrHex, loadWslcSdk, WSLC_COMPONENT_FLAGS } from './bindings' +import { locateSdk } from './locate' /** Nomes amigáveis dos componentes que podem faltar. */ export function missingComponentNames(flags: number): string[] { @@ -11,18 +12,47 @@ export function missingComponentNames(flags: number): string[] { return names } -/** Sonda a API nativa (wslcsdk.dll): presença, versão do SDK e componentes. */ +function fileSize(path: string): number | null { + try { + return statSync(path).size + } catch { + return null + } +} + +/** + * Mensagem acionável para uma DLL que não serve a este WSL. + * + * O caso comum não é arquivo corrompido: é versão trocada. Dizer só + * "0x8004060B" manda a pessoa pesquisar; dizer o que fazer resolve. + */ +function sdkFailureDetail(e: unknown): string { + const msg = e instanceof Error ? e.message : hrHex(Number(e)) + if (msg.includes(HR_SDK_UPDATE_NEEDED)) { + return ( + 'Esta wslcsdk.dll é antiga demais para o WSL instalado (WSLC_E_SDK_UPDATE_NEEDED). ' + + 'Atualize o WSL, ou escolha outra DLL aqui em Sistema.' + ) + } + return `Falha ao carregar/consultar o SDK: ${msg}` +} + +/** Sonda a API nativa (wslcsdk.dll): presença, origem, ABI e componentes. */ export function getNativeStatus(): NativeStatus { - const dllPath = locateWslcSdk() - if (!dllPath) { + const found = locateSdk() + if (!found) { return { available: false, dllPath: null, - sdkVersion: null, + source: null, + wslVersion: null, + abi: null, + sizeBytes: null, missingComponents: [], - detail: 'wslcsdk.dll não encontrada (vendor/wslcsdk ou C:\\Program Files\\WSL).' + detail: 'wslcsdk.dll não encontrada (empacotada com o app ou C:\\Program Files\\WSL).' } } + const { path: dllPath, source } = found try { const sdk = loadWslcSdk(dllPath) const version = sdk.version() @@ -31,7 +61,10 @@ export function getNativeStatus(): NativeStatus { return { available: true, dllPath, - sdkVersion: `${version.major}.${version.minor}.${version.revision}`, + source, + wslVersion: `${version.major}.${version.minor}.${version.revision}`, + abi: sdk.abi.label, + sizeBytes: fileSize(dllPath), missingComponents: missing, detail: missing.length === 0 @@ -42,9 +75,25 @@ export function getNativeStatus(): NativeStatus { return { available: false, dllPath, - sdkVersion: null, + source, + wslVersion: null, + abi: null, + sizeBytes: fileSize(dllPath), missingComponents: [], - detail: `Falha ao carregar/consultar o SDK: ${e instanceof Error ? e.message : hrHex(Number(e))}` + detail: sdkFailureDetail(e) } } } + +/** + * O motor nativo é utilizável NESTA máquina? Guarda dos testes de integração. + * + * Era `locateWslcSdk() === null`, e funcionava por acidente: a DLL não era + * versionada, então no CI ela não existia e a suíte pulava. Ao empacotar o SDK + * no repositório, o arquivo passou a existir em qualquer runner — mas o WSL + * não. Presença de arquivo nunca foi a pergunta certa; a pergunta é se o SDK + * responde, e é isso que `available` mede (carrega a DLL e pede a versão). + */ +export function isNativeUsable(): boolean { + return getNativeStatus().available +} diff --git a/src/main/services/wslc/native/terminal.test.ts b/src/main/services/wslc/native/terminal.test.ts index 8e3b07c..35dedfa 100644 --- a/src/main/services/wslc/native/terminal.test.ts +++ b/src/main/services/wslc/native/terminal.test.ts @@ -2,7 +2,7 @@ import { afterAll, describe, expect, it } from 'vitest' import type { TerminalDataEvent, TerminalExitEvent } from '@shared/schemas' import { closeTerminal, writeTerminal } from '../terminals' import { cleanupNativeContainers, runNativeContainer } from './containers' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' import { releaseNativeSession } from './session' import { openNativeTerminal } from './terminal' @@ -32,7 +32,7 @@ function memorySink(): MemorySink { // Integração real: shell persistente via bridge FIFO dentro de um container // nativo (exige a wslcsdk.dll e a imagem alpine:latest na sessão nativa). -describe.skipIf(locateWslcSdk() === null)('terminal nativo (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('terminal nativo (integração real via FFI)', () => { afterAll(async () => { await cleanupNativeContainers() releaseNativeSession() diff --git a/src/main/services/wslc/native/volumes.test.ts b/src/main/services/wslc/native/volumes.test.ts index a3d617d..4ab11bc 100644 --- a/src/main/services/wslc/native/volumes.test.ts +++ b/src/main/services/wslc/native/volumes.test.ts @@ -1,7 +1,7 @@ import { existsSync } from 'node:fs' import { join } from 'node:path' import { afterAll, describe, expect, it } from 'vitest' -import { locateWslcSdk } from './locate' +import { isNativeUsable } from './status' import { releaseNativeSession } from './session' import { createNativeVolume, @@ -34,7 +34,7 @@ describe('vhdxToVolume (mapeamento puro)', () => { }) // Integração real: cria/lista/remove volumes VHDX na sessão nativa. -describe.skipIf(locateWslcSdk() === null)('volumes VHD nativos (integração real via FFI)', () => { +describe.skipIf(!isNativeUsable())('volumes VHD nativos (integração real via FFI)', () => { const NAME = 'wslcui-teste-vol' afterAll(async () => { diff --git a/src/main/services/wslc/ops.ts b/src/main/services/wslc/ops.ts index b56d070..3332fcf 100644 --- a/src/main/services/wslc/ops.ts +++ b/src/main/services/wslc/ops.ts @@ -11,6 +11,7 @@ import type { NativeTuning, RegistryImage, RunContainerOptions, + SdkProbe, VhdVolumeOptions, VolumeInfo } from '@shared/schemas' @@ -45,8 +46,14 @@ export interface NativeOps { setTuning(tuning: NativeTuning): void setOnSessionEnded(cb: (reason: NativeSessionEndedEvent['reason']) => void): void setOnCrashDump(cb: (ev: NativeCrashDumpEvent) => void): void - /** Sonda a DLL: presença, versão e componentes faltando (não exige sessão). */ + /** Sonda a DLL: presença, origem, ABI e componentes faltando (não exige sessão). */ status(): NativeStatus + /** Caminho da DLL escolhida na aba Sistema (null = a empacotada com o app). */ + getSdkPath(): string | null + /** Passa a usar outra DLL. Só vale de fato na próxima abertura do app. */ + setSdkPath(path: string | null): void + /** Lê versão, ABI e SHA-256 de uma DLL candidata, sem adotá-la. */ + probeSdk(path: string): SdkProbe /** Instalação guiada dos componentes (só precisa da DLL, não da sessão). */ install(onProgress: (ev: InstallProgressEvent) => void): Promise diff --git a/src/main/services/wslc/real-ops.ts b/src/main/services/wslc/real-ops.ts index df68ffe..ec99713 100644 --- a/src/main/services/wslc/real-ops.ts +++ b/src/main/services/wslc/real-ops.ts @@ -23,6 +23,8 @@ import { tagNativeImage } from './native/image-ops' import { installNativeComponents } from './native/install' +import { getCustomSdkPath, setCustomSdkPath } from './native/locate' +import { probeSdkFile } from './native/probe' import { loginNativeRegistry, logoutNativeRegistry } from './native/registry' import { ensureNativeSession, @@ -62,6 +64,9 @@ const nativeOps: NativeOps = { setOnSessionEnded: setOnNativeSessionEnded, setOnCrashDump: setOnNativeCrashDump, status: getNativeStatus, + getSdkPath: getCustomSdkPath, + setSdkPath: setCustomSdkPath, + probeSdk: probeSdkFile, install: installNativeComponents, listContainers: listNativeContainers, diff --git a/src/main/settings.ts b/src/main/settings.ts index 24e378e..98614b2 100644 --- a/src/main/settings.ts +++ b/src/main/settings.ts @@ -59,3 +59,26 @@ export function readNativeTuning(file: string, io: SettingsIo = defaultIo): Nati export function writeNativeTuning(file: string, tuning: NativeTuning, io: SettingsIo = defaultIo): void { io.write(file, JSON.stringify({ ...readAll(file, io), nativeTuning: tuning }, null, 2)) } + +/** + * Caminho da wslcsdk.dll escolhido na aba Sistema. null = usar a empacotada. + * + * Fica no settings.json (e não numa variável de ambiente) porque é escolha de + * quem usa o app, não de quem o desenvolve — e precisa sobreviver ao reinício, + * já que a troca de DLL só vale na próxima abertura. + */ +export function readSdkPath(file: string, io: SettingsIo = defaultIo): string | null { + try { + const parsed: unknown = JSON.parse(io.read(file)) + const value = (parsed as { sdkPath?: unknown }).sdkPath + return typeof value === 'string' && value.trim() !== '' ? value : null + } catch { + return null + } +} + +export function writeSdkPath(file: string, path: string | null, io: SettingsIo = defaultIo): void { + const atual = readAll(file, io) + if (path === null) delete atual['sdkPath'] + io.write(file, JSON.stringify(path === null ? atual : { ...atual, sdkPath: path }, null, 2)) +} diff --git a/src/preload/index.ts b/src/preload/index.ts index 7ee54f5..85aadd0 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -68,6 +68,9 @@ const api: WslcApi = { getNativeTuning: () => invoke('system:get-native-tuning', undefined), setNativeTuning: (tuning) => invoke('system:set-native-tuning', tuning), restartNativeSession: () => invoke('system:restart-native', undefined), + sdkPath: () => invoke('system:sdk-path', undefined), + pickSdk: () => invoke('system:pick-sdk', undefined), + setSdkPath: (path) => invoke('system:set-sdk-path', { path }), getNativeStatus: () => invoke('system:native-status', undefined), getEngine: () => invoke('system:get-engine', undefined), setEngine: (engine) => invoke('system:set-engine', { engine }), diff --git a/src/renderer/src/features/setup/SetupView.test.tsx b/src/renderer/src/features/setup/SetupView.test.tsx index e54d3c1..e708573 100644 --- a/src/renderer/src/features/setup/SetupView.test.tsx +++ b/src/renderer/src/features/setup/SetupView.test.tsx @@ -17,7 +17,10 @@ const envIncompleto: WslcEnvironment = { const nativeStatus = (available: boolean) => ({ available, dllPath: available ? 'C:\\vendor\\wslcsdk.dll' : null, - sdkVersion: available ? '2.9.4' : null, + source: available ? ('bundled' as const) : null, + wslVersion: available ? '2.9.4' : null, + abi: available ? '2.9.9+' : null, + sizeBytes: available ? 4_929_888 : null, missingComponents: [], detail: 'teste' }) diff --git a/src/renderer/src/features/system/SystemView.tsx b/src/renderer/src/features/system/SystemView.tsx index 8eb0471..89812c1 100644 --- a/src/renderer/src/features/system/SystemView.tsx +++ b/src/renderer/src/features/system/SystemView.tsx @@ -1,6 +1,6 @@ import { useCallback, useEffect, useState } from 'react' -import { FileCog, ListTree, Power, RefreshCw, RotateCcw, Save, Undo2 } from 'lucide-react' -import type { NativeTuning, WslcSessionInfo } from '@shared/schemas' +import { FileCog, FolderSearch, ListTree, Power, RefreshCw, RotateCcw, Save, Undo2 } from 'lucide-react' +import type { NativeStatus, NativeTuning, WslcSessionInfo } from '@shared/schemas' import { Button, Cell, @@ -27,6 +27,14 @@ import { useEngineStore } from '@/stores/engine-store' import { useEnvStore } from '@/stores/env-store' import { useNativeStore } from '@/stores/native-store' +/** Rótulo de onde a DLL em uso saiu (nativeStatus.source). */ +const SDK_SOURCES: Record, string> = { + bundled: 'empacotada com o app', + custom: 'escolhida por você', + system: 'instalação do WSL', + env: 'WSLC_SDK_DLL (ambiente)' +} + const LINKS = [ { href: 'https://learn.microsoft.com/windows/wsl/wsl-container', @@ -115,6 +123,8 @@ export default function SystemView(): React.JSX.Element { const [vhdSizeMb, setVhdSizeMb] = useState('') const [gpu, setGpu] = useState(false) const [savingTuning, setSavingTuning] = useState(false) + const [sdkPath, setSdkPath] = useState(null) + const [pickingSdk, setPickingSdk] = useState(false) const refreshSessions = useCallback((): void => { window.wslcApi @@ -127,6 +137,10 @@ export default function SystemView(): React.JSX.Element { void refreshNative() void loadEngine() refreshSessions() + window.wslcApi + .sdkPath() + .then(setSdkPath) + .catch(() => setSdkPath(null)) window.wslcApi .getNativeTuning() .then((t: NativeTuning) => { @@ -138,6 +152,36 @@ export default function SystemView(): React.JSX.Element { .catch(() => undefined) }, [refreshNative, loadEngine, refreshSessions]) + /** + * Escolher outra wslcsdk.dll. A sonda roda ANTES de gravar: um arquivo que + * não é a DLL certa é recusado aqui, e não vira um motor nativo quebrado na + * próxima abertura. + */ + const pickSdk = async (): Promise => { + setPickingSdk(true) + try { + const probe = await window.wslcApi.pickSdk() + if (probe === null) return + if (!probe.ok) { + toast.danger(probe.detail) + return + } + await window.wslcApi.setSdkPath(probe.path) + setSdkPath(probe.path) + toast.success(`DLL ${probe.abi} escolhida. Reabra o app para passar a usá-la.`) + } catch (e) { + toast.danger(e instanceof Error ? e.message : String(e)) + } finally { + setPickingSdk(false) + } + } + + const useBundledSdk = async (): Promise => { + await window.wslcApi.setSdkPath(null) + setSdkPath(null) + toast.success('Voltando para a DLL empacotada. Reabra o app para aplicar.') + } + const saveTuning = async (): Promise => { const tuning: NativeTuning = { cpuCount: parseField(cpuCount), @@ -312,11 +356,12 @@ export default function SystemView(): React.JSX.Element { : 'criada na primeira operação' : 'inativa'} - - {native?.sdkVersion ?? '-'} + + {native?.wslVersion ?? '-'} + - - {native?.dllPath ?? '-'} + + {native?.abi ?? '-'} {native && native.missingComponents.length > 0 && ( {native.missingComponents.join(', ')} @@ -331,10 +376,59 @@ export default function SystemView(): React.JSX.Element { pull e push com progresso por camada, login em registry, tag, load/import de tarball, remover) e volumes VHDX (tamanho, tipo e dono) usam a sessão própria do app ("WslcUi") via FFI. Crashes de processos nos containers geram um aviso com o caminho do dump (.dmp) coletado pelo WSL. - Como o SDK preview não permite reabrir handles, os containers nativos são removidos quando o app - fecha. Build, save, export, stats e redes nomeadas só existem no motor CLI. + A partir da ABI 2.9.9 os containers nativos SOBREVIVEM ao fechamento do app: eles param, e o app + os reabre pelo nome na próxima execução. Na 2.9.3 eles ainda são removidos na saída, porque sem + reabrir por ID virariam registros órfãos e invisíveis. Build, save, export, stats e redes nomeadas + só existem no motor CLI.

+
+ + wslcsdk.dll em uso + +
+ + {native?.source ? SDK_SOURCES[native.source] : '-'} + {sdkPath !== null && native?.source !== 'custom' && ( + + )} + + + {native?.sizeBytes ? `${(native.sizeBytes / 1024 / 1024).toFixed(1)} MB` : '-'} + +
+ + {native?.dllPath ?? '-'} + +
+ {sdkPath !== null && ( +
+ + {sdkPath} + +
+ )} +
+
+ + {sdkPath !== null && ( + + )} +
+

+ A versão da DLL decide o que o motor nativo consegue fazer, e como o app precisa chamá-la: entre + a 2.9.3 e a 2.9.9 duas funções mudaram de assinatura sem mudar nada visível. O app detecta isso + sozinho pela ABI e se adapta — mas a troca só vale ao reabrir, porque a sessão nativa viva + segura handles da DLL atual. +

+
+
Tuning da sessão nativa diff --git a/src/renderer/src/test/wslc-api.ts b/src/renderer/src/test/wslc-api.ts index 88a2505..175ad74 100644 --- a/src/renderer/src/test/wslc-api.ts +++ b/src/renderer/src/test/wslc-api.ts @@ -62,10 +62,16 @@ export function installWslcApiMock(overrides: Partial = {}): WslcApi { getNativeTuning: vi.fn(async () => ({})), setNativeTuning: vi.fn(async () => undefined), restartNativeSession: vi.fn(async () => okResult()), + sdkPath: vi.fn(async () => null), + pickSdk: vi.fn(async () => null), + setSdkPath: vi.fn(async () => undefined), getNativeStatus: vi.fn(async () => ({ available: false, dllPath: null, - sdkVersion: null, + source: null, + wslVersion: null, + abi: null, + sizeBytes: null, missingComponents: [], detail: 'mock' })), diff --git a/src/shared/ipc/api.ts b/src/shared/ipc/api.ts index ffddf51..b7a6f7d 100644 --- a/src/shared/ipc/api.ts +++ b/src/shared/ipc/api.ts @@ -17,6 +17,7 @@ import type { NetworkInfo, RegistryImage, RunContainerOptions, + SdkProbe, StreamDataEvent, StreamExitEvent, StreamProgressEvent, @@ -92,6 +93,12 @@ export interface WslcApi { setNativeTuning(tuning: NativeTuning): Promise /** Termina e recria a sessão nativa aplicando o tuning (mantém imagens). */ restartNativeSession(): Promise + /** Caminho da wslcsdk.dll escolhida (null = a empacotada com o app). */ + sdkPath(): Promise + /** Abre o diálogo e sonda o arquivo escolhido; null se cancelou. */ + pickSdk(): Promise + /** Grava a escolha — vale na próxima abertura do app. */ + setSdkPath(path: string | null): Promise /** Estado da API nativa (wslcsdk.dll via FFI). */ getNativeStatus(): Promise /** Motor atual (CLI ou nativo) e estado da sessão nativa. */ diff --git a/src/shared/ipc/contract.ts b/src/shared/ipc/contract.ts index faa2891..7d9b177 100644 --- a/src/shared/ipc/contract.ts +++ b/src/shared/ipc/contract.ts @@ -19,6 +19,7 @@ import { networkSchema, registryImageSchema, runContainerOptionsSchema, + sdkProbeSchema, streamDataEventSchema, streamExitEventSchema, streamProgressEventSchema, @@ -173,6 +174,11 @@ export const invokeContract = { // Termina e recria a sessão nativa (mantém imagens; containers são perdidos). 'system:restart-native': { input: z.void(), output: commandResultSchema }, + // Escolha da wslcsdk.dll (a versão dela decide se o motor nativo funciona). + 'system:sdk-path': { input: z.void(), output: z.string().nullable() }, + 'system:pick-sdk': { input: z.void(), output: sdkProbeSchema.nullable() }, + 'system:set-sdk-path': { input: z.object({ path: z.string().nullable() }), output: z.void() }, + 'streams:stop': { input: z.object({ streamId: streamIdSchema }), output: z.void() }, // Terminal embutido: shell interativo dentro do container (os dois motores). diff --git a/src/shared/schemas.ts b/src/shared/schemas.ts index bb896a6..fe288c0 100644 --- a/src/shared/schemas.ts +++ b/src/shared/schemas.ts @@ -181,11 +181,44 @@ export const containerStatsSchema = z.object({ blockIO: z.string() }) +/** De onde saiu a wslcsdk.dll em uso, na ordem de precedência do locate. */ +export const sdkSourceSchema = z.enum(['env', 'custom', 'bundled', 'system']) + /** Estado da API nativa (wslcsdk.dll via FFI). */ export const nativeStatusSchema = z.object({ available: z.boolean(), dllPath: z.string().nullable(), - sdkVersion: z.string().nullable(), + source: sdkSourceSchema.nullable(), + /** + * Versão do WSL **instalado**, como o SDK a reporta. NÃO é a versão da DLL: + * WslcGetVersion devolve o mesmo número para binários diferentes (medido com + * 2.9.3 e 2.9.9 na mesma máquina), e a DLL não traz metadados de arquivo. + */ + wslVersion: z.string().nullable(), + /** ABI detectada por símbolo — '2.9.9+' ou '2.9.3'. Ver SdkAbi. */ + abi: z.string().nullable(), + /** Tamanho da DLL: o único jeito barato de distinguir dois binários. */ + sizeBytes: z.number().nullable(), + missingComponents: z.array(z.string()), + detail: z.string() +}) + +/** + * Resultado de sondar uma wslcsdk.dll candidata, escolhida na aba Sistema. + * + * A sonda carrega a DLL num binding próprio, lê o que ela sabe dizer e a + * descarrega — sem trocar a que está em uso, que só muda ao reabrir o app. + */ +export const sdkProbeSchema = z.object({ + path: z.string(), + /** false = não é uma wslcsdk.dll utilizável (não carregou, faltam símbolos). */ + ok: z.boolean(), + /** Versão do WSL instalado, como ESTA DLL a reporta. */ + wslVersion: z.string().nullable(), + abi: z.string().nullable(), + sizeBytes: z.number().nullable(), + /** Identidade forte do binário — a única forma de distinguir duas DLLs. */ + sha256: z.string().nullable(), missingComponents: z.array(z.string()), detail: z.string() }) @@ -345,6 +378,8 @@ export type ContainerStats = z.infer export type BuildImageOptions = z.infer export type RegistryImage = z.infer export type NativeStatus = z.infer +export type SdkSource = z.infer +export type SdkProbe = z.infer export type Engine = z.infer export type EngineStatus = z.infer export type NativeSessionEndedEvent = z.infer diff --git a/vendor/wslcsdk/LICENSE.txt b/vendor/wslcsdk/LICENSE.txt new file mode 100644 index 0000000..6d74843 --- /dev/null +++ b/vendor/wslcsdk/LICENSE.txt @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) Microsoft Corporation. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE + diff --git a/vendor/wslcsdk/NOTICE.txt b/vendor/wslcsdk/NOTICE.txt new file mode 100644 index 0000000..cda1491 --- /dev/null +++ b/vendor/wslcsdk/NOTICE.txt @@ -0,0 +1,2711 @@ +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + +--------------------------------------------------------- + +llvm/llvm-project d32170dbd5b0d54436537b6b75beaf44324e0c28 - Apache-2.0 WITH LLVM-exception + + +(c) (tm) +(c) Value A +(c) auto AS +(c) Value Sd +(c) auto AST +(c) CXType PT +(c) Type I1Ty +(c) Value RHS +(c) X1 ... X1 +(c) Type I32Ty +(c) Value Elt0 +Copyright 2014 +(c) Type Int8Ty +(c) Type V8x8Ty +(c) Value FMSub +(c) unsigned AS +(c) Constant One +(c) Type FloatTy +(c) Type Int16Ty +(c) Type Int32Ty +(c) Type Int64Ty +(c) Value AllocA +(c) Value Alloca +Alloc1 a1 (c) R1 +Alloc1 a2 (c) R1 +(c) FileID MainID +(c) Lower C Upper +(c) Stmt NumExprs +(c) Type DoubleTy +(c) Type I32PtrTy +(c) Value AllocaA +Coproc, Opc1, CRm +(c) ConstantInt C2 +(c) EUR CHECK-NEXT +(c) Scale 1 Offset +(c) State UNQUOTED +(c) Type IndexType +Copyright (c) 2012 +Copyright (c) 2013 +Copyright (c) 2019 +Exprs new (c) Stmt +(c) ExprResult NewE +(c) Metadata Ops MD +(c) SelectInst SelI +(c) SmallVector MDs +(c) TransferBatch B +(c) Type Int32PtrTy +(c) Type Int64PtrTy +(c) BasicBlock Entry +(c) CXXRecordDecl CD +(c) FunctionType FTy +(c) Offset C- Offset +Copyright 2010 INRIA +Copyright 2011 INRIA +Copyright 2012 INRIA +Copyright 2014 INRIA +Copyright 2015 INRIA +Copyright 2016 INRIA +(c) FunctionType FnTy +(c) QualType ResultTy +(c) SourceRange Range +AsmToks new (c) Token +SubExprs new (c) Stmt +(c) 2008 Red Hat, Inc. +(c) 2011 Anthony Green +(c) BasicBlock EntryBB +(c) FunctionType FFnTy +(c) FunctionType IFnTy +(c) SourceLocation Loc +Condition (c) Branches +Context (c) LineToUnit +Copyright (c) 2013 IBM +(c) ErrMsg Stream Error +(c) SmallVector NewVars +(c) SmallVector ToErase +Bbb kind copyright' Bbb +(c) Constant PosDivisorC +CommonPtr new (c) Common +Copyright (c) 2012 CHECK +(c) CharUnits AlignedSize +(c) Constant NullV2I32Ptr +(c) Constant PosDividendC +Copyright 2010-2011 INRIA +Copyright 2014-2015 INRIA +COPYRIGHT,v 1.3 2003/06/02 +Coproc, Opc1, Rt, Rt2, CRm +Copyright 2003 Google Inc. +Copyright 2008 Google Inc. +Copyright 2009 Google Inc. +Copyright 2015 Google Inc. +Copyright 2018 Google Inc. +Copyright The LLVM project +coprime. APInt A HugePrime +copyrighted by the author. +(c) IdentifierInfo NumExprs +(c) VectorType Int8PtrVecTy +(c) Willem van Schaik, 1999 +Copyright (c) 1997, Phillip +Copyright 2005, Google Inc. +Copyright 2006, Google Inc. +Copyright 2007, Google Inc. +Copyright 2008, Google Inc. +Copyright 2012 Google, Inc. +Copyright 2013, Google Inc. +Copyright 2015, Google Inc. +InitCache (c) TransferBatch +copyright u'2015, LLVM Team +Copyright 2006, Dean Edwards +(c) CHECK-NEXT 194 CHECK-NEXT +(c) CXXBaseSpecifier NumBases +(c) Designator NumDesignators +(c) StringLiteral NumClobbers +Constraints new (c) StringRef +Copyright (c) 2002 Bo Thorsen +Copyright (c) 2010 Apple Inc. +Copyright (c) by P.J. Plauger +Copyright 2010 Zencoder, Inc. +Copyright 2017 Roman Lebedev. +ParamInfo new (c) ParmVarDecl +Copyright (c) 2000 Software AG +Copyright (c) 2002 Roger Sayle +Copyright (c) 2008 David Daney +Copyright (c) 2009 Google Inc. +Copyright (c) 2016 Aaron Watry +Copyright (c) 2017 Google Inc. +Copyright (c) 2018 Jim Ingham. +Copyright 2009 The Go Authors. +Copyright 2010 The Go Authors. +Copyright 2011 The Go Authors. +Copyright 2012 The Go Authors. +Copyright 2013 The Go Authors. +Copyright 2014 The Go Authors. +Copyright 2015 The Go Authors. +(c) (3) educational corporation +(c) CHECK-NEXT foo() CHECK-NEXT +(copr0) ConstantDataVector CDV1 +(copr1) ConstantDataVector CDV2 +Copyright (c) 1994 X Consortium +Copyright (c) 2008 Matteo Frigo +Copyright (c) 2009 Matteo Frigo +Copyright (c) 2010 CodeSourcery +Copyright (c) 2011 Kyle Moffett +Copyright (c) 2011 Tilera Corp. +Copyright (c) 2011 Timothy Wall +Copyright (c) 2012 Peter Harris +Copyright (c) 2012 Tilera Corp. +Copyright 2008-2010 Apple, Inc. +Copyright 2015 Sven Verdoolaege +Copyright 2016 Sven Verdoolaege +Copyright 2017 Sven Verdoolaege +Copyright 2018 Sven Verdoolaege +Copyright, License, and Patents +Other Coprocessor Instructions. +(c) StringLiteral NumConstraints +Copyright (c) 1996 Red Hat, Inc. +Copyright (c) 2002 Ranjit Mathew +Copyright (c) 2004 Anthony Green +Copyright (c) 2004 Simon Posnjak +Copyright (c) 2008 Anthony Green +Copyright (c) 2008 Red Hat, Inc. +Copyright (c) 2011 Anthony Green +Copyright (c) 2012 Anthony Green +Copyright (c) 2014 Red Hat, Inc. +Copyright 2011 Sven Verdoolaege. +(c) foo() pragma omp target teams +Copyright (c) 1992 Henry Spencer. +Copyright (c) 2000 John Hornkvist +Copyright (c) 2001 John Hornkvist +Copyright (c) 2006 Kirill Simonov +Copyright (c) 2012 Alan Hourihane +Copyright 2001-2004 Unicode, Inc. +copyright u'2003- d, LLVM Project +copyright u'2011- d, LLVM Project +(c) CyclesSaved + LocalCyclesSaved +Copyright (c) 1999-2007 Apple Inc. +Copyright (c) 2009 The Go Authors. +Copyright (c) 2009-2019 Polly Team +Copyright (c) 2012 Thorsten Glaser +Copyright (c) 2013 Tensilica, Inc. +Copyright 2012 Universiteit Leiden +Copyright 2016-2017 Tobias Grosser +copyright u'2007- d, The LLDB Team +copyright u'2013- d, Analyzer Team +Constraint new (c) AtomicConstraint +Copyright (c) 1998 Cygnus Solutions +Copyright (c) 1998 Geoffrey Keating +Copyright (c) 2001 David E. O'Brien +Copyright (c) 2013 Mentor Graphics. +Copyright (c) 2015the LLVM Project. +Copyright 2009-2010 The Go Authors. +copyright u'2007- d, The Clang Team +copyright u'2010- d, The Polly Team +copyright u'2011-2018, LLVM Project +Copyright (C ) Microsoft Corporation +Copyright (c) 2000, 2007 Software AG +Copyright (c) 2001 Alexander Peslyak +Copyright (c) 2012, 2013 Xilinx, Inc +Copyright (c) 2014, 2015 Google Inc. +Copyright (c) 2019 The MLIR Authors. +Copyright (c) Microsoft Corporation. +Copyright 2009, 2010 The Go Authors. +Copyright 2015-2016 Sven Verdoolaege +Copyright 2016, 2017 Tobias Grosser. +Copyright 2016-2017 Sven Verdoolaege +(c) PointerType InitPtrType InitValue +Copyright (c) 1996-2003 Red Hat, Inc. +Copyright (c) 1996-2004 Red Hat, Inc. +Copyright (c) 1999-2003 Steve Purcell +Copyright (c) 2012-2016, Yann Collet. +Copyright 2011,2015 Sven Verdoolaege. +Copyright (c) 1996, 1998 Red Hat, Inc. +Copyright (c) 1998, 2008 Red Hat, Inc. +Copyright (c) 1999, 2008 Red Hat, Inc. +Copyright (c) 2004 Renesas Technology. +Copyright (c) 2008 Christian Haggstrom +Copyright (c) 2008, 2010 Red Hat, Inc. +Copyright (c) 2011, 2012 Anthony Green +Copyright (c) 2011, 2013 Anthony Green +Copyright (c) 2011, 2014 Anthony Green +Copyright (c) 2012, 2013 Anthony Green +Copyright (c) 2012, 2014 Anthony Green +Copyright 2007-2010 by the Sphinx team +(c) 2006 Free Software Foundation, Inc. +(c) CHECK-NEXT T break CHECK-NEXT Preds +Copyright (c) 1998, 2012 Andreas Schwab +Copyright (c) 2002-2004 Tim J. Robbins. +Copyright (c) 2005 Free Standards Group +Copyright 2005-2007 Universiteit Leiden +Copyright 2006-2007 Universiteit Leiden +Copyright 2012 Ecole Normale Superieure +Copyright 2013 Ecole Normale Superieure +Copyright 2014 Ecole Normale Superieure +Copyright 2016 Ismael Jimenez Martinez. +Portions Copyright 2009 The Go Authors. +in LLVM, Diploma Thesis, (c) April 2011 +(c) StringRef NumClobbers // FIXME Avoid +Copyright (c) 1996-1998 John D. Polstra. +Copyright (c) 2002-2008, 2012 Kaz Kojima +Copyright (c) 1997-2019 Intel Corporation +Copyright (c) 2005 Axis Communications AB +Copyright (c) 2010-2015 Benjamin Peterson +Copyright 1992, 1993, 1994 Henry Spencer. +coproc_option_imm Operand let PrintMethod +(c) CXXCtorInitializer NumIvarInitializers +Copyright (c) 2000 Hewlett Packard Company +Copyright (c) 2002 Bo Thorsen +Copyright (c) 1996-2003, 2010 Red Hat, Inc. +Copyright (c) 2004 eXtensible Systems, Inc. +Copyright (c) 2009-2014 by the contributors +Copyright (c) 2009-2015 by the contributors +Copyright (c) 2009-2016 by the contributors +Copyright (c) 2009-2019 by the contributors +Copyright (c) 2011 Free Software Foundation +Copyright (c) 2011-2014 by the contributors +Copyright (c) 2011-2019 by the contributors +Copyright (c) 2013 Imagination Technologies +Copyright (c) 2017-2019 by the contributors +(c) CHECK-NEXT Preds (1) B4 CHECK-NEXT Succs +(c) CHECK-NEXT Preds (1) B5 CHECK-NEXT Succs +(c) CHECK-NEXT Preds (1) B7 CHECK-NEXT Succs +CoprocNumAsmOperand AsmOperandClass let Name +CoprocRegAsmOperand AsmOperandClass let Name +Copyright (c) 1993 by Sun Microsystems, Inc. +Copyright (c) 1996, 1998, 2005 Red Hat, Inc. +Copyright (c) 1996, 1998, 2007 Red Hat, Inc. +Copyright (c) 1998, 2008, 2011 Red Hat, Inc. +Copyright (c) 1999, 2007, 2008 Red Hat, Inc. +Copyright (c) 2004 by Sun Microsystems, Inc. +Copyright (c) 2007, 2009, 2010 Red Hat, Inc. +Copyright (c) 2011, 2012, 2013 Anthony Green +Copyright 2012,2014 Ecole Normale Superieure +Copyright 2012-2013 Ecole Normale Superieure +Copyright 2012-2014 Ecole Normale Superieure +Copyright 2013-2014 Ecole Normale Superieure +Copyright (c) 1992, 1993, 1994 Henry Spencer. +Copyright (c) 2002-2007 Michael J. Fromberger +Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. +Copyright (c) 2012, 2013 Anthony Green Target +Copyright 2000 Free Software Foundation, Inc. +Copyright 2004 Free Software Foundation, Inc. +Copyright (c) 2008 Ryan McCabe +(c) 2003-2004 Randolph Chung +CoprocOptionAsmOperand AsmOperandClass let Name +Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima +Copyright (c) 2014 Advanced Micro Devices, Inc. +Copyright (c) 2015 Advanced Micro Devices, Inc. +Copyright (c) 1994-1999 Lucent Technologies Inc. +Copyright (c) 2002, 2007 Bo Thorsen +Copyright (c) 2013 Imagination Technologies Ltd. +(c) Designator NumDesigs NumDesignators NumDesigs +Copyright (c) 1992, 1993 UNIX International, Inc. +Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. +Copyright (c) 2004 Free Software Foundation, Inc. +Copyright (c) 2006 Free Software Foundation, Inc. +Copyright (c) 2007 Free Software Foundation, Inc. +Copyright (c) 2008 Free Software Foundation, Inc. +Copyright (c) 2009 Free Software Foundation, Inc. +Copyright (c) 2011 Free Software Foundation, Inc. +Copyright (c) 2012 Free Software Foundation, Inc. +Copyright (c) 2012, Noah Spurrier +Copyright (c) 2013-2014, Pexpect development team +Copyright (c) 2013-2016, Pexpect development team +Copyright (c) 2014 Free Software Foundation, Inc. +Copyright (c) 2015 Paul Norman +Copyright (c) 2016 Aaron Watry +Copyright extcopyright~ he year the LLVM Project. +(c) CHECK-NEXT Preds (3) B3 B4 B2 CHECK-NEXT Succs +(c) CHECK-NEXT Preds (3) B3 B5 B6 CHECK-NEXT Succs +Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. +Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. +Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. +Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. +Copyright (c) 2003-2010 Python Software Foundation +Copyright (c) 2012 Zack Weinberg +Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 2008-2009 Katholieke Universiteit Leuven +(c) Stmt NumExprs std::copy Exprs, Exprs + NumExprs +Copyright (c) 1996, MPEG Software Simulation Group. +Copyright (c) 2003 Jakub Jelinek +Copyright (c) 2008 Guido U. Draheim +Copyright (c) 2008 Stepan Kasal +Copyright (c) 2011 Plausible Labs Cooperative, Inc. +Copyright (c) 2012 Qualcomm Innovation Center, Inc. +Copyright (c) 2008 Benjamin Kosnik +Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) +Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) +Copyright (c) 2014,2015 Advanced Micro Devices, Inc. +Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima +Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima +Copyright (c) 2013 Miodrag Vallat. +Copyright (c) 2014, 2015 Advanced Micro Devices, Inc. +Copyright (c) 2016 Krzesimir Nowak +Copyright (c) 1994-2014 Free Software Foundation, Inc. +Copyright (c) 1994-2017 Free Software Foundation, Inc. +Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. +Copyright (c) 1996-2014 Free Software Foundation, Inc. +Copyright (c) 1996-2015 Free Software Foundation, Inc. +Copyright (c) 1996-2017 Free Software Foundation, Inc. +Copyright (c) 1997-2014 Free Software Foundation, Inc. +Copyright (c) 1997-2017 Free Software Foundation, Inc. +Copyright (c) 1999-2013 Free Software Foundation, Inc. +Copyright (c) 1999-2014 Free Software Foundation, Inc. +Copyright (c) 1999-2017 Free Software Foundation, Inc. +Copyright (c) 2001-2014 Free Software Foundation, Inc. +Copyright (c) 2001-2017 Free Software Foundation, Inc. +Copyright (c) 2002-2014 Free Software Foundation, Inc. +Copyright (c) 2002-2017 Free Software Foundation, Inc. +Copyright (c) 2003-2014 Free Software Foundation, Inc. +Copyright (c) 2003-2017 Free Software Foundation, Inc. +Copyright (c) 2004-2014 Free Software Foundation, Inc. +Copyright (c) 2004-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2017 Free Software Foundation, Inc. +Copyright (c) 2006-2014 Free Software Foundation, Inc. +Copyright (c) 2006-2017 Free Software Foundation, Inc. +Copyright (c) 2007, 2008 Free Software Foundation, Inc +Copyright (c) 2008 Sven Verdoolaege +Copyright (c) 2009-2014 Free Software Foundation, Inc. +Copyright (c) 2009-2017 Free Software Foundation, Inc. +Copyright (c) 2010-2015 Free Software Foundation, Inc. +Copyright (c) 2010-2017 Free Software Foundation, Inc. +Copyright (c) 2011-2013 Free Software Foundation, Inc. +Copyright (c) 2011-2014 Free Software Foundation, Inc. +Copyright (c) 2012-2014 Free Software Foundation, Inc. +Copyright (c) 2012-2015 Free Software Foundation, Inc. +Copyright (c) 2013-2014 Free Software Foundation, Inc. +Copyright (c) 2013-2015 Free Software Foundation, Inc. +Copyright (c) 2002, 2009 Free Software Foundation, Inc. +Copyright (c) 2004, 2005 Free Software Foundation, Inc. +Copyright (c) 2004, 2010 Free Software Foundation, Inc. +Copyright (c) 2006, 2008 Free Software Foundation, Inc. +Copyright (c) 2008, 2010 Free Software Foundation, Inc. +Copyright (c) 2014 Sebastian Macke +Copyright (c) 2015 Moritz Klammler +Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. +Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat +Copyright (c) 2009 Bradley Smith +Copyright (c) 2013 Jesse Towner +Copyright (c) 2013 Roy Stogner +(c) Type AtExitFuncArgs VoidStar FunctionType AtExitFuncTy +copyright (c) 1991-2011, Thomas G. Lane, Guido Vollbeding. +(c) GlobalVariable Handle new GlobalVariable M, DsoHandleTy +(c) Type ArgTys Int32Ty, Int32Ty, Int32Ty FunctionType FnTy +Copyright (c) 2004 Scott James Remnant +Copyright (c) 2008 Steven G. Johnson +Copyright (c) 2009 Steven G. Johnson +Copyright (c) 2004, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2007, 2008, 2010 Free Software Foundation, Inc +Copyright (c) 2007, 2009, 2010 Free Software Foundation, Inc +Copyright (c) 2013 Victor Oliveira +Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier +(c) DeclRefExpr DR M.makeDeclRefExpr(PV) ImplicitCastExpr ICE +(c) IdentifierInfo NumExprs std::copy Names, Names + NumExprs +Copyright (c) 1998 Todd C. Miller +Copyright (c) 2001, 2003, 2005 Free Software Foundation, Inc. +Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2012 Free Software Foundation, Inc. +Copyright (c) 2006, 2008, 2010 Free Software Foundation, Inc. +(c) BranchInst BI BranchInst::Create(Exit, Exit, False, Entry) +Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. +Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. +Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. +Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. +Copyright (c) 1994 The Regents of the University of California. +Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others. +Copyright (c) 1992-1996, 1998-2012 Free Software Foundation, Inc. +Copyright (c) 1996-2001, 2003-2015 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +Copyright (c) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +Copyright (c) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +Copyright (c) 2007-2018 University of Illinois at Urbana-Champaign. +Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign. +Copyright (c) 2002, 2003, 2004, 2010, Free Software Foundation, Inc. +Copyright (c) 2006-2009 Steven J. Bethard +Copyright (c) 1992, 1993 The Regents of the University of California. +(c) StringLiteral NumClobbers std::copy Clobbers, Clobbers + NumClobbers +Copyright (c) 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). +Copyright (c) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, Inc. +Copyright (c) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. +Copyright (c) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994 The Regents of the University of California. +Copyright (c) 2004-2005, 2007-2008, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2012 Alexandre K. I. de Mendonca +Copyright (c) 2001, 2002, 2003, 2005, 2008, 2010 Free Software Foundation, Inc. +Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +(c) StringLiteral NumConstraints std::copy Constraints, Constraints + NumConstraints +Copyright (c) 1996, 1997, 2000, 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software Foundation, Inc. +Copyright (c) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +Copyright (c) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2011 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +Copyright (c) 2012 Alexandre K. I. de Mendonca , Paulo Pizarro +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2014 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + +Apache-2.0 WITH LLVM-exception + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Windows.SDK.NET.Ref 10.0.26100.81 - LicenseRef-scancode-unknown + + +(c) Microsoft Corporation +Copyright (c) Microsoft Corporation + +LicenseRef-scancode-unknown + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.Mvvm 8.4.0 - MIT + + +Copyright (c) 2021 Sergio Pedri +Copyright (c) 2020 Michael Dietrich +Copyright (c) Microsoft Corporation +(c) .NET Foundation and Contributors +Copyright (c) 2009 - 2018 Laurent Bugnion +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2017 Pedro Lamas, http://www.pedrolamas.com + +# .NET Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.WinUI.Animations 8.2.250402 - MIT + + +(c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors + +# Windows Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +CommunityToolkit.WinUI.Controls.SettingsControls 8.2.250402 - MIT + + +(c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors + +# Windows Community Toolkit + +Copyright © .NET Foundation and Contributors + +All rights reserved. + +## MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Hosting 10.0.0 - MIT + + +Copyright (c) 2021 +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) 2022 FormatJS +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright (c) 1998 Microsoft +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 2015 Andrew Gallant +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2024 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2018 Nemanja Mijailovic +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2015-2018, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +(c) 1995-2024 Jean-loup Gailly and Mark Adler +Copyright (c) 2020 Mara Bos +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Portions (c) International Organization for Standardization 1986 +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang) Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Windows.CppWinRT 3.0.260520.1 - MIT + + +(c) Microsoft 2026 +(c) Microsoft Corporation +Copyright (c) Microsoft Corporation + + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.WSL.Containers 2.9.3 - MIT + + +(c) (tm) +(c) Type I1Ty +(c) April 2011 +Copyright 2013 +Copyright 2014 +(c) Type ArgTys +(c) Value A (c) +(c) CHECK-NEXT T +(c) Constant One +(c) Value Sd (c) +Bbb (c) Constant +(c) BranchInst BI +(c) Lower C Upper +(c) Stmt NumExprs +(c) Value RHS (c) +Copyright (c) DFS +Copyright 2013 DI +Copyright 2014 DI +Copyright 2015 DI +copyright 2013- d +(c) EUR CHECK-NEXT +(c) Scale 1 Offset +(c) State UNQUOTED +(c) Type IndexType +Copyright (c) 2008 +Copyright (c) 2009 +Copyright (c) 2010 +Copyright (c) 2011 +Copyright (c) 2012 +Copyright (c) 2014 +Copyright (c) 2016 +Copyright (c) 2019 +(c) Type Int8Ty (c) +Stmt (c) ExprResult +(c) CHECK-NEXT Preds +(c) Offset C- Offset +(c) Type FloatTy (c) +Copyright 2010 INRIA +Copyright 2011 INRIA +Copyright 2012 INRIA +Copyright 2014 INRIA +Copyright 2015 ANSSI +Copyright 2015 INRIA +(c) 2023 GitHub, Inc. +(c) QualType ResultTy +(c) Type DoubleTy (c) +(c) 2008 Red Hat, Inc. +Copyright (c) 2009 THE +Copyright (c) 2011 THE +Copyright (c) 2013 IBM +Copyright 2011 Samsung +Copyright 2011 Vic Lee +Copyright 2012 Vic Lee +Copyright 2014 Vic Lee +Copyright Jeff Sharkey +(c) ErrMsg Stream Error +(c) Metadata Ops MD (c) +(c) SmallVector NewVars +(c) TransferBatch B (c) +(c) Value Alloca Alloc1 +Copyright (c) Microsoft +(c) BasicBlock Entry (c) +(c) Branches Context (c) +Copyright (c) 2012 CHECK +Copyright 2016 INRIA (c) +Copyright 2017 Ben Cohen +(c) GlobalVariable Handle +(c) Microsoft Corporation +Copyright 2010-2011 INRIA +Copyright 2013 Felix Long +Copyright 2014-2015 INRIA +copyright 2015, LLVM Team +(c) 2007-2010 Novell, Inc. +(c) 2011 Anthony Green (c) +(c) 2013 DENSO CORPORATION +Copyright (c) 2010 Rosetta +Copyright 2003 Google Inc. +Copyright 2008 Google Inc. +Copyright 2009 Daniel Mack +Copyright 2009 Google Inc. +Copyright 2011 Jiten Pathy +Copyright 2013 Blaz Bacnik +Copyright 2014 Wim Taymans +Copyright 2015 Georg Chini +Copyright 2015 Google Inc. +Copyright 2018 Google Inc. +Copyright 2019 Rangee Gmbh +Copyright The LLVM project +(c) SmallVector ToErase Bbb +(c) Willem van Schaik, 1999 +Copyright (c) 1997, Phillip +Copyright (c) 2022 FormatJS +Copyright (c) Andrew Arnott +Copyright 2005, Google Inc. +Copyright 2006, Google Inc. +Copyright 2007, Google Inc. +Copyright 2008 Sci-Fi Hi-Fi +Copyright 2008, Google Inc. +Copyright 2009 Ted Percival +Copyright 2010-2011 Vic Lee +Copyright 2010-2012 Vic Lee +Copyright 2011-2012 Vic Lee +Copyright 2012 Atrust corp. +Copyright 2012 Google, Inc. +Copyright 2013 Albert Zeyer +Copyright 2013, Google Inc. +Copyright 2015-2017 Vic Lee +Copyright 2016 Inuvika Inc. +Copyright 2019 LLVM Project +Copyright Kungliga Tekniska +Copyright (c) 1998 Microsoft +Copyright (c) 2008, 2009 the +Copyright (c) 2012 Rob Clark +Copyright (c) 2018 Simon Ser +Copyright 2006 Diego Petteno +Copyright 2006 Shams E. King +Copyright 2006, Dean Edwards +Copyright 2008 Colin Guthrie +Copyright 2009 Canonical Ltd +Copyright 2009 Colin Guthrie +Copyright 2009 Tanu Kaskinen +Copyright 2009-2011 Jay Sorg +Copyright 2009-2012 Jay Sorg +Copyright 2010 Arun Raghavan +Copyright 2010 Colin Guthrie +Copyright 2011 Canonical Ltd +Copyright 2011 Colin Guthrie +Copyright 2013 Hajime Fujita +Copyright 2018 Daniel Lemire +(c) CharUnits AlignedSize (c) +(c) Designator NumDesignators +(c) SourceRange Range AsmToks +(c) Value Elt0 Copyright 2014 +Copyright (c) .NET Foundation +Copyright (c) 1999 Tom Tromey +Copyright (c) 2008 PULSEAUDIO +Copyright (c) 2010 Apple Inc. +Copyright (c) 2012 Modelon AB +Copyright (c) 2018 Jim Ingham +Copyright (c) by P.J. Plauger +Copyright 2008 Matt Gallagher +Copyright 2009 The Go Authors +Copyright 2010 Canonical Ltd. +Copyright 2010 The Go Authors +Copyright 2010 Zencoder, Inc. +Copyright 2011 The Go Authors +Copyright 2012 Gerald Richter +Copyright 2012 Jason Champion +Copyright 2012 The Go Authors +Copyright 2012 Thomas Goddard +Copyright 2013 Collabora Ltd. +Copyright 2013 The Go Authors +Copyright 2014 The Go Authors +Copyright 2015 Canonical Ltd. +Copyright 2017 Artur Zaprzala +Copyright (c) 2000 Software AG +Copyright (c) 2002 Roger Sayle +Copyright (c) 2007 Google Inc. +Copyright (c) 2008 David Daney +Copyright (c) 2009 Google Inc. +Copyright (c) 2010 Google Inc. +Copyright (c) 2012 Jonas Adahl +Copyright (c) 2013 Jonas Adahl +Copyright (c) 2015 Armin Novak +Copyright (c) 2016 Aaron Watry +Copyright (c) 2017 Google Inc. +Copyright 2011 Stephen Erisman +Copyright 2018 Collabora, Ltd. +Copyright 2019 Collabora, Ltd. +(c) IdentifierInfo NumExprs (c) +Copyright (c) 1994 X Consortium +Copyright (c) 2008 Matteo Frigo +Copyright (c) 2008 Timo Jyrinki +Copyright (c) 2009 Chris Wilson +Copyright (c) 2009 Matteo Frigo +Copyright (c) 2010 CodeSourcery +Copyright (c) 2011 Kyle Moffett +Copyright (c) 2011 Tilera Corp. +Copyright (c) 2011 Timothy Wall +Copyright (c) 2011, Google Inc. +Copyright (c) 2012 Peter Harris +Copyright (c) 2012 Scott Moreau +Copyright (c) 2012 Tilera Corp. +Copyright (c) 2017 Red Hat Inc. +Copyright (c) 2020 Dan Shechter +Copyright (c) 2021 Sergio Pedri +Copyright (c) Mesa contributors +Copyright 2008-2010 Apple, Inc. +Copyright 2011-2012 Jiten Pathy +Copyright 2013 Martin Blanchard +Copyright 2015 Sven Verdoolaege +Copyright 2016 Sven Verdoolaege +Copyright 2017 Sven Verdoolaege +Copyright 2018 Sven Verdoolaege +SelectInst SelI (c) SmallVector +copyright 2003- d, LLVM Project +(c) 1997-2005 Sean Eron Anderson +(c) SourceLocation Loc Condition +(c) StringLiteral NumConstraints +Copyright (c) 1992 Henry Spencer +Copyright (c) 1996 Red Hat, Inc. +Copyright (c) 2000 Red Hat, Inc. +Copyright (c) 2001 Chris Bagwell +Copyright (c) 2002 Ranjit Mathew +Copyright (c) 2004 Anthony Green +Copyright (c) 2004 Simon Posnjak +Copyright (c) 2008 Anthony Green +Copyright (c) 2008 Red Hat, Inc. +Copyright (c) 2011 Anthony Green +Copyright (c) 2012 Anthony Green +Copyright (c) 2013 Red Hat, Inc. +Copyright (c) 2014 Red Hat, Inc. +Copyright (c) 2015 Red Hat, Inc. +Copyright 2004 Joe Marcus Clarke +Copyright 2008 Nokia Corporation +Copyright 2009 Intel Corporation +Copyright 2009 Nokia Corporation +Copyright 2010 Intel Corporation +Copyright 2011 Intel Corporation +Copyright 2012 Intel Corporation +Copyright 2013 Alexander Couzens +Copyright 2013 Intel Corporation +Copyright 2014 Intel Corporation +Copyright James Newton-King 2008 +copyright 2007- d, The LLDB Team +copyright 2019, Weston community +(c) CHECK-NEXT 194 CHECK-NEXT (c) +Copyright (c) 2000 John Hornkvist +Copyright (c) 2001 John Hornkvist +Copyright (c) 2006 Kirill Simonov +Copyright (c) 2009 The Go Authors +Copyright (c) 2011 Tim Wiederhake +Copyright (c) 2012 Alan Hourihane +Copyright (c) 2012 Canonical Ltd. +Copyright (c) 2012 Martin Minarik +Copyright (c) 2012 Openismus GmbH +Copyright (c) 2013 Collabora Ltd. +Copyright (c) 2013 David Herrmann +Copyright (c) 2013 Jason Ekstrand +Copyright (c) 2013 Richard Hughes +Copyright (c) 2014 Jason Ekstrand +Copyright (c) 2015 Andrew Gallant +Copyright (c) 2015 Collabora Ltd. +Copyright (c) 2015 Giulio Camuffo +Copyright (c) 2016 Armin Krezovic +Copyright (c) 2016 Giulio Camuffo +Copyright (c) 2019 Collabora Ltd. +Copyright (c) 2022, Wojciech Mula +Copyright 2001-2004 Unicode, Inc. +Copyright 2004 Lennart Poettering +Copyright 2004-2009 Kitware, Inc. +Copyright 2006 Lennart Poettering +Copyright 2006-2009 Kitware, Inc. +Copyright 2007 Lennart Poettering +Copyright 2007-2009 Kitware, Inc. +Copyright 2008 Lennart Poettering +Copyright 2009 Lennart Poettering +Copyright 2010 Lennart Poettering +Copyright 2012 Dmitry Baryshnikov +Copyright 2012 Lennart Poettering +Copyright 2013 Matthias Wabersich +Copyright 2014 Thomas Erbesdobler +copyright 2007- d, The Clang Team +copyright 2010- d, The Polly Team +copyright 2011-2018, LLVM Project +Copyright (c) 1999-2007 Apple Inc. +Copyright (c) 1999-2007 Brian Paul +Copyright (c) 2008 Alexandre Oliva +Copyright (c) 2009-2019 Polly Team +Copyright (c) 2011 Collabora, Ltd. +Copyright (c) 2012 Collabora, Ltd. +Copyright (c) 2012 Thorsten Glaser +Copyright (c) 2013 BMW Car IT GmbH +Copyright (c) 2013 Collabora, Ltd. +Copyright (c) 2013 Mentor Graphics +Copyright (c) 2013 Philip Withnall +Copyright (c) 2013 Tensilica, Inc. +Copyright (c) 2013 The Chromium OS +Copyright (c) 2014 Collabora, Ltd. +Copyright (c) 2015 Collabora, Ltd. +Copyright (c) 2015 Martin Grasslin +Copyright (c) 2015the LLVM Project +Copyright (c) 2016 Benoit Gschwind +Copyright (c) 2016 Collabora, Ltd. +Copyright (c) 2017 Collabora, Ltd. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2018 Collabora, Ltd. +Copyright (c) 2019 Collabora, Ltd. +Copyright (c) 2022, Geoff Langdale +Copyright 2009-2010 The Go Authors +Copyright 2012 Universiteit Leiden +Copyright 2013 bct electronic GmbH +Copyright 2015 The Go Authors. (c) +Copyright 2016-2017 Tobias Grosser +copyright (c) 2001 Fabrice Bellard +Copyright (c) 1998 Cygnus Solutions +Copyright (c) 1998 Geoffrey Keating +Copyright (c) 2001 David E. O'Brien +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2011 Benjamin Franzke +Copyright (c) 2011 Charles Scalesse +Copyright (c) 2012 Benjamin Franzke +Copyright (c) 2012-2021 Yann Collet +Copyright (c) 2019 The MLIR Authors +Copyright (c) 2020 Michael Dietrich +Copyright (c) Microsoft Corporation +Copyright 2009, 2010 The Go Authors +Copyright 2011 Collabora Multimedia +Copyright 2016 The Chromium Authors +Copyright 2016, 2017 Tobias Grosser +Copyright 2017-2018 Collabora, Ltd. +Copyright 2018-2019 Collabora, Ltd. +copyright 2011- d, LLVM Project (c) +(c) .NET Foundation and Contributors +(c) .NET Foundation and contributors +Copyright (c) 2000, 2007 Software AG +Copyright (c) 2001 Alexander Peslyak +Copyright (c) 2007 James Newton-King +Copyright (c) 2008 Kristian Hogsberg +Copyright (c) 2009 Intel Corporation +Copyright (c) 2010 Intel Corporation +Copyright (c) 2010 Kristian Hogsberg +Copyright (c) 2011 Intel Corporation +Copyright (c) 2011 Kristian Hogsberg +Copyright (c) 2012 Intel Corporation +Copyright (c) 2012 John Kare Alsaker +Copyright (c) 2012 Kristian Hogsberg +Copyright (c) 2012, 2013 Xilinx, Inc +Copyright (c) 2012, Victor Lazzarini +Copyright (c) 2012-2016, Yann Collet +Copyright (c) 2013 DENSO CORPORATION +Copyright (c) 2013 Intel Corporation +Copyright (c) 2013 Jasper St. Pierre +Copyright (c) 2013 Rafael Antognolli +Copyright (c) 2014 DENSO CORPORATION +Copyright (c) 2014, 2015 Google Inc. +Copyright (c) 2015 Jasper St. Pierre +Copyright (c) 2015-2017 Red Hat Inc. +Copyright (c) 2016 DENSO CORPORATION +Copyright (c) 2018 Intel Corporation +Copyright (c) 2019 Intel Corporation +Copyright 2011 Sven Verdoolaege. (c) +Copyright 2011,2015 Sven Verdoolaege +Copyright 2011-2013 BMW Car IT GmbH. +Copyright 2013 Joao Paulo Rechi Vita +Copyright 2014, 2015 Andrey Semashev +Copyright 2015-2016 Sven Verdoolaege +Copyright 2016, 2017 Collabora, Ltd. +Copyright 2021-2025 - Morten Nielsen +(c) 2016 Samsung Electronics Co., Ltd +Copyright (c) 1991-2024 Unicode, Inc. +Copyright (c) 1996-2003 Red Hat, Inc. +Copyright (c) 1996-2004 Red Hat, Inc. +Copyright (c) 1999-2003 Steve Purcell +Copyright (c) 2004 Renesas Technology +Copyright (c) 2006 Lennart Poettering +Copyright (c) 2012-2013 A Tasty Pixel +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2016 NVIDIA Corporation +Copyright (c) 2018 Nemanja Mijailovic +Copyright 2010-2012 Intel Corporation +Copyright 2012 the V8 project authors +Copyright 2013 Christian Hofstaedtler +Copyright (c) 1996, 1998 Red Hat, Inc. +Copyright (c) 1998, 2008 Red Hat, Inc. +Copyright (c) 1999 Lucent Technologies +Copyright (c) 1999, 2008 Red Hat, Inc. +Copyright (c) 2002-2004 Tim J. Robbins +Copyright (c) 2008 Christian Haggstrom +Copyright (c) 2008, 2010 Red Hat, Inc. +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011, 2012 Anthony Green +Copyright (c) 2011, 2013 Anthony Green +Copyright (c) 2011, 2014 Anthony Green +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2012, 2013 Anthony Green +Copyright (c) 2012, 2014 Anthony Green +Copyright (c) 2014,2018 Collabora Ltd. +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2015-2018, Wojciech Mula +Copyright 2004-2006 Lennart Poettering +Copyright 2004-2008 Lennart Poettering +Copyright 2004-2009 Lennart Poettering +Copyright 2005-2006 Lennart Poettering +Copyright 2005-2009 Lennart Poettering +Copyright 2006-2008 Lennart Poettering +Copyright 2006-2009 Lennart Poettering +Copyright 2007-2010 by the Sphinx team +Copyright 2013 Raspberry Pi Foundation +Copyright 2016 Ismael Jimenez Martinez +Copyright 2021-2025 - Morten Nielsen A +(c) 2006 Free Software Foundation, Inc. +Copyright (c) 1996-1998 John D. Polstra +Copyright (c) 1998, 2012 Andreas Schwab +Copyright (c) 2005 Free Standards Group +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2005-2014 Lode Vandevenne +Copyright (c) 2011-2012 Collabora, Ltd. +Copyright (c) 2012 Philipp Bruschweiler +Copyright (c) 2012-2013 Collabora, Ltd. +Copyright (c) 2012-2018 Collabora, Ltd. +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2015,2019 Collabora, Ltd. +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) Microsoft Corporation.All +Copyright (c) The Internet Society 1997 +Copyright 2005-2007 Universiteit Leiden +Copyright 2006-2007 Universiteit Leiden +Copyright 2010 Red Hat +Copyright 2012 Ecole Normale Superieure +Copyright 2013 Ecole Normale Superieure +Copyright 2014 Ecole Normale Superieure +Copyright 2017 Roman Lebedev. ParamInfo +Copyright 2018 General Electric Company +StringRef Copyright (c) 2002 Bo Thorsen +(c) Stmt NumExprs std::copy Exprs, Exprs +(c) StringRef NumClobbers // FIXME Avoid +Copyright (c) 2002-2008, 2012 Kaz Kojima +Copyright (c) 2010-2011 Benjamin Franzke +Copyright (c) 2014, 2015 Collabora, Ltd. +Copyright (c) 2014, 2016 Collabora, Ltd. +Copyright (c) 2014, 2019 Collabora, Ltd. +Copyright (c) 2015, 2019 Collabora, Ltd. +Copyright (c) 2016, 2019 Collabora, Ltd. +Copyright (c) 2017, 2018 Collabora, Ltd. +Copyright (c) 2018 DisplayLink (UK) Ltd. +Copyright (c) 2021-2025 - Morten Nielsen +Copyright 1992, 1993, 1994 Henry Spencer +Copyright 2011-2012,2020 Collabora, Ltd. +Copyright 2016 Thinast Technologies GmbH +Copyright 2016-2017 Sven Verdoolaege (c) +Copyright 2018 Thicast Technologies GmbH +(c) StringLiteral NumClobbers Constraints +Copyright (c) 1997-2019 Intel Corporation +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2005 Axis Communications AB +Copyright (c) 2006-2010 Nokia Corporation +Copyright (c) 2008-2011 Kristian Hogsberg +Copyright (c) 2008-2012 Kristian Hogsberg +Copyright (c) 2008-2013 Kristian Hogsberg +Copyright (c) 2009 - 2018 Laurent Bugnion +Copyright (c) 2010-2011 Intel Corporation +Copyright (c) 2010-2012 Intel Corporation +Copyright (c) 2010-2013 Intel Corporation +Copyright (c) 2010-2015 Benjamin Peterson +Copyright (c) 2011-2012 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2014 - 2015 Collabora, Ltd. +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) 2018-2019 Intel Corporation +Copyright (c) The Internet Society (1998) +Copyright (c) The Internet Society (2000) +Copyright (c) The Internet Society (2003) +Copyright 2008-2013 Joao Paulo Rechi Vita +Copyright 2010 O.S. Systems Software Ltda +Copyright 2011 O.S. Systems Software Ltda +Copyright 2012 Thincast Technologies GmbH +Copyright 2013 Thincast Technologies GmbH +Copyright 2014 Thincast Technologies GmbH +Copyright 2014 Thincast Technologies Gmbh +Copyright 2015 Thincast Technologies GmbH +Copyright 2015, Google Inc. InitCache (c) +Copyright 2016 Thincast Technologies GmbH +Copyright 2017 Thincast Technologies GmbH +Copyright 2018 Thincast Technologies GmbH +Copyright 2019 Thincast Technologies GmbH +Copyright Iowa State University 2009-2010 +Copyright James Newton-King 2008 Json.NET +copyright was claimed by the wine project +Copyright (c) .NET Foundation Contributors +Copyright (c) 2000 Hewlett Packard Company +Copyright (c) 2002 Bo Thorsen +Copyright (c) 2006-2008 Lennart Poettering +Copyright (c) 2010, 2013 Intel Corporation +Copyright (c) 2011, 2012 Intel Corporation +Copyright (c) 2012 Raspberry Pi Foundation +Copyright (c) 2013 Raspberry Pi Foundation +Copyright 2012 HP Development Company, LLC +Copyright 2014, 2016, 2020 Collabora, Ltd. +Copyright (c) 1996-2003, 2010 Red Hat, Inc. +Copyright (c) 1998-2016 The OpenSSL Project +Copyright (c) 2004 eXtensible Systems, Inc. +Copyright (c) 2008 Free Software Foundation +Copyright (c) 2009-2014 by the contributors +Copyright (c) 2009-2015 by the contributors +Copyright (c) 2009-2016 by the contributors +Copyright (c) 2009-2019 by the contributors +Copyright (c) 2010 Red Hat +Copyright (c) 2011 Free Software Foundation +Copyright (c) 2011-2014 by the contributors +Copyright (c) 2011-2019 by the contributors +Copyright (c) 2013 Copyright (c) 2019 Exprs +Copyright (c) 2013 Imagination Technologies +Copyright (c) 2015 General Electric Company +Copyright (c) 2017 Pekka Paalanen pq@iki.fi +Copyright (c) 2017-2019 by the contributors +Copyright (c) 2021 Copyright (c) Six Labors +Copyright 2011 Wolfson Microelectronics PLC +copyrighted by the Free Software Foundation +(c) Microsoft Corporation. Med enerett. Hvis +Copyright (c) 1992, 1993, 1994 Henry Spencer +Copyright (c) 1993 by Sun Microsystems, Inc. +Copyright (c) 1996, 1998, 2005 Red Hat, Inc. +Copyright (c) 1996, 1998, 2007 Red Hat, Inc. +Copyright (c) 1998, 2008, 2011 Red Hat, Inc. +Copyright (c) 1999, 2007, 2008 Red Hat, Inc. +Copyright (c) 2004 by Sun Microsystems, Inc. +Copyright (c) 2007, 2009, 2010 Red Hat, Inc. +Copyright (c) 2011, 2012, 2013 Anthony Green +Copyright (c) 2016 Quentin Sardem FF7 Glidic +Copyright (c) 2018 Renesas Electronics Corp. +Copyright 2004-2006, 2009 Lennart Poettering +Copyright 2011 Jay Sorg +Copyright 2011 Shea Levy +Copyright 2012 Jay Sorg +Copyright 2012,2014 Ecole Normale Superieure +Copyright 2012-2013 Ecole Normale Superieure +Copyright 2012-2014 Ecole Normale Superieure +Copyright 2013-2014 Ecole Normale Superieure +Copyright 2015 Vic Lee +Copyright 2017-2018 General Electric Company +(c) 1995-2024 Jean-loup Gailly and Mark Adler +(c) Copyright 2014 Thincast Technologies GmbH +Copyright (c) 2002-2007 Michael J. Fromberger +Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. +Copyright (c) 2012, 2017-2019 Collabora, Ltd. +Copyright (c) 2014 Pekka Paalanen +Copyright (c) 2014 Thincast Technologies GmbH +Copyright (c) 2015 Thincast Technologies GmbH +Copyright (c) 2017 Pekka Paalanen +Copyright (c) 2018 Thincast Technologies GmbH +Copyright (c) 2020 Mara Bos +Copyright 2000 Free Software Foundation, Inc. +Copyright 2004 Free Software Foundation, Inc. +Copyright 2015 bernhard.miklautz@thincast.com +Copyright AssemblyDescription AssemblyProduct +(c) Copyright 2012 HP Development Company, LLC +Copyright (c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and contributors +Copyright (c) 2008 Ryan McCabe +Copyright (c) 2008 Stepan Kasal +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2012, 2017, 2018 Collabora, Ltd. +Copyright (c) 2018 Zodiac Inflight Innovations +Copyright 2009 Jason Newton +Copyright 2011-2013 Thincast Technologies GmbH +Copyright 2012 Alam Arias +Copyright 2015-2016 Thincast Technologies GmbH +Copyright 2015-2017 Thincast Technologies GmbH +Copyright 2016,2018 Thincast Technologies GmbH +Copyright 2016-2017 Thincast Technologies GmbH +(c) 2003-2004 Randolph Chung +Copyright (c) 2003, 2004, 2006, 2008 Kaz Kojima +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2014 Advanced Micro Devices, Inc. +Copyright (c) 2015 Advanced Micro Devices, Inc. +Copyright (c) 2015 Samsung Electronics Co., Ltd +Copyright (c) 2016 Samsung Electronics Co., Ltd +Copyright 2012 Rolf Eike Beer +Copyright 2014 Christian Plattner +Copyright 2016 Christian Plattner +Copyright 2019 Idan Freiberg +Copyright (c) 1994-1999 Lucent Technologies Inc. +Copyright (c) 2002, 2007 Bo Thorsen +Copyright (c) 2007-2008 Free Software Foundation +Copyright (c) 2009 Jason Newton nevion@gmail.com +Copyright (c) 2013 Imagination Technologies Ltd. +Copyright 2011 David Henningsson, Canonical Ltd. +Copyright 2012 Fujitsu Technology Solutions GmbH +Copyright 2014 David Henningsson, Canonical Ltd. +Copyright 2017 Armin Novak +Copyright 2018 Armin Novak +Copyright 2019 Pali Rohar +Copyright extcopyright~ he year the LLVM Project +(c) Designator NumDesigs NumDesignators NumDesigs +Copyright (c) 1992, 1993 UNIX International, Inc. +Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. +Copyright (c) 2004 Free Software Foundation, Inc. +Copyright (c) 2006 Free Software Foundation, Inc. +Copyright (c) 2007 Free Software Foundation, Inc. +Copyright (c) 2008 Free Software Foundation, Inc. +Copyright (c) 2008-2019 Copyright 2009 Finn Thain +Copyright (c) 2009 Free Software Foundation, Inc. +Copyright (c) 2011 Free Software Foundation, Inc. +Copyright (c) 2012 Free Software Foundation, Inc. +Copyright (c) 2012, Noah Spurrier +Copyright (c) 2013-2014, Pexpect development team +Copyright (c) 2013-2016, Pexpect development team +Copyright (c) 2014 Free Software Foundation, Inc. +Copyright (c) 2015 Paul Norman +Copyright (c) 2016 Aaron Watry +Copyright (c) 2017, 2018 General Electric Company +Copyright 2004-2012 Jay Sorg +Copyright 2007-2008 Miguel A. Figueroa-Villanueva +Copyright 2009,2010 Daniel Mack +Copyright 2011 Anthony Tong +Copyright 2013 Peter Meerwald +Copyright 2014 Peter Meerwald +copyright (c) 2011 Petr Vanek +(c) IdentifierInfo NumExprs std::copy Names, Names +Copyright (c) 1996, 2007, 2008, 2011 Red Hat, Inc. +Copyright (c) 1996, MPEG Software Simulation Group +Copyright (c) 1998 Bjorn Reese and Daniel Stenberg +Copyright (c) 1998, 2001, 2007, 2008 Red Hat, Inc. +Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. +Copyright (c) 2000 Bjorn Reese and Daniel Stenberg +Copyright (c) 2000, 2003, 2004, 2008 Red Hat, Inc. +Copyright (c) 2001 Bjorn Reese and Daniel Stenberg +Copyright (c) 2003-2010 Python Software Foundation +Copyright (c) 2006 The Android Open Source Project +Copyright (c) 2008 Andreas Schwab +Copyright (c) 2008 The Android Open Source Project +Copyright (c) 2010 The Android Open Source Project +Copyright (c) 2011 The Android Open Source Project +Copyright (c) 2012 Zack Weinberg +Copyright (c) 2016 The Android Open Source Project +Copyright 1992-2018 Free Software Foundation, Inc. +Copyright 2008-2009 Katholieke Universiteit Leuven +Copyright 2010 Wim Taymans +Copyright 2013 Armin Novak +Copyright 2014 Armin Novak +Copyright 2015 Jiang Zihao +Copyright 2016 Armin Novak +Copyright 2016 Jiang Zihao +Copyright (c) 2003 Jakub Jelinek +Copyright (c) 2006, Tim Beaulen +Copyright (c) 2008 Alan Woodland +Copyright (c) 2008 Guido U. Draheim +Copyright (c) 2008 Stepan Kasal +Copyright (c) 2011 Plausible Labs Cooperative, Inc. +Copyright (c) 2012 Qualcomm Innovation Center, Inc. +Copyright (c) 2013 Hardening +Copyright 2010 David Henningsson +Copyright 2013 Zhang Zhaolong +Copyright 2019 Mati Shabtay +Copyright (c) 2008 Benjamin Kosnik +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) +Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) +Copyright (c) 2014,2015 Advanced Micro Devices, Inc. +Copyright (c) 2015 Rozhuk Ivan +Copyright (c) 2015-2017 Samsung Electronics Co., Ltd +Copyright (c) 2018 Pali Rohar +Copyright (c) 2019 Pali Rohar +Copyright 2006 Alexander Neundorf +Copyright 2010 Alexander Neundorf +Copyright 2011 Nils Andresen +Copyright 2012 Alexander Neundorf +Copyright 2012 Alfred Liu +Copyright 2012 Corey Clayton +Copyright 2013 Corey Clayton +Copyright 2014 Manuel Bachmann +Copyright 2016 Armin Novak +Copyright 2016 Arun Raghavan +Copyright 2019 Kobi Mizrachi +Copyright (c) 1988-2004 Keith Packard and Bart Massey +Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima +Copyright (c) 2003, 2004, 2006, 2007, 2012 Kaz Kojima +Copyright (c) 2013 Miodrag Vallat. +Copyright (c) 2014, 2015 Advanced Micro Devices, Inc. +Copyright (c) 2016 Krzesimir Nowak +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) Alexi Volkov 2006 +Copyright 2013 Armin Novak +Copyright 2014 Armin Novak +Copyright 2015 Armin Novak +Copyright 2016 Armin Novak +Copyright 2016 David PHAM-VAN +Copyright 2017 Alexei Lozovsky +Copyright 2017 Armin Novak +Copyright 2018 Armin Novak +Copyright 2018-2019 Pali Rohar +Copyright 2019 Armin Novak +Copyright (c) 1994-2014 Free Software Foundation, Inc. +Copyright (c) 1994-2017 Free Software Foundation, Inc. +Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) +Copyright (c) 1996, 2003-2004, 2007-2008 Red Hat, Inc. +Copyright (c) 1996-2014 Free Software Foundation, Inc. +Copyright (c) 1996-2015 Free Software Foundation, Inc. +Copyright (c) 1996-2017 Free Software Foundation, Inc. +Copyright (c) 1997-2014 Free Software Foundation, Inc. +Copyright (c) 1997-2017 Free Software Foundation, Inc. +Copyright (c) 1999-2013 Free Software Foundation, Inc. +Copyright (c) 1999-2014 Free Software Foundation, Inc. +Copyright (c) 1999-2017 Free Software Foundation, Inc. +Copyright (c) 2001-2014 Free Software Foundation, Inc. +Copyright (c) 2001-2017 Free Software Foundation, Inc. +Copyright (c) 2002-2014 Free Software Foundation, Inc. +Copyright (c) 2002-2017 Free Software Foundation, Inc. +Copyright (c) 2003-2014 Free Software Foundation, Inc. +Copyright (c) 2003-2017 Free Software Foundation, Inc. +Copyright (c) 2004-2014 Free Software Foundation, Inc. +Copyright (c) 2004-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2017 Free Software Foundation, Inc. +Copyright (c) 2006-2014 Free Software Foundation, Inc. +Copyright (c) 2006-2017 Free Software Foundation, Inc. +Copyright (c) 2007, 2008 Free Software Foundation, Inc +Copyright (c) 2008 Sven Verdoolaege +Copyright (c) 2008-2017 Free Software Foundation, Inc. +Copyright (c) 2009-2014 Free Software Foundation, Inc. +Copyright (c) 2009-2017 Free Software Foundation, Inc. +Copyright (c) 2010-2015 Free Software Foundation, Inc. +Copyright (c) 2010-2017 Free Software Foundation, Inc. +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 2011-2013 Free Software Foundation, Inc. +Copyright (c) 2011-2014 Free Software Foundation, Inc. +Copyright (c) 2012-2014 Free Software Foundation, Inc. +Copyright (c) 2012-2015 Free Software Foundation, Inc. +Copyright (c) 2013 Sam Spilsbury +Copyright (c) 2013-2014 Free Software Foundation, Inc. +Copyright (c) 2013-2015 Free Software Foundation, Inc. +Copyright (c) Microsoft Corporation. Med enerett. Hvis +Copyright 2015 Ahmed S. Darwish +Copyright 2016 Ahmed S. Darwish +Copyright (c) 1989, 1991 Free Software Foundation, Inc. +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) 2002, 2009 Free Software Foundation, Inc. +Copyright (c) 2004, 2005 Free Software Foundation, Inc. +Copyright (c) 2004, 2010 Free Software Foundation, Inc. +Copyright (c) 2006, 2008 Free Software Foundation, Inc. +Copyright (c) 2008, 2010 Free Software Foundation, Inc. +Copyright (c) 2011 Daniel Richard G. +Copyright (c) 2014 Sebastian Macke +Copyright (c) 2015 Moritz Klammler +Copyright 2015 Denis Vincent +Copyright (c) 1996, 1997, 2003, 2004, 2008 Red Hat, Inc. +Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 Red Hat +Copyright (c) 1998, 2009 Bjorn Reese and Daniel Stenberg +Copyright (c) 2006 Andreas Schneider +Copyright (c) 2009 Bradley Smith +Copyright (c) 2011 Maarten Bosmans +Copyright (c) 2012, 2016. Free Software Foundation, Inc. +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright 2009 Wim Taymans +Copyright 2010 Wim Taymans +Copyright 2011 Otavio Salvador +Copyright 2012 Hewlett-Packard Development Company, L.P. +Copyright 2014 Hewlett-Packard Development Company, L.P. +Copyright 2015 Copyright 2015 Thincast Technologies GmbH +Copyright 2015 Hewlett-Packard Development Company, L.P. +(c) Copyright 2014 Armin Novak +Copyright (c) 2004 Michael Niedermayer +Copyright (c) 2008 Kyle Machulis +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2013 David Herrmann +Copyright (c) 2013 Jesse Towner +Copyright (c) 2013 Roy Stogner +Copyright (c) 2013 Vasily Khoruzhick +Copyright (c) 2015 Armin Novak +Copyright (c) 2017 Pedro Lamas, http://www.pedrolamas.com +Copyright (c) 2018 Armin Novak +Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas +Copyright 2011 Martin Fleisz +Copyright 2011 Roman Barabanov +Copyright 2012-2013 Corey Clayton +Copyright 2013 Martin Fleisz +Copyright 2016 Martin Fleisz +Copyright 2018 Pascal Bourguignon +copyright (c) 1991-2011, Thomas G. Lane, Guido Vollbeding +(c) StringLiteral NumClobbers std::copy Clobbers, Clobbers +Copyright (c) 2006, Alexander Neundorf, +Copyright (c) 2008, Kevin Kofler, +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) Microsoft Corporation https://aka.ms/privacy +Copyright 2008-2011 Alexander Neundorf, +Copyright 2012 Alexander Kurtz +Copyright 2015-2017 Armin Novak +Copyright 2016,2018 Armin Novak +Copyright 2016-2017 Armin Novak +Copyright 2017 Sebastian Droge +Copyright 2019 Russell Treleaven +Copyright (c) 2004 Scott James Remnant +Copyright (c) 2008 Steven G. Johnson +Copyright (c) 2009 Steven G. Johnson +Copyright (c) 2010 Diego Elio Petteno +Copyright 2011 Collabora Ltd. 2015 Aldebaran SoftBank Group +Copyright 2011 Norbert Federa +Copyright 2012 Flavio Ceolin +Copyright 2012 Laxmikant Rashinkar +Copyright 2013 Norbert Federa +Copyright 2014 Hardening +Copyright 2014 Norbert Federa +Copyright 2015 Norbert Federa +Copyright 2016 Norbert Federa +(c) Copyright 2012 Hewlett-Packard Development Company, L.P. +(c) Copyright 2014 Hewlett-Packard Development Company, L.P. +Copyright (c) 2004, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2007, 2008, 2010 Free Software Foundation, Inc +Copyright (c) 2007, 2009, 2010 Free Software Foundation, Inc +Copyright (c) 2011 Antonio Ospite +Copyright (c) 2012 Raphael Kubo da Costa +Copyright (c) 2013 Victor Oliveira +Copyright (c) 2014 Collabora Ltd. http://www.collabora.co.uk +Copyright (c) 2015 Hewlett-Packard Development Company, L.P. +Copyright 2009 Wim Taymans +Copyright 2010 Arun Raghavan +Copyright 2010 Eduardo Fiss Beloni +Copyright 2011 Arun Raghavan +Copyright 2011 Eduardo Fiss Beloni +Copyright 2014 David FORT +Copyright 2014 David Fort +Copyright 2015 David FORT +Copyright 2015 David Fort +Copyright 2016 David FORT +Copyright 2016 David Fort +Copyright 2017 David Fort +Copyright 2017 Dorian Ducournau +Copyright 2018 David Fort +Copyright 2019 David Fort +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 1994, 1996, 1997 Free Software Foundation, Inc. +Copyright (c) 1998 Todd C. Miller +Copyright (c) 2001 Bjorn Reese +Copyright (c) 2001, 2003, 2005 Free Software Foundation, Inc. +Copyright (c) 2002, 2003, 2009 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2012 Free Software Foundation, Inc. +Copyright (c) 2004-2010 Marcel Holtmann +Copyright (c) 2006, 2008, 2010 Free Software Foundation, Inc. +Copyright (c) 2010, Luigi Toscano, +Copyright (c) 2013 Roy Stogner (c) +Copyright (c) 2017 Peter Meerwald-Stadler +Copyright 2001-2003, 2006-2012 Free Software Foundation, Inc. +Copyright 2006 Pierre Ossman for Cendio AB +Copyright 2009 Marc-Andre Moreau +Copyright 2010 Marc-Andre Moreau +Copyright 2011 Marc-Andre Moreau +Copyright 2012 Dmitrij Jasnov +Copyright 2012 Marc-Andre Moreau +Copyright 2012 Peter Meerwald +Copyright 2013 Marc-Andre Moreau +Copyright 2013 Peter Meerwald +Copyright 2014 Marc-Andre Moreau +Copyright 2015 Marc-Andre Moreau +Copyright (c) 1994 The Regents of the University of California +Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. +Copyright (c) 1996, 1998, 2001, 2002, 2003, 2005 Red Hat, Inc. +Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. +Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. +Copyright (c) 1996-2014 Anthony Green, Red Hat, Inc and others +Copyright 2013 Dell Software +Copyright 2014 Dell Software +Copyright 2014 Mike McDonald +Copyright 2015 Dell Software +Copyright (c) 2014 Hardening +Copyright (c) 2016 Norbert Federa +Portions Copyright 2009 The Go Authors. in LLVM, Diploma Thesis +Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies) +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies) +Copyright (c) 2014 David FORT +Copyright (c) 2015 David FORT +Copyright 1984, 1987, 1989, 1992, 2000 by Stephen L. Moshier (c) +Copyright 2015-2017 Norbert Federa +Copyright 2016-2017 Norbert Federa +Portions (c) International Organization for Standardization 1986 +Copyright (c) 1992-1996, 1998-2012 Free Software Foundation, Inc. +Copyright (c) 1996-2001, 2003-2015 Free Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang) Disclaimers +Copyright 2012 Bernhard Miklautz +Copyright 2012 Feng Wei , Freescale Ltd. +Copyright 2013 Bernhard Miklautz +Copyright 2015 Bernhard Miklautz +Copyright 2018 Bernhard Miklautz +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign +Copyright (c) 2004, 2006 The Linux Foundation and its contributors +Copyright (c) 2007-2018 University of Illinois at Urbana-Champaign +Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign +Copyright 2006-2007 Pierre Ossman for Cendio AB +Copyright 2009-2012 Marc-Andre Moreau +Copyright 2010-2011 Marc-Andre Moreau +Copyright 2010-2012 Marc-Andre Moreau +Copyright 2010-2014 Marc-Andre Moreau +Copyright 2011-2012 Marc-Andre Moreau +Copyright 2011-2013 Marc-Andre Moreau +Copyright 2011-2014 Marc-Andre Moreau +Copyright 2012-2013 Marc-Andre Moreau +Copyright 2012-2014 Marc-Andre Moreau +Copyright 2013-2014 Marc-Andre Moreau +(c) StringLiteral NumConstraints std::copy Constraints, Constraints +Copyright (c) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +Copyright (c) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2009-2011 Mathieu Malaterre +Copyright (c) 1992, 1993 The Regents of the University of California +Copyright (c) 2002, 2003, 2004, 2010, Free Software Foundation, Inc. +Copyright (c) 2006-2009 Steven J. Bethard +Copyright (c) 2015 Bernhard Miklautz +Copyright (c) Microsoft Corporation. Med ensamr Sekretessinformation +Copyright (c) 2014-2015 David FORT +Copyright 2006 Enrico Scholz +Copyright 2012 Niels Ole Salscheider +Copyright (c) 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) +Copyright 2009 Vincent Filali-Ansary +Copyright (c) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +Copyright (c) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, Inc. +Copyright (c) 2002, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. +Copyright (c) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, Inc. +Copyright (c) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright (c) 1992, 1993, 1994 The Regents of the University of California +Copyright (c) 2019 Pengutronix, Michael Olbrich +Copyright (c) 1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007-2008, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2008, 2009, 2012, 2015, 2019 The Free Software Foundation, Inc +Copyright (c) 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc. +Copyright (c) 2012 Alexandre K. I. de Mendonca +Copyright (c) 2001, 2002, 2003, 2005, 2008, 2010 Free Software Foundation, Inc. +Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (c) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan Westerfeld +Copyright (c) 1996, 1997, 2000, 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software Foundation, Inc. +Copyright 2018 Kai Harms Copyright.txt or https://cmake.org/licensing +Copyright (c) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +Copyright (c) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright 2008-2013 Joao Paulo Rechi Vita Copyrigth 2018-2019 Pali Rohar +Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 Free Software Foundation, Inc. +Copyright (c) Microsoft Corporation. https://aka.ms/privacy wsl.exe Argument Options... CommandLine +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2011 Free Software Foundation, Inc. +Copyright (c) 2000-2002 Oliver Kurth 2003 Lennart Poettering +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +Copyright (c) 2012 Alexandre K. I. de Mendonca , Paulo Pizarro +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011, 2014 Free Software Foundation, Inc. +Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Xaml.Behaviors.WinUI.Managed 3.0.0 - MIT + + +(c) Microsoft Corporation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +microsoft/gsl a3534567187d2edc428efd3f13466ff75fe5805c - MIT + + +Copyright 2008, Google Inc. +Copyright (c) 2015 Microsoft Corporation + +Copyright (c) 2015 Microsoft Corporation. All rights reserved. + +This code is licensed under the MIT License (MIT). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +nlohmann/json 55f93686c01528224f448c19128836e7df245f72 - MIT + + +2012 Erik Edlund +2020 Hannes Domani +2017 Georg Sauthoff +2018 Vitaliy Manushkin +2003-2022 LLVM Project. +2013-2025 Niels Lohmann +2015-2017 Niels Lohmann +2016-2021 Evan Nemerson +2018 The Abseil Authors +2016-2023 Viktor Kirilov +(c) 2013-2025 Niels Lohmann +Copyright 2003-2022 LLVM Project +Copyright 2015-2017 Niels Lohmann +Copyright 2018 The Abseil Authors +Copyright (c) 2009 Florian Loitsch +Copyright 2016-2023 Viktor Kirilov +Copyright (c) 2013-2025 Niels Lohmann +Copyright (c) 2015-2017 Niels Lohmann +copyright (c) 2013-2022 Niels Lohmann +copyright (c) 2013-2025 Niels Lohmann +Copyright (c) 2016-2023 Viktor Kirilov +Copyright 2017 Georg Sauthoff +copyright Niels Lohmann https://nlohmann.me +Copyright Copyright (c) 2013-2025 Niels Lohmann +Copyright 2012 Erik Edlund +Copyright 2018 Vitaliy Manushkin +Copyright 2013-2025 Niels Lohmann https://nlohmann.me +Copyright 2016-2021 Evan Nemerson +Copyright (c) 2012, Erik Edlund +Copyright 2020 Hannes Domani https://github.com/ssbssa +Copyright 2013 - 2025 Niels Lohmann https://nlohmann.me +Copyright 2016 - 2021 Evan Nemerson +Copyright (c) 2013-2022 Niels Lohmann http://nlohmann.me +Copyright 2009 Florian Loitsch https://florian.loitsch.com +Copyright (c) 2013-2025 Niels Lohmann (https://nlohmann.me) +Copyright 2008 - 2009 Bjorn Hoehrmann +Copyright (c) 2020 Hannes Domani (https://github.com/ssbssa) +Copyright (c) 2007 Free Software Foundation, Inc. http://fsf.org +Copyright (c) 2009 Florian Loitsch (https://florian.loitsch.com/) +(c) 2016 title 0.18611s from github-fe151-cp1-prd.iad.github.net GitHub, Inc. +Copyright (c) 2008-2009 Bjorn Hoehrmann (http://bjoern.hoehrmann.de/) +Copyright (c) 2008-2009 Bjorn Hoehrmann (https://bjoern.hoehrmann.de/) +Copyright (c) 2008-2009 Bjoern Hoehrmann @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa + +MIT License + +Copyright (c) 2013-2025 Niels Lohmann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +vswhere 3.1.7 - MIT + + +(c) 2023 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) by P.J. Plauger +Copyright (c) Microsoft Corporation + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +WinUIEx 2.9.0 - MIT + + +Copyright (c) Microsoft Corporation +Copyright 2021-2025 - Morten Nielsen +Copyright 2021-2025 - Morten Nielsen A +Copyright (c) 2021-2025 - Morten Nielsen + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +wix 5.0.2 - MS-RL + + +Copyright James Newton-King 2008 +Copyright UpdateUrl DisableModify +Copyright (c) Microsoft Corporation +(c) .NET Foundation and contributors +Copyright James Newton-King 2008 Json.NET +Copyright AssemblyDescription AssemblyProduct +Copyright (c) .NET Foundation and contributors + +Microsoft Reciprocal License (Ms-RL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + + 1. Definitions + + The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + + A "contribution" is the original software, or any additions or changes to the software. + + A "contributor" is any person that distributes its contribution under this license. + + "Licensed patents" are a contributor's patent claims that read directly on its contribution. + + 2. Grant of Rights + + (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + + (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + + 3. Conditions and Limitations + + (A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose. + + (B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + + (C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + + (D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + + (E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + + (F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees, or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. + +--------------------------------------------------------- + + +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + +--------------------------------------------------------- + +freerdp/freerdp 39f56443f2dc50e0dcfa52d4f8f15008d5b8ed8e - Apache-2.0 + + +Copyright 2013 +Copyright 2014 +Copyright 2013 DI +Copyright 2014 DI +Copyright 2015 DI +Copyright (c) 2011 +Copyright 2015 ANSSI +Copyright 2011 Samsung +Copyright 2011 Vic Lee +Copyright 2012 Vic Lee +Copyright 2014 Vic Lee +Copyright Jeff Sharkey +Copyright 2017 Ben Cohen +Copyright 2013 Felix Long +Copyright 2011 Jiten Pathy +Copyright 2013 Blaz Bacnik +Copyright 2019 Rangee Gmbh +Copyright 2010-2011 Vic Lee +Copyright 2010-2012 Vic Lee +Copyright 2011-2012 Vic Lee +Copyright 2012 Atrust corp. +Copyright 2015-2017 Vic Lee +Copyright 2016 Inuvika Inc. +Copyright (c) 2018 Simon Ser +Copyright 2008 Sci-Fi Hi-Fi. +Copyright 2009-2011 Jay Sorg +Copyright 2009-2012 Jay Sorg +Copyright (c) 2010 Apple Inc. +Copyright (c) 2012 Modelon AB +Copyright 2012 Gerald Richter +Copyright 2012 Jason Champion +Copyright 2012 Thomas Goddard +Copyright 2017 Artur Zaprzala +Copyright (c) 2007 Google Inc. +Copyright (c) 2015 Armin Novak +Copyright 2008 Matt Gallagher. +Copyright 2011 Stephen Erisman +Copyright (c) 2017 Red Hat Inc. +Copyright 2011-2012 Jiten Pathy +Copyright (c) 2012 MyCompanyName +Copyright 2001-2004 Unicode, Inc. +Copyright 2004-2009 Kitware, Inc. +Copyright 2006-2009 Kitware, Inc. +Copyright 2007-2009 Kitware, Inc. +Copyright 2012 Dmitry Baryshnikov +Copyright 2014 Thomas Erbesdobler +Copyright (c) 2012 Collabora, Ltd. +Copyright (c) 2013 BMW Car IT GmbH +Copyright (c) 2015 Martin Grasslin +Copyright (c) 2011-@RC_VERSION_YEAR +Copyright (c) 2008 Kristian Hogsberg +Copyright (c) 2011 Charles Scalesse. +Copyright (c) 2012, Victor Lazzarini +Copyright (c) 2013 DENSO CORPORATION +Copyright (c) 2013 Jasper St. Pierre +Copyright (c) 2013 Rafael Antognolli +Copyright (c) 2015-2017 Red Hat Inc. +Copyright (c) 2012-2013 A Tasty Pixel +Copyright 2013 Christian Hofstaedtler +Copyright (c) 2005-2014 Lode Vandevenne +Copyright 2016 Thinast Technologies GmbH +Copyright 2018 Thicast Technologies GmbH +Copyright (c) 2008-2013 Kristian Hogsberg +Copyright (c) 2010-2013 Intel Corporation +Copyright 2012 Thincast Technologies GmbH +Copyright 2013 Thincast Technologies GmbH +Copyright 2014 Thincast Technologies GmbH +Copyright 2015 Thincast Technologies GmbH +Copyright 2016 Thincast Technologies GmbH +Copyright 2017 Thincast Technologies GmbH +Copyright 2018 Thincast Technologies GmbH +Copyright 2019 Thincast Technologies GmbH +copyright was claimed by the wine project +Copyright 2010 O.S. Systems Software Ltda. +Copyright 2011 O.S. Systems Software Ltda. +Copyright 2012 HP Development Company, LLC +Copyright 2014 Thincast Technologies Gmbh. +Copyright Iowa State University 2009-2010. +Copyright (c) 1998-2016 The OpenSSL Project. +Copyright 2011 Jay Sorg +Copyright 2011 Shea Levy +Copyright 2012 Jay Sorg +Copyright 2015 Vic Lee +Copyright 2018 Kai Harms +Copyright.txt or https://cmake.org/licensing +(c) Copyright 2014 Thincast Technologies GmbH +Copyright (c) 2014 Thincast Technologies GmbH +Copyright (c) 2015 Thincast Technologies GmbH +Copyright (c) 2018 Thincast Technologies GmbH +Copyright 2015 bernhard.miklautz@thincast.com +(c) Copyright 2012 HP Development Company, LLC +Copyright 2011-2013 Thincast Technologies GmbH +Copyright 2012 Alam Arias +Copyright 2015-2016 Thincast Technologies GmbH +Copyright 2015-2017 Thincast Technologies GmbH +Copyright 2016,2018 Thincast Technologies GmbH +Copyright 2016-2017 Thincast Technologies GmbH +Copyright 2012 Rolf Eike Beer +Copyright 2014 Christian Plattner +Copyright 2016 Christian Plattner +Copyright 2019 Idan Freiberg +Copyright 2012 Fujitsu Technology Solutions GmbH +Copyright 2017 Armin Novak +Copyright 2018 Armin Novak +Copyright 2004-2012 Jay Sorg +Copyright 2007-2008 Miguel A. Figueroa-Villanueva +Copyright 2011 Anthony Tong +copyright (c) 2011 Petr Vanek +Copyright (c) 2006 The Android Open Source Project +Copyright (c) 2008 The Android Open Source Project +Copyright (c) 2010 The Android Open Source Project +Copyright (c) 2011 The Android Open Source Project +Copyright (c) 2016 The Android Open Source Project +Copyright 2013 Armin Novak +Copyright 2014 Armin Novak +Copyright 2015 Jiang Zihao +Copyright 2016 Armin Novak +Copyright 2016 Jiang Zihao +Copyright (c) 1998 Bjorn Reese and Daniel Stenberg. +Copyright (c) 2000 Bjorn Reese and Daniel Stenberg. +Copyright (c) 2001 Bjorn Reese and Daniel Stenberg. +Copyright (c) 2006, Tim Beaulen +Copyright 2013 Zhang Zhaolong +Copyright 2019 Mati Shabtay +Copyright (c) 2015 Rozhuk Ivan +Copyright (c) 2015-2017 Samsung Electronics Co., Ltd +Copyright 2006 Alexander Neundorf +Copyright 2010 Alexander Neundorf +Copyright 2011 Nils Andresen +Copyright 2012 Alexander Neundorf +Copyright 2012 Alfred Liu +Copyright 2012 Corey Clayton +Copyright 2013 Corey Clayton +Copyright 2014 Manuel Bachmann +Copyright 2016 Armin Novak +Copyright 2019 Kobi Mizrachi +Copyright (c) Alexi Volkov 2006 +Copyright 2013 Armin Novak +Copyright 2014 Armin Novak +Copyright 2015 Armin Novak +Copyright 2016 Armin Novak +Copyright 2016 David PHAM-VAN +Copyright 2017 Alexei Lozovsky +Copyright 2017 Armin Novak +Copyright 2018 Armin Novak +Copyright 2019 Armin Novak +Copyright (c) 1995-1998 Eric Young (eay@cryptsoft.com) +Copyright 2015 Denis Vincent +Copyright (c) 2006 Andreas Schneider +Copyright 2011 Otavio Salvador +Copyright 2012 Hewlett-Packard Development Company, L.P. +Copyright 2014 Hewlett-Packard Development Company, L.P. +Copyright 2015 Copyright 2015 Thincast Technologies GmbH +Copyright 2015 Hewlett-Packard Development Company, L.P. +(c) Copyright 2014 Armin Novak +Copyright (c) 1998, 2009 Bjorn Reese and Daniel Stenberg. +Copyright (c) 2008 Kyle Machulis +Copyright (c) 2015 Armin Novak +Copyright (c) 2018 Armin Novak +Copyright 2011 Martin Fleisz +Copyright 2011 Roman Barabanov +Copyright 2012-2013 Corey Clayton +Copyright 2013 Martin Fleisz +Copyright 2016 Martin Fleisz +Copyright 2018 Pascal Bourguignon +Copyright (c) 2006, Alexander Neundorf, +Copyright (c) 2008, Kevin Kofler, +Copyright 2008-2011 Alexander Neundorf, +Copyright 2015-2017 Armin Novak +Copyright 2016,2018 Armin Novak +Copyright 2016-2017 Armin Novak +Copyright 2011 Norbert Federa +Copyright 2012 Laxmikant Rashinkar +Copyright 2013 Norbert Federa +Copyright 2014 Hardening +Copyright 2014 Norbert Federa +Copyright 2015 Norbert Federa +Copyright 2016 Norbert Federa +(c) Copyright 2012 Hewlett-Packard Development Company, L.P. +(c) Copyright 2014 Hewlett-Packard Development Company, L.P. +Copyright (c) 2012 Raphael Kubo da Costa +Copyright (c) 2015 Hewlett-Packard Development Company, L.P. +Copyright 2010 Eduardo Fiss Beloni +Copyright 2011 Eduardo Fiss Beloni +Copyright 2014 David FORT +Copyright 2014 David Fort +Copyright 2015 David FORT +Copyright 2015 David Fort +Copyright 2016 David FORT +Copyright 2016 David Fort +Copyright 2017 David Fort +Copyright 2017 Dorian Ducournau +Copyright 2018 David Fort +Copyright 2019 David Fort +Copyright (c) 2001 Bjorn Reese +Copyright (c) 2010, Luigi Toscano, +Copyright 2009 Marc-Andre Moreau +Copyright 2010 Marc-Andre Moreau +Copyright 2011 Marc-Andre Moreau +Copyright 2012 Dmitrij Jasnov +Copyright 2012 Marc-Andre Moreau +Copyright 2013 Marc-Andre Moreau +Copyright 2014 Marc-Andre Moreau +Copyright 2015 Marc-Andre Moreau +Copyright 2013 Dell Software +Copyright 2014 Dell Software +Copyright 2014 Mike McDonald +Copyright 2015 Dell Software +Copyright (c) 2014 Hardening +Copyright (c) 2016 Norbert Federa +Copyright (c) 2014 David FORT +Copyright (c) 2015 David FORT +Copyright 2015-2017 Norbert Federa +Copyright 2016-2017 Norbert Federa +Copyright 2012 Bernhard Miklautz +Copyright 2013 Bernhard Miklautz +Copyright 2015 Bernhard Miklautz +Copyright 2018 Bernhard Miklautz +Copyright 2009-2012 Marc-Andre Moreau +Copyright 2010-2011 Marc-Andre Moreau +Copyright 2010-2012 Marc-Andre Moreau +Copyright 2010-2014 Marc-Andre Moreau +Copyright 2011-2012 Marc-Andre Moreau +Copyright 2011-2013 Marc-Andre Moreau +Copyright 2011-2014 Marc-Andre Moreau +Copyright 2012-2013 Marc-Andre Moreau +Copyright 2012-2014 Marc-Andre Moreau +Copyright 2013-2014 Marc-Andre Moreau +Copyright 2009-2011 Mathieu Malaterre +Copyright (c) 2015 Bernhard Miklautz +Copyright (c) 2014-2015 David FORT +Copyright 2006 Enrico Scholz + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +pulseaudio/pulseaudio 0e691b96640919b1c7ed91ae9240761c5775deeb - GPL-2.0-only AND LGPL-2.1-only + + +Copyright (c) DFS +Copyright (c) 2008 +Copyright (c) 2010 +Copyright (c) 2014 +Copyright (c) 2016 +Copyright (c) 2019 +Copyright (c) 2009. +Copyright (c) 2009 THE +Copyright (c) 2011 THE +Copyright (c) 2008-2019 +Copyright 2009 Finn Thain +Copyright (c) 2010 Rosetta +Copyright 2009 Daniel Mack +Copyright 2015 Georg Chini +Copyright 2009 Ted Percival +Copyright 2013 Albert Zeyer +Copyright Kungliga Tekniska +Copyright 2006 Diego Petteno +Copyright 2006 Shams E. King +Copyright 2008 Colin Guthrie +Copyright 2009 Canonical Ltd +Copyright 2009 Colin Guthrie +Copyright 2009 Tanu Kaskinen +Copyright 2010 Arun Raghavan +Copyright 2010 Colin Guthrie +Copyright 2011 Canonical Ltd +Copyright 2011 Colin Guthrie +Copyright 2013 Hajime Fujita +Copyright (c) 1999 Tom Tromey +Copyright (c) 2008 PULSEAUDIO +Copyright 2010 Canonical Ltd. +Copyright 2013 Collabora Ltd. +Copyright 2015 Canonical Ltd. +Copyright (c) 2010 Google Inc. +Copyright (c) 2008 Timo Jyrinki +Copyright (c) 2009 Matteo Frigo +Copyright 2013 Martin Blanchard +Copyright (c) 2000 Red Hat, Inc. +Copyright (c) 2001 Chris Bagwell +Copyright 2004 Joe Marcus Clarke +Copyright 2008 Nokia Corporation +Copyright 2009 Intel Corporation +Copyright 2009 Nokia Corporation +Copyright 2010 Intel Corporation +Copyright 2011 Intel Corporation +Copyright 2013 Alexander Couzens +Copyright 2013 Intel Corporation +Copyright 2014 Intel Corporation +Copyright (c) 2012 Canonical Ltd. +Copyright 2004 Lennart Poettering +Copyright 2006 Lennart Poettering +Copyright 2007 Lennart Poettering +Copyright 2008 Lennart Poettering +Copyright 2009 Lennart Poettering +Copyright 2010 Lennart Poettering +Copyright 2012 Lennart Poettering +Copyright 2013 Matthias Wabersich +Copyright (c) 2008 Alexandre Oliva +Copyright (c) 2013 The Chromium OS +copyright (c) 2001 Fabrice Bellard +Copyright 2011 Collabora Multimedia +Copyright (c) 2012 Intel Corporation +Copyright (c) 2014, 2015 Google Inc. +Copyright 2011-2013 BMW Car IT GmbH. +Copyright 2013 Joao Paulo Rechi Vita +Copyright 2014, 2015 Andrey Semashev +Copyright (c) 2006 Lennart Poettering +Copyright (c) 2008, 2009 the author(s) +Copyright 2004-2006 Lennart Poettering +Copyright 2004-2008 Lennart Poettering +Copyright 2004-2009 Lennart Poettering +Copyright 2005-2006 Lennart Poettering +Copyright 2005-2009 Lennart Poettering +Copyright 2006-2008 Lennart Poettering +Copyright 2006-2009 Lennart Poettering +COPYRIGHT_HOLDER PulseAudio contributors +Copyright (c) 2006-2010 Nokia Corporation +Copyright 2008-2013 Joao Paulo Rechi Vita +Copyright (c) 2006-2008 Lennart Poettering +Copyright (c) The Internet Society (1998). +Copyright (c) The Internet Society (2000). +Copyright (c) The Internet Society (2003). +Copyright (c) 2008 Free Software Foundation +Copyright 2011 Wolfson Microelectronics PLC +copyrighted by the Free Software Foundation +Copyright 2004-2006, 2009 Lennart Poettering +Copyright (c) 2008 Stepan Kasal +Copyright 2009 Jason Newton +Copyright (c) 2007-2008 Free Software Foundation +Copyright (c) 2009 Jason Newton nevion@gmail.com +Copyright 2011 David Henningsson, Canonical Ltd. +Copyright 2014 David Henningsson, Canonical Ltd. +Copyright 2019 Pali Rohar +Copyright (c) 2009 Free Software Foundation, Inc. +Copyright (c) 2015 Paul Norman +Copyright 2009,2010 Daniel Mack +Copyright 2013 Peter Meerwald +Copyright 2014 Peter Meerwald +Copyright (c) 2008 Andreas Schwab +Copyright (c) 2012 Zack Weinberg +Copyright 2010 Wim Taymans +Copyright (c) 2008 Alan Woodland +Copyright (c) 2008 Guido U. Draheim +Copyright 2010 David Henningsson +Copyright (c) 2008 Benjamin Kosnik +Copyright (c) 2018 Pali Rohar +Copyright (c) 2019 Pali Rohar +Copyright 2016 Arun Raghavan +Copyright 2014 Wim Taymans +Copyright 2018-2019 Pali Rohar +Copyright (c) 2008-2017 Free Software Foundation, Inc. +Copyright 2015 Ahmed S. Darwish +Copyright 2016 Ahmed S. Darwish +Copyright (c) 1989, 1991 Free Software Foundation, Inc. +Copyright (c) 1991, 1999 Free Software Foundation, Inc. +Copyright (c) 2011 Daniel Richard G. +Copyright (c) 2015 Moritz Klammler +Copyright (c) 2011 Maarten Bosmans +Copyright (c) 2012, 2016. Free Software Foundation, Inc. +Copyright 2009 Wim Taymans +Copyright 2010 Wim Taymans +Copyright (c) 2004 Michael Niedermayer +Copyright (c) 2013 Roy Stogner +Copyright 2012 Alexander Kurtz +Copyright 2017 Sebastian Droge +Copyright 2019 Russell Treleaven +Copyright (c) 2008 Steven G. Johnson +Copyright (c) 2009 Steven G. Johnson +Copyright (c) 2010 Diego Elio Petteno +Copyright 2011 Collabora Ltd. 2015 Aldebaran SoftBank Group +Copyright 2012 Flavio Ceolin +Copyright (c) 2011 Antonio Ospite +Copyright 2009 Wim Taymans +Copyright 2010 Arun Raghavan +Copyright 2011 Arun Raghavan +Copyright (c) 1994, 1996, 1997 Free Software Foundation, Inc. +Copyright (c) 2004-2010 Marcel Holtmann +Copyright (c) 2017 Peter Meerwald-Stadler +Copyright 2001-2003, 2006-2012 Free Software Foundation, Inc. +Copyright 2006 Pierre Ossman for Cendio AB +Copyright 2012 Peter Meerwald +Copyright 2013 Peter Meerwald +Copyright (c) 2014 Collabora Ltd. +Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +Copyright 2012 Feng Wei , Freescale Ltd. +Copyright 2006-2007 Pierre Ossman for Cendio AB +Copyright 2012 Niels Ole Salscheider +Copyright 2009 Vincent Filali-Ansary +Copyright (c) 1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc. +Copyright (c) 2008, 2009, 2012, 2015, 2019 The Free Software Foundation, Inc +Copyright (c) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan Westerfeld. +Copyright 2013 bct electronic GmbH Contributor Stefan Huber +Copyright 2008-2013 Joao Paulo Rechi Vita Copyrigth 2018-2019 Pali Rohar +Copyright (c) 2000-2002 Oliver Kurth 2003 Lennart Poettering + +All PulseAudio source files, except as noted below, are licensed under the GNU +Lesser General Public License. (see file LGPL for details) + +However, the server side has optional GPL dependencies. These include the +libsamplerate and gdbm (core libraries), LIRC (lirc module) and FFTW (equalizer +module), although others may also be included in the future. If PulseAudio is +compiled with these optional components, this effectively downgrades the +license of the server part to GPL (see the file GPL for details), exercising +section 3 of the LGPL. In such circumstances, you should treat the client +library (libpulse) of PulseAudio as being LGPL licensed and the server part +(libpulsecore) as being GPL licensed. Since the PulseAudio daemon, tests, +various utilities/helpers and the modules link to libpulsecore and/or the afore +mentioned optional GPL dependencies they are of course also GPL licensed also +in this scenario. + +In addition to this, if D-Bus support is enabled, the PulseAudio client library +(libpulse) MAY need to be licensed under the GPL, depending on the license +adopted for libdbus. libdbus is licensed under either of the Academic Free +License 2.1 or GPL 2.0 or above. Which of these applies is your choice, and the +result affects the licensing of libpulse and thus, potentially, all programs +that link to libpulse. + +Andre Adrian's echo cancellation implementation is licensed under a less +restrictive license - see src/modules/echo-cancel/adrian-license.txt for +details. + +Some other files pulled into PA source (i.e. reference implementations that are +considered too small and stable to be considered as an external library) use the +more permissive MIT license. These include the device reservation DBus protocol +and realtime kit implementations. + +A more permissive BSD-style license is used for LFE filters, see +src/pulsecore/filter/LICENSE.WEBKIT for details. + +Additionally, a more permissive Sun license is used for code that performs +u-law, A-law and linear PCM conversions. + +While we attempt to provide a summary here, it is the ultimate responsibility of +the packager to ensure the components they use in their build of PulseAudio +meets their license requirements. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +wayland-project/weston 04d3ae265d8d8f84352c8dac21ec40b2fe07e7d2 - MIT + + +(c) 2007-2010 Novell, Inc. +(c) 2013 DENSO CORPORATION +Copyright (c) 2012 Rob Clark +Copyright (c) 2012 Jonas Adahl +Copyright (c) 2013 Jonas Adahl +Copyright 2018 Collabora, Ltd. +Copyright 2019 Collabora, Ltd. +Copyright (c) 2009 Chris Wilson +Copyright (c) 2012 Scott Moreau +Copyright (c) 2013 Red Hat, Inc. +Copyright (c) 2015 Red Hat, Inc. +Copyright 2012 Intel Corporation +Copyright (c) 2011 Tim Wiederhake +Copyright (c) 2012 Martin Minarik +Copyright (c) 2012 Openismus GmbH +Copyright (c) 2013 Collabora Ltd. +Copyright (c) 2013 David Herrmann +Copyright (c) 2013 Jason Ekstrand +Copyright (c) 2013 Richard Hughes +Copyright (c) 2014 Jason Ekstrand +Copyright (c) 2015 Collabora Ltd. +Copyright (c) 2015 Giulio Camuffo +Copyright (c) 2016 Armin Krezovic +Copyright (c) 2016 Giulio Camuffo +Copyright (c) 2019 Collabora Ltd. +Copyright (c) 2011 Collabora, Ltd. +Copyright (c) 2012 Collabora, Ltd. +Copyright (c) 2013 BMW Car IT GmbH +Copyright (c) 2013 Collabora, Ltd. +Copyright (c) 2013 Philip Withnall +Copyright (c) 2014 Collabora, Ltd. +Copyright (c) 2015 Collabora, Ltd. +Copyright (c) 2016 Benoit Gschwind +Copyright (c) 2016 Collabora, Ltd. +Copyright (c) 2017 Collabora, Ltd. +Copyright (c) 2018 Collabora, Ltd. +Copyright (c) 2019 Collabora, Ltd. +copyright u'2019, Weston community +Copyright (c) 2011 Benjamin Franzke +Copyright (c) 2012 Benjamin Franzke +Copyright 2017-2018 Collabora, Ltd. +Copyright 2018-2019 Collabora, Ltd. +Copyright (c) 2008 Kristian Hogsberg +Copyright (c) 2009 Intel Corporation +Copyright (c) 2010 Intel Corporation +Copyright (c) 2010 Kristian Hogsberg +Copyright (c) 2011 Intel Corporation +Copyright (c) 2011 Kristian Hogsberg +Copyright (c) 2012 John Kare Alsaker +Copyright (c) 2012 Kristian Hogsberg +Copyright (c) 2013 DENSO CORPORATION +Copyright (c) 2013 Intel Corporation +Copyright (c) 2014 DENSO CORPORATION +Copyright (c) 2015 Jasper St. Pierre +Copyright (c) 2016 DENSO CORPORATION +Copyright (c) 2018 Intel Corporation +Copyright (c) 2019 Intel Corporation +Copyright 2016 The Chromium Authors. +Copyright 2016, 2017 Collabora, Ltd. +(c) 2016 Samsung Electronics Co., Ltd +Copyright (c) 2012 Intel Corporation. +Copyright (c) 2016 NVIDIA Corporation +Copyright 2010-2012 Intel Corporation +Copyright (c) 2014,2018 Collabora Ltd. +Copyright 2013 Raspberry Pi Foundation +Copyright (c) 2011-2012 Collabora, Ltd. +Copyright (c) 2012 Philipp Bruschweiler +Copyright (c) 2012-2013 Collabora, Ltd. +Copyright (c) 2012-2018 Collabora, Ltd. +Copyright (c) 2015,2019 Collabora, Ltd. +Copyright 2010 Red Hat +Copyright 2018 General Electric Company +Copyright (c) 2010-2011 Benjamin Franzke +Copyright (c) 2014, 2015 Collabora, Ltd. +Copyright (c) 2014, 2016 Collabora, Ltd. +Copyright (c) 2014, 2019 Collabora, Ltd. +Copyright (c) 2015, 2019 Collabora, Ltd. +Copyright (c) 2016, 2019 Collabora, Ltd. +Copyright (c) 2017, 2018 Collabora, Ltd. +Copyright (c) 2018 DisplayLink (UK) Ltd. +Copyright 2011-2012,2020 Collabora, Ltd. +Copyright (c) 2008-2011 Kristian Hogsberg +Copyright (c) 2008-2012 Kristian Hogsberg +Copyright (c) 2010-2011 Intel Corporation +Copyright (c) 2010-2012 Intel Corporation +Copyright (c) 2011-2012 Intel Corporation +Copyright (c) 2014 - 2015 Collabora, Ltd. +Copyright (c) 2010, 2013 Intel Corporation +Copyright (c) 2011, 2012 Intel Corporation +Copyright (c) 2012 Raspberry Pi Foundation +Copyright (c) 2013 Raspberry Pi Foundation +Copyright (c) 2018-2019 Intel Corporation. +Copyright 2014, 2016, 2020 Collabora, Ltd. +Copyright (c) 2010 Red Hat +Copyright (c) 2017 Pekka Paalanen pq@iki.fi +Copyright (c) 2015 General Electric Company. +Copyright (c) 2016 Quentin Sardem FF7 Glidic +Copyright (c) 2018 Renesas Electronics Corp. +Copyright 2017-2018 General Electric Company +Copyright (c) 2012, 2017-2019 Collabora, Ltd. +Copyright (c) 2014 Pekka Paalanen +Copyright (c) 2017 Pekka Paalanen +Copyright (c) 2012, 2017, 2018 Collabora, Ltd. +Copyright (c) 2018 Zodiac Inflight Innovations +Copyright (c) 2015 Samsung Electronics Co., Ltd +Copyright (c) 2016 Samsung Electronics Co., Ltd +Copyright (c) 2017, 2018 General Electric Company +Copyright (c) 2013 Hardening +Copyright (c) 1988-2004 Keith Packard and Bart Massey. +Copyright (c) 2013 Sam Spilsbury +Copyright (c) 2013 David Herrmann +Copyright (c) 2013 Vasily Khoruzhick +Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. +Copyright (c) 2004, 2006 The Linux Foundation and its contributors. +Copyright (c) 2019 Pengutronix, Michael Olbrich + +Copyright © 2008-2012 Kristian Høgsberg +Copyright © 2010-2012 Intel Corporation +Copyright © 2010-2011 Benjamin Franzke +Copyright © 2011-2012 Collabora, Ltd. +Copyright © 2010 Red Hat + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +--- + +The above is the version of the MIT "Expat" License used by X.org: + + http://cgit.freedesktop.org/xorg/xserver/tree/COPYING + + +--------------------------------------------------------- + + +--------------------------------------------------------- + +mesa/mesa be4f7fb656180ab55a50eff01f36672b0bf5f146 - MIT + + +Copyright (C) 1999-2007 Brian Paul. All Rights Reserved. +Copyright (c) Mesa contributors + +The Mesa distribution consists of several components under different licenses. The core Mesa library and Gallium code are licensed under the MIT license shown below. Component licenses are documented in docs/license.rst within the project source tree. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- diff --git a/vendor/wslcsdk/README.md b/vendor/wslcsdk/README.md index 974594f..86aea44 100644 --- a/vendor/wslcsdk/README.md +++ b/vendor/wslcsdk/README.md @@ -1,27 +1,67 @@ -# wslcsdk (vendorizado) +# wslcsdk — SDK do WSL Containers (vendorizado) -DLL e header do pacote NuGet **Microsoft.WSL.Containers** (preview), usados pelo backend nativo -(koffi/FFI) em `src/main/services/wslc/native/`. +DLLs e headers do pacote NuGet **[Microsoft.WSL.Containers][pkg]**, usados pelo backend nativo +(koffi/FFI) em `src/main/services/wslc/native/`. Licença **MIT**, © Microsoft Corporation — ver +`LICENSE.txt` e `NOTICE.txt`. Redistribuir é permitido desde que esses avisos acompanhem, que é +por isso que eles estão aqui e vão dentro do instalador. -> **Os binários não estão no repositório.** São redistribuíveis da Microsoft e ficam fora do -> controle de versão (ver `.gitignore`). Baixe-os antes de usar o motor nativo. +| Versão | SHA-256 da DLL | Tamanho | +| ------ | ------------------------------------------------------------------ | --------- | +| 2.9.3 | `a3881e7d239be9944a64868c323046aa0292d4806c289cb31c50c8df8d5dc68d` | 5.406.520 | +| 2.9.9 | `8d4d55d4283fb32a5909b57e78b576d01363d7b28bb9b2595115e80faf61db5b` | 4.929.888 | -## Como obter +``` +vendor/wslcsdk/ + include/2.9.3/wslcsdk.h LICENSE.txt + include/2.9.9/wslcsdk.h NOTICE.txt + win-x64/2.9.3/wslcsdk.dll + win-x64/2.9.9/wslcsdk.dll +``` + +## Por que duas + +Porque a versão do SDK precisa acompanhar a do WSL instalado, e isso foi **medido**: nesta máquina, +com WSL **2.9.4**, o SDK **2.9.9** carrega, cria a sessão e lista imagens — e então dá +**segmentation fault** em `WslcGetSessionTerminationEvent`. + +O que torna esse caso perigoso é que nada no header denuncia o problema: a declaração daquela função +é byte a byte idêntica nas duas versões, e os 18 structs também. Não há binding que se defenda +disso. O SDK novo simplesmente conversa com um `wslservice` mais velho do que ele espera. + +Daí a regra de `native/bundled.ts`: **usar a DLL mais nova que não passe da versão do WSL +instalado**. Com WSL 2.9.4 isso dá a 2.9.3; com 2.9.9 ou mais, a 2.9.9. Sem saber a versão, fica na +mais antiga — errar para baixo custa recurso, errar para cima custa o processo. + +Quem quiser fugir da regra escolhe outra DLL na aba **Sistema**. + +## O que a 2.9.9 muda + +Duas funções novas — `WslcOpenContainer` (abre container existente por nome, ID ou prefixo) e +`WslcSetContainerInitProcessIOCallbacks` — e **duas assinaturas alteradas**: + +- `WslcSessionAuthenticate` ganhou `tokenType` **antes** do `errorMessage`; +- `WslcInstallWithDependencies` ganhou `components` e `options` na frente. + +O `bindings.ts` detecta qual ABI está carregada pela presença do símbolo `WslcOpenContainer` e +adapta as chamadas (ver `SdkAbi`). É o que permite ao seletor da aba Sistema aceitar qualquer uma +das duas sem quebrar login em registry nem instalação guiada. + +## Atualizar / acrescentar uma versão ```powershell -curl.exe -L -o wslc.nupkg https://www.nuget.org/api/v2/package/Microsoft.WSL.Containers +curl.exe -L -o wslc.nupkg https://www.nuget.org/api/v2/package/Microsoft.WSL.Containers/ Expand-Archive .\wslc.nupkg -DestinationPath .\wslc-nupkg -Copy-Item .\wslc-nupkg\runtimes\win-x64\native\wslcsdk.dll .\win-x64\ -Copy-Item .\wslc-nupkg\build\native\include\wslcsdk.h .\include\ +mkdir .\win-x64\, .\include\ +Copy-Item .\wslc-nupkg\runtimes\win-x64\native\wslcsdk.dll .\win-x64\\ +Copy-Item .\wslc-nupkg\include\wslcsdk.h .\include\\ +Copy-Item .\wslc-nupkg\NOTICE.txt .\ +Get-FileHash .\win-x64\\wslcsdk.dll -Algorithm SHA256 ``` -Estrutura esperada: +Depois: acrescente a versão em `BUNDLED_SDKS` (ordenada, da mais antiga para a mais nova) e **faça o +diff do header** contra a anterior antes de confiar. Se alguma assinatura mudar de novo, `SdkAbi` +precisa de um novo marcador — um símbolo que só exista na versão nova. -``` -vendor/wslcsdk/ - include/wslcsdk.h - win-x64/wslcsdk.dll -``` +Sem esses arquivos o app continua funcionando pelo motor **CLI** (`wslc.exe`). -Sem esses arquivos o app continua funcionando pelo motor **CLI** (`wslc.exe`); a instalação guiada -do próprio app detecta a ausência do SDK e orienta o download. +[pkg]: https://www.nuget.org/packages/Microsoft.WSL.Containers diff --git a/vendor/wslcsdk/include/2.9.3/wslcsdk.h b/vendor/wslcsdk/include/2.9.3/wslcsdk.h new file mode 100644 index 0000000..97dc2b0 --- /dev/null +++ b/vendor/wslcsdk/include/2.9.3/wslcsdk.h @@ -0,0 +1,631 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + WslcSDK.h + +Abstract: + + This file contains the public WSL Container SDK api definitions. + + PREVIEW NOTICE: This API is currently in preview and is subject to breaking + changes in future releases without prior notice. Do not rely on API stability + for production workloads. Features, function signatures, and behaviors may + change between releases during the preview period. + +--*/ +#pragma once +#include +#include +#include +#include +#include + +EXTERN_C_START + +// WSLC specific error codes +// Ensure wslc.idl and wslcsdk.idl are also updated. +#define WSLC_E_BASE (0x0600) +#define WSLC_E_IMAGE_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 1) /* 0x80040601 */ +#define WSLC_E_CONTAINER_PREFIX_AMBIGUOUS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 2) /* 0x80040602 */ +#define WSLC_E_CONTAINER_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 3) /* 0x80040603 */ +#define WSLC_E_VOLUME_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 4) /* 0x80040604 */ +#define WSLC_E_CONTAINER_NOT_RUNNING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 5) /* 0x80040605 */ +#define WSLC_E_CONTAINER_IS_RUNNING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 6) /* 0x80040606 */ +#define WSLC_E_SESSION_RESERVED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 7) /* 0x80040607 */ +#define WSLC_E_INVALID_SESSION_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 8) /* 0x80040608 */ +#define WSLC_E_NETWORK_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 9) /* 0x80040609 */ +#define WSLC_E_WU_SEARCH_FAILED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 10) /* 0x8004060A */ +#define WSLC_E_SDK_UPDATE_NEEDED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 11) /* 0x8004060B */ +#define WSLC_E_CONTAINER_DISABLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 12) /* 0x8004060C */ +#define WSLC_E_REGISTRY_BLOCKED_BY_POLICY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 13) /* 0x8004060D */ +#define WSLC_E_VOLUME_NOT_AVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 14) /* 0x8004060E */ +#define WSLC_E_SESSION_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 15) /* 0x8004060F */ + +// Session values +#define WSLC_SESSION_OPTIONS_SIZE 72 +#define WSLC_SESSION_OPTIONS_ALIGNMENT 8 + +typedef struct WslcSessionSettings +{ + __declspec(align(WSLC_SESSION_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_SESSION_OPTIONS_SIZE]; +} WslcSessionSettings; + +DECLARE_HANDLE(WslcSession); + +// Container values +#define WSLC_CONTAINER_OPTIONS_SIZE 104 +#define WSLC_CONTAINER_OPTIONS_ALIGNMENT 8 + +typedef struct WslcContainerSettings +{ + __declspec(align(WSLC_CONTAINER_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_CONTAINER_OPTIONS_SIZE]; +} WslcContainerSettings; + +DECLARE_HANDLE(WslcContainer); + +// Process values +#define WSLC_CONTAINER_PROCESS_OPTIONS_SIZE 72 +#define WSLC_CONTAINER_PROCESS_OPTIONS_ALIGNMENT 8 +typedef struct WslcProcessSettings +{ + __declspec(align(WSLC_CONTAINER_PROCESS_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_CONTAINER_PROCESS_OPTIONS_SIZE]; +} WslcProcessSettings; + +DECLARE_HANDLE(WslcProcess); + +typedef enum WslcContainerNetworkingMode +{ + WSLC_CONTAINER_NETWORKING_MODE_NONE = 0, // No networking / isolated + WSLC_CONTAINER_NETWORKING_MODE_BRIDGED = 1 +} WslcContainerNetworkingMode; + +typedef enum WslcVhdType +{ + WSLC_VHD_TYPE_DYNAMIC = 0, // Expanding VHDX (default) + WSLC_VHD_TYPE_FIXED = 1 // Fixed-allocation VHDX (only honored by WslcCreateSessionVhdVolume) +} WslcVhdType; + +typedef enum WslcVhdRequirementsFlags +{ + WSLC_VHD_REQ_FLAG_NONE = 0x00000000, + // When set, WslcVhdRequirements::uid and gid are honored. When clear, + // those fields are ignored and the volume is left owned by root:root. + WSLC_VHD_REQ_FLAG_OWNER = 0x00000001, +} WslcVhdRequirementsFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcVhdRequirementsFlags); + +typedef struct WslcVhdRequirements +{ + // Ignored by WslcSetSessionSettingsVhd + _In_z_ PCSTR name; + _In_ uint64_t sizeBytes; // Desired size (for create/expand) + _In_ WslcVhdType type; + // The remaining fields are only honored by WslcCreateSessionVhdVolume. + // WslcSetSessionSettingsVhd rejects non-NONE flags with E_INVALIDARG. + _In_ WslcVhdRequirementsFlags flags; + _In_ uint32_t uid; // honored iff (flags & WSLC_VHD_REQ_FLAG_OWNER) + _In_ uint32_t gid; // honored iff (flags & WSLC_VHD_REQ_FLAG_OWNER) +} WslcVhdRequirements; + +typedef enum WslcSessionFeatureFlags +{ + WSLC_SESSION_FEATURE_FLAG_NONE = 0x00000000, + WSLC_SESSION_FEATURE_FLAG_ENABLE_GPU = 0x00000004 +} WslcSessionFeatureFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcSessionFeatureFlags); + +typedef enum WslcSessionTerminationReason +{ + WSLC_SESSION_TERMINATION_REASON_UNKNOWN = 0, + WSLC_SESSION_TERMINATION_REASON_SHUTDOWN = 1, + WSLC_SESSION_TERMINATION_REASON_CRASHED = 2, +} WslcSessionTerminationReason; + +typedef struct WslcSessionCrashDumpInfo +{ + _Field_z_ PCWSTR dumpPath; + _Field_z_ PCSTR processName; + uint32_t pid; + uint32_t signal; + uint64_t timestamp; +} WslcSessionCrashDumpInfo; + +typedef __callback void(CALLBACK* WslcSessionCrashDumpCallback)(_In_ const WslcSessionCrashDumpInfo* info, _In_opt_ PVOID context); + +// Opaque handle returned by WslcRegisterSessionCrashDumpCallback. Holding it keeps the crash dump +// registration alive; pass it to WslcReleaseCrashDumpSubscription to unsubscribe. +DECLARE_HANDLE(WslcCrashDumpSubscription); + +STDAPI WslcInitSessionSettings(_In_ PCWSTR name, _In_ PCWSTR storagePath, _Out_ WslcSessionSettings* sessionSettings); + +STDAPI WslcCreateSession(_In_ WslcSessionSettings* sessionSettings, _Out_ WslcSession* session, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// OPTIONAL SESSION SETTINGS +STDAPI WslcSetSessionSettingsCpuCount(_In_ WslcSessionSettings* sessionSettings, _In_ uint32_t cpuCount); +STDAPI WslcSetSessionSettingsMemory(_In_ WslcSessionSettings* sessionSettings, _In_ uint32_t memoryMB); +STDAPI WslcSetSessionSettingsTimeout(_In_ WslcSessionSettings* sessionSettings, _In_ uint32_t timeoutMS); + +STDAPI WslcSetSessionSettingsVhd(_In_ WslcSessionSettings* sessionSettings, _In_opt_ const WslcVhdRequirements* vhdRequirements); + +STDAPI WslcSetSessionSettingsFeatureFlags(_In_ WslcSessionSettings* sessionSettings, _In_ WslcSessionFeatureFlags flags); + +STDAPI WslcGetSessionTerminationEvent(_In_ WslcSession session, _Out_ HANDLE* terminationEvent); +STDAPI WslcGetSessionTerminationReason(_In_ WslcSession session, _Out_ WslcSessionTerminationReason* reason); + +STDAPI WslcTerminateSession(_In_ WslcSession session); +STDAPI WslcReleaseSession(_In_ WslcSession session); + +// Registers a callback invoked when a Linux process crash dump is written for the session. +// Works for any caller holding a live session. The returned subscription keeps the registration +// alive; release it with WslcReleaseCrashDumpSubscription to unsubscribe. Multiple subscriptions +// can be registered against the same session. +STDAPI WslcRegisterSessionCrashDumpCallback( + _In_ WslcSession session, + _In_ WslcSessionCrashDumpCallback crashDumpCallback, + _In_opt_ PVOID crashDumpContext, + _Out_ WslcCrashDumpSubscription* subscription, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcReleaseCrashDumpSubscription(_In_ WslcCrashDumpSubscription subscription); + +// CONTAINER DEFINITIONS + +typedef enum WslcPortProtocol +{ + WSLC_PORT_PROTOCOL_TCP = 0, + WSLC_PORT_PROTOCOL_UDP = 1 +} WslcPortProtocol; + +typedef struct WslcContainerPortMapping +{ + _In_ uint16_t windowsPort; // Port on Windows host + _In_ uint16_t containerPort; // Port inside container + _In_ WslcPortProtocol protocol; // TCP or UDP + + // if you want to override the default binding address + _In_opt_ struct sockaddr_storage* windowsAddress; // accepts ipv4/6 +} WslcContainerPortMapping; + +typedef struct WslcContainerVolume +{ + _In_z_ PCWSTR windowsPath; + _In_z_ PCSTR containerPath; + _In_ BOOL readOnly; +} WslcContainerVolume; + +typedef struct WslcContainerNamedVolume +{ + _In_z_ PCSTR name; // Name of the session volume (from WslcVhdRequirements.name) + _In_z_ PCSTR containerPath; // Absolute path inside the container + _In_ BOOL readOnly; +} WslcContainerNamedVolume; + +typedef enum WslcContainerFlags +{ + WSLC_CONTAINER_FLAG_NONE = 0x00000000, + WSLC_CONTAINER_FLAG_AUTO_REMOVE = 0x00000001, + WSLC_CONTAINER_FLAG_ENABLE_GPU = 0x00000002, + WSLC_CONTAINER_FLAG_PRIVILEGED = 0x00000004, + +} WslcContainerFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcContainerFlags); + +typedef enum WslcContainerStartFlags +{ + WSLC_CONTAINER_START_FLAG_NONE = 0x00000000, + WSLC_CONTAINER_START_FLAG_ATTACH = 0x00000001, + +} WslcContainerStartFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcContainerStartFlags); + +STDAPI WslcInitContainerSettings(_In_ PCSTR imageName, _Out_ WslcContainerSettings* containerSettings); + +STDAPI WslcCreateContainer(_In_ WslcSession session, _In_ const WslcContainerSettings* containerSettings, _Out_ WslcContainer* container, _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcStartContainer(_In_ WslcContainer container, _In_ WslcContainerStartFlags flags, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// OPTIONAL CONTAINER SETTINGS +STDAPI WslcSetContainerSettingsName(_In_ WslcContainerSettings* containerSettings, _In_ PCSTR name); + +STDAPI WslcSetContainerSettingsInitProcess(_In_ WslcContainerSettings* containerSettings, _In_ WslcProcessSettings* initProcess); + +STDAPI WslcSetContainerSettingsNetworkingMode(_In_ WslcContainerSettings* containerSettings, _In_ WslcContainerNetworkingMode networkingMode); + +STDAPI WslcSetContainerSettingsHostName(_In_ WslcContainerSettings* containerSettings, _In_ PCSTR hostName); + +STDAPI WslcSetContainerSettingsDomainName(_In_ WslcContainerSettings* containerSettings, _In_ PCSTR domainName); + +STDAPI WslcSetContainerSettingsFlags(_In_ WslcContainerSettings* containerSettings, _In_ WslcContainerFlags flags); + +STDAPI WslcSetContainerSettingsPortMappings( + _In_ WslcContainerSettings* containerSettings, + _In_reads_opt_(portMappingCount) const WslcContainerPortMapping* portMappings, + _In_ uint32_t portMappingCount); + +// Add the container volumes to the volumes array +STDAPI WslcSetContainerSettingsVolumes( + _In_ WslcContainerSettings* containerSettings, _In_reads_opt_(volumeCount) const WslcContainerVolume* volumes, _In_ uint32_t volumeCount); + +// Add named session volumes (created via WslcCreateSessionVhdVolume) to the container settings +STDAPI WslcSetContainerSettingsNamedVolumes( + _In_ WslcContainerSettings* containerSettings, + _In_reads_opt_(namedVolumeCount) const WslcContainerNamedVolume* namedVolumes, + _In_ uint32_t namedVolumeCount); + +STDAPI WslcCreateContainerProcess( + _In_ WslcContainer container, _In_ WslcProcessSettings* newProcessSettings, _Out_ WslcProcess* newProcess, _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcReleaseContainer(_In_ WslcContainer container); + +// GENERAL CONTAINER MANAGEMENT + +#define WSLC_CONTAINER_ID_BUFFER_SIZE 65 // 64 hex chars + null terminator + +STDAPI WslcGetContainerID(_In_ WslcContainer container, _Out_writes_(WSLC_CONTAINER_ID_BUFFER_SIZE) CHAR containerID[WSLC_CONTAINER_ID_BUFFER_SIZE]); + +STDAPI WslcGetContainerInitProcess(_In_ WslcContainer container, _Out_ WslcProcess* initProcess); + +// Retrieves the inspection data for a container. +// +// Parameters: +// container +// A valid WslcContainer handle representing the container to inspect. +// +// inspectData +// On success, receives a pointer to a null-terminated ANSI string +// containing the inspection data. +// +// The string is allocated using CoTaskMemAlloc. The caller takes +// ownership of the returned memory and must free it by calling +// CoTaskMemFree when it is no longer needed. +// +// Return Value: +// S_OK on success. Otherwise, an HRESULT error code indicating the failure. +STDAPI WslcInspectContainer(_In_ WslcContainer container, _Outptr_result_z_ PSTR* inspectData); + +typedef enum WslcContainerState +{ + WSLC_CONTAINER_STATE_INVALID = 0, + WSLC_CONTAINER_STATE_CREATED = 1, + WSLC_CONTAINER_STATE_RUNNING = 2, + WSLC_CONTAINER_STATE_EXITED = 3, + WSLC_CONTAINER_STATE_DELETED = 4, +} WslcContainerState; + +STDAPI WslcGetContainerState(_In_ WslcContainer container, _Out_ WslcContainerState* state); + +// Will define more signals as needed: +typedef enum WslcSignal +{ + WSLC_SIGNAL_NONE = 0, // No signal; reserved for future use + WSLC_SIGNAL_SIGHUP = 1, // SIGHUP: reload / hangup + WSLC_SIGNAL_SIGINT = 2, // SIGINT: interrupt (Ctrl-C) + WSLC_SIGNAL_SIGQUIT = 3, // SIGQUIT: quit with core dump + WSLC_SIGNAL_SIGKILL = 9, // SIGKILL: immediate termination + WSLC_SIGNAL_SIGTERM = 15, // SIGTERM: graceful shutdown +} WslcSignal; + +STDAPI WslcStopContainer(_In_ WslcContainer container, _In_ WslcSignal signal, _In_ uint32_t timeoutSeconds, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef enum WslcDeleteContainerFlags +{ + WSLC_DELETE_CONTAINER_FLAG_NONE = 0, + WSLC_DELETE_CONTAINER_FLAG_FORCE = 0x01 +} WslcDeleteContainerFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcDeleteContainerFlags); + +STDAPI WslcDeleteContainer(_In_ WslcContainer container, _In_ WslcDeleteContainerFlags flags, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// PROCESS DEFINITIONS +STDAPI WslcInitProcessSettings(_Out_ WslcProcessSettings* processSettings); + +// OPTIONAL PROCESS SETTINGS + +STDAPI WslcSetProcessSettingsWorkingDirectory(_In_ WslcProcessSettings* processSettings, _In_ PCSTR workingDirectory); + +STDAPI WslcSetProcessSettingsCmdLine(_In_ WslcProcessSettings* processSettings, _In_reads_(argc) PCSTR const* argv, size_t argc); + +STDAPI WslcSetProcessSettingsEnvVariables(_In_ WslcProcessSettings* processSettings, _In_reads_(argc) PCSTR const* key_value, size_t argc); + +typedef enum WslcProcessIOHandle +{ + WSLC_PROCESS_IO_HANDLE_STDIN = 0, + WSLC_PROCESS_IO_HANDLE_STDOUT = 1, + WSLC_PROCESS_IO_HANDLE_STDERR = 2 +} WslcProcessIOHandle; + +// Callback invoked when stdout or stderr data is available from a running +// WSLC process. +// +// Parameters: +// ioHandle +// The WslcProcessIOHandle that the IO callback is for. +// Only STDOUT and STDERR will receive callbacks. +// +// data +// Pointer to a buffer containing the bytes read. The buffer is owned +// by WSLC and is valid only for the duration of the callback. +// +// The caller must not free, modify, or retain the pointer. If the +// caller needs to keep the data, it must copy the contents before +// returning from the callback. +// +// dataBytes +// Number of bytes available in the data buffer. +// +// context +// Caller-supplied context pointer that was provided when the callback +// was registered. +// +// Notes: +// - WSLC frees or reuses the buffer immediately after the callback returns. +// - The callback must return promptly; long-running operations may block +// WSLC's internal I/O processing. +// - The buffer is not null-terminated; it is a raw byte sequence. +// +typedef __callback void(CALLBACK* WslcStdIOCallback)( + WslcProcessIOHandle ioHandle, _In_reads_bytes_(dataBytes) const BYTE* data, _In_ uint32_t dataBytes, _In_opt_ PVOID context); + +// Callback invoked when a WSLC process has exited AND any remaining IO has been flushed. +// +// Parameters: +// exitCode +// The exit code of the process. +// +// context +// Caller-supplied context pointer that was provided when the callback +// was registered. +// +// Notes: +// - Once this callback is invoked, any registered IO callbacks will no longer be called. +// +typedef __callback void(CALLBACK* WslcProcessExitCallback)(INT32 exitCode, _In_opt_ PVOID context); + +// Using any callbacks will consume the IO handles, preventing acquisition through WslcGetProcessIOHandle. +// If using IO callbacks, also use the exit callback to prevent a race between process exit and IO buffer flushing. +typedef struct WslcProcessCallbacks +{ + WslcStdIOCallback onStdOut; + WslcStdIOCallback onStdErr; + WslcProcessExitCallback onExit; +} WslcProcessCallbacks; + +STDAPI WslcSetProcessSettingsCallbacks(_In_ WslcProcessSettings* processSettings, _In_ const WslcProcessCallbacks* callbacks, _In_opt_ PVOID context); + +// PROCESS MANAGEMENT + +STDAPI WslcGetProcessPid(_In_ WslcProcess process, _Out_ uint32_t* pid); + +STDAPI WslcGetProcessExitEvent(_In_ WslcProcess process, _Out_ HANDLE* exitEvent); + +typedef enum WslcProcessState +{ + WSLC_PROCESS_STATE_UNKNOWN = 0, + WSLC_PROCESS_STATE_RUNNING = 1, + WSLC_PROCESS_STATE_EXITED = 2, + WSLC_PROCESS_STATE_SIGNALLED = 3 +} WslcProcessState; + +STDAPI WslcGetProcessState(_In_ WslcProcess process, _Out_ WslcProcessState* state); + +STDAPI WslcGetProcessExitCode(_In_ WslcProcess process, _Out_ PINT32 exitCode); + +STDAPI WslcSignalProcess(_In_ WslcProcess process, _In_ WslcSignal signal); + +STDAPI WslcGetProcessIOHandle(_In_ WslcProcess process, _In_ WslcProcessIOHandle ioHandle, _Out_ HANDLE* handle); + +STDAPI WslcReleaseProcess(_In_ WslcProcess process); + +// IMAGE MANAGEMENT + +// Container image +typedef struct WslcImageProgressDetail +{ + _Out_ uint64_t currentBytes; // bytes downloaded so far + _Out_ uint64_t totalBytes; // total bytes expected +} WslcImageProgressDetail; + +typedef enum WslcImageProgressStatus +{ + WSLC_IMAGE_PROGRESS_STATUS_UNKNOWN = 0, + WSLC_IMAGE_PROGRESS_STATUS_PULLING = 1, // "Pulling fs layer" + WSLC_IMAGE_PROGRESS_STATUS_WAITING = 2, // "Waiting" + WSLC_IMAGE_PROGRESS_STATUS_DOWNLOADING = 3, // "Downloading" + WSLC_IMAGE_PROGRESS_STATUS_VERIFYING = 4, // "Verifying Checksum" + WSLC_IMAGE_PROGRESS_STATUS_EXTRACTING = 5, // "Extracting" + WSLC_IMAGE_PROGRESS_STATUS_COMPLETE = 6 // "Pull complete" +} WslcImageProgressStatus; + +typedef struct WslcImageProgressMessage +{ + _Out_ PCSTR id; // layer ID or digest + _Out_ WslcImageProgressStatus status; // "Downloading", "Extracting", etc. + _Out_ WslcImageProgressDetail detail; +} WslcImageProgressMessage; + +// pointer-to-function typedef (unambiguous) +typedef HRESULT(CALLBACK* WslcContainerImageProgressCallback)(const WslcImageProgressMessage* progress, PVOID context); + +// options struct typedef is a pointer type and _In_opt_ is valid +typedef struct WslcPullImageOptions +{ + _In_z_ PCSTR uri; + WslcContainerImageProgressCallback progressCallback; + PVOID progressCallbackContext; + _In_opt_z_ PCSTR registryAuth; +} WslcPullImageOptions; + +STDAPI WslcPullSessionImage(_In_ WslcSession session, _In_ const WslcPullImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcImportImageOptions +{ + _In_opt_ WslcContainerImageProgressCallback progressCallback; + _In_opt_ PVOID progressCallbackContext; +} WslcImportImageOptions; + +STDAPI WslcImportSessionImage( + _In_ WslcSession session, + _In_z_ PCSTR imageName, + _In_ HANDLE imageContent, + _In_ uint64_t imageContentBytes, + _In_opt_ const WslcImportImageOptions* options, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcImportSessionImageFromFile( + _In_ WslcSession session, _In_z_ PCSTR imageName, _In_z_ PCWSTR path, _In_opt_ const WslcImportImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcLoadImageOptions +{ + _In_opt_ WslcContainerImageProgressCallback progressCallback; + _In_opt_ PVOID progressCallbackContext; +} WslcLoadImageOptions; + +STDAPI WslcLoadSessionImage( + _In_ WslcSession session, + _In_ HANDLE imageContent, + _In_ uint64_t imageContentBytes, + _In_opt_ const WslcLoadImageOptions* options, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcLoadSessionImageFromFile( + _In_ WslcSession session, _In_z_ PCWSTR path, _In_opt_ const WslcLoadImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +#define WSLC_IMAGE_NAME_LENGTH 256 // 255 chars + null + +typedef struct WslcImageInfo +{ + // we should expose this + CHAR name[WSLC_IMAGE_NAME_LENGTH]; + uint8_t sha256[32]; + int64_t sizeBytes; + uint64_t createdUnixTime; +} WslcImageInfo; + +STDAPI WslcDeleteSessionImage(_In_ WslcSession session, _In_z_ PCSTR nameOrID, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcTagImageOptions +{ + _In_z_ PCSTR image; // Source image name or ID. + _In_z_ PCSTR repo; // Target repository name. + _In_z_ PCSTR tag; // Target tag name. +} WslcTagImageOptions; + +STDAPI WslcTagSessionImage(_In_ WslcSession session, _In_ const WslcTagImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcPushImageOptions +{ + _In_z_ PCSTR image; + _In_z_ PCSTR registryAuth; // Base64-encoded X-Registry-Auth header value. + _In_opt_ WslcContainerImageProgressCallback progressCallback; + _In_opt_ PVOID progressCallbackContext; +} WslcPushImageOptions; + +STDAPI WslcPushSessionImage(_In_ WslcSession session, _In_ const WslcPushImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// Authenticates with a container registry and returns an identity token. +// +// Parameters: +// session +// A valid WslcSession handle. +// +// serverAddress +// The registry server address (e.g. "127.0.0.1:5000"). +// +// username +// The username for authentication. +// +// password +// The password for authentication. +// +// identityToken +// On success, receives a pointer to a null-terminated ANSI string +// containing the identity token. +// +// The string is allocated using CoTaskMemAlloc. The caller takes +// ownership of the returned memory and must free it by calling +// CoTaskMemFree when it is no longer needed. +// +// Return Value: +// S_OK on success. Otherwise, an HRESULT error code indicating the failure. +STDAPI WslcSessionAuthenticate( + _In_ WslcSession session, + _In_z_ PCSTR serverAddress, + _In_z_ PCSTR username, + _In_z_ PCSTR password, + _Outptr_result_z_ PSTR* identityToken, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +// Retrieves the list of container images +// Parameters: +// session +// A valid WslcSession handle. +// +// images +// On success, receives a pointer to a contiguous array of +// WslcImageInfo structures describing the images +// +// The array is allocated using CoTaskMemAlloc. The caller takes +// ownership of the memory and must free it by calling +// CoTaskMemFree when it is no longer needed. +// +// count +// On success, receives the number of elements in the images array. +// On failure, *count is set to 0. +// +// Return Value: +// S_OK on success. Otherwise, an HRESULT error code indicating the +// reason for failure. +// +// Notes: +// - The caller must pass non-null pointers for both 'images' and 'count'. +// + +STDAPI WslcListSessionImages(_In_ WslcSession session, _Outptr_result_buffer_(*count) WslcImageInfo** images, _Out_ uint32_t* count); + +// STORAGE + +STDAPI WslcCreateSessionVhdVolume(_In_ WslcSession session, _In_ const WslcVhdRequirements* options, _Outptr_opt_result_z_ PWSTR* errorMessage); +STDAPI WslcDeleteSessionVhdVolume(_In_ WslcSession session, _In_z_ PCSTR name, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// INSTALL + +typedef enum WslcComponentFlags +{ + WSLC_COMPONENT_FLAG_NONE = 0, + // Services provided by the Virtual Machine Platform optional feature (other optional features may provide these services as + // well). Installing this component will require a reboot. + WSLC_COMPONENT_FLAG_VIRTUAL_MACHINE_PLATFORM = 1, + // The WSL runtime package, at an appropriate version to provide support for WSLC. + WSLC_COMPONENT_FLAG_WSL_PACKAGE = 2, + // Set if the WSLC SDK itself needs to be updated. + WSLC_COMPONENT_FLAG_SDK_NEEDS_UPDATE = 4, +} WslcComponentFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcComponentFlags); + +STDAPI WslcGetMissingComponents(_Out_ WslcComponentFlags* missingComponents); + +typedef struct WslcVersion +{ + uint32_t major; + uint32_t minor; + uint32_t revision; +} WslcVersion; +STDAPI WslcGetVersion(_Out_writes_(1) WslcVersion* version); + +typedef __callback void(CALLBACK* WslcInstallCallback)( + _In_ WslcComponentFlags component, _In_ uint32_t progressSteps, _In_ uint32_t totalSteps, _In_opt_ PVOID context); + +// Callbacks will only be made for components that are actively installed by this call. +// That list can be acquired prior to this call with `WslcCanRun`. +STDAPI WslcInstallWithDependencies(_In_opt_ WslcInstallCallback progressCallback, _In_opt_ PVOID context); + +EXTERN_C_END diff --git a/vendor/wslcsdk/include/2.9.9/wslcsdk.h b/vendor/wslcsdk/include/2.9.9/wslcsdk.h new file mode 100644 index 0000000..56f05a6 --- /dev/null +++ b/vendor/wslcsdk/include/2.9.9/wslcsdk.h @@ -0,0 +1,682 @@ +/*++ + +Copyright (c) Microsoft. All rights reserved. + +Module Name: + + WslcSDK.h + +Abstract: + + This file contains the public WSL Container SDK api definitions. + + PREVIEW NOTICE: This API is currently in preview and is subject to breaking + changes in future releases without prior notice. Do not rely on API stability + for production workloads. Features, function signatures, and behaviors may + change between releases during the preview period. + +--*/ +#pragma once +#include +#include +#include +#include +#include + +EXTERN_C_START + +// WSLC specific error codes +// Ensure wslc.idl and wslcsdk.idl are also updated. +#define WSLC_E_BASE (0x0600) +#define WSLC_E_IMAGE_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 1) /* 0x80040601 */ +#define WSLC_E_CONTAINER_PREFIX_AMBIGUOUS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 2) /* 0x80040602 */ +#define WSLC_E_CONTAINER_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 3) /* 0x80040603 */ +#define WSLC_E_VOLUME_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 4) /* 0x80040604 */ +#define WSLC_E_CONTAINER_NOT_RUNNING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 5) /* 0x80040605 */ +#define WSLC_E_CONTAINER_IS_RUNNING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 6) /* 0x80040606 */ +#define WSLC_E_SESSION_RESERVED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 7) /* 0x80040607 */ +#define WSLC_E_INVALID_SESSION_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 8) /* 0x80040608 */ +#define WSLC_E_NETWORK_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 9) /* 0x80040609 */ +#define WSLC_E_WU_SEARCH_FAILED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 10) /* 0x8004060A */ +#define WSLC_E_SDK_UPDATE_NEEDED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 11) /* 0x8004060B */ +#define WSLC_E_CONTAINER_DISABLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 12) /* 0x8004060C */ +#define WSLC_E_REGISTRY_BLOCKED_BY_POLICY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 13) /* 0x8004060D */ +#define WSLC_E_VOLUME_NOT_AVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 14) /* 0x8004060E */ +#define WSLC_E_SESSION_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 15) /* 0x8004060F */ +#define WSLC_E_VM_NOT_RUNNING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, WSLC_E_BASE + 16) /* 0x80040610 */ + +// Session values +#define WSLC_SESSION_OPTIONS_SIZE 72 +#define WSLC_SESSION_OPTIONS_ALIGNMENT 8 + +typedef struct WslcSessionSettings +{ + __declspec(align(WSLC_SESSION_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_SESSION_OPTIONS_SIZE]; +} WslcSessionSettings; + +DECLARE_HANDLE(WslcSession); + +// Container values +#define WSLC_CONTAINER_OPTIONS_SIZE 104 +#define WSLC_CONTAINER_OPTIONS_ALIGNMENT 8 + +typedef struct WslcContainerSettings +{ + __declspec(align(WSLC_CONTAINER_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_CONTAINER_OPTIONS_SIZE]; +} WslcContainerSettings; + +DECLARE_HANDLE(WslcContainer); + +// Process values +#define WSLC_CONTAINER_PROCESS_OPTIONS_SIZE 72 +#define WSLC_CONTAINER_PROCESS_OPTIONS_ALIGNMENT 8 +typedef struct WslcProcessSettings +{ + __declspec(align(WSLC_CONTAINER_PROCESS_OPTIONS_ALIGNMENT)) BYTE _opaque[WSLC_CONTAINER_PROCESS_OPTIONS_SIZE]; +} WslcProcessSettings; + +DECLARE_HANDLE(WslcProcess); + +typedef enum WslcContainerNetworkingMode +{ + WSLC_CONTAINER_NETWORKING_MODE_NONE = 0, // No networking / isolated + WSLC_CONTAINER_NETWORKING_MODE_BRIDGED = 1 +} WslcContainerNetworkingMode; + +typedef enum WslcVhdType +{ + WSLC_VHD_TYPE_DYNAMIC = 0, // Expanding VHDX (default) + WSLC_VHD_TYPE_FIXED = 1 // Fixed-allocation VHDX (only honored by WslcCreateSessionVhdVolume) +} WslcVhdType; + +typedef enum WslcVhdRequirementsFlags +{ + WSLC_VHD_REQ_FLAG_NONE = 0x00000000, + // When set, WslcVhdRequirements::uid and gid are honored. When clear, + // those fields are ignored and the volume is left owned by root:root. + WSLC_VHD_REQ_FLAG_OWNER = 0x00000001, +} WslcVhdRequirementsFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcVhdRequirementsFlags); + +typedef struct WslcVhdRequirements +{ + // Ignored by WslcSetSessionSettingsVhd + _In_z_ PCSTR name; + _In_ uint64_t sizeBytes; // Desired size (for create/expand) + _In_ WslcVhdType type; + // The remaining fields are only honored by WslcCreateSessionVhdVolume. + // WslcSetSessionSettingsVhd rejects non-NONE flags with E_INVALIDARG. + _In_ WslcVhdRequirementsFlags flags; + _In_ uint32_t uid; // honored iff (flags & WSLC_VHD_REQ_FLAG_OWNER) + _In_ uint32_t gid; // honored iff (flags & WSLC_VHD_REQ_FLAG_OWNER) +} WslcVhdRequirements; + +typedef enum WslcSessionFeatureFlags +{ + WSLC_SESSION_FEATURE_FLAG_NONE = 0x00000000, + WSLC_SESSION_FEATURE_FLAG_ENABLE_GPU = 0x00000004 +} WslcSessionFeatureFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcSessionFeatureFlags); + +typedef enum WslcSessionTerminationReason +{ + WSLC_SESSION_TERMINATION_REASON_UNKNOWN = 0, + WSLC_SESSION_TERMINATION_REASON_SHUTDOWN = 1, + WSLC_SESSION_TERMINATION_REASON_CRASHED = 2, +} WslcSessionTerminationReason; + +typedef struct WslcSessionCrashDumpInfo +{ + _Field_z_ PCWSTR dumpPath; + _Field_z_ PCSTR processName; + uint32_t pid; + uint32_t signal; + uint64_t timestamp; +} WslcSessionCrashDumpInfo; + +typedef __callback void(CALLBACK* WslcSessionCrashDumpCallback)(_In_ const WslcSessionCrashDumpInfo* info, _In_opt_ PVOID context); + +// Opaque handle returned by WslcRegisterSessionCrashDumpCallback. Holding it keeps the crash dump +// registration alive; pass it to WslcReleaseCrashDumpSubscription to unsubscribe. +DECLARE_HANDLE(WslcCrashDumpSubscription); + +STDAPI WslcInitSessionSettings(_In_ PCWSTR name, _In_ PCWSTR storagePath, _Out_ WslcSessionSettings* sessionSettings); + +STDAPI WslcCreateSession(_In_ WslcSessionSettings* sessionSettings, _Out_ WslcSession* session, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// OPTIONAL SESSION SETTINGS +STDAPI WslcSetSessionSettingsCpuCount(_In_ WslcSessionSettings* sessionSettings, _In_ uint32_t cpuCount); +STDAPI WslcSetSessionSettingsMemory(_In_ WslcSessionSettings* sessionSettings, _In_ uint32_t memoryMB); +STDAPI WslcSetSessionSettingsTimeout(_In_ WslcSessionSettings* sessionSettings, _In_ uint32_t timeoutMS); + +STDAPI WslcSetSessionSettingsVhd(_In_ WslcSessionSettings* sessionSettings, _In_opt_ const WslcVhdRequirements* vhdRequirements); + +STDAPI WslcSetSessionSettingsFeatureFlags(_In_ WslcSessionSettings* sessionSettings, _In_ WslcSessionFeatureFlags flags); + +STDAPI WslcGetSessionTerminationEvent(_In_ WslcSession session, _Out_ HANDLE* terminationEvent); +STDAPI WslcGetSessionTerminationReason(_In_ WslcSession session, _Out_ WslcSessionTerminationReason* reason); + +STDAPI WslcTerminateSession(_In_ WslcSession session); +STDAPI WslcReleaseSession(_In_ WslcSession session); + +// Registers a callback invoked when a Linux process crash dump is written for the session. +// Works for any caller holding a live session. The returned subscription keeps the registration +// alive; release it with WslcReleaseCrashDumpSubscription to unsubscribe. Multiple subscriptions +// can be registered against the same session. +STDAPI WslcRegisterSessionCrashDumpCallback( + _In_ WslcSession session, + _In_ WslcSessionCrashDumpCallback crashDumpCallback, + _In_opt_ PVOID crashDumpContext, + _Out_ WslcCrashDumpSubscription* subscription, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcReleaseCrashDumpSubscription(_In_ WslcCrashDumpSubscription subscription); + +// CONTAINER DEFINITIONS + +typedef enum WslcPortProtocol +{ + WSLC_PORT_PROTOCOL_TCP = 0, + WSLC_PORT_PROTOCOL_UDP = 1 +} WslcPortProtocol; + +typedef struct WslcContainerPortMapping +{ + _In_ uint16_t windowsPort; // Port on Windows host + _In_ uint16_t containerPort; // Port inside container + _In_ WslcPortProtocol protocol; // TCP or UDP + + // if you want to override the default binding address + _In_opt_ struct sockaddr_storage* windowsAddress; // accepts ipv4/6 +} WslcContainerPortMapping; + +typedef struct WslcContainerVolume +{ + _In_z_ PCWSTR windowsPath; + _In_z_ PCSTR containerPath; + _In_ BOOL readOnly; +} WslcContainerVolume; + +typedef struct WslcContainerNamedVolume +{ + _In_z_ PCSTR name; // Name of the session volume (from WslcVhdRequirements.name) + _In_z_ PCSTR containerPath; // Absolute path inside the container + _In_ BOOL readOnly; +} WslcContainerNamedVolume; + +typedef enum WslcContainerFlags +{ + WSLC_CONTAINER_FLAG_NONE = 0x00000000, + WSLC_CONTAINER_FLAG_AUTO_REMOVE = 0x00000001, + WSLC_CONTAINER_FLAG_ENABLE_GPU = 0x00000002, + WSLC_CONTAINER_FLAG_PRIVILEGED = 0x00000004, + +} WslcContainerFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcContainerFlags); + +typedef enum WslcContainerStartFlags +{ + WSLC_CONTAINER_START_FLAG_NONE = 0x00000000, + WSLC_CONTAINER_START_FLAG_ATTACH = 0x00000001, + +} WslcContainerStartFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcContainerStartFlags); + +STDAPI WslcInitContainerSettings(_In_ PCSTR imageName, _Out_ WslcContainerSettings* containerSettings); + +STDAPI WslcCreateContainer(_In_ WslcSession session, _In_ const WslcContainerSettings* containerSettings, _Out_ WslcContainer* container, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// Opens an existing container by name, full ID, or partial ID prefix. +// The returned WslcContainer handle is owned by the caller; release it with WslcReleaseContainer. +// Returns WSLC_E_CONTAINER_NOT_FOUND if no matching container exists, or +// WSLC_E_CONTAINER_PREFIX_AMBIGUOUS if the given prefix matches more than one container. +STDAPI WslcOpenContainer(_In_ WslcSession session, _In_z_ PCSTR nameOrId, _Out_ WslcContainer* container, _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcStartContainer(_In_ WslcContainer container, _In_ WslcContainerStartFlags flags, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// OPTIONAL CONTAINER SETTINGS +STDAPI WslcSetContainerSettingsName(_In_ WslcContainerSettings* containerSettings, _In_ PCSTR name); + +STDAPI WslcSetContainerSettingsInitProcess(_In_ WslcContainerSettings* containerSettings, _In_ WslcProcessSettings* initProcess); + +STDAPI WslcSetContainerSettingsNetworkingMode(_In_ WslcContainerSettings* containerSettings, _In_ WslcContainerNetworkingMode networkingMode); + +STDAPI WslcSetContainerSettingsHostName(_In_ WslcContainerSettings* containerSettings, _In_ PCSTR hostName); + +STDAPI WslcSetContainerSettingsDomainName(_In_ WslcContainerSettings* containerSettings, _In_ PCSTR domainName); + +STDAPI WslcSetContainerSettingsFlags(_In_ WslcContainerSettings* containerSettings, _In_ WslcContainerFlags flags); + +STDAPI WslcSetContainerSettingsPortMappings( + _In_ WslcContainerSettings* containerSettings, + _In_reads_opt_(portMappingCount) const WslcContainerPortMapping* portMappings, + _In_ uint32_t portMappingCount); + +// Add the container volumes to the volumes array +STDAPI WslcSetContainerSettingsVolumes( + _In_ WslcContainerSettings* containerSettings, _In_reads_opt_(volumeCount) const WslcContainerVolume* volumes, _In_ uint32_t volumeCount); + +// Add named session volumes (created via WslcCreateSessionVhdVolume) to the container settings +STDAPI WslcSetContainerSettingsNamedVolumes( + _In_ WslcContainerSettings* containerSettings, + _In_reads_opt_(namedVolumeCount) const WslcContainerNamedVolume* namedVolumes, + _In_ uint32_t namedVolumeCount); + +STDAPI WslcCreateContainerProcess( + _In_ WslcContainer container, _In_ WslcProcessSettings* newProcessSettings, _Out_ WslcProcess* newProcess, _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcReleaseContainer(_In_ WslcContainer container); + +// GENERAL CONTAINER MANAGEMENT + +#define WSLC_CONTAINER_ID_BUFFER_SIZE 65 // 64 hex chars + null terminator + +STDAPI WslcGetContainerID(_In_ WslcContainer container, _Out_writes_(WSLC_CONTAINER_ID_BUFFER_SIZE) CHAR containerID[WSLC_CONTAINER_ID_BUFFER_SIZE]); + +STDAPI WslcGetContainerInitProcess(_In_ WslcContainer container, _Out_ WslcProcess* initProcess); + +// Retrieves the inspection data for a container. +// +// Parameters: +// container +// A valid WslcContainer handle representing the container to inspect. +// +// inspectData +// On success, receives a pointer to a null-terminated ANSI string +// containing the inspection data. +// +// The string is allocated using CoTaskMemAlloc. The caller takes +// ownership of the returned memory and must free it by calling +// CoTaskMemFree when it is no longer needed. +// +// Return Value: +// S_OK on success. Otherwise, an HRESULT error code indicating the failure. +STDAPI WslcInspectContainer(_In_ WslcContainer container, _Outptr_result_z_ PSTR* inspectData); + +typedef enum WslcContainerState +{ + WSLC_CONTAINER_STATE_INVALID = 0, + WSLC_CONTAINER_STATE_CREATED = 1, + WSLC_CONTAINER_STATE_RUNNING = 2, + WSLC_CONTAINER_STATE_EXITED = 3, + WSLC_CONTAINER_STATE_DELETED = 4, +} WslcContainerState; + +STDAPI WslcGetContainerState(_In_ WslcContainer container, _Out_ WslcContainerState* state); + +// Will define more signals as needed: +typedef enum WslcSignal +{ + WSLC_SIGNAL_NONE = 0, // No signal; reserved for future use + WSLC_SIGNAL_SIGHUP = 1, // SIGHUP: reload / hangup + WSLC_SIGNAL_SIGINT = 2, // SIGINT: interrupt (Ctrl-C) + WSLC_SIGNAL_SIGQUIT = 3, // SIGQUIT: quit with core dump + WSLC_SIGNAL_SIGKILL = 9, // SIGKILL: immediate termination + WSLC_SIGNAL_SIGTERM = 15, // SIGTERM: graceful shutdown +} WslcSignal; + +STDAPI WslcStopContainer(_In_ WslcContainer container, _In_ WslcSignal signal, _In_ uint32_t timeoutSeconds, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef enum WslcDeleteContainerFlags +{ + WSLC_DELETE_CONTAINER_FLAG_NONE = 0, + WSLC_DELETE_CONTAINER_FLAG_FORCE = 0x01 +} WslcDeleteContainerFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcDeleteContainerFlags); + +STDAPI WslcDeleteContainer(_In_ WslcContainer container, _In_ WslcDeleteContainerFlags flags, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// PROCESS DEFINITIONS +STDAPI WslcInitProcessSettings(_Out_ WslcProcessSettings* processSettings); + +// OPTIONAL PROCESS SETTINGS + +STDAPI WslcSetProcessSettingsWorkingDirectory(_In_ WslcProcessSettings* processSettings, _In_ PCSTR workingDirectory); + +STDAPI WslcSetProcessSettingsCmdLine(_In_ WslcProcessSettings* processSettings, _In_reads_(argc) PCSTR const* argv, size_t argc); + +STDAPI WslcSetProcessSettingsEnvVariables(_In_ WslcProcessSettings* processSettings, _In_reads_(argc) PCSTR const* key_value, size_t argc); + +typedef enum WslcProcessIOHandle +{ + WSLC_PROCESS_IO_HANDLE_STDIN = 0, + WSLC_PROCESS_IO_HANDLE_STDOUT = 1, + WSLC_PROCESS_IO_HANDLE_STDERR = 2 +} WslcProcessIOHandle; + +// Callback invoked when stdout or stderr data is available from a running +// WSLC process. +// +// Parameters: +// ioHandle +// The WslcProcessIOHandle that the IO callback is for. +// Only STDOUT and STDERR will receive callbacks. +// +// data +// Pointer to a buffer containing the bytes read. The buffer is owned +// by WSLC and is valid only for the duration of the callback. +// +// The caller must not free, modify, or retain the pointer. If the +// caller needs to keep the data, it must copy the contents before +// returning from the callback. +// +// dataBytes +// Number of bytes available in the data buffer. +// +// context +// Caller-supplied context pointer that was provided when the callback +// was registered. +// +// Notes: +// - WSLC frees or reuses the buffer immediately after the callback returns. +// - The callback must return promptly; long-running operations may block +// WSLC's internal I/O processing. +// - The buffer is not null-terminated; it is a raw byte sequence. +// +typedef __callback void(CALLBACK* WslcStdIOCallback)( + WslcProcessIOHandle ioHandle, _In_reads_bytes_(dataBytes) const BYTE* data, _In_ uint32_t dataBytes, _In_opt_ PVOID context); + +// Callback invoked when a WSLC process has exited AND any remaining IO has been flushed. +// +// Parameters: +// exitCode +// The exit code of the process. +// +// context +// Caller-supplied context pointer that was provided when the callback +// was registered. +// +// Notes: +// - Once this callback is invoked, any registered IO callbacks will no longer be called. +// +typedef __callback void(CALLBACK* WslcProcessExitCallback)(INT32 exitCode, _In_opt_ PVOID context); + +// Using any callbacks will consume the IO handles, preventing acquisition through WslcGetProcessIOHandle. +// If using IO callbacks, also use the exit callback to prevent a race between process exit and IO buffer flushing. +typedef struct WslcProcessCallbacks +{ + WslcStdIOCallback onStdOut; + WslcStdIOCallback onStdErr; + WslcProcessExitCallback onExit; +} WslcProcessCallbacks; + +STDAPI WslcSetProcessSettingsCallbacks(_In_ WslcProcessSettings* processSettings, _In_ const WslcProcessCallbacks* callbacks, _In_opt_ PVOID context); + +// Sets IO callbacks for the init process of a container. +// Must be called before WslcStartContainer (with WSLC_CONTAINER_START_FLAG_ATTACH). +// Has no effect on a container that is already running. +STDAPI WslcSetContainerInitProcessIOCallbacks(_In_ WslcContainer container, _In_ const WslcProcessCallbacks* callbacks, _In_opt_ PVOID context); + +// PROCESS MANAGEMENT + +STDAPI WslcGetProcessPid(_In_ WslcProcess process, _Out_ uint32_t* pid); + +STDAPI WslcGetProcessExitEvent(_In_ WslcProcess process, _Out_ HANDLE* exitEvent); + +typedef enum WslcProcessState +{ + WSLC_PROCESS_STATE_UNKNOWN = 0, + WSLC_PROCESS_STATE_RUNNING = 1, + WSLC_PROCESS_STATE_EXITED = 2, + WSLC_PROCESS_STATE_SIGNALLED = 3 +} WslcProcessState; + +STDAPI WslcGetProcessState(_In_ WslcProcess process, _Out_ WslcProcessState* state); + +STDAPI WslcGetProcessExitCode(_In_ WslcProcess process, _Out_ PINT32 exitCode); + +STDAPI WslcSignalProcess(_In_ WslcProcess process, _In_ WslcSignal signal); + +STDAPI WslcGetProcessIOHandle(_In_ WslcProcess process, _In_ WslcProcessIOHandle ioHandle, _Out_ HANDLE* handle); + +STDAPI WslcReleaseProcess(_In_ WslcProcess process); + +// IMAGE MANAGEMENT + +// Container image +typedef struct WslcImageProgressDetail +{ + _Out_ uint64_t currentBytes; // bytes downloaded so far + _Out_ uint64_t totalBytes; // total bytes expected +} WslcImageProgressDetail; + +typedef enum WslcImageProgressStatus +{ + WSLC_IMAGE_PROGRESS_STATUS_UNKNOWN = 0, + WSLC_IMAGE_PROGRESS_STATUS_PULLING = 1, // "Pulling fs layer" + WSLC_IMAGE_PROGRESS_STATUS_WAITING = 2, // "Waiting" + WSLC_IMAGE_PROGRESS_STATUS_DOWNLOADING = 3, // "Downloading" + WSLC_IMAGE_PROGRESS_STATUS_VERIFYING = 4, // "Verifying Checksum" + WSLC_IMAGE_PROGRESS_STATUS_EXTRACTING = 5, // "Extracting" + WSLC_IMAGE_PROGRESS_STATUS_COMPLETE = 6 // "Pull complete" +} WslcImageProgressStatus; + +typedef struct WslcImageProgressMessage +{ + _Out_ PCSTR id; // layer ID or digest + _Out_ WslcImageProgressStatus status; // "Downloading", "Extracting", etc. + _Out_ WslcImageProgressDetail detail; +} WslcImageProgressMessage; + +// pointer-to-function typedef (unambiguous) +typedef HRESULT(CALLBACK* WslcContainerImageProgressCallback)(const WslcImageProgressMessage* progress, PVOID context); + +// options struct typedef is a pointer type and _In_opt_ is valid +typedef struct WslcPullImageOptions +{ + _In_z_ PCSTR uri; + WslcContainerImageProgressCallback progressCallback; + PVOID progressCallbackContext; + _In_opt_z_ PCSTR registryAuth; +} WslcPullImageOptions; + +STDAPI WslcPullSessionImage(_In_ WslcSession session, _In_ const WslcPullImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcImportImageOptions +{ + _In_opt_ WslcContainerImageProgressCallback progressCallback; + _In_opt_ PVOID progressCallbackContext; +} WslcImportImageOptions; + +STDAPI WslcImportSessionImage( + _In_ WslcSession session, + _In_z_ PCSTR imageName, + _In_ HANDLE imageContent, + _In_ uint64_t imageContentBytes, + _In_opt_ const WslcImportImageOptions* options, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcImportSessionImageFromFile( + _In_ WslcSession session, _In_z_ PCSTR imageName, _In_z_ PCWSTR path, _In_opt_ const WslcImportImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcLoadImageOptions +{ + _In_opt_ WslcContainerImageProgressCallback progressCallback; + _In_opt_ PVOID progressCallbackContext; +} WslcLoadImageOptions; + +STDAPI WslcLoadSessionImage( + _In_ WslcSession session, + _In_ HANDLE imageContent, + _In_ uint64_t imageContentBytes, + _In_opt_ const WslcLoadImageOptions* options, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +STDAPI WslcLoadSessionImageFromFile( + _In_ WslcSession session, _In_z_ PCWSTR path, _In_opt_ const WslcLoadImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +#define WSLC_IMAGE_NAME_LENGTH 256 // 255 chars + null + +typedef struct WslcImageInfo +{ + // we should expose this + CHAR name[WSLC_IMAGE_NAME_LENGTH]; + uint8_t sha256[32]; + int64_t sizeBytes; + uint64_t createdUnixTime; +} WslcImageInfo; + +STDAPI WslcDeleteSessionImage(_In_ WslcSession session, _In_z_ PCSTR nameOrID, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcTagImageOptions +{ + _In_z_ PCSTR image; // Source image name or ID. + _In_z_ PCSTR repo; // Target repository name. + _In_z_ PCSTR tag; // Target tag name. +} WslcTagImageOptions; + +STDAPI WslcTagSessionImage(_In_ WslcSession session, _In_ const WslcTagImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef struct WslcPushImageOptions +{ + _In_z_ PCSTR image; + _In_z_ PCSTR registryAuth; // Base64-encoded X-Registry-Auth header value. + _In_opt_ WslcContainerImageProgressCallback progressCallback; + _In_opt_ PVOID progressCallbackContext; +} WslcPushImageOptions; + +STDAPI WslcPushSessionImage(_In_ WslcSession session, _In_ const WslcPushImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage); + +typedef enum WslcIdentityTokenType +{ + WSLC_IDENTITY_TOKEN_TYPE_UNKNOWN = 0, + WSLC_IDENTITY_TOKEN_TYPE_TOKEN = 1, + WSLC_IDENTITY_TOKEN_TYPE_CREDENTIALS = 2, +} WslcIdentityTokenType; + +// Authenticates with a container registry and returns an identity token suitable for use as +// the registryAuth value in WslcPullSessionImage and WslcPushSessionImage. +// +// Parameters: +// session +// A valid WslcSession handle. +// +// serverAddress +// The registry server address (e.g. "127.0.0.1:5000"). +// +// username +// The username for authentication. +// +// password +// The password for authentication. +// +// identityToken +// On success, receives a pointer to a null-terminated ANSI string containing a +// base64-encoded JSON object that can be passed directly as the registryAuth value to +// WslcPullSessionImage or WslcPushSessionImage. +// +// The string is allocated using CoTaskMemAlloc. The caller takes ownership of the +// returned memory and must free it by calling CoTaskMemFree when it is no longer needed. +// +// tokenType +// Optional. On success, receives the type of credential embedded in identityToken: +// WSLC_IDENTITY_TOKEN_TYPE_TOKEN - the server returned an identity token; +// identityToken encodes {"identitytoken": ...} +// WSLC_IDENTITY_TOKEN_TYPE_CREDENTIALS - the server returned no token; the supplied +// username/password are embedded instead as +// {"username": ..., "password": ...} +// On failure, set to WSLC_IDENTITY_TOKEN_TYPE_UNKNOWN. +// May be null if the caller does not need the token type. +// +// errorMessage +// Optional. On failure, receives a human-readable error message. May be null. +// +// Return Value: +// S_OK on success. Otherwise, an HRESULT error code indicating the failure. +// +// Outcome table: +// Outcome | HRESULT | identityToken | tokenType +// ------------------------------|---------|--------------------------------------|---------- +// Failure | FAILED | nullptr | UNKNOWN +// Success, server returns token | S_OK | base64({"identitytoken": ""}) | TOKEN +// Success, no token returned | S_OK | base64({"username":..,"password":..})| CREDENTIALS +STDAPI WslcSessionAuthenticate( + _In_ WslcSession session, + _In_z_ PCSTR serverAddress, + _In_z_ PCSTR username, + _In_z_ PCSTR password, + _Outptr_result_z_ PSTR* identityToken, + _Out_opt_ WslcIdentityTokenType* tokenType, + _Outptr_opt_result_z_ PWSTR* errorMessage); + +// Retrieves the list of container images +// Parameters: +// session +// A valid WslcSession handle. +// +// images +// On success, receives a pointer to a contiguous array of +// WslcImageInfo structures describing the images +// +// The array is allocated using CoTaskMemAlloc. The caller takes +// ownership of the memory and must free it by calling +// CoTaskMemFree when it is no longer needed. +// +// count +// On success, receives the number of elements in the images array. +// On failure, *count is set to 0. +// +// Return Value: +// S_OK on success. Otherwise, an HRESULT error code indicating the +// reason for failure. +// +// Notes: +// - The caller must pass non-null pointers for both 'images' and 'count'. +// + +STDAPI WslcListSessionImages(_In_ WslcSession session, _Outptr_result_buffer_(*count) WslcImageInfo** images, _Out_ uint32_t* count); + +// STORAGE + +STDAPI WslcCreateSessionVhdVolume(_In_ WslcSession session, _In_ const WslcVhdRequirements* options, _Outptr_opt_result_z_ PWSTR* errorMessage); +STDAPI WslcDeleteSessionVhdVolume(_In_ WslcSession session, _In_z_ PCSTR name, _Outptr_opt_result_z_ PWSTR* errorMessage); + +// INSTALL + +typedef enum WslcComponentFlags +{ + WSLC_COMPONENT_FLAG_NONE = 0, + // Services provided by the Virtual Machine Platform optional feature (other optional features may provide these services as + // well). Installing this component will require a reboot. + WSLC_COMPONENT_FLAG_VIRTUAL_MACHINE_PLATFORM = 1, + // The WSL runtime package, at an appropriate version to provide support for WSLC. + WSLC_COMPONENT_FLAG_WSL_PACKAGE = 2, + // Set if the WSLC SDK itself needs to be updated. + WSLC_COMPONENT_FLAG_SDK_NEEDS_UPDATE = 4, +} WslcComponentFlags; + +DEFINE_ENUM_FLAG_OPERATORS(WslcComponentFlags); + +STDAPI WslcGetMissingComponents(_Out_ WslcComponentFlags* missingComponents); + +typedef struct WslcVersion +{ + uint32_t major; + uint32_t minor; + uint32_t revision; +} WslcVersion; +STDAPI WslcGetVersion(_Out_writes_(1) WslcVersion* version); + +typedef __callback void(CALLBACK* WslcInstallCallback)( + _In_ WslcComponentFlags component, _In_ uint32_t progressSteps, _In_ uint32_t totalSteps, _In_opt_ PVOID context); + +typedef enum WslcInstallOptions +{ + WSLC_INSTALL_OPTION_NONE = 0, + // Allows components to be reinstalled. + WSLC_INSTALL_OPTION_REPAIR = 1, +} WslcInstallOptions; + +DEFINE_ENUM_FLAG_OPERATORS(WslcInstallOptions); + +// Callbacks will only be made for components that are actively installed by this call. +// The list of required components can be acquired prior to this call with `WslcGetMissingComponents`. +STDAPI WslcInstallWithDependencies( + _In_ WslcComponentFlags components, _In_ WslcInstallOptions options, _In_opt_ WslcInstallCallback progressCallback, _In_opt_ PVOID context); + +EXTERN_C_END diff --git a/vendor/wslcsdk/win-x64/2.9.3/wslcsdk.dll b/vendor/wslcsdk/win-x64/2.9.3/wslcsdk.dll new file mode 100644 index 0000000..02c4a59 Binary files /dev/null and b/vendor/wslcsdk/win-x64/2.9.3/wslcsdk.dll differ diff --git a/vendor/wslcsdk/win-x64/2.9.9/wslcsdk.dll b/vendor/wslcsdk/win-x64/2.9.9/wslcsdk.dll new file mode 100644 index 0000000..12d4760 Binary files /dev/null and b/vendor/wslcsdk/win-x64/2.9.9/wslcsdk.dll differ